summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDylan William Hardison <dylan@hardison.net>2018-10-14 18:19:50 +0200
committerDylan William Hardison <dylan@hardison.net>2018-10-14 18:19:50 +0200
commitce00a61057535d49aa0e83181a1d317d7842571b (patch)
tree280243de9ff791449fb2c82f3f0f2b9bd931d5b2
parent6367a26da4093a8379e370ef328e9507c98b2e7e (diff)
parent6657fa9f5210d5b5a9b14c0cba6882bd56232054 (diff)
downloadbugzilla-ce00a61057535d49aa0e83181a1d317d7842571b.tar.gz
bugzilla-ce00a61057535d49aa0e83181a1d317d7842571b.tar.xz
Merge remote-tracking branch 'bmo/master'
-rw-r--r--.circleci/config.yml2
-rw-r--r--.editorconfig6
-rw-r--r--.perltidyrc16
-rw-r--r--Bugzilla.pm110
-rw-r--r--Bugzilla/BugUrl.pm8
-rw-r--r--Bugzilla/CGI.pm12
-rw-r--r--Bugzilla/Config.pm3
-rw-r--r--Bugzilla/Config/Reports.pm (renamed from extensions/Persona/lib/Config.pm)29
-rw-r--r--Bugzilla/Constants.pm6
-rw-r--r--Bugzilla/DB.pm83
-rw-r--r--Bugzilla/DB/Schema.pm11
-rw-r--r--Bugzilla/Error.pm12
-rw-r--r--Bugzilla/Error/Base.pm (renamed from extensions/Persona/Config.pm)24
-rw-r--r--Bugzilla/Error/Code.pm (renamed from extensions/MozReview/Config.pm)8
-rw-r--r--Bugzilla/Error/User.pm13
-rw-r--r--Bugzilla/Error/disabled (renamed from extensions/MozReview/disabled)0
-rw-r--r--Bugzilla/Install/Requirements.pm1
-rw-r--r--Bugzilla/Markdown/GFM.pm4
-rw-r--r--Bugzilla/Quantum.pm187
-rw-r--r--Bugzilla/Quantum/CGI.pm246
-rw-r--r--Bugzilla/Quantum/Home.pm28
-rw-r--r--Bugzilla/Quantum/Plugin/BlockIP.pm38
-rw-r--r--Bugzilla/Quantum/Plugin/Glue.pm217
-rw-r--r--Bugzilla/Quantum/Plugin/Helpers.pm66
-rw-r--r--Bugzilla/Quantum/Static.pm18
-rw-r--r--Bugzilla/Quantum/Stdout.pm50
-rw-r--r--Bugzilla/Report/SecurityRisk.pm314
-rw-r--r--Bugzilla/Template.pm2
-rw-r--r--Bugzilla/Test/Util.pm39
-rw-r--r--Bugzilla/Token.pm15
-rw-r--r--Bugzilla/User.pm2
-rw-r--r--Bugzilla/WebService/Bug.pm20
-rw-r--r--Bugzilla/WebService/Bugzilla.pm4
-rw-r--r--Bugzilla/WebService/JSON.pm64
-rw-r--r--Bugzilla/WebService/JSON/Box.pm43
-rw-r--r--Bugzilla/WebService/Product.pm21
-rw-r--r--Bugzilla/WebService/README4
-rw-r--r--Bugzilla/WebService/Server.pm18
-rw-r--r--Bugzilla/WebService/Server/JSONRPC.pm14
-rw-r--r--Bugzilla/WebService/Server/REST.pm1
-rw-r--r--Bugzilla/WebService/Util.pm24
-rw-r--r--Dockerfile3
-rw-r--r--LICENSE2
-rwxr-xr-xMakefile.PL723
-rw-r--r--README.rst50
-rwxr-xr-xattachment.cgi20
-rwxr-xr-xbuglist.cgi7
-rw-r--r--bugzilla.dtd16
-rwxr-xr-xcolchange.cgi3
-rwxr-xr-xcontrib/secbugstats/README.md2
-rw-r--r--docs/en/rst/about/index.rst15
-rw-r--r--docs/en/rst/administering/extensions.rst2
-rw-r--r--docs/en/rst/administering/keywords.rst2
-rw-r--r--docs/en/rst/administering/parameters.rst10
-rw-r--r--docs/en/rst/api/core/v1/bug.rst9
-rw-r--r--docs/en/rst/api/core/v1/bugzilla.rst4
-rw-r--r--docs/en/rst/api/core/v1/product.rst4
-rw-r--r--docs/en/rst/integrating/extensions.rst10
-rw-r--r--docs/en/rst/integrating/faq.rst4
-rw-r--r--docs/en/rst/integrating/languages.rst2
-rw-r--r--docs/en/rst/integrating/skins.rst2
-rw-r--r--docs/en/rst/integrating/templates.rst10
-rw-r--r--docs/en/rst/using/creating-an-account.rst4
-rw-r--r--docs/en/rst/using/extensions.rst2
-rw-r--r--docs/en/rst/using/filing.rst13
-rw-r--r--docs/en/rst/using/finding.rst4
-rw-r--r--docs/en/rst/using/understanding.rst2
-rwxr-xr-xeditparams.cgi3
-rw-r--r--extensions/BMO/lib/Data.pm17
-rw-r--r--extensions/BMO/lib/Reports/ReleaseTracking.pm10
-rw-r--r--extensions/BMO/template/en/default/bug/create/comment-finance.txt.tmpl4
-rw-r--r--extensions/BMO/template/en/default/bug/create/comment-mozlist.txt.tmpl2
-rw-r--r--extensions/BMO/template/en/default/bug/create/create-doc.html.tmpl4
-rw-r--r--extensions/BMO/template/en/default/bug/create/create-finance.html.tmpl4
-rw-r--r--extensions/BMO/template/en/default/bug/create/create-mozlist.html.tmpl4
-rw-r--r--extensions/BMO/template/en/default/bug/create/create-recoverykey.html.tmpl40
-rw-r--r--extensions/BMO/template/en/default/bug/create/create-trademark.html.tmpl62
-rw-r--r--extensions/BMO/template/en/default/bug/create/custom_forms.none.tmpl6
-rw-r--r--extensions/BMO/template/en/default/email/bugmail.html.tmpl2
-rw-r--r--extensions/BMO/template/en/default/global/choose-product.html.tmpl24
-rw-r--r--extensions/BMO/template/en/default/hook/bug/field-help-end.none.tmpl20
-rw-r--r--extensions/BMO/template/en/default/hook/bug/show-header-end.html.tmpl2
-rw-r--r--extensions/BMO/template/en/default/hook/flag/type_comment-form.html.tmpl202
-rw-r--r--extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl1
-rw-r--r--extensions/BMO/template/en/default/hook/index-intro.html.tmpl10
-rw-r--r--extensions/BMO/template/en/default/pages/persona_deprecated.html.tmpl53
-rw-r--r--extensions/BMO/template/en/default/pages/release_tracking_report.html.tmpl2
-rw-r--r--extensions/BMO/template/en/default/pages/upgrade-3.6.html.tmpl16
-rw-r--r--extensions/BMO/template/en/default/pages/user_activity.html.tmpl2
-rw-r--r--extensions/BMO/web/js/new-bug-frequent-comp.js123
-rw-r--r--extensions/BMO/web/js/release_tracking_report.js2
-rw-r--r--extensions/BMO/web/js/sorttable.js52
-rw-r--r--extensions/BMO/web/js/swag.js18
-rw-r--r--extensions/BMO/web/styles/choose_product.css21
-rw-r--r--extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl4
-rw-r--r--extensions/BugModal/web/bug_modal.js3
-rw-r--r--extensions/BugModal/web/new_bug.js4
-rw-r--r--extensions/BzAPI/Extension.pm4
-rw-r--r--extensions/ComponentWatching/template/en/default/hook/global/reason-descs-end.none.tmpl2
-rw-r--r--extensions/Example/template/en/default/hook/global/setting-descs-settings.none.tmpl4
-rw-r--r--extensions/Example/template/en/default/hook/global/user-error-errors.html.tmpl2
-rw-r--r--extensions/Example/template/en/default/pages/example.html.tmpl4
-rw-r--r--extensions/FlagDefaultRequestee/template/en/default/hook/admin/flag-type/edit-rows.html.tmpl2
-rw-r--r--extensions/FlagTypeComment/template/en/default/flag/type_comment.html.tmpl40
-rw-r--r--extensions/FlagTypeComment/web/js/ftc.js189
-rw-r--r--extensions/FlagTypeComment/web/styles/ftc.css58
-rw-r--r--extensions/GitHubAuth/Extension.pm2
-rw-r--r--extensions/GuidedBugEntry/template/en/default/bug/create/comment-guided.txt.tmpl2
-rw-r--r--extensions/GuidedBugEntry/template/en/default/guided/guided.html.tmpl1
-rw-r--r--extensions/GuidedBugEntry/web/js/guided.js3
-rw-r--r--extensions/GuidedBugEntry/web/js/products.js4
-rw-r--r--extensions/InlineHistory/web/inline-history.js2
-rw-r--r--extensions/MozReview/Extension.pm132
-rwxr-xr-xextensions/MozReview/bin/add-mozreview-children.pl257
-rw-r--r--extensions/MozReview/lib/Config.pm55
-rw-r--r--extensions/MozReview/lib/WebService.pm209
-rw-r--r--extensions/MozReview/template/en/default/admin/params/mozreview.html.tmpl20
-rw-r--r--extensions/MozReview/template/en/default/hook/attachment/create-before_form.html.tmpl17
-rw-r--r--extensions/MozReview/template/en/default/hook/attachment/edit-view.html.tmpl16
-rw-r--r--extensions/MozReview/template/en/default/hook/bug/edit-after_bug_data.html.tmpl35
-rw-r--r--extensions/MozReview/template/en/default/hook/bug/show-header-end.html.tmpl13
-rw-r--r--extensions/MozReview/template/en/default/hook/bug_modal/edit-module.html.tmpl21
-rw-r--r--extensions/MozReview/template/en/default/hook/bug_modal/header-end.html.tmpl13
-rw-r--r--extensions/MozReview/template/en/default/hook/global/header-start.html.tmpl11
-rw-r--r--extensions/MozReview/template/en/default/hook/global/user-error-errors.html.tmpl15
-rw-r--r--extensions/MozReview/template/en/default/moz_review/header.html.tmpl10
-rw-r--r--extensions/MozReview/template/en/default/moz_review/table.html.tmpl28
-rw-r--r--extensions/MozReview/web/js/mozreview.js134
-rw-r--r--extensions/MozReview/web/style/attachment.css13
-rw-r--r--extensions/MozReview/web/style/mozreview.css79
-rw-r--r--extensions/MyDashboard/template/en/default/hook/account/prefs/saved-searches-saved-row.html.tmpl2
-rw-r--r--extensions/MyDashboard/template/en/default/pages/mydashboard.html.tmpl37
-rw-r--r--extensions/MyDashboard/web/js/flags.js101
-rw-r--r--extensions/MyDashboard/web/js/query.js2
-rw-r--r--extensions/OldBugMove/template/en/default/admin/params/oldbugmove.html.tmpl6
-rw-r--r--extensions/OldBugMove/template/en/default/hook/bug/edit-after_comment_textarea.html.tmpl2
-rw-r--r--extensions/OldBugMove/template/en/default/hook/bug/format_comment-type.txt.tmpl2
-rw-r--r--extensions/OldBugMove/template/en/default/hook/global/user-error-errors.html.tmpl2
-rw-r--r--extensions/OldBugMove/template/en/default/hook/list/edit-multiple-after_groups.html.tmpl2
-rw-r--r--extensions/OrangeFactor/web/js/LICENSE.processing.js4
-rw-r--r--extensions/OrangeFactor/web/js/LICENSE.sparklines.js4
-rw-r--r--extensions/OrangeFactor/web/js/orange_factor.js2
-rw-r--r--extensions/OrangeFactor/web/js/sparklines.min.js2
-rw-r--r--extensions/Persona/Extension.pm86
-rw-r--r--extensions/Persona/TODO19
-rw-r--r--extensions/Persona/lib/Login.pm137
-rw-r--r--extensions/Persona/template/en/default/admin/params/browserid.html.tmpl22
-rw-r--r--extensions/Persona/template/en/default/admin/params/persona.html.tmpl24
-rw-r--r--extensions/Persona/template/en/default/hook/account/auth/login-additional_methods.html.tmpl9
-rw-r--r--extensions/Persona/template/en/default/hook/account/auth/login-small-additional_methods.html.tmpl17
-rw-r--r--extensions/Persona/template/en/default/hook/account/create-additional_methods.html.tmpl13
-rw-r--r--extensions/Persona/template/en/default/hook/global/header-additional_header.html.tmpl90
-rw-r--r--extensions/Persona/template/en/default/hook/global/user-error-errors.html.tmpl12
-rw-r--r--extensions/Persona/web/images/persona_sign_in.pngbin3684 -> 0 bytes
-rw-r--r--extensions/Persona/web/images/sign_in.pngbin1993 -> 0 bytes
-rw-r--r--extensions/PhabBugz/lib/Constants.pm2
-rw-r--r--extensions/PhabBugz/lib/Feed.pm182
-rw-r--r--extensions/PhabBugz/lib/Util.pm77
-rw-r--r--extensions/PhabBugz/lib/WebService.pm105
-rw-r--r--extensions/PhabBugz/t/basic.t27
-rw-r--r--extensions/PhabBugz/t/feed-daemon-guts.t12
-rw-r--r--extensions/Profanivore/README14
-rw-r--r--extensions/Push/lib/Connector/ReviewBoard.pm178
-rw-r--r--extensions/Push/t/ReviewBoard.t225
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl6
-rw-r--r--extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl8
-rw-r--r--extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl2
-rw-r--r--extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl6
-rw-r--r--extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl2
-rw-r--r--extensions/REMO/web/js/form_validate.js2
-rw-r--r--extensions/REMO/web/js/swag.js18
-rw-r--r--extensions/SecureMail/template/en/default/account/email/encryption-required.txt.tmpl2
-rw-r--r--extensions/SecureMail/template/en/default/account/prefs/securemail.html.tmpl8
-rw-r--r--extensions/SecureMail/template/en/default/hook/account/prefs/prefs-tabs.html.tmpl2
-rw-r--r--extensions/SecureMail/template/en/default/hook/admin/groups/create-field.html.tmpl6
-rw-r--r--extensions/SecureMail/template/en/default/hook/admin/groups/edit-field.html.tmpl2
-rw-r--r--extensions/SecureMail/template/en/default/hook/admin/users/userdata-end.html.tmpl2
-rw-r--r--extensions/SecureMail/template/en/default/hook/global/user-error-errors.html.tmpl6
-rw-r--r--extensions/SecureMail/template/en/default/pages/securemail/help.html.tmpl14
-rw-r--r--extensions/SiteMapIndex/template/en/default/hook/global/messages-messages.html.tmpl2
-rw-r--r--extensions/Splinter/web/splinter.js104
-rw-r--r--extensions/Voting/template/en/default/hook/account/prefs/email-relationships.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/admin/products/edit-common-rows.html.tmpl6
-rw-r--r--extensions/Voting/template/en/default/hook/admin/products/updated-changes.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/admin/sanitycheck/messages-statuses.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/admin/users/confirm-delete-warn_safe.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/bug/edit-after_importance.html.tmpl4
-rw-r--r--extensions/Voting/template/en/default/hook/bug/format_comment-type.txt.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/bug/process/header-title.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/bug/process/results-title.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/bug/show-header-end.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/global/code-error-errors.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/global/reason-descs-end.none.tmpl4
-rw-r--r--extensions/Voting/template/en/default/hook/global/user-error-errors.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/search/form-after_freetext_fields.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/hook/search/search-report-select-rep_fields.html.tmpl2
-rw-r--r--extensions/Voting/template/en/default/pages/voting.html.tmpl22
-rwxr-xr-xheartbeat.cgi2
-rw-r--r--images/bugzilla-magnifier.pngbin7491 -> 0 bytes
-rw-r--r--images/bugzilla-papericon.pngbin3800 -> 0 bytes
-rw-r--r--images/bugzilla-person-alternate.pngbin8359 -> 0 bytes
-rw-r--r--images/bugzilla-person.pngbin6648 -> 0 bytes
-rw-r--r--images/bugzilla-questionmark2.pngbin11552 -> 0 bytes
-rw-r--r--js/TUI.js16
-rw-r--r--js/attachment.js17
-rw-r--r--js/change-columns.js8
-rw-r--r--js/create_bug.js4
-rw-r--r--js/custom-search.js12
-rw-r--r--js/expanding-tree.js12
-rw-r--r--js/field.js50
-rw-r--r--js/instant-search.js18
-rw-r--r--js/productform.js12
-rw-r--r--js/util.js8
-rw-r--r--public/favicon.icobin0 -> 1150 bytes
-rw-r--r--public/metricsgraphics/css/bootstrap.min.css (renamed from static/metricsgraphics/css/bootstrap.min.css)0
-rw-r--r--public/metricsgraphics/css/font-awesome.min.css (renamed from static/metricsgraphics/css/font-awesome.min.css)0
-rw-r--r--public/metricsgraphics/css/google-OpenSans.min.css (renamed from static/metricsgraphics/css/google-OpenSans.min.css)0
-rw-r--r--public/metricsgraphics/css/google-PTSerif.min.css (renamed from static/metricsgraphics/css/google-PTSerif.min.css)0
-rw-r--r--public/metricsgraphics/css/metricsgraphics.css (renamed from static/metricsgraphics/css/metricsgraphics.css)2
-rw-r--r--public/metricsgraphics/js/bootstrap.min.js (renamed from static/metricsgraphics/js/bootstrap.min.js)0
-rw-r--r--public/metricsgraphics/js/d3.min.js (renamed from static/metricsgraphics/js/d3.min.js)0
-rw-r--r--public/metricsgraphics/js/jquery.min.js (renamed from static/metricsgraphics/js/jquery.min.js)0
-rw-r--r--public/metricsgraphics/js/main.js (renamed from static/metricsgraphics/js/main.js)6
-rw-r--r--public/metricsgraphics/js/metricsgraphics.min.js (renamed from static/metricsgraphics/js/metricsgraphics.min.js)0
-rw-r--r--public/metricsgraphics/socorro-lens.html (renamed from static/metricsgraphics/socorro-lens.html)10
-rw-r--r--qa/t/test_create_user_accounts.t10
-rw-r--r--qa/t/webservice_bug_get.t4
-rw-r--r--qa/t/webservice_bug_update.t4
-rw-r--r--qa/t/webservice_bug_update_see_also.t2
-rwxr-xr-xreports.cgi14
-rwxr-xr-xscripts/issue-api-key.pl4
-rw-r--r--scripts/perl-fmt24
-rw-r--r--scripts/secbugsreport.pl84
-rwxr-xr-xscripts/syncflags.pl12
-rw-r--r--skins/standard/IE-fixes.css4
-rw-r--r--skins/standard/attachment.css4
-rw-r--r--skins/standard/dependency-tree.css16
-rw-r--r--skins/standard/duplicates.css10
-rw-r--r--skins/standard/enter_bug.css2
-rw-r--r--skins/standard/global.css118
-rw-r--r--skins/standard/index.css144
-rw-r--r--skins/standard/index/file-a-bug.pngbin3534 -> 0 bytes
-rw-r--r--skins/standard/index/help.pngbin4111 -> 0 bytes
-rw-r--r--skins/standard/index/new-account.pngbin4082 -> 0 bytes
-rw-r--r--skins/standard/index/search.pngbin4828 -> 0 bytes
-rw-r--r--skins/standard/search_form.css26
-rw-r--r--skins/standard/show_bug.css16
-rw-r--r--t/.perlcritic-history2
-rw-r--r--t/006spellcheck.t6
-rw-r--r--t/007util.t6
-rw-r--r--t/008filter.t40
-rw-r--r--t/009bugwords.t18
-rw-r--r--t/012throwables.t22
-rw-r--r--t/json-boxes.t36
-rw-r--r--t/markdown.t6
-rw-r--r--t/mojo-example.t76
-rw-r--r--t/security-risk.t156
-rw-r--r--template/en/default/account/auth/login.html.tmpl4
-rw-r--r--template/en/default/account/create.html.tmpl2
-rw-r--r--template/en/default/account/created.html.tmpl2
-rw-r--r--template/en/default/account/email/confirm.html.tmpl2
-rw-r--r--template/en/default/account/email/request-new.txt.tmpl2
-rw-r--r--template/en/default/account/password/forgotten-password.txt.tmpl2
-rw-r--r--template/en/default/account/prefs/apikey.html.tmpl18
-rw-r--r--template/en/default/account/prefs/email.html.tmpl36
-rw-r--r--template/en/default/account/prefs/permissions.html.tmpl2
-rw-r--r--template/en/default/account/prefs/prefs.html.tmpl6
-rw-r--r--template/en/default/account/prefs/saved-searches.html.tmpl12
-rw-r--r--template/en/default/account/profile-activity.html.tmpl4
-rw-r--r--template/en/default/admin/classifications/add.html.tmpl4
-rw-r--r--template/en/default/admin/classifications/del.html.tmpl4
-rw-r--r--template/en/default/admin/classifications/edit-common.html.tmpl2
-rw-r--r--template/en/default/admin/classifications/edit.html.tmpl6
-rw-r--r--template/en/default/admin/classifications/select.html.tmpl4
-rw-r--r--template/en/default/admin/components/confirm-delete.html.tmpl22
-rw-r--r--template/en/default/admin/components/create.html.tmpl4
-rw-r--r--template/en/default/admin/components/edit.html.tmpl4
-rw-r--r--template/en/default/admin/components/footer.html.tmpl16
-rw-r--r--template/en/default/admin/components/list.html.tmpl8
-rw-r--r--template/en/default/admin/components/select-product.html.tmpl8
-rw-r--r--template/en/default/admin/custom_fields/cf-js.js.tmpl2
-rw-r--r--template/en/default/admin/custom_fields/create.html.tmpl2
-rw-r--r--template/en/default/admin/custom_fields/edit.html.tmpl10
-rw-r--r--template/en/default/admin/custom_fields/list.html.tmpl2
-rw-r--r--template/en/default/admin/fieldvalues/confirm-delete.html.tmpl14
-rw-r--r--template/en/default/admin/fieldvalues/create.html.tmpl8
-rw-r--r--template/en/default/admin/fieldvalues/edit.html.tmpl8
-rw-r--r--template/en/default/admin/fieldvalues/footer.html.tmpl4
-rw-r--r--template/en/default/admin/fieldvalues/list.html.tmpl6
-rw-r--r--template/en/default/admin/fieldvalues/select-field.html.tmpl4
-rw-r--r--template/en/default/admin/flag-type/edit.html.tmpl6
-rw-r--r--template/en/default/admin/groups/confirm-remove.html.tmpl10
-rw-r--r--template/en/default/admin/groups/create.html.tmpl12
-rw-r--r--template/en/default/admin/groups/delete.html.tmpl14
-rw-r--r--template/en/default/admin/groups/edit.html.tmpl28
-rw-r--r--template/en/default/admin/groups/list.html.tmpl4
-rw-r--r--template/en/default/admin/keywords/confirm-delete.html.tmpl4
-rw-r--r--template/en/default/admin/keywords/create.html.tmpl2
-rw-r--r--template/en/default/admin/milestones/confirm-delete.html.tmpl10
-rw-r--r--template/en/default/admin/milestones/create.html.tmpl2
-rw-r--r--template/en/default/admin/milestones/footer.html.tmpl8
-rw-r--r--template/en/default/admin/milestones/list.html.tmpl8
-rw-r--r--template/en/default/admin/milestones/select-product.html.tmpl8
-rw-r--r--template/en/default/admin/params/bugchange.html.tmpl2
-rw-r--r--template/en/default/admin/params/bugfields.html.tmpl2
-rw-r--r--template/en/default/admin/params/common.html.tmpl2
-rw-r--r--template/en/default/admin/params/general.html.tmpl16
-rw-r--r--template/en/default/admin/params/groupsecurity.html.tmpl4
-rw-r--r--template/en/default/admin/params/index.html.tmpl2
-rw-r--r--template/en/default/admin/params/reports.html.tmpl20
-rw-r--r--template/en/default/admin/params/usermatch.html.tmpl2
-rw-r--r--template/en/default/admin/products/confirm-delete.html.tmpl2
-rw-r--r--template/en/default/admin/products/create.html.tmpl6
-rw-r--r--template/en/default/admin/products/edit-common.html.tmpl6
-rw-r--r--template/en/default/admin/products/edit.html.tmpl10
-rw-r--r--template/en/default/admin/products/footer.html.tmpl10
-rw-r--r--template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl2
-rw-r--r--template/en/default/admin/products/groupcontrol/edit.html.tmpl4
-rw-r--r--template/en/default/admin/products/groupcontrol/updated.html.tmpl4
-rw-r--r--template/en/default/admin/products/list-classifications.html.tmpl6
-rw-r--r--template/en/default/admin/products/list.html.tmpl12
-rw-r--r--template/en/default/admin/products/updated.html.tmpl14
-rw-r--r--template/en/default/admin/settings/edit.html.tmpl2
-rw-r--r--template/en/default/admin/sudo.html.tmpl36
-rw-r--r--template/en/default/admin/table.html.tmpl20
-rw-r--r--template/en/default/admin/users/search.html.tmpl2
-rw-r--r--template/en/default/admin/users/userdata.html.tmpl2
-rw-r--r--template/en/default/admin/versions/confirm-delete.html.tmpl14
-rw-r--r--template/en/default/admin/versions/create.html.tmpl2
-rw-r--r--template/en/default/admin/versions/footer.html.tmpl8
-rw-r--r--template/en/default/admin/versions/list.html.tmpl2
-rw-r--r--template/en/default/admin/versions/select-product.html.tmpl8
-rw-r--r--template/en/default/attachment/create.html.tmpl1
-rw-r--r--template/en/default/attachment/diff-file.html.tmpl4
-rw-r--r--template/en/default/attachment/diff-footer.html.tmpl2
-rw-r--r--template/en/default/attachment/edit.html.tmpl28
-rw-r--r--template/en/default/bug/create/comment-guided.txt.tmpl7
-rw-r--r--template/en/default/bug/create/create-guided.html.tmpl55
-rw-r--r--template/en/default/bug/create/user-message.html.tmpl4
-rw-r--r--template/en/default/bug/dependency-tree.html.tmpl30
-rw-r--r--template/en/default/bug/edit.html.tmpl195
-rw-r--r--template/en/default/bug/field-events.js.tmpl2
-rw-r--r--template/en/default/bug/field-help.none.tmpl18
-rw-r--r--template/en/default/bug/field-label.html.tmpl2
-rw-r--r--template/en/default/bug/field.html.tmpl24
-rw-r--r--template/en/default/bug/format_comment.txt.tmpl2
-rw-r--r--template/en/default/bug/knob.html.tmpl4
-rw-r--r--template/en/default/bug/link.html.tmpl4
-rw-r--r--template/en/default/bug/new_bug.html.tmpl4
-rw-r--r--template/en/default/bug/process/midair.html.tmpl4
-rw-r--r--template/en/default/bug/process/verify-new-product.html.tmpl20
-rw-r--r--template/en/default/bug/show-multiple.html.tmpl10
-rw-r--r--template/en/default/bug/show.xml.tmpl10
-rw-r--r--template/en/default/bug/summarize-time.html.tmpl20
-rw-r--r--template/en/default/config.js.tmpl6
-rw-r--r--template/en/default/email/bugmail-common.txt.tmpl3
-rw-r--r--template/en/default/email/bugmail-header.txt.tmpl2
-rw-r--r--template/en/default/email/bugmail.html.tmpl2
-rw-r--r--template/en/default/email/lockout.txt.tmpl2
-rw-r--r--template/en/default/email/new-api-key.txt.tmpl5
-rw-r--r--template/en/default/email/sudo.txt.tmpl6
-rw-r--r--template/en/default/email/whine.txt.tmpl4
-rw-r--r--template/en/default/extensions/extension.pm.tmpl2
-rw-r--r--template/en/default/extensions/hook-readme.txt.tmpl2
-rw-r--r--template/en/default/extensions/name-readme.txt.tmpl2
-rw-r--r--template/en/default/extensions/util.pm.tmpl4
-rw-r--r--template/en/default/flag/list.html.tmpl1
-rw-r--r--template/en/default/global/choose-classification.html.tmpl4
-rw-r--r--template/en/default/global/choose-product.html.tmpl2
-rw-r--r--template/en/default/global/code-error.html.tmpl16
-rw-r--r--template/en/default/global/confirm-user-match.html.tmpl2
-rw-r--r--template/en/default/global/header.html.tmpl66
-rw-r--r--template/en/default/global/reason-descs.none.tmpl2
-rw-r--r--template/en/default/global/select-menu.html.tmpl14
-rw-r--r--template/en/default/global/user-error.html.tmpl18
-rw-r--r--template/en/default/global/user.html.tmpl2
-rw-r--r--template/en/default/global/value-descs.js.tmpl2
-rw-r--r--template/en/default/global/value-descs.none.tmpl2
-rw-r--r--template/en/default/global/variables.none.tmpl8
-rw-r--r--template/en/default/index.html.tmpl61
-rw-r--r--template/en/default/list/change-columns.html.tmpl12
-rw-r--r--template/en/default/list/edit-multiple.html.tmpl20
-rw-r--r--template/en/default/list/list.atom.tmpl2
-rw-r--r--template/en/default/list/list.html.tmpl34
-rw-r--r--template/en/default/list/list.rdf.tmpl10
-rw-r--r--template/en/default/list/quips.html.tmpl4
-rw-r--r--template/en/default/list/table.html.tmpl52
-rw-r--r--template/en/default/pages/bug-writing.html.tmpl44
-rw-r--r--template/en/default/pages/bugzilla.dtd.tmpl86
-rw-r--r--template/en/default/pages/linked.html.tmpl2
-rw-r--r--template/en/default/pages/quicksearch.html.tmpl30
-rw-r--r--template/en/default/pages/release-notes.html.tmpl62
-rw-r--r--template/en/default/pages/release-notes3.html.tmpl1362
-rw-r--r--template/en/default/pages/sudo.html.tmpl28
-rw-r--r--template/en/default/reports/chart.csv.tmpl6
-rw-r--r--template/en/default/reports/chart.html.tmpl14
-rw-r--r--template/en/default/reports/chart.png.tmpl12
-rw-r--r--template/en/default/reports/create-chart.html.tmpl42
-rw-r--r--template/en/default/reports/duplicates-table.html.tmpl8
-rw-r--r--template/en/default/reports/duplicates.html.tmpl10
-rw-r--r--template/en/default/reports/edit-series.html.tmpl12
-rw-r--r--template/en/default/reports/email/security-risk.html.tmpl95
-rw-r--r--template/en/default/reports/report-line.png.tmpl2
-rw-r--r--template/en/default/reports/report-pie.png.tmpl4
-rw-r--r--template/en/default/reports/report-table.html.tmpl18
-rw-r--r--template/en/default/reports/report.csv.tmpl4
-rw-r--r--template/en/default/reports/report.html.tmpl34
-rw-r--r--template/en/default/reports/series-common.html.tmpl30
-rw-r--r--template/en/default/reports/series.html.tmpl14
-rw-r--r--template/en/default/request/queue.html.tmpl8
-rw-r--r--template/en/default/search/field.html.tmpl38
-rw-r--r--template/en/default/search/form.html.tmpl108
-rw-r--r--template/en/default/search/knob.html.tmpl10
-rw-r--r--template/en/default/search/search-create-series.html.tmpl14
-rw-r--r--template/en/default/search/search-instant.html.tmpl7
-rw-r--r--template/en/default/search/search-report-graph.html.tmpl2
-rw-r--r--template/en/default/search/search-report-select.html.tmpl4
-rw-r--r--template/en/default/search/search-report-table.html.tmpl2
-rw-r--r--template/en/default/search/search-specific.html.tmpl8
-rw-r--r--template/en/default/search/tabs.html.tmpl4
-rw-r--r--template/en/default/search/type-select.html.tmpl4
-rw-r--r--template/en/default/whine/mail.html.tmpl2
-rw-r--r--template/en/default/whine/schedule.html.tmpl4
-rwxr-xr-xtestagent.cgi26
-rwxr-xr-xvagrant_support/bugzilla-push6
-rw-r--r--vagrant_support/postfix/main.cf54
-rwxr-xr-xxmlrpc.cgi40
428 files changed, 5359 insertions, 5835 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
index f64524c80..061ed9903 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -7,7 +7,7 @@ version: 2
defaults:
bmo_slim_image: &bmo_slim_image
- image: mozillabteam/bmo-slim:20180809.1
+ image: mozillabteam/bmo-slim:20181011.1
user: app
mysql_image: &mysql_image
diff --git a/.editorconfig b/.editorconfig
index 2d527a250..ddd559494 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -5,10 +5,10 @@ root = true
end_of_line = lf
insert_final_newline = true
-# 4 space indentation for Perl files
-[*.{pl,PL,pm,cgi}]
+# 2 space indentation for Perl files
+[*.{pl,PL,pm,cgi,t}]
indent_style = space
-indent_size = 4
+indent_size = 2
# 2 space indentation for HTML, CSS, JavaScript and YAML files
[.{html,tmpl,css,js,yml}]
diff --git a/.perltidyrc b/.perltidyrc
index 25f9ef626..f15324190 100644
--- a/.perltidyrc
+++ b/.perltidyrc
@@ -1,3 +1,13 @@
---perl-best-practices
---brace-vertical-tightness=0 # always break after {
---maximum-line-length=120 # max line length is 120
+-pbp # Start with Perl Best Practices
+-w # Show all warnings
+-iob # Ignore old breakpoints
+-l=80 # 80 characters per line
+-mbl=2 # No more than 2 blank lines
+-i=2 # Indentation is 2 columns
+-ci=2 # Continuation indentation is 2 columns
+-vt=0 # Less vertical tightness
+-pt=2 # High parenthesis tightness
+-bt=2 # High brace tightness
+-sbt=2 # High square bracket tightness
+-wn # Weld nested containers
+-isbc # Don't indent comments without leading space
diff --git a/Bugzilla.pm b/Bugzilla.pm
index 3ba535c8e..1ea1e59a3 100644
--- a/Bugzilla.pm
+++ b/Bugzilla.pm
@@ -13,7 +13,7 @@ use warnings;
use Bugzilla::Logging;
-our $VERSION = '5.16';
+our $VERSION = '20181010.1';
use Bugzilla::Auth;
use Bugzilla::Auth::Persist::Cookie;
@@ -29,8 +29,6 @@ use Bugzilla::Flag;
use Bugzilla::Hook;
use Bugzilla::Install::Localconfig qw(read_localconfig);
use Bugzilla::Install::Util qw(init_console include_languages);
-use Bugzilla::Markdown::GFM;
-use Bugzilla::Markdown::GFM::Parser;
use Bugzilla::Memcached;
use Bugzilla::Template;
use Bugzilla::Token;
@@ -55,23 +53,6 @@ use parent qw(Bugzilla::CPAN);
# Constants
#####################################################################
-# Scripts that are not stopped by shutdownhtml being in effect.
-use constant SHUTDOWNHTML_EXEMPT => qw(
- editparams.cgi
- checksetup.pl
- migrate.pl
- recode.pl
-);
-
-# Non-cgi scripts that should silently exit.
-use constant SHUTDOWNHTML_EXIT_SILENTLY => qw(
- whine.pl
-);
-
-# shutdownhtml pages are sent as an HTTP 503. After how many seconds
-# should search engines attempt to index the page again?
-use constant SHUTDOWNHTML_RETRY_AFTER => 3600;
-
# This is identical to Install::Util::_cache so that things loaded
# into Install::Util::_cache during installation can be read out
# of request_cache later in installation.
@@ -87,9 +68,6 @@ sub init_page {
# request cache are very annoying (see bug 1347335)
# and this is not an expensive operation.
clear_request_cache();
- if ($0 =~ /\.t/) {
- return;
- }
if (Bugzilla->usage_mode == USAGE_MODE_CMDLINE) {
init_console();
}
@@ -101,14 +79,6 @@ sub init_page {
Bugzilla::Logging->fields->{remote_ip} = remote_ip();
}
- if (${^TAINT}) {
- # Some environment variables are not taint safe
- delete @::ENV{'PATH', 'IFS', 'CDPATH', 'ENV', 'BASH_ENV'};
- # Some modules throw undefined errors (notably File::Spec::Win32) if
- # PATH is undefined.
- $ENV{'PATH'} = '';
- }
-
# Because this function is run live from perl "use" commands of
# other scripts, we're skipping the rest of this function if we get here
# during a perl syntax check (perl -c, like we do during the
@@ -121,63 +91,6 @@ sub init_page {
if ($script ne 'attachment.cgi') {
do_ssl_redirect_if_required();
}
-
- # If Bugzilla is shut down, do not allow anything to run, just display a
- # message to the user about the downtime and log out. Scripts listed in
- # SHUTDOWNHTML_EXEMPT are exempt from this message.
- #
- # This code must go here. It cannot go anywhere in Bugzilla::CGI, because
- # it uses Template, and that causes various dependency loops.
- if (Bugzilla->params->{"shutdownhtml"}
- && !grep { $_ eq $script } SHUTDOWNHTML_EXEMPT)
- {
- # Allow non-cgi scripts to exit silently (without displaying any
- # message), if desired. At this point, no DBI call has been made
- # yet, and no error will be returned if the DB is inaccessible.
- if (!i_am_cgi()
- && grep { $_ eq $script } SHUTDOWNHTML_EXIT_SILENTLY)
- {
- exit;
- }
-
- # For security reasons, log out users when Bugzilla is down.
- # Bugzilla->login() is required to catch the logincookie, if any.
- my $user;
- eval { $user = Bugzilla->login(LOGIN_OPTIONAL); };
- if ($@) {
- # The DB is not accessible. Use the default user object.
- $user = Bugzilla->user;
- $user->{settings} = {};
- }
- my $userid = $user->id;
- Bugzilla->logout();
-
- my $template = Bugzilla->template;
- my $vars = {};
- $vars->{'message'} = 'shutdown';
- $vars->{'userid'} = $userid;
- # Generate and return a message about the downtime, appropriately
- # for if we're a command-line script or a CGI script.
- my $extension;
- if (i_am_cgi() && (!Bugzilla->cgi->param('ctype')
- || Bugzilla->cgi->param('ctype') eq 'html')) {
- $extension = 'html';
- }
- else {
- $extension = 'txt';
- }
- if (i_am_cgi()) {
- # Set the HTTP status to 503 when Bugzilla is down to avoid pages
- # being indexed by search engines.
- print Bugzilla->cgi->header(-status => 503,
- -retry_after => SHUTDOWNHTML_RETRY_AFTER);
- }
- my $t_output;
- $template->process("global/message.$extension.tmpl", $vars, \$t_output)
- || ThrowTemplateError($template->error);
- print $t_output . "\n";
- exit;
- }
}
#####################################################################
@@ -595,6 +508,9 @@ sub usage_mode {
elsif ($newval == USAGE_MODE_REST) {
$class->error_mode(ERROR_MODE_REST);
}
+ elsif ($newval == USAGE_MODE_MOJO) {
+ $class->error_mode(ERROR_MODE_MOJO);
+ }
else {
ThrowCodeError('usage_mode_invalid',
{'invalid_usage_mode', $newval});
@@ -859,6 +775,8 @@ sub check_rate_limit {
}
sub markdown_parser {
+ require Bugzilla::Markdown::GFM;
+ require Bugzilla::Markdown::GFM::Parser;
return request_cache->{markdown_parser}
||= Bugzilla::Markdown::GFM::Parser->new( {extensions => [qw( autolink tagfilter table strikethrough)] } );
}
@@ -883,21 +801,15 @@ sub _cleanup {
}
clear_request_cache();
- # These are both set by CGI.pm but need to be undone so that
- # Apache can actually shut down its children if it needs to.
- foreach my $signal (qw(TERM PIPE)) {
- $SIG{$signal} = 'DEFAULT' if $SIG{$signal} && $SIG{$signal} eq 'IGNORE';
- }
-
Log::Log4perl::MDC->remove();
}
-sub END {
- # Bugzilla.pm cannot compile in mod_perl.pl if this runs.
- _cleanup() unless BZ_PERSISTENT;
-}
+our ($caller_package, $caller_file) = caller;
+init_page() if $caller_package eq 'main' && $caller_package !~ /^Test/ && $caller_file =~ /\.t$/;
-init_page() unless BZ_PERSISTENT;
+END {
+ cleanup() if $caller_package eq 'main';
+}
1;
diff --git a/Bugzilla/BugUrl.pm b/Bugzilla/BugUrl.pm
index 4724ae71a..a824d286d 100644
--- a/Bugzilla/BugUrl.pm
+++ b/Bugzilla/BugUrl.pm
@@ -16,6 +16,7 @@ use base qw(Bugzilla::Object);
use Bugzilla::Util;
use Bugzilla::Error;
use Bugzilla::Constants;
+use Module::Runtime qw(require_module);
use URI::QueryParam;
@@ -113,7 +114,7 @@ sub _do_list_select {
my $objects = $class->SUPER::_do_list_select(@_);
foreach my $object (@$objects) {
- eval "use " . $object->class; die $@ if $@;
+ require_module($object->class);
bless $object, $object->class;
}
@@ -133,8 +134,7 @@ sub class_for {
my $uri = URI->new($value);
foreach my $subclass ($class->SUB_CLASSES) {
- eval "use $subclass";
- die $@ if $@;
+ require_module($subclass);
return wantarray ? ($subclass, $uri) : $subclass
if $subclass->should_handle($uri);
}
@@ -145,7 +145,7 @@ sub class_for {
sub _check_class {
my ($class, $subclass) = @_;
- eval "use $subclass"; die $@ if $@;
+ require_module($subclass);
return $subclass;
}
diff --git a/Bugzilla/CGI.pm b/Bugzilla/CGI.pm
index 2cbb02e3e..4be384b67 100644
--- a/Bugzilla/CGI.pm
+++ b/Bugzilla/CGI.pm
@@ -89,12 +89,6 @@ sub SHOW_BUG_MODAL_CSP {
push @{ $policy{img_src} }, $attach_base;
}
- # MozReview API calls
- my $mozreview_url = Bugzilla->params->{mozreview_base_url};
- if ($mozreview_url) {
- push @{ $policy{connect_src} }, $mozreview_url . 'api/extensions/mozreview.extension.MozReviewExtension/summary/';
- }
-
return %policy;
}
@@ -103,12 +97,6 @@ sub _init_bz_cgi_globals {
# We need to disable output buffering - see bug 179174
$| = 1;
- # Ignore SIGTERM and SIGPIPE - this prevents DB corruption. If the user closes
- # their browser window while a script is running, the web server sends these
- # signals, and we don't want to die half way through a write.
- $SIG{TERM} = 'IGNORE';
- $SIG{PIPE} = 'IGNORE';
-
# We don't precompile any functions here, that's done specially in
# mod_perl code.
$invocant->_setup_symbols(qw(:no_xhtml :oldstyle_urls :private_tempfiles
diff --git a/Bugzilla/Config.pm b/Bugzilla/Config.pm
index 85779fa6b..1016d51e4 100644
--- a/Bugzilla/Config.pm
+++ b/Bugzilla/Config.pm
@@ -16,6 +16,7 @@ use Bugzilla::Constants;
use Bugzilla::Hook;
use Data::Dumper;
use File::Temp;
+use Module::Runtime qw(require_module);
# Don't export localvars by default - people should have to explicitly
# ask for it, as a (probably futile) attempt to stop code using it
@@ -35,7 +36,7 @@ sub _load_params {
my %hook_panels;
foreach my $panel (keys %$panels) {
my $module = $panels->{$panel};
- eval("require $module") || die $@;
+ require_module($module);
my @new_param_list = $module->get_param_list();
$hook_panels{lc($panel)} = { params => \@new_param_list };
}
diff --git a/extensions/Persona/lib/Config.pm b/Bugzilla/Config/Reports.pm
index ae40fd94a..26c5aad57 100644
--- a/extensions/Persona/lib/Config.pm
+++ b/Bugzilla/Config/Reports.pm
@@ -5,7 +5,7 @@
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
-package Bugzilla::Extension::Persona::Config;
+package Bugzilla::Config::Reports;
use 5.10.1;
use strict;
@@ -13,30 +13,25 @@ use warnings;
use Bugzilla::Config::Common;
-our $sortkey = 1350;
+our $sortkey = 1100;
sub get_param_list {
- my ($class) = @_;
-
+ my $class = shift;
my @param_list = (
{
- name => 'persona_verify_url',
- type => 't',
- default => 'https://verifier.login.persona.org/verify',
+ name => 'report_secbugs_active',
+ type => 'b',
+ default => 1,
},
{
- name => 'persona_includejs_url',
+ name => 'report_secbugs_emails',
type => 't',
- default => 'https://login.persona.org/include.js',
+ default => 'bugzilla-admin@mozilla.org'
},
{
- name => 'persona_proxy_url',
- type => 't',
- default => '',
+ name => 'report_secbugs_products',
+ type => 'l',
+ default => '[]'
},
- );
-
- return @param_list;
+ );
}
-
-1;
diff --git a/Bugzilla/Constants.pm b/Bugzilla/Constants.pm
index 34e4a4cfe..cd478c33e 100644
--- a/Bugzilla/Constants.pm
+++ b/Bugzilla/Constants.pm
@@ -131,6 +131,7 @@ use Memoize;
USAGE_MODE_JSON
USAGE_MODE_TEST
USAGE_MODE_REST
+ USAGE_MODE_MOJO
ERROR_MODE_WEBPAGE
ERROR_MODE_DIE
@@ -138,6 +139,7 @@ use Memoize;
ERROR_MODE_JSON_RPC
ERROR_MODE_TEST
ERROR_MODE_REST
+ ERROR_MODE_MOJO
COLOR_ERROR
COLOR_SUCCESS
@@ -212,7 +214,7 @@ sub BUGZILLA_VERSION {
}
# Location of the remote and local XML files to track new releases.
-use constant REMOTE_FILE => 'http://updates.bugzilla.org/bugzilla-update.xml';
+use constant REMOTE_FILE => 'https://updates.bugzilla.org/bugzilla-update.xml';
use constant LOCAL_FILE => 'bugzilla-update.xml'; # Relative to datadir.
# These are unique values that are unlikely to match a string or a number,
@@ -490,6 +492,7 @@ use constant USAGE_MODE_EMAIL => 3;
use constant USAGE_MODE_JSON => 4;
use constant USAGE_MODE_TEST => 5;
use constant USAGE_MODE_REST => 6;
+use constant USAGE_MODE_MOJO => 7;
# Error modes. Default set by Bugzilla->usage_mode (so ERROR_MODE_WEBPAGE
# usually). Use with Bugzilla->error_mode.
@@ -499,6 +502,7 @@ use constant ERROR_MODE_DIE_SOAP_FAULT => 2;
use constant ERROR_MODE_JSON_RPC => 3;
use constant ERROR_MODE_TEST => 4;
use constant ERROR_MODE_REST => 5;
+use constant ERROR_MODE_MOJO => 6;
# The ANSI colors of messages that command-line scripts use
use constant COLOR_ERROR => 'red';
diff --git a/Bugzilla/DB.pm b/Bugzilla/DB.pm
index 80404131a..87110aaaa 100644
--- a/Bugzilla/DB.pm
+++ b/Bugzilla/DB.pm
@@ -12,19 +12,13 @@ use Moo;
use DBI;
use DBIx::Connector;
-our %Connector;
-has 'dbh' => (
+has 'connector' => (
is => 'lazy',
- handles => [
- qw[
- begin_work column_info commit disconnect do errstr get_info last_insert_id ping prepare
- primary_key quote_identifier rollback selectall_arrayref selectall_hashref
- selectcol_arrayref selectrow_array selectrow_arrayref selectrow_hashref table_info
- ]
- ],
+ handles => [ qw( dbh ) ],
);
+use Bugzilla::Logging;
use Bugzilla::Constants;
use Bugzilla::Install::Requirements;
use Bugzilla::Install::Util qw(install_string);
@@ -37,13 +31,39 @@ use Bugzilla::DB::Schema;
use Bugzilla::Version;
use List::Util qw(max);
+use Scalar::Util qw(weaken);
use Storable qw(dclone);
+use English qw(-no_match_vars);
+use Module::Runtime qw(require_module);
has [qw(dsn user pass attrs)] => (
is => 'ro',
required => 1,
);
+
+# Install proxy methods to the DBI object.
+# We can't use handles() as DBIx::Connector->dbh has to be called each
+# time we need a DBI handle to ensure the connection is alive.
+{
+ my @DBI_METHODS = qw(
+ begin_work column_info commit do errstr get_info last_insert_id ping prepare
+ primary_key quote_identifier rollback selectall_arrayref selectall_hashref
+ selectcol_arrayref selectrow_array selectrow_arrayref selectrow_hashref table_info
+ );
+ my $stash = Package::Stash->new(__PACKAGE__);
+
+ foreach my $method (@DBI_METHODS) {
+ my $symbol = '&' . $method;
+ $stash->add_symbol(
+ $symbol => sub {
+ my $self = shift;
+ return $self->dbh->$method(@_);
+ }
+ );
+ }
+}
+
#####################################################################
# Constants
#####################################################################
@@ -113,6 +133,12 @@ sub quote {
#####################################################################
sub connect_shadow {
+ state $shadow_dbh;
+ if ($shadow_dbh && $shadow_dbh->bz_in_transaction) {
+ FATAL("Somehow in a transaction at connection time");
+ $shadow_dbh->bz_rollback_transaction();
+ }
+ return $shadow_dbh if $shadow_dbh;
my $params = Bugzilla->params;
die "Tried to connect to non-existent shadowdb"
unless Bugzilla->get_param_with_override('shadowdb');
@@ -130,13 +156,16 @@ sub connect_shadow {
$connect_params->{db_user} = Bugzilla->localconfig->{'shadowdb_user'};
$connect_params->{db_pass} = Bugzilla->localconfig->{'shadowdb_pass'};
}
-
- return _connect($connect_params);
+ return $shadow_dbh = _connect($connect_params);
}
sub connect_main {
- my $lc = Bugzilla->localconfig;
- return _connect(Bugzilla->localconfig);
+ state $main_dbh = _connect(Bugzilla->localconfig);
+ if ($main_dbh->bz_in_transaction) {
+ FATAL("Somehow in a transaction at connection time");
+ $main_dbh->bz_rollback_transaction();
+ }
+ return $main_dbh;
}
sub _connect {
@@ -146,15 +175,13 @@ sub _connect {
my $pkg_module = DB_MODULE->{lc($driver)}->{db};
# do the actual import
- eval ("require $pkg_module")
+ eval { require_module($pkg_module) }
|| die ("'$driver' is not a valid choice for \$db_driver in "
. " localconfig: " . $@);
# instantiate the correct DB specific module
- my $dbh = $pkg_module->new($params);
-
- return $dbh;
+ return $pkg_module->new($params);
}
sub _handle_error {
@@ -278,7 +305,6 @@ sub _get_no_db_connection {
my $dbh;
my %connect_params = %{ Bugzilla->localconfig };
$connect_params{db_name} = '';
- local %Connector = ();
my $conn_success = eval {
$dbh = _connect(\%connect_params);
};
@@ -1263,7 +1289,7 @@ sub bz_rollback_transaction {
# Subclass Helpers
#####################################################################
-sub _build_dbh {
+sub _build_connector {
my ($self) = @_;
my ($dsn, $user, $pass, $override_attrs) =
map { $self->$_ } qw(dsn user pass attrs);
@@ -1289,15 +1315,18 @@ sub _build_dbh {
}
}
my $class = ref $self;
- if ($class->can('on_dbi_connected')) {
- $attributes->{Callbacks} = {
- connected => sub { $class->on_dbi_connected(@_); return },
- }
- }
-
- my $connector = $Connector{"$user.$dsn"} //= DBIx::Connector->new($dsn, $user, $pass, $attributes);
+ weaken($self);
+ $attributes->{Callbacks} = {
+ connected => sub {
+ my ($dbh, $dsn) = @_;
+ INFO("$PROGRAM_NAME connected mysql $dsn");
+ ThrowCodeError('not_in_transaction') if $self && $self->bz_in_transaction;
+ $class->on_dbi_connected(@_) if $class->can('on_dbi_connected');
+ return
+ },
+ };
- return $connector->dbh;
+ return DBIx::Connector->new($dsn, $user, $pass, $attributes);
}
#####################################################################
diff --git a/Bugzilla/DB/Schema.pm b/Bugzilla/DB/Schema.pm
index 67ee9071c..e1c19fa51 100644
--- a/Bugzilla/DB/Schema.pm
+++ b/Bugzilla/DB/Schema.pm
@@ -28,6 +28,8 @@ use Carp qw(confess);
use Digest::MD5 qw(md5_hex);
use Hash::Util qw(lock_value unlock_hash lock_keys unlock_keys);
use List::MoreUtils qw(firstidx natatime);
+use Try::Tiny;
+use Module::Runtime qw(require_module);
use Safe;
# Historical, needed for SCHEMA_VERSION = '1.00'
use Storable qw(dclone freeze thaw);
@@ -1876,9 +1878,12 @@ sub new {
if ($driver) {
(my $subclass = $driver) =~ s/^(\S)/\U$1/;
$class .= '::' . $subclass;
- eval "require $class;";
- die "The $class class could not be found ($subclass " .
- "not supported?): $@" if ($@);
+ try {
+ require_module($class);
+ }
+ catch {
+ die "The $class class could not be found ($subclass not supported?): $_";
+ };
}
die "$class is an abstract base class. Instantiate a subclass instead."
if ($class eq __PACKAGE__);
diff --git a/Bugzilla/Error.pm b/Bugzilla/Error.pm
index f932294b0..70430d40d 100644
--- a/Bugzilla/Error.pm
+++ b/Bugzilla/Error.pm
@@ -20,6 +20,8 @@ our @EXPORT = qw( ThrowCodeError ThrowTemplateError ThrowUserError ThrowErrorPag
use Bugzilla::Constants;
use Bugzilla::WebService::Constants;
use Bugzilla::Util;
+use Bugzilla::Error::User;
+use Bugzilla::Error::Code;
use Carp;
use Data::Dumper;
@@ -40,7 +42,6 @@ sub _in_eval {
sub _throw_error {
my ($name, $error, $vars, $logfunc) = @_;
$vars ||= {};
- $vars->{error} = $error;
# Make sure any transaction is rolled back (if supported).
# If we are within an eval(), do not roll back transactions as we are
@@ -48,6 +49,15 @@ sub _throw_error {
my $dbh = eval { Bugzilla->dbh };
$dbh->bz_rollback_transaction() if ($dbh && $dbh->bz_in_transaction() && !_in_eval());
+ if (Bugzilla->error_mode == ERROR_MODE_MOJO) {
+ my ($type) = $name =~ /^global\/(user|code)-error/;
+ my $class = $type ? 'Bugzilla::Error::' . ucfirst($type) : 'Mojo::Exception';
+ my $e = $class->new($error)->trace(2);
+ $e->vars($vars) if $e->can('vars');
+ CORE::die $e->inspect;
+ }
+
+ $vars->{error} = $error;
my $template = Bugzilla->template;
my $message;
diff --git a/extensions/Persona/Config.pm b/Bugzilla/Error/Base.pm
index fa878bb05..ea44c272a 100644
--- a/extensions/Persona/Config.pm
+++ b/Bugzilla/Error/Base.pm
@@ -5,23 +5,17 @@
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
-package Bugzilla::Extension::Persona;
+package Bugzilla::Error::Base;
use 5.10.1;
-use strict;
-use warnings;
+use Mojo::Base 'Mojo::Exception';
-use constant NAME => 'Persona';
+has 'vars' => sub { {} };
-use constant REQUIRED_MODULES => [
- {
- package => 'JSON',
- module => 'JSON',
- version => 0,
- },
-];
+has 'template' => sub {
+ my $self = shift;
+ my $type = lc( (split(/::/, ref $self))[-1] );
+ return "global/$type-error";
+};
-use constant OPTIONAL_MODULES => [
-];
-
-__PACKAGE__->NAME;
+1;
diff --git a/extensions/MozReview/Config.pm b/Bugzilla/Error/Code.pm
index 34d98907c..27393fd17 100644
--- a/extensions/MozReview/Config.pm
+++ b/Bugzilla/Error/Code.pm
@@ -5,12 +5,10 @@
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
-package Bugzilla::Extension::MozReview;
+package Bugzilla::Error::Code;
use 5.10.1;
-use strict;
-use warnings;
+use Mojo::Base 'Bugzilla::Error::Base';
-use constant NAME => 'MozReview';
-__PACKAGE__->NAME;
+1;
diff --git a/Bugzilla/Error/User.pm b/Bugzilla/Error/User.pm
new file mode 100644
index 000000000..aa87c9752
--- /dev/null
+++ b/Bugzilla/Error/User.pm
@@ -0,0 +1,13 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::Error::User;
+
+use 5.10.1;
+use Mojo::Base 'Bugzilla::Error::Base';
+
+1;
diff --git a/extensions/MozReview/disabled b/Bugzilla/Error/disabled
index e69de29bb..e69de29bb 100644
--- a/extensions/MozReview/disabled
+++ b/Bugzilla/Error/disabled
diff --git a/Bugzilla/Install/Requirements.pm b/Bugzilla/Install/Requirements.pm
index c4813abde..beed721f3 100644
--- a/Bugzilla/Install/Requirements.pm
+++ b/Bugzilla/Install/Requirements.pm
@@ -96,7 +96,6 @@ use constant FEATURE_FILES => (
patch_viewer => ['Bugzilla/Attachment/PatchReader.pm'],
updates => ['Bugzilla/Update.pm'],
mfa => ['Bugzilla/MFA/*.pm'],
- markdown => ['Bugzilla/Markdown.pm'],
memcached => ['Bugzilla/Memcache.pm'],
s3 => ['Bugzilla/S3.pm', 'Bugzilla/S3/Bucket.pm', 'Bugzilla/Attachment/S3.pm']
);
diff --git a/Bugzilla/Markdown/GFM.pm b/Bugzilla/Markdown/GFM.pm
index f3f24fc6a..367dc7a53 100644
--- a/Bugzilla/Markdown/GFM.pm
+++ b/Bugzilla/Markdown/GFM.pm
@@ -69,9 +69,9 @@ $FFI->attach(cmark_markdown_to_html => ['opaque', 'int', 'markdown_options_t'] =
);
# This has to happen after something from the main lib is loaded
-$FFI->attach('core_extensions_ensure_registered' => [] => 'void');
+$FFI->attach('cmark_gfm_core_extensions_ensure_registered' => [] => 'void');
-core_extensions_ensure_registered();
+cmark_gfm_core_extensions_ensure_registered();
Bugzilla::Markdown::GFM::SyntaxExtension->SETUP($FFI);
Bugzilla::Markdown::GFM::SyntaxExtensionList->SETUP($FFI);
diff --git a/Bugzilla/Quantum.pm b/Bugzilla/Quantum.pm
index 34d6fc45d..4fddb8da9 100644
--- a/Bugzilla/Quantum.pm
+++ b/Bugzilla/Quantum.pm
@@ -10,6 +10,8 @@ use Mojo::Base 'Mojolicious';
# Needed for its exit() overload, must happen early in execution.
use CGI::Compile;
+use utf8;
+use Encode;
use Bugzilla ();
use Bugzilla::BugMail ();
@@ -20,100 +22,125 @@ use Bugzilla::Install::Requirements ();
use Bugzilla::Logging;
use Bugzilla::Quantum::CGI;
use Bugzilla::Quantum::SES;
+use Bugzilla::Quantum::Home;
use Bugzilla::Quantum::Static;
use Mojo::Loader qw( find_modules );
use Module::Runtime qw( require_module );
use Bugzilla::Util ();
use Cwd qw(realpath);
use MojoX::Log::Log4perl::Tiny;
+use Bugzilla::WebService::Server::REST;
has 'static' => sub { Bugzilla::Quantum::Static->new };
sub startup {
- my ($self) = @_;
-
- DEBUG('Starting up');
- $self->plugin('Bugzilla::Quantum::Plugin::Glue');
- $self->plugin('Bugzilla::Quantum::Plugin::Hostage');
- $self->plugin('Bugzilla::Quantum::Plugin::BlockIP');
- $self->plugin('Bugzilla::Quantum::Plugin::BasicAuth');
-
- Bugzilla::Extension->load_all();
- if ( $self->mode ne 'development' ) {
- Bugzilla->preload_features();
- DEBUG('preloading templates');
- Bugzilla->preload_templates();
- DEBUG('done preloading templates');
- require_module($_) for find_modules('Bugzilla::User::Setting');
-
- $self->hook(
- after_static => sub {
- my ($c) = @_;
- $c->res->headers->cache_control('public, max-age=31536000');
- }
- );
- }
-
- my $r = $self->routes;
- Bugzilla::Quantum::CGI->load_all($r);
- Bugzilla::Quantum::CGI->load_one( 'bzapi_cgi', 'extensions/BzAPI/bin/rest.cgi' );
-
- Bugzilla::WebService::Server::REST->preload;
-
- $r->any('/')->to('CGI#index_cgi');
- $r->any('/bug/<id:num>')->to('CGI#show_bug_cgi');
- $r->any('/<id:num>')->to('CGI#show_bug_cgi');
-
- $r->any('/rest')->to('CGI#rest_cgi');
- $r->any('/rest.cgi/*PATH_INFO')->to( 'CGI#rest_cgi' => { PATH_INFO => '' } );
- $r->any('/rest/*PATH_INFO')->to( 'CGI#rest_cgi' => { PATH_INFO => '' } );
- $r->any('/bzapi')->to('CGI#bzapi_cgi');
- $r->any('/bzapi/*PATH_INFO')->to('CGI#bzapi_cgi');
- $r->any('/extensions/BzAPI/bin/rest.cgi/*PATH_INFO')->to('CGI#bzapi_cgi');
-
- $r->get(
- '/__lbheartbeat__' => sub {
- my $c = shift;
- $c->reply->file( $c->app->home->child('__lbheartbeat__') );
- },
- );
-
- $r->get(
- '/__version__' => sub {
- my $c = shift;
- $c->reply->file( $c->app->home->child('version.json') );
- },
+ my ($self) = @_;
+
+ DEBUG('Starting up');
+ $self->plugin('Bugzilla::Quantum::Plugin::Glue');
+ $self->plugin('Bugzilla::Quantum::Plugin::Hostage')
+ unless $ENV{BUGZILLA_DISABLE_HOSTAGE};
+ $self->plugin('Bugzilla::Quantum::Plugin::BlockIP');
+ $self->plugin('Bugzilla::Quantum::Plugin::Helpers');
+
+ # hypnotoad is weird and doesn't look for MOJO_LISTEN itself.
+ $self->config(
+ hypnotoad => {
+ proxy => $ENV{MOJO_REVERSE_PROXY} // 1,
+ heartbeat_interval => $ENV{MOJO_HEARTBEAT_INTERVAL} // 10,
+ heartbeat_timeout => $ENV{MOJO_HEARTBEAT_TIMEOUT} // 120,
+ inactivity_timeout => $ENV{MOJO_INACTIVITY_TIMEOUT} // 120,
+ workers => $ENV{MOJO_WORKERS} // 15,
+ clients => $ENV{MOJO_CLIENTS} // 10,
+ spare => $ENV{MOJO_SPARE} // 5,
+ listen => [$ENV{MOJO_LISTEN} // 'http://*:3000'],
+ },
+ );
+
+ # Make sure each httpd child receives a different random seed (bug 476622).
+ # Bugzilla::RNG has one srand that needs to be called for
+ # every process, and Perl has another. (Various Perl modules still use
+ # the built-in rand(), even though we never use it in Bugzilla itself,
+ # so we need to srand() both of them.)
+ # Also, ping the dbh to force a reconnection.
+ Mojo::IOLoop->next_tick(sub {
+ Bugzilla::RNG::srand();
+ srand();
+ eval { Bugzilla->dbh->ping };
+ });
+
+ Bugzilla::Extension->load_all();
+ if ($self->mode ne 'development') {
+ Bugzilla->preload_features();
+ DEBUG('preloading templates');
+ Bugzilla->preload_templates();
+ DEBUG('done preloading templates');
+ require_module($_) for find_modules('Bugzilla::User::Setting');
+
+ $self->hook(
+ after_static => sub {
+ my ($c) = @_;
+ $c->res->headers->cache_control('public, max-age=31536000');
+ }
);
+ }
+ Bugzilla::WebService::Server::REST->preload;
- $r->get(
- '/version.json' => sub {
- my $c = shift;
- $c->reply->file( $c->app->home->child('version.json') );
- },
- );
+ $self->setup_routes;
- $r->get('/__heartbeat__')->to('CGI#heartbeat_cgi');
- $r->get('/robots.txt')->to('CGI#robots_cgi');
-
- $r->any('/review')->to( 'CGI#page_cgi' => { 'id' => 'splinter.html' } );
- $r->any('/user_profile')->to( 'CGI#page_cgi' => { 'id' => 'user_profile.html' } );
- $r->any('/userprofile')->to( 'CGI#page_cgi' => { 'id' => 'user_profile.html' } );
- $r->any('/request_defer')->to( 'CGI#page_cgi' => { 'id' => 'request_defer.html' } );
- $r->any('/login')->to( 'CGI#index_cgi' => { 'GoAheadAndLogIn' => '1' } );
-
- $r->any( '/:new_bug' => [ new_bug => qr{new[-_]bug} ] )->to('CGI#new_bug_cgi');
-
- my $ses_auth = $r->under(
- '/ses' => sub {
- my ($c) = @_;
- my $lc = Bugzilla->localconfig;
-
- return $c->basic_auth( 'SES', $lc->{ses_username}, $lc->{ses_password} );
- }
- );
- $ses_auth->any('/index.cgi')->to('SES#main');
+ Bugzilla::Hook::process('app_startup', {app => $self});
+}
- Bugzilla::Hook::process( 'app_startup', { app => $self } );
+sub setup_routes {
+ my ($self) = @_;
+
+ my $r = $self->routes;
+ Bugzilla::Quantum::CGI->load_all($r);
+ Bugzilla::Quantum::CGI->load_one('bzapi_cgi',
+ 'extensions/BzAPI/bin/rest.cgi');
+
+ $r->get('/home')->to('Home#index');
+ $r->any('/')->to('CGI#index_cgi');
+ $r->any('/bug/<id:num>')->to('CGI#show_bug_cgi');
+ $r->any('/<id:num>')->to('CGI#show_bug_cgi');
+ $r->get(
+ '/testagent.cgi' => sub {
+ my $c = shift;
+ $c->render(text => "OK Mojolicious");
+ }
+ );
+
+ $r->any('/rest')->to('CGI#rest_cgi');
+ $r->any('/rest.cgi/*PATH_INFO')->to('CGI#rest_cgi' => {PATH_INFO => ''});
+ $r->any('/rest/*PATH_INFO')->to('CGI#rest_cgi' => {PATH_INFO => ''});
+ $r->any('/extensions/BzAPI/bin/rest.cgi/*PATH_INFO')->to('CGI#bzapi_cgi');
+ $r->any('/latest/*PATH_INFO')->to('CGI#bzapi_cgi');
+ $r->any('/bzapi/*PATH_INFO')->to('CGI#bzapi_cgi');
+
+ $r->static_file('/__lbheartbeat__');
+ $r->static_file('/__version__' =>
+ {file => 'version.json', content_type => 'application/json'});
+ $r->static_file('/version.json', {content_type => 'application/json'});
+
+ $r->page('/review', 'splinter.html');
+ $r->page('/user_profile', 'user_profile.html');
+ $r->page('/userprofile', 'user_profile.html');
+ $r->page('/request_defer', 'request_defer.html');
+
+ $r->get('/__heartbeat__')->to('CGI#heartbeat_cgi');
+ $r->get('/robots.txt')->to('CGI#robots_cgi');
+ $r->any('/login')->to('CGI#index_cgi' => {'GoAheadAndLogIn' => '1'});
+ $r->any('/:new_bug' => [new_bug => qr{new[-_]bug}])->to('CGI#new_bug_cgi');
+
+ my $ses_auth = $r->under(
+ '/ses' => sub {
+ my ($c) = @_;
+ my $lc = Bugzilla->localconfig;
+
+ return $c->basic_auth('SES', $lc->{ses_username}, $lc->{ses_password});
+ }
+ );
+ $ses_auth->any('/index.cgi')->to('SES#main');
}
1;
diff --git a/Bugzilla/Quantum/CGI.pm b/Bugzilla/Quantum/CGI.pm
index 7548c0809..79fbcfde6 100644
--- a/Bugzilla/Quantum/CGI.pm
+++ b/Bugzilla/Quantum/CGI.pm
@@ -19,143 +19,159 @@ use File::Spec::Functions qw(catfile);
use File::Slurper qw(read_text);
use English qw(-no_match_vars);
use Bugzilla::Quantum::Stdout;
-use Bugzilla::Constants qw(bz_locations);
+use Bugzilla::Constants qw(bz_locations USAGE_MODE_BROWSER);
our $C;
my %SEEN;
sub load_all {
- my ( $class, $r ) = @_;
+ my ($class, $r) = @_;
- foreach my $file ( glob '*.cgi' ) {
- my $name = _file_to_method($file);
- $class->load_one( $name, $file );
- $r->any("/$file")->to("CGI#$name");
- }
+ foreach my $file (glob '*.cgi') {
+ my $name = _file_to_method($file);
+ $class->load_one($name, $file);
+ $r->any("/$file")->to("CGI#$name");
+ }
}
sub load_one {
- my ( $class, $name, $file ) = @_;
- my $package = __PACKAGE__ . "::$name", my $inner_name = "_$name";
- my $content = read_text( catfile( bz_locations->{cgi_path}, $file ) );
- $content = "package $package; $content";
- untaint($content);
- my %options = (
- package => $package,
- file => $file,
- line => 1,
- no_defer => 1,
- );
- die "Tried to load $file more than once" if $SEEN{$file}++;
- my $inner = quote_sub $inner_name, $content, {}, \%options;
- my $wrapper = sub {
- my ($c) = @_;
- my $stdin = $c->_STDIN;
- local $C = $c;
- local %ENV = $c->_ENV($file);
- local $CGI::Compile::USE_REAL_EXIT = 0;
- local $PROGRAM_NAME = $file;
- local *STDIN; ## no critic (local)
- open STDIN, '<', $stdin->path or die "STDIN @{[$stdin->path]}: $!" if -s $stdin->path;
- tie *STDOUT, 'Bugzilla::Quantum::Stdout', controller => $c; ## no critic (tie)
- try {
- Bugzilla->init_page();
- $inner->();
- }
- catch {
- die $_ unless ref $_ eq 'ARRAY' && $_->[0] eq "EXIT\n";
- }
- finally {
- my $error = shift;
- untie *STDOUT;
- $c->finish unless $error;
- Bugzilla->cleanup;
- CGI::initialize_globals();
- };
+ my ($class, $name, $file) = @_;
+ my $package = __PACKAGE__ . "::$name", my $inner_name = "_$name";
+ my $content = read_text(catfile(bz_locations->{cgi_path}, $file));
+ $content = "package $package; $content";
+ untaint($content);
+ my %options = (package => $package, file => $file, line => 1, no_defer => 1,);
+ die "Tried to load $file more than once" if $SEEN{$file}++;
+ my $inner = quote_sub $inner_name, $content, {}, \%options;
+ my $wrapper = sub {
+ my ($c) = @_;
+ my $stdin = $c->_STDIN;
+ local $C = $c;
+ local %ENV = $c->_ENV($file);
+ local $CGI::Compile::USE_REAL_EXIT = 0;
+ local $PROGRAM_NAME = $file;
+ local *STDIN; ## no critic (local)
+ open STDIN, '<', $stdin->path
+ or die "STDIN @{[$stdin->path]}: $!"
+ if -s $stdin->path;
+ tie *STDOUT, 'Bugzilla::Quantum::Stdout',
+ controller => $c; ## no critic (tie)
+
+ # the finally block calls cleanup.
+ $c->stash->{cleanup_guard}->dismiss;
+ Bugzilla->usage_mode(USAGE_MODE_BROWSER);
+ try {
+ Bugzilla->init_page();
+ $inner->();
+ }
+ catch {
+ die $_ unless _is_exit($_);
+ }
+ finally {
+ my $error = shift;
+ untie *STDOUT;
+ $c->finish if !$error || _is_exit($error);
+ Bugzilla->cleanup;
+ CGI::initialize_globals();
};
+ };
- no strict 'refs'; ## no critic (strict)
- *{$name} = subname( $name, $wrapper );
- return 1;
+ no strict 'refs'; ## no critic (strict)
+ *{$name} = subname($name, $wrapper);
+ return 1;
}
sub _ENV {
- my ( $c, $script_name ) = @_;
- my $tx = $c->tx;
- my $req = $tx->req;
- my $headers = $req->headers;
- my $content_length = $req->content->is_multipart ? $req->body_size : $headers->content_length;
- my %env_headers = ( HTTP_COOKIE => '', HTTP_REFERER => '' );
-
- for my $name ( @{ $headers->names } ) {
- my $key = uc "http_$name";
- $key =~ s/\W/_/g;
- $env_headers{$key} = $headers->header($name);
- }
-
- my $remote_user;
- if ( my $userinfo = $req->url->to_abs->userinfo ) {
- $remote_user = $userinfo =~ /([^:]+)/ ? $1 : '';
- }
- elsif ( my $authenticate = $headers->authorization ) {
- $remote_user = $authenticate =~ /Basic\s+(.*)/ ? b64_decode $1 : '';
- $remote_user = $remote_user =~ /([^:]+)/ ? $1 : '';
- }
- my $path_info = $c->stash->{'mojo.captures'}{'PATH_INFO'};
- my %captures = %{ $c->stash->{'mojo.captures'} // {} };
- foreach my $key ( keys %captures ) {
- if ( $key eq 'controller' || $key eq 'action' || $key eq 'PATH_INFO' || $key =~ /^REWRITE_/ ) {
- delete $captures{$key};
- }
+ my ($c, $script_name) = @_;
+ my $tx = $c->tx;
+ my $req = $tx->req;
+ my $headers = $req->headers;
+ my $content_length
+ = $req->content->is_multipart ? $req->body_size : $headers->content_length;
+ my %env_headers = (HTTP_COOKIE => '', HTTP_REFERER => '');
+
+ $headers->content_type('application/x-www-form-urlencoded; charset=utf-8')
+ unless $headers->content_type;
+ for my $name (@{$headers->names}) {
+ my $key = uc "http_$name";
+ $key =~ s/\W/_/g;
+ $env_headers{$key} = $headers->header($name);
+ }
+
+ my $remote_user;
+ if (my $userinfo = $req->url->to_abs->userinfo) {
+ $remote_user = $userinfo =~ /([^:]+)/ ? $1 : '';
+ }
+ elsif (my $authenticate = $headers->authorization) {
+ $remote_user = $authenticate =~ /Basic\s+(.*)/ ? b64_decode $1 : '';
+ $remote_user = $remote_user =~ /([^:]+)/ ? $1 : '';
+ }
+ my $path_info = $c->stash->{'mojo.captures'}{'PATH_INFO'};
+ my %captures = %{$c->stash->{'mojo.captures'} // {}};
+ foreach my $key (keys %captures) {
+ if ( $key eq 'controller'
+ || $key eq 'action'
+ || $key eq 'PATH_INFO'
+ || $key =~ /^REWRITE_/)
+ {
+ delete $captures{$key};
}
- my $cgi_query = Mojo::Parameters->new(%captures);
- $cgi_query->append( $req->url->query );
- my $prefix = $c->stash->{bmo_prefix} ? '/bmo/' : '/';
-
- return (
- %ENV,
- CONTENT_LENGTH => $content_length || 0,
- CONTENT_TYPE => $headers->content_type || '',
- GATEWAY_INTERFACE => 'CGI/1.1',
- HTTPS => $req->is_secure ? 'on' : 'off',
- %env_headers,
- QUERY_STRING => $cgi_query->to_string,
- PATH_INFO => $path_info ? "/$path_info" : '',
- REMOTE_ADDR => $tx->original_remote_address,
- REMOTE_HOST => $tx->original_remote_address,
- REMOTE_PORT => $tx->remote_port,
- REMOTE_USER => $remote_user || '',
- REQUEST_METHOD => $req->method,
- SCRIPT_NAME => "$prefix$script_name",
- SERVER_NAME => hostname,
- SERVER_PORT => $tx->local_port,
- SERVER_PROTOCOL => $req->is_secure ? 'HTTPS' : 'HTTP', # TODO: Version is missing
- SERVER_SOFTWARE => __PACKAGE__,
- );
+ }
+ my $cgi_query = Mojo::Parameters->new(%captures);
+ $cgi_query->append($req->url->query);
+ my $prefix = $c->stash->{bmo_prefix} ? '/bmo/' : '/';
+
+ return (
+ %ENV,
+ CONTENT_LENGTH => $content_length || 0,
+ CONTENT_TYPE => $headers->content_type || '',
+ GATEWAY_INTERFACE => 'CGI/1.1',
+ HTTPS => $req->is_secure ? 'on' : 'off',
+ %env_headers,
+ QUERY_STRING => $cgi_query->to_string,
+ PATH_INFO => $path_info ? "/$path_info" : '',
+ REMOTE_ADDR => $tx->original_remote_address,
+ REMOTE_HOST => $tx->original_remote_address,
+ REMOTE_PORT => $tx->remote_port,
+ REMOTE_USER => $remote_user || '',
+ REQUEST_METHOD => $req->method,
+ SCRIPT_NAME => "$prefix$script_name",
+ SERVER_NAME => hostname,
+ SERVER_PORT => $tx->local_port,
+ SERVER_PROTOCOL => $req->is_secure
+ ? 'HTTPS'
+ : 'HTTP', # TODO: Version is missing
+ SERVER_SOFTWARE => __PACKAGE__,
+ );
}
sub _STDIN {
- my $c = shift;
- my $stdin;
-
- if ( $c->req->content->is_multipart ) {
- $stdin = Mojo::Asset::File->new;
- $stdin->add_chunk( $c->req->build_body );
- }
- else {
- $stdin = $c->req->content->asset;
- }
-
- return $stdin if $stdin->isa('Mojo::Asset::File');
- return Mojo::Asset::File->new->add_chunk( $stdin->slurp );
+ my $c = shift;
+ my $stdin;
+
+ if ($c->req->content->is_multipart) {
+ $stdin = Mojo::Asset::File->new;
+ $stdin->add_chunk($c->req->build_body);
+ }
+ else {
+ $stdin = $c->req->content->asset;
+ }
+
+ return $stdin if $stdin->isa('Mojo::Asset::File');
+ return Mojo::Asset::File->new->add_chunk($stdin->slurp);
}
sub _file_to_method {
- my ($name) = @_;
- $name =~ s/\./_/s;
- $name =~ s/\W+/_/gs;
- return $name;
+ my ($name) = @_;
+ $name =~ s/\./_/s;
+ $name =~ s/\W+/_/gs;
+ return $name;
+}
+
+sub _is_exit {
+ my ($error) = @_;
+ return ref $error eq 'ARRAY' && $error->[0] eq "EXIT\n";
}
1;
diff --git a/Bugzilla/Quantum/Home.pm b/Bugzilla/Quantum/Home.pm
new file mode 100644
index 000000000..48d5e47bd
--- /dev/null
+++ b/Bugzilla/Quantum/Home.pm
@@ -0,0 +1,28 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::Quantum::Home;
+use Mojo::Base 'Mojolicious::Controller';
+
+use Bugzilla::Error;
+use Try::Tiny;
+use Bugzilla::Constants;
+
+sub index {
+ my ($c) = @_;
+ $c->bugzilla->login(LOGIN_REQUIRED) or return;
+ try {
+ ThrowUserError('invalid_username', {login => 'batman'})
+ if $c->param('error');
+ $c->render(handler => 'bugzilla', template => 'index');
+ }
+ catch {
+ $c->bugzilla->error_page($_);
+ };
+}
+
+1;
diff --git a/Bugzilla/Quantum/Plugin/BlockIP.pm b/Bugzilla/Quantum/Plugin/BlockIP.pm
index 058ecbf64..974eebff9 100644
--- a/Bugzilla/Quantum/Plugin/BlockIP.pm
+++ b/Bugzilla/Quantum/Plugin/BlockIP.pm
@@ -9,35 +9,35 @@ use constant BLOCK_TIMEOUT => 60 * 60;
my $MEMCACHED = Bugzilla::Memcached->new()->{memcached};
sub register {
- my ( $self, $app, $conf ) = @_;
+ my ($self, $app, $conf) = @_;
- $app->hook( before_routes => \&_before_routes );
- $app->helper( block_ip => \&_block_ip );
- $app->helper( unblock_ip => \&_unblock_ip );
+ $app->hook(before_routes => \&_before_routes);
+ $app->helper(block_ip => \&_block_ip);
+ $app->helper(unblock_ip => \&_unblock_ip);
}
sub _block_ip {
- my ( $class, $ip ) = @_;
- $MEMCACHED->set( "block_ip:$ip" => 1, BLOCK_TIMEOUT ) if $MEMCACHED;
+ my ($class, $ip) = @_;
+ $MEMCACHED->set("block_ip:$ip" => 1, BLOCK_TIMEOUT) if $MEMCACHED;
}
sub _unblock_ip {
- my ( $class, $ip ) = @_;
- $MEMCACHED->delete("block_ip:$ip") if $MEMCACHED;
+ my ($class, $ip) = @_;
+ $MEMCACHED->delete("block_ip:$ip") if $MEMCACHED;
}
sub _before_routes {
- my ($c) = @_;
- return if $c->stash->{'mojo.static'};
-
- my $ip = $c->tx->remote_address;
- if ( $MEMCACHED && $MEMCACHED->get("block_ip:$ip") ) {
- $c->block_ip($ip);
- $c->res->code(429);
- $c->res->message('Too Many Requests');
- $c->res->body('Too Many Requests');
- $c->finish;
- }
+ my ($c) = @_;
+ return if $c->stash->{'mojo.static'};
+
+ my $ip = $c->tx->remote_address;
+ if ($MEMCACHED && $MEMCACHED->get("block_ip:$ip")) {
+ $c->block_ip($ip);
+ $c->res->code(429);
+ $c->res->message('Too Many Requests');
+ $c->res->body('Too Many Requests');
+ $c->finish;
+ }
}
1;
diff --git a/Bugzilla/Quantum/Plugin/Glue.pm b/Bugzilla/Quantum/Plugin/Glue.pm
index ded4daf15..f04b9c025 100644
--- a/Bugzilla/Quantum/Plugin/Glue.pm
+++ b/Bugzilla/Quantum/Plugin/Glue.pm
@@ -13,89 +13,152 @@ use Try::Tiny;
use Bugzilla::Constants;
use Bugzilla::Logging;
use Bugzilla::RNG ();
-use JSON::MaybeXS qw(decode_json);
+use Bugzilla::Util qw(with_writable_database);
+use Mojo::Util qw(secure_compare);
+use Mojo::JSON qw(decode_json);
+use Scalar::Util qw(blessed);
+use Scope::Guard;
sub register {
- my ( $self, $app, $conf ) = @_;
-
- my %D;
- if ( $ENV{BUGZILLA_HTTPD_ARGS} ) {
- my $args = decode_json( $ENV{BUGZILLA_HTTPD_ARGS} );
- foreach my $arg (@$args) {
- if ( $arg =~ /^-D(\w+)$/ ) {
- $D{$1} = 1;
- }
- else {
- die "Unknown httpd arg: $arg";
- }
- }
+ my ($self, $app, $conf) = @_;
+
+ my %D;
+ if ($ENV{BUGZILLA_HTTPD_ARGS}) {
+ my $args = decode_json($ENV{BUGZILLA_HTTPD_ARGS});
+ foreach my $arg (@$args) {
+ if ($arg =~ /^-D(\w+)$/) {
+ $D{$1} = 1;
+ }
+ else {
+ die "Unknown httpd arg: $arg";
+ }
}
+ }
- # hypnotoad is weird and doesn't look for MOJO_LISTEN itself.
- $app->config(
- hypnotoad => {
- proxy => 1,
- listen => [ $ENV{MOJO_LISTEN} ],
- },
- );
-
- # Make sure each httpd child receives a different random seed (bug 476622).
- # Bugzilla::RNG has one srand that needs to be called for
- # every process, and Perl has another. (Various Perl modules still use
- # the built-in rand(), even though we never use it in Bugzilla itself,
- # so we need to srand() both of them.)
- # Also, ping the dbh to force a reconnection.
- Mojo::IOLoop->next_tick(
- sub {
- Bugzilla::RNG::srand();
- srand();
- try { Bugzilla->dbh->ping };
- }
- );
-
- $app->hook(
- before_dispatch => sub {
- my ($c) = @_;
- if ( $D{HTTPD_IN_SUBDIR} ) {
- my $path = $c->req->url->path;
- if ( $path =~ s{^/bmo}{}s ) {
- $c->stash->{bmo_prefix} = 1;
- $c->req->url->path($path);
- }
- }
- Log::Log4perl::MDC->put( request_id => $c->req->request_id );
- }
- );
-
-
- $app->secrets( [ Bugzilla->localconfig->{side_wide_secret} ] );
-
- $app->renderer->add_handler(
- 'bugzilla' => sub {
- my ( $renderer, $c, $output, $options ) = @_;
- my $vars = delete $c->stash->{vars};
-
- # Helpers
- my %helper;
- foreach my $method ( grep {m/^\w+\z/} keys %{ $renderer->helpers } ) {
- my $sub = $renderer->helpers->{$method};
- $helper{$method} = sub { $c->$sub(@_) };
- }
- $vars->{helper} = \%helper;
-
- # The controller
- $vars->{c} = $c;
- my $name = $options->{template};
- unless ( $name =~ /\./ ) {
- $name = sprintf '%s.%s.tmpl', $options->{template}, $options->{format};
- }
- my $template = Bugzilla->template;
- $template->process( $name, $vars, $output )
- or die $template->error;
+ $app->hook(
+ before_dispatch => sub {
+ my ($c) = @_;
+ if ($D{HTTPD_IN_SUBDIR}) {
+ my $path = $c->req->url->path;
+ if ($path =~ s{^/bmo}{}s) {
+ $c->stash->{bmo_prefix} = 1;
+ $c->req->url->path($path);
}
- );
+ }
+ Log::Log4perl::MDC->put(request_id => $c->req->request_id);
+ $c->stash->{cleanup_guard} = Scope::Guard->new(\&Bugzilla::cleanup);
+ Bugzilla->usage_mode(USAGE_MODE_MOJO);
+ }
+ );
+
+ $app->secrets([Bugzilla->localconfig->{side_wide_secret}]);
+
+ $app->renderer->add_handler(
+ 'bugzilla' => sub {
+ my ($renderer, $c, $output, $options) = @_;
+
+ my %params;
+
+ # Helpers
+ foreach my $method (grep {m/^\w+\z/} keys %{$renderer->helpers}) {
+ my $sub = $renderer->helpers->{$method};
+ $params{$method} = sub { $c->$sub(@_) };
+ }
+
+ # Stash values
+ $params{$_} = $c->stash->{$_} for grep {m/^\w+\z/} keys %{$c->stash};
+
+ $params{self} = $params{c} = $c;
+
+ my $name = sprintf '%s.%s.tmpl', $options->{template}, $options->{format};
+ my $template = Bugzilla->template;
+ $template->process($name, \%params, $output) or die $template->error;
+ }
+ );
+ $app->helper(
+ 'bugzilla.login_redirect_if_required' => sub {
+ my ($c, $type) = @_;
+
+ if ($type == LOGIN_REQUIRED) {
+ $c->redirect_to('/login');
+ return undef;
+ }
+ else {
+ return Bugzilla->user;
+ }
+ }
+ );
+ $app->helper(
+ 'bugzilla.login' => sub {
+ my ($c, $type) = @_;
+ $type //= LOGIN_NORMAL;
+
+ return Bugzilla->user if Bugzilla->user->id;
+
+ $type = LOGIN_REQUIRED
+ if $c->param('GoAheadAndLogIn') || Bugzilla->params->{requirelogin};
+
+ # Allow templates to know that we're in a page that always requires
+ # login.
+ if ($type == LOGIN_REQUIRED) {
+ Bugzilla->request_cache->{page_requires_login} = 1;
+ }
+
+ my $login_cookie = $c->cookie("Bugzilla_logincookie");
+ my $user_id = $c->cookie("Bugzilla_login");
+ my $ip_addr = $c->tx->remote_address;
+
+ return $c->bugzilla->login_redirect_if_required($type)
+ unless ($login_cookie && $user_id);
+
+ my $db_cookie = Bugzilla->dbh->selectrow_array(
+ q{
+ SELECT cookie
+ FROM logincookies
+ WHERE cookie = ?
+ AND userid = ?
+ AND (restrict_ipaddr = 0 OR ipaddr = ?)
+ }, undef, ($login_cookie, $user_id, $ip_addr)
+ );
+
+ if (defined $db_cookie && secure_compare($login_cookie, $db_cookie)) {
+ my $user = Bugzilla::User->check({id => $user_id, cache => 1});
+
+ # If we logged in successfully, then update the lastused
+ # time on the login cookie
+ with_writable_database {
+ Bugzilla->dbh->do(
+ q{ UPDATE logincookies SET lastused = NOW() WHERE cookie = ? },
+ undef, $login_cookie);
+ };
+ Bugzilla->set_user($user);
+ return $user;
+ }
+ else {
+ return $c->bugzilla->login_redirect_if_required($type);
+ }
+ }
+ );
+ $app->helper(
+ 'bugzilla.error_page' => sub {
+ my ($c, $error) = @_;
+ if (blessed $error && $error->isa('Bugzilla::Error::Base')) {
+ $c->render(
+ handler => 'bugzilla',
+ template => $error->template,
+ error => $error->message,
+ %{$error->vars}
+ );
+ }
+ else {
+ $c->reply->exception($error);
+ }
+ }
+ );
- $app->log( MojoX::Log::Log4perl::Tiny->new( logger => Log::Log4perl->get_logger( ref $app ) ) );
+ $app->log(MojoX::Log::Log4perl::Tiny->new(
+ logger => Log::Log4perl->get_logger(ref $app)
+ ));
}
1;
diff --git a/Bugzilla/Quantum/Plugin/Helpers.pm b/Bugzilla/Quantum/Plugin/Helpers.pm
new file mode 100644
index 000000000..72dd96cf9
--- /dev/null
+++ b/Bugzilla/Quantum/Plugin/Helpers.pm
@@ -0,0 +1,66 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+package Bugzilla::Quantum::Plugin::Helpers;
+use 5.10.1;
+use Mojo::Base qw(Mojolicious::Plugin);
+
+use Bugzilla::Logging;
+use Carp;
+
+sub register {
+ my ($self, $app, $conf) = @_;
+
+ $app->helper(
+ basic_auth => sub {
+ my ($c, $realm, $auth_user, $auth_pass) = @_;
+ my $req = $c->req;
+ my ($user, $password) = $req->url->to_abs->userinfo =~ /^([^:]+):(.*)/;
+
+ unless ($realm && $auth_user && $auth_pass) {
+ croak 'basic_auth() called with missing parameters.';
+ }
+
+ unless ($user eq $auth_user && $password eq $auth_pass) {
+ WARN('username and password do not match');
+ $c->res->headers->www_authenticate("Basic realm=\"$realm\"");
+ $c->res->code(401);
+ $c->rendered;
+ return 0;
+ }
+
+ return 1;
+ }
+ );
+ $app->routes->add_shortcut(
+ static_file => sub {
+ my ($r, $path, $option) = @_;
+ my $file = $option->{file};
+ my $content_type = $option->{content_type} // 'text/plain';
+ unless ($file) {
+ $file = $path;
+ $file =~ s!^/!!;
+ }
+
+ return $r->get(
+ $path => sub {
+ my ($c) = @_;
+ $c->res->headers->content_type($content_type);
+ $c->reply->file($c->app->home->child($file));
+ }
+ );
+ }
+ );
+ $app->routes->add_shortcut(
+ page => sub {
+ my ($r, $path, $id) = @_;
+
+ return $r->any($path)->to('CGI#page_cgi' => {id => $id});
+ }
+ );
+}
+
+1;
diff --git a/Bugzilla/Quantum/Static.pm b/Bugzilla/Quantum/Static.pm
index c01f062a4..6ac803e96 100644
--- a/Bugzilla/Quantum/Static.pm
+++ b/Bugzilla/Quantum/Static.pm
@@ -11,20 +11,20 @@ use Bugzilla::Constants qw(bz_locations);
my $LEGACY_RE = qr{
^ (?:static/v[0-9]+\.[0-9]+/) ?
- ( (?:extensions/[^/]+/web|(?:image|graph|skin|j)s)/.+)
+ ( (?:extensions/[^/]+/web|(?:image|skin|j|graph)s)/.+)
$
}xs;
sub file {
- my ( $self, $rel ) = @_;
+ my ($self, $rel) = @_;
- if ( my ($legacy_rel) = $rel =~ $LEGACY_RE ) {
- local $self->{paths} = [ bz_locations->{cgi_path} ];
- return $self->SUPER::file($legacy_rel);
- }
- else {
- return $self->SUPER::file($rel);
- }
+ if (my ($legacy_rel) = $rel =~ $LEGACY_RE) {
+ local $self->{paths} = [bz_locations->{cgi_path}];
+ return $self->SUPER::file($legacy_rel);
+ }
+ else {
+ return $self->SUPER::file($rel);
+ }
}
1;
diff --git a/Bugzilla/Quantum/Stdout.pm b/Bugzilla/Quantum/Stdout.pm
index 9cf19992c..10be0b664 100644
--- a/Bugzilla/Quantum/Stdout.pm
+++ b/Bugzilla/Quantum/Stdout.pm
@@ -13,48 +13,42 @@ use Bugzilla::Logging;
use Encode;
use English qw(-no_match_vars);
-has 'controller' => (
- is => 'ro',
- required => 1,
-);
+has 'controller' => (is => 'ro', required => 1,);
-has '_encoding' => (
- is => 'rw',
- default => '',
-);
+has '_encoding' => (is => 'rw', default => '',);
sub TIEHANDLE { ## no critic (unpack)
- my $class = shift;
+ my $class = shift;
- return $class->new(@_);
+ return $class->new(@_);
}
sub PRINTF { ## no critic (unpack)
- my $self = shift;
- $self->PRINT( sprintf @_ );
+ my $self = shift;
+ $self->PRINT(sprintf @_);
}
sub PRINT { ## no critic (unpack)
- my $self = shift;
- my $c = $self->controller;
- my $bytes = join '', @_;
- return unless $bytes;
- if ( $self->_encoding ) {
- $bytes = encode( $self->_encoding, $bytes );
- }
- $c->write($bytes . ( $OUTPUT_RECORD_SEPARATOR // '' ) );
+ my $self = shift;
+ my $c = $self->controller;
+ my $bytes = join '', @_;
+ return unless $bytes;
+ if ($self->_encoding) {
+ $bytes = encode($self->_encoding, $bytes);
+ }
+ $c->write($bytes . ($OUTPUT_RECORD_SEPARATOR // ''));
}
sub BINMODE {
- my ( $self, $mode ) = @_;
- if ($mode) {
- if ( $mode eq ':bytes' or $mode eq ':raw' ) {
- $self->_encoding('');
- }
- elsif ( $mode eq ':utf8' ) {
- $self->_encoding('utf8');
- }
+ my ($self, $mode) = @_;
+ if ($mode) {
+ if ($mode eq ':bytes' or $mode eq ':raw') {
+ $self->_encoding('');
+ }
+ elsif ($mode eq ':utf8') {
+ $self->_encoding('utf8');
}
+ }
}
1;
diff --git a/Bugzilla/Report/SecurityRisk.pm b/Bugzilla/Report/SecurityRisk.pm
new file mode 100644
index 000000000..5eb98fd7f
--- /dev/null
+++ b/Bugzilla/Report/SecurityRisk.pm
@@ -0,0 +1,314 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::Report::SecurityRisk;
+
+use 5.10.1;
+use Moo;
+use MooX::StrictConstructor;
+
+use Bugzilla::Error;
+use Bugzilla::Status qw(is_open_state);
+use Bugzilla::Util qw(datetime_from);
+use Bugzilla;
+use DateTime;
+use List::Util qw(any first sum);
+use POSIX qw(ceil);
+use Type::Utils;
+use Types::Standard qw(Num Int Bool Str HashRef ArrayRef CodeRef Map Dict Enum);
+
+my $DateTime = class_type { class => 'DateTime' };
+
+has 'start_date' => (
+ is => 'ro',
+ required => 1,
+ isa => $DateTime,
+);
+
+has 'end_date' => (
+ is => 'ro',
+ required => 1,
+ isa => $DateTime,
+);
+
+has 'products' => (
+ is => 'ro',
+ required => 1,
+ isa => ArrayRef [Str],
+);
+
+has 'sec_keywords' => (
+ is => 'ro',
+ required => 1,
+ isa => ArrayRef [Str],
+);
+
+has 'initial_bug_ids' => (
+ is => 'lazy',
+ isa => ArrayRef [Int],
+);
+
+has 'initial_bugs' => (
+ is => 'lazy',
+ isa => HashRef [
+ Dict [
+ id => Int,
+ product => Str,
+ sec_level => Str,
+ is_open => Bool,
+ created_at => $DateTime,
+ ],
+ ],
+);
+
+has 'check_open_state' => (
+ is => 'ro',
+ isa => CodeRef,
+ default => sub { return \&is_open_state; },
+);
+
+has 'events' => (
+ is => 'lazy',
+ isa => ArrayRef [
+ Dict [
+ bug_id => Int,
+ bug_when => $DateTime,
+ field_name => Enum [qw(bug_status keywords)],
+ removed => Str,
+ added => Str,
+ ],
+ ],
+);
+
+has 'results' => (
+ is => 'lazy',
+ isa => ArrayRef [
+ Dict [
+ date => $DateTime,
+ bugs_by_product => HashRef [
+ Dict [
+ open => ArrayRef [Int],
+ closed => ArrayRef [Int],
+ median_age_open => Num
+ ]
+ ],
+ bugs_by_sec_keyword => HashRef [
+ Dict [
+ open => ArrayRef [Int],
+ closed => ArrayRef [Int],
+ median_age_open => Num
+ ]
+ ],
+ ],
+ ],
+);
+
+sub _build_initial_bug_ids {
+ # TODO: Handle changes in product (e.g. gravyarding) by searching the events table
+ # for changes to the 'product' field where one of $self->products is found in
+ # the 'removed' field, add the related bug id to the list of initial bugs.
+ my ($self) = @_;
+ my $dbh = Bugzilla->dbh;
+ my $products = join ', ', map { $dbh->quote($_) } @{ $self->products };
+ my $sec_keywords = join ', ', map { $dbh->quote($_) } @{ $self->sec_keywords };
+ my $query = qq{
+ SELECT
+ bug_id
+ FROM
+ bugs AS bug
+ JOIN products AS product ON bug.product_id = product.id
+ JOIN components AS component ON bug.component_id = component.id
+ JOIN keywords USING (bug_id)
+ JOIN keyworddefs AS keyword ON keyword.id = keywords.keywordid
+ WHERE
+ keyword.name IN ($sec_keywords)
+ AND product.name IN ($products)
+ };
+ return Bugzilla->dbh->selectcol_arrayref($query);
+}
+
+sub _build_initial_bugs {
+ my ($self) = @_;
+ my $bugs = {};
+ my $bugs_list = Bugzilla::Bug->new_from_list( $self->initial_bug_ids );
+ for my $bug (@$bugs_list) {
+ $bugs->{ $bug->id } = {
+ id => $bug->id,
+ product => $bug->product,
+ sec_level => (
+ # Select the first keyword matching one of the target keywords
+ # (of which there _should_ only be one found anyway).
+ first {
+ my $x = $_;
+ grep { lc($_) eq lc( $x->name ) } @{ $self->sec_keywords }
+ }
+ @{ $bug->keyword_objects }
+ )->name,
+ is_open => $self->check_open_state->( $bug->status->name ),
+ created_at => datetime_from( $bug->creation_ts ),
+ };
+ }
+ return $bugs;
+}
+
+sub _build_events {
+ my ($self) = @_;
+ return [] if !(@{$self->initial_bug_ids});
+ my $bug_ids = join ', ', @{ $self->initial_bug_ids };
+ my $start_date = $self->start_date->ymd('-');
+ my $query = qq{
+ SELECT
+ bug_id,
+ bug_when,
+ field.name AS field_name,
+ CONCAT(removed) AS removed,
+ CONCAT(added) AS added
+ FROM
+ bugs_activity
+ JOIN fielddefs AS field ON fieldid = field.id
+ JOIN bugs AS bug USING (bug_id)
+ WHERE
+ bug_id IN ($bug_ids)
+ AND field.name IN ('keywords' , 'bug_status')
+ AND bug_when >= '$start_date 00:00:00'
+ GROUP BY bug_id , bug_when , field.name
+ };
+ my $result = Bugzilla->dbh->selectall_hashref( $query, 'bug_id' );
+ my @events = values %$result;
+ foreach my $event (@events) {
+ $event->{bug_when} = datetime_from( $event->{bug_when} );
+ }
+
+ # We sort by reverse chronological order instead of ORDER BY
+ # since values %hash doesn't guareentee any order.
+ @events = sort { $b->{bug_when} cmp $a->{bug_when} } @events;
+ return \@events;
+}
+
+sub _build_results {
+ my ($self) = @_;
+ my $e = 0;
+ my $bugs = $self->initial_bugs;
+ my @results = ();
+
+ # We must generate a report for each week in the target time interval, regardless of
+ # whether anything changed. The for loop here ensures that we do so.
+ for ( my $report_date = $self->end_date; $report_date >= $self->start_date; $report_date->subtract( weeks => 1 ) ) {
+ # We rewind events while there are still events existing which occured after the start
+ # of the report week. The bugs will reflect a snapshot of how they were at the start of the week.
+ # $self->events is ordered reverse chronologically, so the end of the array is the earliest event.
+ while ( $e < @{ $self->events }
+ && ( @{ $self->events }[$e] )->{bug_when} > $report_date )
+ {
+ my $event = @{ $self->events }[$e];
+ my $bug = $bugs->{ $event->{bug_id} };
+
+ # Undo bug status changes
+ if ( $event->{field_name} eq 'bug_status' ) {
+ $bug->{is_open} = $self->check_open_state->( $event->{removed} );
+ }
+
+ # Undo keyword changes
+ if ( $event->{field_name} eq 'keywords' ) {
+ my $bug_sec_level = $bug->{sec_level};
+ if ( $event->{added} =~ /\b\Q$bug_sec_level\E\b/ ) {
+ # If the currently set sec level was added in this event, remove it.
+ $bug->{sec_level} = undef;
+ }
+ if ( $event->{removed} ) {
+ # If a target sec keyword was removed, add the first one back.
+ my $removed_sec = first { $event->{removed} =~ /\b\Q$_\E\b/ } @{ $self->sec_keywords };
+ $bug->{sec_level} = $removed_sec if ($removed_sec);
+ }
+ }
+
+ $e++;
+ }
+
+ # Remove uncreated bugs
+ foreach my $bug_key ( keys %$bugs ) {
+ if ( $bugs->{$bug_key}->{created_at} > $report_date ) {
+ delete $bugs->{$bug_key};
+ }
+ }
+
+ # Report!
+ my $date_snapshot = $report_date->clone();
+ my @bugs_snapshot = values %$bugs;
+ my $result = {
+ date => $date_snapshot,
+ bugs_by_product => $self->_bugs_by_product( $date_snapshot, @bugs_snapshot ),
+ bugs_by_sec_keyword => $self->_bugs_by_sec_keyword( $date_snapshot, @bugs_snapshot ),
+ };
+ push @results, $result;
+ }
+
+ return [reverse @results];
+}
+
+sub _bugs_by_product {
+ my ( $self, $report_date, @bugs ) = @_;
+ my $result = {};
+ my $groups = {};
+ foreach my $product ( @{ $self->products } ) {
+ $groups->{$product} = [];
+ }
+ foreach my $bug (@bugs) {
+ # We skip over bugs with no sec level which can happen during event rewinding.
+ if ( $bug->{sec_level} ) {
+ push @{ $groups->{ $bug->{product} } }, $bug;
+ }
+ }
+ foreach my $product ( @{ $self->products } ) {
+ my @open = map { $_->{id} } grep { ( $_->{is_open} ) } @{ $groups->{$product} };
+ my @closed = map { $_->{id} } grep { !( $_->{is_open} ) } @{ $groups->{$product} };
+ my @ages = map { $_->{created_at}->subtract_datetime_absolute($report_date)->seconds / 86_400; }
+ grep { ( $_->{is_open} ) } @{ $groups->{$product} };
+ $result->{$product} = {
+ open => \@open,
+ closed => \@closed,
+ median_age_open => @ages ? _median(@ages) : 0,
+ };
+ }
+
+ return $result;
+}
+
+sub _bugs_by_sec_keyword {
+ my ( $self, $report_date, @bugs ) = @_;
+ my $result = {};
+ my $groups = {};
+ foreach my $sec_keyword ( @{ $self->sec_keywords } ) {
+ $groups->{$sec_keyword} = [];
+ }
+ foreach my $bug (@bugs) {
+ # We skip over bugs with no sec level which can happen during event rewinding.
+ if ( $bug->{sec_level} ) {
+ push @{ $groups->{ $bug->{sec_level} } }, $bug;
+ }
+ }
+ foreach my $sec_keyword ( @{ $self->sec_keywords } ) {
+ my @open = map { $_->{id} } grep { ( $_->{is_open} ) } @{ $groups->{$sec_keyword} };
+ my @closed = map { $_->{id} } grep { !( $_->{is_open} ) } @{ $groups->{$sec_keyword} };
+ my @ages = map { $_->{created_at}->subtract_datetime_absolute($report_date)->seconds / 86_400 }
+ grep { ( $_->{is_open} ) } @{ $groups->{$sec_keyword} };
+ $result->{$sec_keyword} = {
+ open => \@open,
+ closed => \@closed,
+ median_age_open => @ages ? _median(@ages) : 0,
+ };
+ }
+
+ return $result;
+}
+
+sub _median {
+ # From tlm @ https://www.perlmonks.org/?node_id=474564. Jul 14, 2005
+ return sum( ( sort { $a <=> $b } @_ )[ int( $#_ / 2 ), ceil( $#_ / 2 ) ] ) / 2;
+}
+
+1;
diff --git a/Bugzilla/Template.pm b/Bugzilla/Template.pm
index cdeb54a50..36435d637 100644
--- a/Bugzilla/Template.pm
+++ b/Bugzilla/Template.pm
@@ -1031,7 +1031,7 @@ sub create {
return '' unless @sigs;
# use a URI object to encode the query string part.
- my $uri = URI->new(Bugzilla->localconfig->{urlbase} . 'static/metricsgraphics/socorro-lens.html');
+ my $uri = URI->new(Bugzilla->localconfig->{urlbase} . 'metricsgraphics/socorro-lens.html');
$uri->query_form('s' => join("\\", @sigs));
return $uri;
},
diff --git a/Bugzilla/Test/Util.pm b/Bugzilla/Test/Util.pm
index 02c842658..9fbc151f7 100644
--- a/Bugzilla/Test/Util.pm
+++ b/Bugzilla/Test/Util.pm
@@ -12,9 +12,12 @@ use strict;
use warnings;
use base qw(Exporter);
-our @EXPORT = qw(create_user);
+our @EXPORT = qw(create_user issue_api_key mock_useragent_tx);
use Bugzilla::User;
+use Bugzilla::User::APIKey;
+use Mojo::Message::Response;
+use Test2::Tools::Mock qw(mock);
sub create_user {
my ($login, $password, %extra) = @_;
@@ -29,4 +32,38 @@ sub create_user {
});
}
+sub issue_api_key {
+ my ($login, $given_api_key) = @_;
+ my $user = Bugzilla::User->check({ name => $login });
+
+ my $params = {
+ user_id => $user->id,
+ description => 'Bugzilla::Test::Util::issue_api_key',
+ api_key => $given_api_key,
+ };
+
+ if ($given_api_key) {
+ return Bugzilla::User::APIKey->create_special($params);
+ } else {
+ return Bugzilla::User::APIKey->create($params);
+ }
+}
+
+sub _json_content_type { $_->headers->content_type('application/json') }
+
+sub mock_useragent_tx {
+ my ($body, $modify) = @_;
+ $modify //= \&_json_content_type;
+
+ my $res = Mojo::Message::Response->new;
+ $res->code(200);
+ $res->body($body);
+ if ($modify) {
+ local $_ = $res;
+ $modify->($res);
+ }
+
+ return mock({result => $res});
+}
+
1;
diff --git a/Bugzilla/Token.pm b/Bugzilla/Token.pm
index 4b12f836b..8e51db45d 100644
--- a/Bugzilla/Token.pm
+++ b/Bugzilla/Token.pm
@@ -20,7 +20,6 @@ use Bugzilla::User;
use Date::Format;
use Date::Parse;
use File::Basename;
-use Digest::MD5 qw(md5_hex);
use Digest::SHA qw(hmac_sha256_base64);
use Encode;
use JSON qw(encode_json decode_json);
@@ -254,15 +253,15 @@ sub issue_hash_token {
my $user_id = Bugzilla->user->id || remote_ip();
# The concatenated string is of the form
- # token creation time + site-wide secret + user ID (either ID or remote IP) + data
- my @args = ($time, Bugzilla->localconfig->{'site_wide_secret'}, $user_id, @$data);
+ # token creation time + user ID (either ID or remote IP) + data
+ my @args = ($time, $user_id, @$data);
my $token = join('*', @args);
- # Wide characters cause md5_hex() to die.
- if (Bugzilla->params->{'utf8'}) {
- utf8::encode($token) if utf8::is_utf8($token);
- }
- $token = md5_hex($token);
+ # $token needs to be a byte string.
+ utf8::encode($token);
+ $token = hmac_sha256_base64($token, Bugzilla->localconfig->{'site_wide_secret'});
+ $token =~ s/\+/-/g;
+ $token =~ s/\//_/g;
# Prepend the token creation time, unencrypted, so that the token
# lifetime can be validated.
diff --git a/Bugzilla/User.pm b/Bugzilla/User.pm
index 4a58043a0..afd310eb0 100644
--- a/Bugzilla/User.pm
+++ b/Bugzilla/User.pm
@@ -34,7 +34,7 @@ use Role::Tiny::With;
use base qw(Bugzilla::Object Exporter);
@Bugzilla::User::EXPORT = qw(is_available_username
- login_to_id user_id_to_login
+ login_to_id user_id_to_login
USER_MATCH_MULTIPLE USER_MATCH_FAILED USER_MATCH_SUCCESS
MATCH_SKIP_CONFIRM
);
diff --git a/Bugzilla/WebService/Bug.pm b/Bugzilla/WebService/Bug.pm
index feb541c2e..61a95e07d 100644
--- a/Bugzilla/WebService/Bug.pm
+++ b/Bugzilla/WebService/Bug.pm
@@ -666,7 +666,7 @@ sub possible_duplicates {
include_fields => Optional [ ArrayRef [Str] ],
Bugzilla_api_token => Optional [Str]
];
-
+
ThrowCodeError( 'param_invalid', { function => 'Bug.possible_duplicates', param => 'A param' } )
if !$params_type->check($params);
@@ -674,10 +674,10 @@ sub possible_duplicates {
if ($params->{id}) {
my $bug = Bugzilla::Bug->check({ id => $params->{id}, cache => 1 });
$summary = $bug->short_desc;
- }
+ }
elsif ($params->{summary}) {
$summary = $params->{summary};
- }
+ }
else {
ThrowCodeError('param_required',
{ function => 'Bug.possible_duplicates', param => 'id or summary' });
@@ -701,7 +701,7 @@ sub possible_duplicates {
if ($params->{id}) {
@$possible_dupes = grep { $_->id != $params->{id} } @$possible_dupes;
}
-
+
my @hashes = map { $self->_bug_to_hash($_, $params) } @$possible_dupes;
$self->_add_update_tokens($params, $possible_dupes, \@hashes);
return { bugs => \@hashes };
@@ -1412,6 +1412,9 @@ sub _bug_to_hash {
if (filter_wants $params, 'dupe_of') {
$item{'dupe_of'} = $self->type('int', $bug->dup_id);
}
+ if (filter_wants $params, 'duplicates') {
+ $item{'duplicates'} = [ map { $self->type('int', $_->id) } @{ $bug->duplicates } ];
+ }
if (filter_wants $params, 'groups') {
my @groups = map { $self->type('string', $_->name) }
@{ $bug->groups_in };
@@ -1459,7 +1462,8 @@ sub _bug_to_hash {
elsif ($field->type == FIELD_TYPE_DATETIME
|| $field->type == FIELD_TYPE_DATE)
{
- $item{$name} = $self->type('dateTime', $bug->$name);
+ my $value = $bug->$name;
+ $item{$name} = defined($value) ? $self->type('dateTime', $value) : undef;
}
elsif ($field->type == FIELD_TYPE_MULTI_SELECT) {
my @values = map { $self->type('string', $_) } @{ $bug->$name };
@@ -2594,6 +2598,10 @@ C<array> of C<int>s. The ids of bugs that this bug "depends on".
C<int> The bug ID of the bug that this bug is a duplicate of. If this bug
isn't a duplicate of any bug, this will be null.
+=item C<duplicates>
+
+C<array> of C<int>s. The ids of bugs that are marked as duplicate of this bug.
+
=item C<estimated_time>
C<double> The number of hours that it was estimated that this bug would
@@ -2911,6 +2919,8 @@ and all custom fields.
=item The C<actual_time> item was added to the C<bugs> return value
in Bugzilla B<4.4>.
+=item The C<duplicates> array was added in Bugzilla B<6.0>.
+
=back
=back
diff --git a/Bugzilla/WebService/Bugzilla.pm b/Bugzilla/WebService/Bugzilla.pm
index 145502445..8e95028cb 100644
--- a/Bugzilla/WebService/Bugzilla.pm
+++ b/Bugzilla/WebService/Bugzilla.pm
@@ -87,7 +87,7 @@ sub time {
sub jobqueue_status {
my ( $self, $params ) = @_;
-
+
Bugzilla->login(LOGIN_REQUIRED);
my $dbh = Bugzilla->dbh;
@@ -98,7 +98,7 @@ sub jobqueue_status {
(SELECT COUNT(*)
FROM ts_error
WHERE ts_error.jobid = j.jobid
- )
+ )
, 0) AS errors
FROM ts_job j
INNER JOIN ts_funcmap f
diff --git a/Bugzilla/WebService/JSON.pm b/Bugzilla/WebService/JSON.pm
new file mode 100644
index 000000000..5c28b20f4
--- /dev/null
+++ b/Bugzilla/WebService/JSON.pm
@@ -0,0 +1,64 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::WebService::JSON;
+use 5.10.1;
+use Moo;
+
+use Bugzilla::Logging;
+use Bugzilla::WebService::JSON::Box;
+use JSON::MaybeXS;
+use Scalar::Util qw(refaddr blessed);
+use Package::Stash;
+
+use constant Box => 'Bugzilla::WebService::JSON::Box';
+
+has 'json' => (
+ init_arg => undef,
+ is => 'lazy',
+ handles => {_encode => 'encode', _decode => 'decode'},
+);
+
+sub encode {
+ my ($self, $value) = @_;
+ return Box->new(json => $self, value => $value);
+}
+
+sub decode {
+ my ($self, $box) = @_;
+
+ if (blessed($box) && $box->isa(Box)) {
+ return $box->value;
+ }
+ else {
+ return $self->_decode($box);
+ }
+}
+
+sub _build_json { JSON::MaybeXS->new }
+
+# delegation all the json options to the real json encoder.
+{
+ my @json_methods = qw(
+ utf8 ascii pretty canonical
+ allow_nonref allow_blessed convert_blessed
+ );
+ my $stash = Package::Stash->new(__PACKAGE__);
+ foreach my $method (@json_methods) {
+ my $symbol = '&' . $method;
+ $stash->add_symbol(
+ $symbol => sub {
+ my $self = shift;
+ $self->json->$method(@_);
+ return $self;
+ }
+ );
+ }
+}
+
+
+1;
diff --git a/Bugzilla/WebService/JSON/Box.pm b/Bugzilla/WebService/JSON/Box.pm
new file mode 100644
index 000000000..fc39aeee8
--- /dev/null
+++ b/Bugzilla/WebService/JSON/Box.pm
@@ -0,0 +1,43 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+package Bugzilla::WebService::JSON::Box;
+use 5.10.1;
+use Moo;
+
+use overload '${}' => 'value', '""' => 'to_string', fallback => 1;
+
+has 'value' => (is => 'ro', required => 1);
+has 'json' => (is => 'ro', required => 1);
+has 'label' => (is => 'lazy');
+has 'encode' => (init_arg => undef, is => 'lazy', predicate => 'is_encoded');
+
+sub TO_JSON {
+ my ($self) = @_;
+
+ return $self->to_string;
+}
+
+sub to_string {
+ my ($self) = @_;
+
+ return $self->is_encoded ? $self->encode : $self->label;
+}
+
+sub _build_encode {
+ my ($self) = @_;
+
+ return $self->json->_encode($self->value);
+}
+
+sub _build_label {
+ my ($self) = @_;
+
+ return "" . $self->value;
+}
+
+1;
diff --git a/Bugzilla/WebService/Product.pm b/Bugzilla/WebService/Product.pm
index 6ca3fee90..cdd8a0a92 100644
--- a/Bugzilla/WebService/Product.pm
+++ b/Bugzilla/WebService/Product.pm
@@ -64,10 +64,13 @@ sub get_accessible_products {
}
# Get a list of actual products, based on list of ids or names
+our %FLAG_CACHE;
sub get {
my ($self, $params) = validate(@_, 'ids', 'names', 'type');
my $user = Bugzilla->user;
+ Bugzilla->request_cache->{bz_etag_disable} = 1;
+
defined $params->{ids} || defined $params->{names} || defined $params->{type}
|| ThrowCodeError("params_required", { function => "Product.get",
params => ['ids', 'names', 'type'] });
@@ -134,6 +137,7 @@ sub get {
}
# Now create a result entry for each.
+ local %FLAG_CACHE = ();
my @products = map { $self->_product_to_hash($params, $_) }
@requested_products;
return { products => \@products };
@@ -215,6 +219,8 @@ sub _component_to_hash {
$self->type('email', $component->default_assignee->login),
default_qa_contact =>
$self->type('email', $component->default_qa_contact->login),
+ triage_owner =>
+ $self->type('email', $component->triage_owner->login),
sort_key => # sort_key is returned to match Bug.fields
0,
is_active =>
@@ -225,11 +231,11 @@ sub _component_to_hash {
$field_data->{flag_types} = {
bug =>
[map {
- $self->_flag_type_to_hash($_)
+ $FLAG_CACHE{ $_->id } //= $self->_flag_type_to_hash($_)
} @{$component->flag_types->{'bug'}}],
attachment =>
[map {
- $self->_flag_type_to_hash($_)
+ $FLAG_CACHE{ $_->id } //= $self->_flag_type_to_hash($_)
} @{$component->flag_types->{'attachment'}}],
};
}
@@ -238,8 +244,8 @@ sub _component_to_hash {
}
sub _flag_type_to_hash {
- my ($self, $flag_type, $params) = @_;
- return filter $params, {
+ my ($self, $flag_type) = @_;
+ return {
id =>
$self->type('int', $flag_type->id),
name =>
@@ -262,7 +268,7 @@ sub _flag_type_to_hash {
$self->type('int', $flag_type->grant_group_id),
request_group =>
$self->type('int', $flag_type->request_group_id),
- }, undef, 'flag_types';
+ };
}
sub _version_to_hash {
@@ -548,6 +554,11 @@ default.
C<string> The login name of the user who will be set as the QA Contact for
new bugs by default.
+=item C<triage_owner>
+
+C<string> The login name of the user who is named as the Triage Owner of the
+component.
+
=item C<sort_key>
C<int> Components, when displayed in a list, are sorted first by this integer
diff --git a/Bugzilla/WebService/README b/Bugzilla/WebService/README
index bbe320979..788c550bb 100644
--- a/Bugzilla/WebService/README
+++ b/Bugzilla/WebService/README
@@ -7,11 +7,11 @@ Our goal is to make JSON::RPC and XMLRPC::Lite both work with the same code.
The problem is that these both pass different things for $self to WebService
methods.
-When XMLRPC::Lite calls a method, $self is the name of the *class* the
+When XMLRPC::Lite calls a method, $self is the name of the *class* the
method is in. For example, if we call Bugzilla.version(), the first argument
is Bugzilla::WebService::Bugzilla. So in order to have $self
(our first argument) act correctly in XML-RPC, we make all WebService
-classes use base qw(Bugzilla::WebService).
+classes use base qw(Bugzilla::WebService).
When JSON::RPC calls a method, $self is the JSON-RPC *server object*. In other
words, it's an instance of Bugzilla::WebService::Server::JSONRPC. So we have
diff --git a/Bugzilla/WebService/Server.pm b/Bugzilla/WebService/Server.pm
index a76c4c48c..c4bd3e605 100644
--- a/Bugzilla/WebService/Server.pm
+++ b/Bugzilla/WebService/Server.pm
@@ -11,12 +11,15 @@ use 5.10.1;
use strict;
use warnings;
+use Bugzilla::Logging;
use Bugzilla::Error;
use Bugzilla::Util qw(datetime_from);
use Digest::MD5 qw(md5_base64);
use Scalar::Util qw(blessed);
use Storable qw(freeze);
+use Module::Runtime qw(require_module);
+use Try::Tiny;
sub handle_login {
my ($self, $class, $method, $full_method) = @_;
@@ -30,8 +33,13 @@ sub handle_login {
Bugzilla->request_cache->{dont_persist_session} = 1;
}
- eval "require $class";
- ThrowCodeError('unknown_method', {method => $full_method}) if $@;
+ try {
+ require_module($class);
+ }
+ catch {
+ ThrowCodeError('unknown_method', {method => $full_method});
+ FATAL($_);
+ };
return if ($class->login_exempt($method)
and !defined Bugzilla->input_params->{Bugzilla_login});
Bugzilla->login();
@@ -73,7 +81,11 @@ sub datetime_format_outbound {
sub bz_etag {
my ($self, $data) = @_;
my $cache = Bugzilla->request_cache;
- if (defined $data) {
+
+ if (Bugzilla->request_cache->{bz_etag_disable}) {
+ return undef;
+ }
+ elsif (defined $data) {
# Serialize the data if passed a reference
local $Storable::canonical = 1;
$data = freeze($data) if ref $data;
diff --git a/Bugzilla/WebService/Server/JSONRPC.pm b/Bugzilla/WebService/Server/JSONRPC.pm
index 093167048..12a3143cc 100644
--- a/Bugzilla/WebService/Server/JSONRPC.pm
+++ b/Bugzilla/WebService/Server/JSONRPC.pm
@@ -31,7 +31,9 @@ use Bugzilla::Util;
use HTTP::Message;
use MIME::Base64 qw(decode_base64 encode_base64);
+use Scalar::Util qw(blessed);
use List::MoreUtils qw(none);
+use Bugzilla::WebService::JSON;
#####################################
# Public JSON::RPC Method Overrides #
@@ -48,7 +50,7 @@ sub new {
sub create_json_coder {
my $self = shift;
- my $json = $self->SUPER::create_json_coder(@_);
+ my $json = Bugzilla::WebService::JSON->new;
$json->allow_blessed(1);
$json->convert_blessed(1);
$json->allow_nonref(1);
@@ -83,6 +85,9 @@ sub response {
# Implement JSONP.
if (my $callback = $self->_bz_callback) {
my $content = $response->content;
+ if (blessed $content) {
+ $content = $content->encode;
+ }
# Prepend the JSONP response with /**/ in order to protect
# against possible encoding attacks (e.g., affecting Flash).
$response->content("/**/$callback($content)");
@@ -110,7 +115,12 @@ sub response {
else {
push(@header_args, "-ETag", $etag) if $etag;
print $cgi->header(-status => $response->code, @header_args);
- print $response->content;
+ my $content = $response->content;
+ if (blessed $content) {
+ $content = $content->encode;
+ utf8::encode($content);
+ }
+ print $content;
}
}
diff --git a/Bugzilla/WebService/Server/REST.pm b/Bugzilla/WebService/Server/REST.pm
index 13896b248..5d8367410 100644
--- a/Bugzilla/WebService/Server/REST.pm
+++ b/Bugzilla/WebService/Server/REST.pm
@@ -165,6 +165,7 @@ sub response {
my $template = Bugzilla->template;
$content = "";
+ $result->encode if blessed $result;
$template->process("rest.html.tmpl", { result => $result }, \$content)
|| ThrowTemplateError($template->error());
diff --git a/Bugzilla/WebService/Util.pm b/Bugzilla/WebService/Util.pm
index d462c884a..ce5586911 100644
--- a/Bugzilla/WebService/Util.pm
+++ b/Bugzilla/WebService/Util.pm
@@ -11,6 +11,7 @@ use 5.10.1;
use strict;
use warnings;
+use Bugzilla::Logging;
use Bugzilla::Flag;
use Bugzilla::FlagType;
use Bugzilla::Error;
@@ -18,6 +19,8 @@ use Bugzilla::WebService::Constants;
use Storable qw(dclone);
use URI::Escape qw(uri_unescape);
+use Type::Params qw( compile );
+use Types::Standard -all;
use base qw(Exporter);
@@ -217,6 +220,17 @@ sub _delete_bad_keys {
sub validate {
my ($self, $params, @keys) = @_;
+ my $cache_key = join('|', (caller(1))[3], sort @keys);
+ # Type->of() is the same as Type[], used here because it is easier
+ # to chain with plus_coercions.
+ state $array_of_nonrefs = ArrayRef->of(Maybe[Value])->plus_coercions(
+ Maybe[Value], q{ [ $_ ] },
+ );
+ state $type_cache = {};
+ my $params_type = $type_cache->{$cache_key} //= do {
+ my %fields = map { $_ => Optional[$array_of_nonrefs] } @keys;
+ Maybe[ Dict[%fields, slurpy Any] ];
+ };
# If $params is defined but not a reference, then we weren't
# sent any parameters at all, and we're getting @keys where
@@ -226,12 +240,10 @@ sub validate {
# If @keys is not empty then we convert any named
# parameters that have scalar values to arrayrefs
# that match.
- foreach my $key (@keys) {
- if (exists $params->{$key}) {
- $params->{$key} = ref $params->{$key}
- ? $params->{$key}
- : [ $params->{$key} ];
- }
+ $params = $params_type->coerce($params);
+ if (my $type_error = $params_type->validate($params)) {
+ FATAL("validate() found type error: $type_error");
+ ThrowUserError('invalid_params', { type_error => $type_error } ) if $type_error;
}
return ($self, $params);
diff --git a/Dockerfile b/Dockerfile
index fd02f222d..18c1af20e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM mozillabteam/bmo-slim:20180809.1
+FROM mozillabteam/bmo-slim:20181011.1
ARG CI
ARG CIRCLE_SHA1
@@ -22,7 +22,6 @@ RUN mv /opt/bmo/local /app && \
chown -R app:app /app && \
perl -I/app -I/app/local/lib/perl5 -c -E 'use Bugzilla; BEGIN { Bugzilla->extensions }' && \
perl -c /app/scripts/entrypoint.pl && \
- setcap 'cap_net_bind_service=+ep' /usr/sbin/httpd && \
setcap 'cap_net_bind_service=+ep' /usr/bin/perl
USER app
diff --git a/LICENSE b/LICENSE
index 14e2f777f..a612ad981 100644
--- a/LICENSE
+++ b/LICENSE
@@ -35,7 +35,7 @@ Mozilla Public License Version 2.0
means any form of the work other than Source Code Form.
1.7. "Larger Work"
- means a work that combines Covered Software with other material, in
+ means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
diff --git a/Makefile.PL b/Makefile.PL
index 43d3930b0..f3772adf4 100755
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -14,9 +14,13 @@ use File::Basename;
use File::Spec;
BEGIN {
- require lib;
- my $dir = File::Spec->rel2abs( dirname(__FILE__) );
- lib->import( $dir, File::Spec->catdir( $dir, 'lib' ), File::Spec->catdir( $dir, qw(local lib perl5) ) );
+ require lib;
+ my $dir = File::Spec->rel2abs(dirname(__FILE__));
+ lib->import(
+ $dir,
+ File::Spec->catdir($dir, 'lib'),
+ File::Spec->catdir($dir, qw(local lib perl5))
+ );
}
use ExtUtils::MakeMaker 7.22;
@@ -25,419 +29,380 @@ use File::Spec;
use English qw(-no_match_vars $OSNAME);
BEGIN {
- if ( $ENV{BZ_SILENT_MAKEFILE} ) {
- open STDOUT, '>>', File::Spec->devnull or die "redirecting STDOUT to /dev/null failed: $!";
- open STDERR, '>>', File::Spec->devnull or die "redirecting STDERR to /dev/null failed: $!";
- }
+ if ($ENV{BZ_SILENT_MAKEFILE}) {
+ open STDOUT, '>>', File::Spec->devnull
+ or die "redirecting STDOUT to /dev/null failed: $!";
+ open STDERR, '>>', File::Spec->devnull
+ or die "redirecting STDERR to /dev/null failed: $!";
+ }
}
# PREREQ_PM
my %requires = (
- 'Alien::libcmark_gfm' => 0,
- 'Algorithm::BloomFilter' => '0.02',
- 'CGI' => '4.31',
- 'CGI::Compile' => 0,
- 'CGI::Emulate::PSGI' => 0,
- 'CPAN::Meta::Prereqs' => '2.132830',
- 'CPAN::Meta::Requirements' => '2.121',
- 'Class::XSAccessor' => '1.18',
- 'DBI' => '1.614',
- 'DBIx::Connector' => 0,
- 'Data::Password::passwdqc' => '0.08',
- 'Date::Format' => '2.23',
- 'DateTime' => '0.75',
- 'DateTime::TimeZone' => '2.11',
- 'Digest::SHA' => '5.47',
- 'Email::MIME' => '1.904',
- 'Email::Send' => '1.911',
- 'FFI::Platypus' => 0,
- 'File::Slurp' => '9999.13',
- 'File::Slurper' => '0.012',
- 'Future' => '0.34',
- 'HTML::Escape' => '1.10',
- 'IPC::System::Simple' => 0,
- 'IO::Async' => '0.71',
- 'JSON::MaybeXS' => '1.003008',
- 'JSON::XS' => '2.01',
- 'LWP::Protocol::https' => '6.07',
- 'LWP::UserAgent' => '6.26',
- 'List::MoreUtils' => '0.418',
- 'Log::Dispatch' => '2.67',
- 'Log::Log4perl' => '1.49',
- 'Math::Random::ISAAC' => '1.0.1',
- 'Module::Metadata' => '1.000033',
- 'Module::Runtime' => '0.014',
- 'Mojolicious' => '7.71',
- 'MojoX::Log::Log4perl::Tiny' => '0.01',
- 'Moo' => '2.002004',
- 'MooX::StrictConstructor' => '0.008',
- 'Mozilla::CA' => '20160104',
- 'Parse::CPAN::Meta' => '1.44',
- 'Role::Tiny' => '2.000003',
- 'Scope::Guard' => '0.21',
- 'Sereal' => '4.004',
- 'Taint::Util' => '0.08',
- 'Template' => '2.24',
- 'Text::CSV_XS' => '1.26',
- 'Throwable' => '0.200013',
- 'Sub::Quote' => '2.005000',
- 'Type::Tiny' => '1.004002',
- 'URI' => '1.55',
- 'URI::Escape::XS' => '0.14',
- 'version' => '0.87',
- 'EV' => '4.0',
+ 'Algorithm::BloomFilter' => '0.02',
+ 'CGI' => '4.31',
+ 'CGI::Compile' => 0,
+ 'CGI::Emulate::PSGI' => 0,
+ 'CPAN::Meta::Prereqs' => '2.132830',
+ 'CPAN::Meta::Requirements' => '2.121',
+ 'Class::XSAccessor' => '1.18',
+ 'DBI' => '1.614',
+ 'DBIx::Connector' => 0,
+ 'Data::Password::passwdqc' => '0.08',
+ 'Date::Format' => '2.23',
+ 'DateTime' => '0.75',
+ 'DateTime::TimeZone' => '2.11',
+ 'Devel::NYTProf' => '6.04',
+ 'Digest::SHA' => '5.47',
+ 'Email::MIME' => '1.904',
+ 'Email::Send' => '1.911',
+ 'FFI::Platypus' => 0,
+ 'File::Slurp' => '9999.13',
+ 'File::Slurper' => '0.012',
+ 'Future' => '0.34',
+ 'HTML::Escape' => '1.10',
+ 'IPC::System::Simple' => 0,
+ 'IO::Async' => '0.71',
+ 'JSON::MaybeXS' => '1.003008',
+ 'JSON::XS' => '2.01',
+ 'LWP::Protocol::https' => '6.07',
+ 'LWP::UserAgent' => '6.26',
+ 'List::MoreUtils' => '0.418',
+ 'Log::Dispatch' => '2.67',
+ 'Log::Log4perl' => '1.49',
+ 'Math::Random::ISAAC' => '1.0.1',
+ 'Module::Metadata' => '1.000033',
+ 'Module::Runtime' => '0.014',
+ 'Mojolicious' => '8.02',
+ 'MojoX::Log::Log4perl::Tiny' => '0.01',
+ 'Mojo::JWT' => '0.07',
+ 'Mojolicious::Plugin::OAuth2::Server' => '0.42',
+ 'Moo' => '2.002004',
+ 'MooX::StrictConstructor' => '0.008',
+ 'Mozilla::CA' => '20160104',
+ 'Package::Stash' => '0.37',
+ 'Parse::CPAN::Meta' => '1.44',
+ 'Role::Tiny' => '2.000003',
+ 'Scope::Guard' => '0.21',
+ 'Sereal' => '4.004',
+ 'Taint::Util' => '0.08',
+ 'Template' => '2.24',
+ 'Text::CSV_XS' => '1.26',
+ 'Throwable' => '0.200013',
+ 'Sub::Quote' => '2.005000',
+ 'Type::Tiny' => '1.004002',
+ 'URI' => '1.55',
+ 'URI::Escape::XS' => '0.14',
+ 'version' => '0.87',
+ 'EV' => '4.0',
);
-my %build_requires = ( 'ExtUtils::MakeMaker' => '7.22', );
+my %build_requires = ('ExtUtils::MakeMaker' => '7.22',);
my %test_requires = (
- 'Test::More' => 0,
- 'Pod::Coverage' => 0,
- 'Test::WWW::Selenium' => 0,
- 'Test::Selenium::Firefox' => 0,
- 'Test::Perl::Critic::Progressive' => 0,
- 'Perl::Critic::Freenode' => 0,
- 'Capture::Tiny' => 0,
+ 'Capture::Tiny' => 0,
+ 'DBD::SQLite' => '1.29',
+ 'Perl::Critic::Freenode' => 0,
+ 'Perl::Tidy' => '20180220',
+ 'Pod::Coverage' => 0,
+ 'Test::More' => 0,
+ 'Test::Perl::Critic::Progressive' => 0,
+ 'Test::Selenium::Firefox' => 0,
+ 'Test::WWW::Selenium' => 0,
);
-my %recommends = ( Safe => '2.30',);
+my %recommends = (Safe => '2.30',);
# Windows requires some additional modules.
-if ( $OSNAME eq 'MSWin32' ) {
- $requires{'Win32'} = '0.35';
- $requires{'Win32::API'} = '0.55';
- $requires{'DateTime::TimeZone::Local::Win32'} = '1.64';
+if ($OSNAME eq 'MSWin32') {
+ $requires{'Win32'} = '0.35';
+ $requires{'Win32::API'} = '0.55';
+ $requires{'DateTime::TimeZone::Local::Win32'} = '1.64';
}
-if ( $OSNAME eq 'linux' && -f '/etc/debian_version' ) {
- my @extra = qw(
- Test::Pod::Coverage
- Pod::Coverage::TrustPod
- Test::CPAN::Meta
- Test::Pod
- );
- $requires{$_} = 0 for @extra;
+if ($OSNAME eq 'linux' && -f '/etc/debian_version') {
+ my @extra = qw(
+ Test::Pod::Coverage
+ Pod::Coverage::TrustPod
+ Test::CPAN::Meta
+ Test::Pod
+ );
+ $requires{$_} = 0 for @extra;
}
my %optional_features = (
- argon2 => {
- description => 'Support hashing passwords with Argon2',
- prereqs => {
- runtime => {
- requires => {
- 'Crypt::Argon2' => '0.004',
- },
- },
- },
- },
- smtp_auth => {
- description => 'SMTP Authentication',
- prereqs => { runtime => { requires => { 'Authen::SASL' => 0 } } },
- },
- detect_charset => {
- description => 'Automatic charset detection for text attachments',
- prereqs => {
- runtime => { requires => { 'Encode::Detect' => 0, Encode => '2.21' } }
- },
- },
- new_charts => {
- description => 'New Charts',
- prereqs => {
- runtime => { requires => { 'Chart::Lines' => 'v2.4.10', GD => '1.20' } }
- }
- },
- html_desc => {
- description => 'More HTML in Product/Group Descriptions',
- prereqs => {
- runtime => {
- requires => { 'HTML::Parser' => '3.67', 'HTML::Scrubber' => 0 }
- }
- }
- },
- markdown => {
- description => 'Markdown syntax support for comments',
- prereqs => {
- runtime => { requires => { 'Text::MultiMarkdown' => '1.000034' } }
- }
- },
- pg => {
- description => 'Postgres database support',
- prereqs => { runtime => { requires => { 'DBD::Pg' => 'v2.19.3' } } },
- },
- memcached => {
- description => 'Memcached Support',
- prereqs => {
- runtime => { requires => { 'Cache::Memcached::Fast' => '0.17' } }
- }
- },
- updates => {
- description => 'Automatic Update Notifications',
- prereqs => {
- runtime => { requires => { 'XML::Twig' => 0 } }
- }
- },
- auth_radius => {
- description => 'RADIUS Authentication',
- prereqs => { runtime => { requires => { 'Authen::Radius' => 0 } } }
- },
- documentation => {
- description => 'Documentation',
- prereqs => {
- runtime => {
- requires => {
- 'File::Which' => 0,
- 'File::Copy::Recursive' => 0,
- }
- }
- },
- },
- xmlrpc => {
- description => 'XML-RPC Interface',
- prereqs => {
- runtime => {
- requires => {
- 'XMLRPC::Lite' => '0.712',
- 'SOAP::Lite' => '0.712',
- 'Test::Taint' => '1.06'
- }
- }
- }
- },
- auth_ldap => {
- description => 'LDAP Authentication',
- prereqs => { runtime => { requires => { 'Net::LDAP' => 0 } } },
- },
- old_charts => {
- description => 'Old Charts',
- prereqs => {
- runtime => {
- requires => { GD => '1.20', 'Chart::Lines' => 'v2.4.10' }
- },
- },
- },
- moving => {
- description => 'Move Bugs Between Installations',
- prereqs => {
- runtime => {
- requires => { 'MIME::Parser' => '5.406', 'XML::Twig' => 0 }
- }
- },
- },
- oracle => {
- description => 'Oracle database support',
- prereqs => { runtime => { requires => { 'DBD::Oracle' => '1.19' } } }
- },
- s3 => {
- description => 'Amazon S3 Attachment Storage',
- prereqs => {
- runtime => {
- requires => {
- 'Class::Accessor::Fast' => 0,
- 'XML::Simple' => 0,
- 'URI::Escape' => 0,
- }
- }
- }
- },
- typesniffer => {
- description => 'Sniff MIME type of attachments',
- prereqs => {
- runtime => {
- requires => {
- 'IO::Scalar' => 0,
- 'File::MimeInfo::Magic' => 0,
- },
- },
- },
- },
- sqlite => {
- description => 'SQLite database support',
- prereqs => { runtime => { requires => { 'DBD::SQLite' => '1.29' } } },
- },
- mysql => {
- description => 'MySQL database support',
- prereqs => { runtime => { requires => { 'DBD::mysql' => '4.037' } } }
- },
- jsonrpc => {
- description => 'JSON-RPC Interface',
- prereqs => {
- runtime => { requires => { 'JSON::RPC' => '== 1.01', 'Test::Taint' => '1.06' } }
- }
+ alien_cmark => {
+ description => 'Support GitHub-flavored markdown',
+ prereqs => {runtime => {requires => {'Alien::libcmark_gfm' => '3'},},},
+ },
+ argon2 => {
+ description => 'Support hashing passwords with Argon2',
+ prereqs => {runtime => {requires => {'Crypt::Argon2' => '0.004',},},},
+ },
+ smtp_auth => {
+ description => 'SMTP Authentication',
+ prereqs => {runtime => {requires => {'Authen::SASL' => 0}}},
+ },
+ detect_charset => {
+ description => 'Automatic charset detection for text attachments',
+ prereqs =>
+ {runtime => {requires => {'Encode::Detect' => 0, Encode => '2.21'}}},
+ },
+ chart_clicker => {
+ description => 'Support nice-looking charts',
+ prereqs => {runtime => {requires => {'Chart::Clicker' => 0}},},
+ },
+ new_charts => {
+ description => 'New Charts',
+ prereqs =>
+ {runtime => {requires => {'Chart::Lines' => 'v2.4.10', GD => '1.20'}}}
+ },
+ html_desc => {
+ description => 'More HTML in Product/Group Descriptions',
+ prereqs => {
+ runtime => {requires => {'HTML::Parser' => '3.67', 'HTML::Scrubber' => 0}}
+ }
+ },
+ markdown => {
+ description => 'Markdown syntax support for comments',
+ prereqs => {runtime => {requires => {'Text::MultiMarkdown' => '1.000034'}}}
+ },
+ pg => {
+ description => 'Postgres database support',
+ prereqs => {runtime => {requires => {'DBD::Pg' => 'v2.19.3'}}},
+ },
+ memcached => {
+ description => 'Memcached Support',
+ prereqs => {runtime => {requires => {'Cache::Memcached::Fast' => '0.17'}}}
+ },
+ updates => {
+ description => 'Automatic Update Notifications',
+ prereqs => {runtime => {requires => {'XML::Twig' => 0}}}
+ },
+ auth_radius => {
+ description => 'RADIUS Authentication',
+ prereqs => {runtime => {requires => {'Authen::Radius' => 0}}}
+ },
+ documentation => {
+ description => 'Documentation',
+ prereqs => {
+ runtime =>
+ {requires => {'File::Which' => 0, 'File::Copy::Recursive' => 0,}}
},
- graphical_reports => {
- description => 'Graphical Reports',
- prereqs => {
- runtime => {
- requires => {
- 'GD::Text' => 0,
- 'Template::Plugin::GD::Image' => 0,
- 'GD::Graph' => 0,
- GD => '1.20',
- }
- }
+ },
+ xmlrpc => {
+ description => 'XML-RPC Interface',
+ prereqs => {
+ runtime => {
+ requires => {
+ 'XMLRPC::Lite' => '0.712',
+ 'SOAP::Lite' => '0.712',
+ 'Test::Taint' => '1.06'
}
- },
- mfa => {
- description => 'Multi-Factor Authentication',
- prereqs => {
- runtime => {
- requires => {
- 'Auth::GoogleAuth' => '1.01',
- 'GD::Barcode::QRcode' => '0',
- },
- }
- },
- },
- inbound_email => {
- description => 'Inbound Email',
- prereqs => {
- runtime => {
- requires => {
- 'Email::MIME::Attachment::Stripper' => 0,
- 'Email::Reply' => 0,
- }
- }
- },
- },
- patch_viewer => {
- description => 'Patch Viewer',
- prereqs => { runtime => { requires => { PatchReader => '0.9.6' } } }
- },
- rest => {
- description => 'REST Interface',
- prereqs => {
- runtime => {
- requires => {
- 'Test::Taint' => '1.06',
- 'JSON::RPC' => '==1.01',
- }
- }
+ }
+ }
+ },
+ auth_ldap => {
+ description => 'LDAP Authentication',
+ prereqs => {runtime => {requires => {'Net::LDAP' => 0}}},
+ },
+ old_charts => {
+ description => 'Old Charts',
+ prereqs =>
+ {runtime => {requires => {GD => '1.20', 'Chart::Lines' => 'v2.4.10'}},},
+ },
+ moving => {
+ description => 'Move Bugs Between Installations',
+ prereqs =>
+ {runtime => {requires => {'MIME::Parser' => '5.406', 'XML::Twig' => 0}}},
+ },
+ oracle => {
+ description => 'Oracle database support',
+ prereqs => {runtime => {requires => {'DBD::Oracle' => '1.19'}}}
+ },
+ s3 => {
+ description => 'Amazon S3 Attachment Storage',
+ prereqs => {
+ runtime => {
+ requires => {
+ 'Class::Accessor::Fast' => 0,
+ 'XML::Simple' => 0,
+ 'URI::Escape' => 0,
}
- },
- linux_pid => {
- description => 'Linux::PID for MozReview',
- prereqs => {
- runtime => {
- requires => { 'Linux::Pid' => 0 },
- },
- },
- },
- linux_smaps => {
- description => 'Linux::Smaps for limiting memory usage',
- prereqs => {
- runtime => {
- requires => { 'Linux::Smaps' => '0' },
- }
- },
- },
- linux_pdeath => {
- description => 'Linux::Pdeathsig for a good parent/child relationships',
- prereqs => {
- runtime => {
- requires => { 'Linux::Pdeathsig' => 0 },
- },
- },
- },
- jobqueue => {
- description => 'Mail Queueing',
- prereqs => {
- runtime => {
- requires => { TheSchwartz => '1.10', 'Daemon::Generic' => 0 }
- }
+ }
+ }
+ },
+ typesniffer => {
+ description => 'Sniff MIME type of attachments',
+ prereqs => {
+ runtime =>
+ {requires => {'IO::Scalar' => 0, 'File::MimeInfo::Magic' => 0,},},
+ },
+ },
+ sqlite => {
+ description => 'SQLite database support',
+ prereqs => {runtime => {requires => {'DBD::SQLite' => '1.29'}}},
+ },
+ mysql => {
+ description => 'MySQL database support',
+ prereqs => {runtime => {requires => {'DBD::mysql' => '4.037'}}}
+ },
+ jsonrpc => {
+ description => 'JSON-RPC Interface',
+ prereqs => {
+ runtime =>
+ {requires => {'JSON::RPC' => '== 1.01', 'Test::Taint' => '1.06'}}
+ }
+ },
+ graphical_reports => {
+ description => 'Graphical Reports',
+ prereqs => {
+ runtime => {
+ requires => {
+ 'GD::Text' => 0,
+ 'Template::Plugin::GD::Image' => 0,
+ 'GD::Graph' => 0,
+ GD => '1.20',
}
- },
- elasticsearch => {
- description => 'Elasticsearch-powered searches',
- prereqs => {
- runtime => {
- recommends => { 'Term::ProgressBar' => 0 },
- requires => { 'Search::Elasticsearch' => 0 },
+ }
+ }
+ },
+ mfa => {
+ description => 'Multi-Factor Authentication',
+ prereqs => {
+ runtime => {
+ requires =>
+ {'Auth::GoogleAuth' => '1.01', 'GD::Barcode::QRcode' => '0',},
+ }
+ },
+ },
+ inbound_email => {
+ description => 'Inbound Email',
+ prereqs => {
+ runtime => {
+ requires =>
+ {'Email::MIME::Attachment::Stripper' => 0, 'Email::Reply' => 0,}
+ }
+ },
+ },
+ patch_viewer => {
+ description => 'Patch Viewer',
+ prereqs => {runtime => {requires => {PatchReader => '0.9.6'}}}
+ },
+ rest => {
+ description => 'REST Interface',
+ prereqs => {
+ runtime =>
+ {requires => {'Test::Taint' => '1.06', 'JSON::RPC' => '==1.01',}}
+ }
+ },
+ linux_pid => {
+ description => 'Linux::PID',
+ prereqs => {runtime => {requires => {'Linux::Pid' => 0},},},
+ },
+ linux_smaps => {
+ description => 'Linux::Smaps::Tiny for limiting memory usage',
+ prereqs => {runtime => {requires => {'Linux::Smaps::Tiny' => '0'}}},
+ },
+ linux_pdeath => {
+ description => 'Linux::Pdeathsig for a good parent/child relationships',
+ prereqs => {runtime => {requires => {'Linux::Pdeathsig' => 0},},},
+ },
+ jobqueue => {
+ description => 'Mail Queueing',
+ prereqs => {
+ runtime => {requires => {TheSchwartz => '1.10', 'Daemon::Generic' => 0}}
+ }
+ },
+ elasticsearch => {
+ description => 'Elasticsearch-powered searches',
+ prereqs => {
+ runtime => {
+ recommends => {'Term::ProgressBar' => 0},
+ requires => {'Search::Elasticsearch' => 0},
- },
- },
- },
- sentry => {
- description => 'Sentry Support',
- prereqs => {
- runtime => {
- requires => { 'Log::Log4perl::Appender::Raven' => '0.006' },
- },
- },
+ },
},
- datadog => {
- description => 'Data Dog support',
- prereqs => {
- runtime => {
- requires => { 'DataDog::DogStatsd' => '0.05' },
- },
- },
+ },
+ sentry => {
+ description => 'Sentry Support',
+ prereqs => {
+ runtime => {requires => {'Log::Log4perl::Appender::Raven' => '0.006'},},
},
+ },
+ datadog => {
+ description => 'Data Dog support',
+ prereqs => {runtime => {requires => {'DataDog::DogStatsd' => '0.05'},},},
+ },
);
-for my $file ( glob 'extensions/*/Config.pm' ) {
- my $dir = dirname($file);
- my $name = basename($dir);
+for my $file (glob 'extensions/*/Config.pm') {
+ my $dir = dirname($file);
+ my $name = basename($dir);
- next if -f File::Spec->catfile( $dir, 'disabled' );
- require $file;
- my $class = "Bugzilla::Extension::$name";
- if ( $class->can('REQUIRED_MODULES') ) {
- foreach my $required_module ( @{ $class->REQUIRED_MODULES() } ) {
- $requires{ $required_module->{module} }
- = $required_module->{version};
- }
+ next if -f File::Spec->catfile($dir, 'disabled');
+ require $file;
+ my $class = "Bugzilla::Extension::$name";
+ if ($class->can('REQUIRED_MODULES')) {
+ foreach my $required_module (@{$class->REQUIRED_MODULES()}) {
+ $requires{$required_module->{module}} = $required_module->{version};
}
+ }
- if ( $class->can('OPTIONAL_MODULES') ) {
- my $default_feature = 'extension_' . lc($name) . '_optional';
- foreach my $mod ( @{ $class->OPTIONAL_MODULES } ) {
- my @features
- = $mod->{feature} ? @{ $mod->{feature} } : ($default_feature);
- foreach my $feature (@features) {
- $optional_features{$feature}{prereqs}{runtime}{requires}{ $mod->{module} } = $mod->{version} // 0;
- }
- }
+ if ($class->can('OPTIONAL_MODULES')) {
+ my $default_feature = 'extension_' . lc($name) . '_optional';
+ foreach my $mod (@{$class->OPTIONAL_MODULES}) {
+ my @features = $mod->{feature} ? @{$mod->{feature}} : ($default_feature);
+ foreach my $feature (@features) {
+ $optional_features{$feature}{prereqs}{runtime}{requires}{$mod->{module}}
+ = $mod->{version} // 0;
+ }
}
+ }
}
# BMO Customization
my @bmo_features = grep { is_bmo_feature($_) } keys %optional_features;
$optional_features{bmo} = {
- description => 'features that bmo needs',
- prereqs => {
- runtime => {
- requires => { map { %{ $optional_features{$_}{prereqs}{runtime}{requires} } } @bmo_features },
- },
- },
+ description => 'features that bmo needs',
+ prereqs => {
+ runtime => {
+ requires => {
+ map { %{$optional_features{$_}{prereqs}{runtime}{requires}} }
+ @bmo_features
+ },
+ },
+ },
};
WriteMakefile(
- NAME => 'Bugzilla',
- AUTHOR => q{Bugzilla Developers <developers@bugzilla.org>},
- VERSION_FROM => 'Bugzilla.pm',
- ABSTRACT => 'Bugzilla Bug Tracking System',
- LICENSE => 'Mozilla_2_0',
- MIN_PERL_VERSION => '5.10.1',
- CONFIGURE_REQUIRES => { 'ExtUtils::MakeMaker' => $build_requires{'ExtUtils::MakeMaker'} },
- PREREQ_PM => { %requires },
- BUILD_REQUIRES => { %build_requires },
- TEST_REQUIRES => { %test_requires },
- META_MERGE => {
- 'meta-spec' => {
- url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
- version => '2'
- },
- dynamic_config => 1,
- prereqs => {
- build => { requires => { %build_requires } },
- runtime => { requires => { %requires }, recommends => { %recommends } },
- test => { requires => { %test_requires } },
- },
- optional_features => \%optional_features,
- },
+ NAME => 'Bugzilla',
+ AUTHOR => q{Bugzilla Developers <developers@bugzilla.org>},
+ VERSION_FROM => 'Bugzilla.pm',
+ ABSTRACT => 'Bugzilla Bug Tracking System',
+ LICENSE => 'Mozilla_2_0',
+ MIN_PERL_VERSION => '5.10.1',
+ CONFIGURE_REQUIRES =>
+ {'ExtUtils::MakeMaker' => $build_requires{'ExtUtils::MakeMaker'}},
+ PREREQ_PM => {%requires},
+ BUILD_REQUIRES => {%build_requires},
+ TEST_REQUIRES => {%test_requires},
+ META_MERGE => {
+ 'meta-spec' => {
+ url => 'http://search.cpan.org/perldoc?CPAN::Meta::Spec',
+ version => '2'
+ },
+ dynamic_config => 1,
+ prereqs => {
+ build => {requires => {%build_requires}},
+ runtime => {requires => {%requires}, recommends => {%recommends}},
+ test => {requires => {%test_requires}},
+ },
+ optional_features => \%optional_features,
+ },
);
sub MY::postamble {
- return <<"MAKE";
+ return <<"MAKE";
GEN_CPANFILE_ARGS = -D bmo
cpanfile: MYMETA.json
\t\$(PERLRUN) gen-cpanfile.pl \$(GEN_CPANFILE_ARGS)
@@ -452,9 +417,9 @@ MAKE
}
sub is_bmo_feature {
- local $_ = shift;
- return $OSNAME eq 'linux' if /^linux/;
- return !m{
+ local $_ = shift;
+ return $OSNAME eq 'linux' if /^linux/;
+ return !m{
^
(?: pg
| oracle
diff --git a/README.rst b/README.rst
index 2a0fa289c..e20be7f38 100644
--- a/README.rst
+++ b/README.rst
@@ -80,11 +80,13 @@ or db is changed, do a full provision:
vagrant rsync && vagrant provision
-If you are using Visual Studio Code, these tasks are available from the editor's
-`Tasks menu`_. The update command can be run by simply hitting `Ctrl+Shift+B` on
-Windows/Linux or `Command+Shift+B` on macOS.
+If you are using Visual Studio Code, these commands will come in handy as the
+editor's `tasks`_ that can be found under the Terminal menu. The update command
+can be executed by simply hitting `Ctrl+Shift+B` on Windows/Linux or
+`Command+Shift+B` on macOS. An `extension bundle`_ for VS Code is also available.
-.. _`Tasks menu`: https://code.visualstudio.com/docs/editor/tasks
+.. _`tasks`: https://code.visualstudio.com/docs/editor/tasks
+.. _`extension bundle`: https://marketplace.visualstudio.com/items?itemName=dylanwh.bugzilla
Testing Auth delegation
-----------------------
@@ -247,6 +249,46 @@ PORT
plain-text HTTP connections.
Default: 8000
+MOJO_REVERSE_PROXY
+ This tells the backend that it is behind a proxy.
+ Default: 1
+
+MOJO_HEARTBEAT_INTERVAL
+ How often (in seconds) will the manager process send a heartbeat to the workers.
+ Default: 10
+
+MOJO_HEARTBEAT_TIMEOUT
+ Maximum amount of time in seconds before a worker without a heartbeat will be stopped gracefully
+ Default: 120
+
+MOJO_INACTIVITY_TIMEOUT
+ Maximum amount of time in seconds a connection can be inactive before getting closed.
+ Default: 120
+
+MOJO_WORKERS
+ Number of worker processes. A good rule of thumb is two worker processes per
+ CPU core for applications that perform mostly non-blocking operations,
+ blocking operations often require more and benefit from decreasing
+ concurrency with "MOJO_CLIENTS" (often as low as 1). Note that during zero
+ downtime software upgrades there will be twice as many workers active for a
+ short amount of time.
+ Default: 1
+
+MOJO_SPARE
+ Temporarily spawn up to this number of additional workers if there is a
+ need. This allows for new workers to be started while old ones are still
+ shutting down gracefully, drastically reducing the performance cost of
+ worker restarts.
+ Default: 1
+
+MOJO_CLIENTS
+ Maximum number of accepted connections each worker process is allowed to
+ handle concurrently, before stopping to accept new incoming connections. Note
+ that high concurrency works best with applications that perform mostly
+ non-blocking operations, to optimize for blocking operations you can decrease
+ this value and increase "MOJO_WORKERS" instead for better performance.
+ Default: 10
+
BUGZILLA_UNSAFE_AUTH_DELEGATION
This should never be set in production. It allows auth delegation over http.
diff --git a/attachment.cgi b/attachment.cgi
index 875de6a50..e1009c18e 100755
--- a/attachment.cgi
+++ b/attachment.cgi
@@ -27,11 +27,11 @@ use Bugzilla::Attachment::PatchReader;
use Bugzilla::Token;
use Bugzilla::Keyword;
use Bugzilla::Hook;
+use Mojo::Util qw(url_escape);
use Encode qw(encode find_encoding from_to);
use URI;
use URI::QueryParam;
-use URI::Escape qw(uri_escape_utf8);
use File::Basename qw(basename);
use MIME::Base64 qw(decode_base64);
@@ -405,24 +405,10 @@ sub view {
if Bugzilla->user->id;
my $disposition = Bugzilla->params->{'allow_attachment_display'} ? 'inline' : 'attachment';
+ my $filename_star = qq{UTF-8''} . url_escape( encode('UTF-8', $filename) );
- my $ascii_filename = $filename;
- utf8::encode($ascii_filename);
- from_to($ascii_filename, 'UTF-8', 'ascii');
- $ascii_filename =~ s/(["\\])/\\$1/g;
- my $qfilename = qq{"$filename"};
- my $ufilename = qq{UTF-8''} . uri_escape_utf8($filename);
-
- my $filenames = "filename=$qfilename";
- if ($ascii_filename ne $filename) {
- $filenames .= "; filename*=$ufilename";
- }
-
- # IE8 and older do not support RFC 6266. So for these old browsers
- # we still pass the old 'filename' attribute. Modern browsers will
- # automatically pick the new 'filename*' attribute.
print $cgi->header(-type=> $contenttype,
- -content_disposition=> "$disposition; $filenames",
+ -content_disposition=> "$disposition; filename*=$filename_star",
-content_length => $attachment->datasize);
disable_utf8();
print $attachment->data;
diff --git a/buglist.cgi b/buglist.cgi
index d1cde7096..8de38599f 100755
--- a/buglist.cgi
+++ b/buglist.cgi
@@ -590,9 +590,6 @@ if ($format->{'extension'} eq 'ics') {
}
if ($format->{'extension'} eq 'atom') {
- # The title of the Atom feed will be the same one as for the bug list.
- $vars->{'title'} = $cgi->param('title');
-
# This is the list of fields that are needed by the Atom filter.
my @required_atom_columns = (
'short_desc',
@@ -1060,6 +1057,10 @@ $vars->{'defaultsavename'} = $cgi->param('query_based_on');
# string in the text field.
$vars->{'quicksearch'} = $searchstring;
+# Allow to custimize the title of HTML page and Atom feed. Also allow to pass
+# the title from HTML page to Atom feed through a link.
+$vars->{'title'} = $cgi->param('title');
+
################################################################################
# HTTP Header Generation
################################################################################
diff --git a/bugzilla.dtd b/bugzilla.dtd
index 61d7969f6..e22a2bfd1 100644
--- a/bugzilla.dtd
+++ b/bugzilla.dtd
@@ -5,12 +5,12 @@
maintainer CDATA #REQUIRED
exporter CDATA #IMPLIED
>
-<!ELEMENT bug (bug_id, (alias?, creation_ts, short_desc, delta_ts, reporter_accessible,
- cclist_accessible, classification_id, classification, product, component,
- version, rep_platform, op_sys, bug_status, resolution?, dup_id?, see_also*,
- bug_file_loc?, status_whiteboard?, keywords*, priority, bug_severity,
- target_milestone?, dependson*, blocked*, everconfirmed, reporter, assigned_to,
- cc*, (estimated_time, remaining_time, actual_time, deadline?)?, qa_contact?,
+<!ELEMENT bug (bug_id, (alias?, creation_ts, short_desc, delta_ts, reporter_accessible,
+ cclist_accessible, classification_id, classification, product, component,
+ version, rep_platform, op_sys, bug_status, resolution?, dup_id?, see_also*,
+ bug_file_loc?, status_whiteboard?, keywords*, priority, bug_severity,
+ target_milestone?, dependson*, blocked*, everconfirmed, reporter, assigned_to,
+ cc*, (estimated_time, remaining_time, actual_time, deadline?)?, qa_contact?,
votes?, token?, group*, flag*, long_desc*, attachment*)?)>
<!ATTLIST bug
error (NotFound | NotPermitted | InvalidBugId) #IMPLIED
@@ -29,7 +29,7 @@
<!ELEMENT version (#PCDATA)>
<!ELEMENT rep_platform (#PCDATA)>
<!ELEMENT assigned_to (#PCDATA)>
-<!ATTLIST assigned_to
+<!ATTLIST assigned_to
name CDATA #REQUIRED
>
<!ELEMENT delta_ts (#PCDATA)>
@@ -100,7 +100,7 @@
<!ATTLIST flag
name CDATA #REQUIRED
id CDATA #REQUIRED
- type_id CDATA #REQUIRED
+ type_id CDATA #REQUIRED
status CDATA #REQUIRED
setter CDATA #REQUIRED
requestee CDATA #IMPLIED
diff --git a/colchange.cgi b/colchange.cgi
index 46d25ecdf..bc18c3851 100755
--- a/colchange.cgi
+++ b/colchange.cgi
@@ -20,6 +20,7 @@ use Bugzilla::Search::Saved;
use Bugzilla::Error;
use Bugzilla::User;
use Bugzilla::Token;
+use Module::Runtime qw(require_module);
use Storable qw(dclone);
@@ -58,7 +59,7 @@ foreach my $param (keys %{ COLUMN_PARAMS() }) {
}
foreach my $class (keys %{ COLUMN_CLASSES() }) {
- eval("use $class; 1;") || die $@;
+ require_module($class);
my $column = COLUMN_CLASSES->{$class};
delete $columns->{$column} if !$class->any_exist;
}
diff --git a/contrib/secbugstats/README.md b/contrib/secbugstats/README.md
index 29d347489..36228acd4 100755
--- a/contrib/secbugstats/README.md
+++ b/contrib/secbugstats/README.md
@@ -10,7 +10,7 @@ report that is emailed to interested parties.
A good starting place to read this code is the gather.sh shell script. This
script is the driver for the remaining collection and processing scripts which
-populate the reports and charts.
+populate the reports and charts.
- Collection scripts are run once per week as a cron job
- API results
diff --git a/docs/en/rst/about/index.rst b/docs/en/rst/about/index.rst
index cdcea4d15..82e6830a0 100644
--- a/docs/en/rst/about/index.rst
+++ b/docs/en/rst/about/index.rst
@@ -17,11 +17,16 @@ The most current version of this document can always be found on the
Evaluating Bugzilla
###################
-If you want to try out Bugzilla to see if it meets your needs, you can do so
-on `Landfill <https://landfill.bugzilla.org/bugzilla-4.4-branch/>`_, our test
-server. The `Bugzilla FAQ <https://wiki.mozilla.org/Bugzilla:FAQ>`_ may also
-be helpful, as it answers a number of questions people sometimes have about
-whether Bugzilla is for them.
+If you want to try out Bugzilla to see if it meets your needs, you can do so on
+`Mozilla’s Bugzilla (BMO) test server <https://bugzilla-dev.allizom.org/>`_,
+though it comes with various Mozilla-specific customizations. The easiest way to
+explore the admin tools and more is `running a minimum local copy of BMO
+<https://github.com/mozilla-bteam/bmo/blob/master/README.rst>`_ using Vagrant or
+Docker. We are not offering any online vanilla test environment at this time.
+
+The `Bugzilla FAQ <https://wiki.mozilla.org/Bugzilla:FAQ>`_ may also be helpful,
+as it answers a number of questions people sometimes have about whether Bugzilla
+is for them.
.. _getting-help:
diff --git a/docs/en/rst/administering/extensions.rst b/docs/en/rst/administering/extensions.rst
index 2c54b8463..62c7ec03d 100644
--- a/docs/en/rst/administering/extensions.rst
+++ b/docs/en/rst/administering/extensions.rst
@@ -14,5 +14,5 @@ last time you compiled the documentation):
.. toctree::
:maxdepth: 1
:glob:
-
+
../extensions/*/index-admin
diff --git a/docs/en/rst/administering/keywords.rst b/docs/en/rst/administering/keywords.rst
index 245bcbe4c..2582c29e4 100644
--- a/docs/en/rst/administering/keywords.rst
+++ b/docs/en/rst/administering/keywords.rst
@@ -7,7 +7,7 @@ The administrator can define keywords which can be used to tag and
categorise bugs. For example, the keyword "regression" is commonly used.
A company might have a policy stating all regressions
must be fixed by the next release—this keyword can make tracking those
-bugs much easier. Keywords are global, rather than per product.
+bugs much easier. Keywords are global, rather than per product.
Keywords can be created, edited, or deleted by clicking the "Keywords"
link in the admin page. There are two fields for each keyword—the keyword
diff --git a/docs/en/rst/administering/parameters.rst b/docs/en/rst/administering/parameters.rst
index 0492e0070..1b657ff3c 100644
--- a/docs/en/rst/administering/parameters.rst
+++ b/docs/en/rst/administering/parameters.rst
@@ -29,12 +29,10 @@ utf8
you must re-run :file:`checksetup.pl` immediately afterward.
announcehtml
- Any text in this field will be displayed at the top of every HTML
- page in this Bugzilla installation. The text is not wrapped in any
- tags. For best results, wrap the text in a ``<div>``
- tag. Any style attributes from the CSS can be applied. For example,
- to make the text green inside of a red box, add ``id=message``
- to the ``<div>`` tag.
+ Any text in this field will be displayed at the top of every HTML page in
+ this Bugzilla installation. The text is not wrapped in any tags. For best
+ results, wrap the text in a ``<p>`` tag. Any style attributes from the CSS
+ can be applied. ``<p class="warning">`` makes the text red.
upgrade_notification
Enable or disable a notification on the homepage of this Bugzilla
diff --git a/docs/en/rst/api/core/v1/bug.rst b/docs/en/rst/api/core/v1/bug.rst
index 53f637a67..bab2cd0e8 100644
--- a/docs/en/rst/api/core/v1/bug.rst
+++ b/docs/en/rst/api/core/v1/bug.rst
@@ -102,6 +102,7 @@ name type description
"is_creator_accessible": true,
"whiteboard": "",
"dupe_of": null,
+ "duplicates": [],
"target_milestone": "---",
"cf_mulitple_select": [],
"component": "SaltSprinkler",
@@ -163,6 +164,8 @@ depends_on array The IDs of bugs that this bug "depends on".
dupe_of int The bug ID of the bug that this bug is a
duplicate of. If this bug isn't a duplicate of
any bug, this will be null.
+duplicates array The ids of bugs that are marked as duplicate of
+ this bug.
estimated_time double The number of hours that it was estimated that
this bug would take. If you are not in the
time-tracking group, this field will not be
@@ -479,9 +482,9 @@ limit int Limit the number of results returned. If the 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.
-longdescs.count int The number of comments a bug has. The bug's description
+longdescs.count int The number of comments a bug has. The bug's description
is the first comment. For example, to find bugs which someone
- has commented on after they have been filed, search on
+ has commented on after they have been filed, search on
``longdescs.count`` *greater than* 1.
offset int Used in conjunction with the ``limit`` argument,
``offset`` defines the starting position for the
@@ -1202,4 +1205,4 @@ attachment_id int The ID of the attachment that was changed.
This only appears if the change was to an attachment,
otherwise ``attachment_id`` will not be present in this
object.
-============= ====== ========================================================== \ No newline at end of file
+============= ====== ==========================================================
diff --git a/docs/en/rst/api/core/v1/bugzilla.rst b/docs/en/rst/api/core/v1/bugzilla.rst
index e43472c30..220ee5fc5 100644
--- a/docs/en/rst/api/core/v1/bugzilla.rst
+++ b/docs/en/rst/api/core/v1/bugzilla.rst
@@ -312,7 +312,7 @@ Reports the status of the job queue.
GET /rest/jobqueue_status
-This method requires an authenticated user.
+This method requires an authenticated user.
**Response**
@@ -328,4 +328,4 @@ name type description
=============== ======= ====================================================
total integer The total number of jobs in the job queue.
errors integer The number of errors produced by jobs in the queue.
-=============== ======= ==================================================== \ No newline at end of file
+=============== ======= ====================================================
diff --git a/docs/en/rst/api/core/v1/product.rst b/docs/en/rst/api/core/v1/product.rst
index 4819bbbbe..a1f5bd3c8 100644
--- a/docs/en/rst/api/core/v1/product.rst
+++ b/docs/en/rst/api/core/v1/product.rst
@@ -142,6 +142,7 @@ type string The group of products to return. Valid values are
]
},
"default_qa_contact": "",
+ "triage_owner": "",
"description": "This is a test component."
}
],
@@ -215,6 +216,9 @@ default_assigned_to string The login name of the user to whom new bugs
default_qa_contact string The login name of the user who will be set as
the QA Contact for new bugs by default. Empty
string if the QA contact is not defined.
+triage_owner string The login name of the user who is named as the
+ Triage Owner of the component. Empty string if the
+ Triage Owner is not defined.
sort_key int Components, when displayed in a list, are sorted
first by this integer and then secondly by their
name.
diff --git a/docs/en/rst/integrating/extensions.rst b/docs/en/rst/integrating/extensions.rst
index 50f204746..e9ae48630 100644
--- a/docs/en/rst/integrating/extensions.rst
+++ b/docs/en/rst/integrating/extensions.rst
@@ -49,7 +49,7 @@ To add new fields to a bug, you need to do the following:
my $field = new Bugzilla::Field({ name => $name });
return if $field;
-
+
$field = Bugzilla::Field->create({
name => $name,
description => $description,
@@ -67,12 +67,12 @@ To add new fields to a bug, you need to do the following:
.. code-block:: perl
- BEGIN {
- *Bugzilla::Bug::is_foopy = \&_bug_is_foopy;
+ BEGIN {
+ *Bugzilla::Bug::is_foopy = \&_bug_is_foopy;
}
-
+
...
-
+
sub _bug_is_foopy {
return $_[0]->{'is_foopy'};
}
diff --git a/docs/en/rst/integrating/faq.rst b/docs/en/rst/integrating/faq.rst
index 19f8b59ff..f50453df5 100644
--- a/docs/en/rst/integrating/faq.rst
+++ b/docs/en/rst/integrating/faq.rst
@@ -18,10 +18,10 @@ How do I...
...use a word other than 'bug' to describe bugs?
:ref:`Edit or override <templates>` the appropriate values in the template
:file:`template/en/default/global/variables.none.tmpl`.
-
+
...call the system something other than 'Bugzilla'?
:ref:`Edit or override <templates>` the appropriate value in the template
:file:`template/en/default/global/variables.none.tmpl`.
-
+
...alter who can change what field when?
See :ref:`who-can-change-what`.
diff --git a/docs/en/rst/integrating/languages.rst b/docs/en/rst/integrating/languages.rst
index 4d087a721..d76a82a82 100644
--- a/docs/en/rst/integrating/languages.rst
+++ b/docs/en/rst/integrating/languages.rst
@@ -3,7 +3,7 @@ Languages
Bugzilla's templates can be localized, although it's a `big job
<https://wiki.mozilla.org/Bugzilla:L10n:Guide>`_. If you have
-a localized set of templates for your version of Bugzilla, Bugzilla can
+a localized set of templates for your version of Bugzilla, Bugzilla can
support multiple languages at once. In that case, Bugzilla honours the user's
``Accept-Language`` HTTP header when deciding which language to serve. If
multiple languages are installed, a menu will display in the header allowing
diff --git a/docs/en/rst/integrating/skins.rst b/docs/en/rst/integrating/skins.rst
index 2cd08b4c0..92bf60dfc 100644
--- a/docs/en/rst/integrating/skins.rst
+++ b/docs/en/rst/integrating/skins.rst
@@ -11,7 +11,7 @@ are a couple more which are part of
`bugzilla.mozilla.org <http://git.mozilla.org/?p=webtools/bmo/bugzilla.git>`_.
However, in each
case you may need to check that the skin supports the version of Bugzilla
-you have.
+you have.
To create a new custom skin, make a directory that contains all the same CSS
file names as :file:`skins/standard/`, and put your directory in
diff --git a/docs/en/rst/integrating/templates.rst b/docs/en/rst/integrating/templates.rst
index ee2c08e92..e563d8179 100644
--- a/docs/en/rst/integrating/templates.rst
+++ b/docs/en/rst/integrating/templates.rst
@@ -49,7 +49,7 @@ modifications, and the method you plan to use to upgrade Bugzilla.
#. You can use the hooks built into many of the templates to add or modify
the UI from an :ref:`extension <extensions>`. Hooks generally don't go away
- and have a stable interface.
+ and have a stable interface.
The third method is the best if there are hooks in the appropriate places
and the change you want to do is possible using hooks. It's not very easy
@@ -89,7 +89,7 @@ can't if you fork the file into the :file:`custom` directory.
How To Edit Templates
=====================
-.. note:: If you are making template changes that you intend on submitting
+.. note:: If you are making template changes that you intend on submitting
back for inclusion in standard Bugzilla, you should read the relevant
sections of the
`Developers' Guide <https://www.bugzilla.org/docs/developer.html>`_.
@@ -111,7 +111,7 @@ to cross-site scripting attacks.
You should run :command:`./checksetup.pl` after editing any templates. Failure
to do so may mean either that your changes are not picked up, or that the
-permissions on the edited files are wrong so the webserver can't read them.
+permissions on the edited files are wrong so the webserver can't read them.
.. _template-formats:
@@ -232,11 +232,11 @@ customizing for your installation.
and have their values appear formatted in the initial comment.
An example of this is the `guided bug submission form
- <http://landfill.bugzilla.org/bugzilla-tip/enter_bug.cgi?product=WorldControl;format=guided>`_.
+ <https://bugzilla-dev.allizom.org/enter_bug.cgi?product=Firefox&format=guided>`_.
The code for this comes with the Bugzilla distribution as an example for
you to copy. It can be found in the files
:file:`create-guided.html.tmpl` and :file:`comment-guided.html.tmpl`.
-
+
A hidden field that indicates the format should be added inside
the form in order to make the template functional. Its value should
be the suffix of the template filename. For example, if the file
diff --git a/docs/en/rst/using/creating-an-account.rst b/docs/en/rst/using/creating-an-account.rst
index 0ea42ee5d..3d70096f5 100644
--- a/docs/en/rst/using/creating-an-account.rst
+++ b/docs/en/rst/using/creating-an-account.rst
@@ -6,8 +6,8 @@ Creating an Account
If you want to use a particular installation of Bugzilla, first you need to
create an account. Ask the administrator responsible for your installation
for the URL you should use to access it. If you're test-driving Bugzilla,
-you can use one of the installations on
-`Landfill <http://landfill.bugzilla.org/>`_.
+you can use one of the installations on `Mozilla’s Bugzilla (BMO) test server
+<https://bugzilla-dev.allizom.org/>`_.
The process of creating an account is similar to many other websites.
diff --git a/docs/en/rst/using/extensions.rst b/docs/en/rst/using/extensions.rst
index 752b50b9a..28bae5be5 100644
--- a/docs/en/rst/using/extensions.rst
+++ b/docs/en/rst/using/extensions.rst
@@ -14,5 +14,5 @@ last time you compiled the documentation):
.. toctree::
:maxdepth: 1
:glob:
-
+
../extensions/*/index-user
diff --git a/docs/en/rst/using/filing.rst b/docs/en/rst/using/filing.rst
index 788cebbd5..a76e3faed 100644
--- a/docs/en/rst/using/filing.rst
+++ b/docs/en/rst/using/filing.rst
@@ -7,18 +7,17 @@ Reporting a New Bug
===================
Years of bug writing experience has been distilled for your
-reading pleasure into the
-`Bug Writing Guidelines <http://landfill.bugzilla.org/bugzilla-tip/page.cgi?id=bug-writing.html>`_.
+reading pleasure into the `Bug report writing guidelines
+<https://developer.mozilla.org/docs/Mozilla/QA/Bug_writing_guidelines>`_.
While some of the advice is Mozilla-specific, the basic principles of
reporting Reproducible, Specific bugs and isolating the Product you are
using, the Version of the Product, the Component which failed, the Hardware
Platform, and Operating System you were using at the time of the failure go a
long way toward ensuring accurate, responsible fixes for the bug that bit you.
-.. note:: If you want to file a test bug to see how Bugzilla works,
- you can do it on one of our test installations on
- `Landfill <http://landfill.bugzilla.org/>`_. Please don't do it on anyone's
- production Bugzilla installation.
+.. note:: If you want to file a test bug to see how Bugzilla works, you can do
+ so on `Mozilla’s Bugzilla (BMO) test server <https://bugzilla-dev.allizom.org/>`_.
+ Please don’t do it on any production Bugzilla installation.
The procedure for filing a bug is as follows:
@@ -46,7 +45,7 @@ The procedure for filing a bug is as follows:
developers easier, and the probability that they consider your bug in
a reasonable timeframe will be much higher.
- .. note:: Try to make sure that everything in the Summary is also in the
+ .. note:: Try to make sure that everything in the Summary is also in the
Description. Summaries are often updated and this will ensure your original
information is easily accessible.
diff --git a/docs/en/rst/using/finding.rst b/docs/en/rst/using/finding.rst
index 44d4003dc..baf2d9076 100644
--- a/docs/en/rst/using/finding.rst
+++ b/docs/en/rst/using/finding.rst
@@ -43,8 +43,8 @@ Advanced Search
===============
The Advanced Search page is used to produce a list of all bugs fitting
-exact criteria. `You can play with it on
-Landfill <http://landfill.bugzilla.org/bugzilla-tip/query.cgi?format=advanced>`_.
+exact criteria. You can play with it on `Mozilla’s Bugzilla (BMO) test server
+<https://bugzilla-dev.allizom.org/query.cgi?format=advanced>`_.
Advanced Search has controls for selecting different possible
values for all of the fields in a bug, as described above. For some
diff --git a/docs/en/rst/using/understanding.rst b/docs/en/rst/using/understanding.rst
index c52bd2167..958d4baae 100644
--- a/docs/en/rst/using/understanding.rst
+++ b/docs/en/rst/using/understanding.rst
@@ -26,7 +26,7 @@ installation of Bugzilla.
*Product and Component*:
Bugs are divided up by Product and Component, with a Product
- having one or more Components in it.
+ having one or more Components in it.
*Version:*
The "Version" field usually contains the numbers or names of released
diff --git a/editparams.cgi b/editparams.cgi
index 495d53937..2dd9ff08d 100755
--- a/editparams.cgi
+++ b/editparams.cgi
@@ -23,6 +23,7 @@ use Bugzilla::Token;
use Bugzilla::User;
use Bugzilla::User::Setting;
use Bugzilla::Status;
+use Module::Runtime qw(require_module);
my $user = Bugzilla->login(LOGIN_REQUIRED);
my $cgi = Bugzilla->cgi;
@@ -48,7 +49,7 @@ my $param_panels = Bugzilla::Config::param_panels();
my $override = Bugzilla->localconfig->{param_override};
foreach my $panel (keys %$param_panels) {
my $module = $param_panels->{$panel};
- eval("require $module") || die $@;
+ require_module($module);
my @module_param_list = $module->get_param_list();
my $item = {
name => lc($panel),
diff --git a/extensions/BMO/lib/Data.pm b/extensions/BMO/lib/Data.pm
index 30a32c95e..349f88093 100644
--- a/extensions/BMO/lib/Data.pm
+++ b/extensions/BMO/lib/Data.pm
@@ -58,7 +58,7 @@ our %autodetect_attach_urls = (
title => 'MozReview',
regex => $mozreview_url_re,
content_type => 'text/x-review-board-request',
- can_review => 1,
+ can_review => 0,
},
Phabricator => {
title => 'Phabricator',
@@ -114,6 +114,7 @@ tie(%$cf_visible_in_products, "Tie::IxHash",
"External Software Affecting Firefox" => [],
"Firefox" => [],
"Firefox for Android" => [],
+ "GeckoView" => [],
"JSS" => [],
"MailNews Core" => [],
"Mozilla Labs" => [],
@@ -140,6 +141,7 @@ tie(%$cf_visible_in_products, "Tie::IxHash",
"Data & BI Services Team" => [],
"Data Compliance" => [],
"Developer Engagement" => [],
+ "Firefox" => ["Security: Review Requests"],
"Infrastructure & Operations" => [],
"Marketing" => [],
"mozilla.org" => ["Security Assurance: Review Request"],
@@ -162,24 +164,27 @@ tie(%$cf_visible_in_products, "Tie::IxHash",
"Firefox for Android" => [],
"Firefox for iOS" => [],
"Firefox" => [],
+ "GeckoView" => [],
"Hello (Loop)" => [],
"Cloud Services" => [],
"Tech Evangelism" => [],
"Toolkit" => [],
},
qr/^cf_has_regression_range$/ => {
- "Core" => [],
+ "Core" => [],
"Firefox for Android" => [],
"Firefox for iOS" => [],
- "Firefox" => [],
- "Toolkit" => [],
+ "Firefox" => [],
+ "GeckoView" => [],
+ "Toolkit" => [],
},
qr/^cf_has_str$/ => {
"Core" => [],
"Firefox for Android" => [],
"Firefox for iOS" => [],
- "Firefox" => [],
- "Toolkit" => [],
+ "Firefox" => [],
+ "GeckoView" => [],
+ "Toolkit" => [],
},
qr/^cf_cab_review$/ => {
"Infrastructure & Operations Graveyard" => [],
diff --git a/extensions/BMO/lib/Reports/ReleaseTracking.pm b/extensions/BMO/lib/Reports/ReleaseTracking.pm
index 42ef24b47..9fba1e14b 100644
--- a/extensions/BMO/lib/Reports/ReleaseTracking.pm
+++ b/extensions/BMO/lib/Reports/ReleaseTracking.pm
@@ -421,16 +421,6 @@ sub report {
$query .= join("\nAND ", @where);
- if ($input->{debug}) {
- print "Content-Type: text/plain\n\n";
- $query =~ s/\?/\000/g;
- foreach my $param (@params) {
- $query =~ s/\000/'$param'/;
- }
- print "$query\n";
- exit;
- }
-
my $bugs = $dbh->selectcol_arrayref($query, undef, @params);
push @$bugs, 0 unless @$bugs;
diff --git a/extensions/BMO/template/en/default/bug/create/comment-finance.txt.tmpl b/extensions/BMO/template/en/default/bug/create/comment-finance.txt.tmpl
index f0427b4c5..c55ea1d96 100644
--- a/extensions/BMO/template/en/default/bug/create/comment-finance.txt.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/comment-finance.txt.tmpl
@@ -14,10 +14,10 @@ Summary: [% cgi.param('short_desc') %]
Priority to your Team: [% cgi.param('team_priority') %]
Timeframe for Signature: [% cgi.param('signature_time') %]
-Name of Other Party:
+Name of Other Party:
[%+ cgi.param('other_party') %]
-Business Objective:
+Business Objective:
[%+ cgi.param('business_obj') %]
What is this purchase?:
diff --git a/extensions/BMO/template/en/default/bug/create/comment-mozlist.txt.tmpl b/extensions/BMO/template/en/default/bug/create/comment-mozlist.txt.tmpl
index c62461d42..7c14ec95f 100644
--- a/extensions/BMO/template/en/default/bug/create/comment-mozlist.txt.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/comment-mozlist.txt.tmpl
@@ -24,7 +24,7 @@
# enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
# pull out various custom fields and format an initial Description entry
# from them.
- #%]
+ #%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
List Name: [% cgi.param("listName") %]
diff --git a/extensions/BMO/template/en/default/bug/create/create-doc.html.tmpl b/extensions/BMO/template/en/default/bug/create/create-doc.html.tmpl
index becbb2b56..9ff4ef2e3 100644
--- a/extensions/BMO/template/en/default/bug/create/create-doc.html.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/create-doc.html.tmpl
@@ -106,10 +106,10 @@ function validateAndSubmit() {
<td colspan="3">
<div id="possible_duplicates"></div>
<script>
- var dt_columns = [
+ var dt_columns = [
{ key: "id", label: "[% field_descs.bug_id FILTER js %]",
formatter: YAHOO.bugzilla.dupTable.formatBugLink },
- { key: "summary",
+ { key: "summary",
label: "[% field_descs.short_desc FILTER js %]",
formatter: "text" },
{ key: "status",
diff --git a/extensions/BMO/template/en/default/bug/create/create-finance.html.tmpl b/extensions/BMO/template/en/default/bug/create/create-finance.html.tmpl
index 8b2fd63da..434c82fa3 100644
--- a/extensions/BMO/template/en/default/bug/create/create-finance.html.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/create-finance.html.tmpl
@@ -181,7 +181,7 @@
</th>
<td>
<i>
- Describe your request, what items are we purchasing, including number of
+ Describe your request, what items are we purchasing, including number of
units if available.<br>Also provide context and background. Enter No if not
a purchase order.</i><br>
<textarea name="what_purchase" id="what_purchase" rows="5" cols="40"></textarea>
@@ -235,7 +235,7 @@
<label for="attachment">Attachment:</label>
</th>
<td>
- <i>Upload document that needs to be signed. If this is a Purchase Request form,<br>
+ <i>Upload document that needs to be signed. If this is a Purchase Request form,<br>
also upload any supporting document such as draft SOW, quote, order form, etc.</i>
<div>
<input type="file" id="attachment" name="data" size="50">
diff --git a/extensions/BMO/template/en/default/bug/create/create-mozlist.html.tmpl b/extensions/BMO/template/en/default/bug/create/create-mozlist.html.tmpl
index 841477099..8c54bc803 100644
--- a/extensions/BMO/template/en/default/bug/create/create-mozlist.html.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/create-mozlist.html.tmpl
@@ -55,7 +55,7 @@
<div id="message">
<b>Note:</b>
- You must use <a href="https://mozilla.service-now.com/"><b>Service Now</b></a>
+ You must use <a href="https://mozilla.service-now.com/"><b>Service Now</b></a>
to request a distribution list or a standard mailing list.
</div>
<br>
@@ -79,7 +79,7 @@
<span class="mandatory" title="Required">*</span> List Name:
</th>
<td>
- The desired name for the newsgroup. Should start with 'mozilla.' and fit somewhere
+ The desired name for the newsgroup. Should start with 'mozilla.' and fit somewhere
in the hierarchy described <a href="https://www.mozilla.org/about/forums/">here</a>.<br>
<input name="listName" id="listName" size="60" value="[% listName FILTER html %]">
</td>
diff --git a/extensions/BMO/template/en/default/bug/create/create-recoverykey.html.tmpl b/extensions/BMO/template/en/default/bug/create/create-recoverykey.html.tmpl
index ffe9b3482..3ede350a2 100644
--- a/extensions/BMO/template/en/default/bug/create/create-recoverykey.html.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/create-recoverykey.html.tmpl
@@ -1,33 +1,33 @@
-[%# 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 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 BMO Bugzilla Extension.
#
# The Initial Developer of the Original Code is the Mozilla Foundation
# Portions created by the Initial Developers are Copyright (C) 2011 the
# Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# David Lawrence <dkl@mozilla.com>
- #%]
-
-[% PROCESS global/variables.none.tmpl %]
-
-[% PROCESS global/header.html.tmpl
- title = "Mozilla Corporation/Foundation Encryption Recovery Key"
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Mozilla Corporation/Foundation Encryption Recovery Key"
%]
-
+
<p>Please complete the following information as you are encrypting your laptop.</p>
<ul>
- <li>The Recovery Key will be displayed during the encryption process
+ <li>The Recovery Key will be displayed during the encryption process
(<a href="https://mana.mozilla.org/wiki/display/INFRASEC/Desktop+Security#DesktopSecurity-DiskencryptionFileVault">more info</a>)
</li>
<li>The asset tag number is located on a sticker typically on the bottom of the device.</li>
@@ -67,4 +67,4 @@
</table>
</form>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/BMO/template/en/default/bug/create/create-trademark.html.tmpl b/extensions/BMO/template/en/default/bug/create/create-trademark.html.tmpl
index 90da895b2..0a7629a88 100644
--- a/extensions/BMO/template/en/default/bug/create/create-trademark.html.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/create-trademark.html.tmpl
@@ -1,36 +1,36 @@
-[%# 1.0@bugzilla.org %]
-[%# 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 Netscape Communications
- # Corporation. Portions created by Netscape are
- # Copyright (C) 1998 Netscape Communications Corporation. All
- # Rights Reserved.
- #
- # Contributor(s): Gervase Markham <gerv@gerv.net>
+[%# 1.0@bugzilla.org %]
+[%# 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 Netscape Communications
+ # Corporation. Portions created by Netscape are
+ # Copyright (C) 1998 Netscape Communications Corporation. All
+ # Rights Reserved.
+ #
+ # Contributor(s): Gervase Markham <gerv@gerv.net>
# Ville Skyttä <ville.skytta@iki.fi>
# John Hoogstrate <hoogstrate@zeelandnet.nl>
- #%]
-
-[% PROCESS global/variables.none.tmpl %]
-
-[% PROCESS global/header.html.tmpl
- title = "Trademark Usage Requests"
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+[% PROCESS global/header.html.tmpl
+ title = "Trademark Usage Requests"
%]
-
-[% USE Bugzilla %]
+
+[% USE Bugzilla %]
<p>
- If, after reading
+ If, after reading
<a href="https://www.mozilla.org/foundation/trademarks/">the trademark policy
documents</a>, you know you need permission to use a certain trademark, this
is the place to be.
@@ -39,7 +39,7 @@
<p><strong>Please use this form for trademark requests only!</strong></p>
<form method="post" action="post_bug.cgi" id="tmRequestForm">
-
+
<input type="hidden" name="product" value="Marketing">
<input type="hidden" name="component" value="Trademark Permissions">
<input type="hidden" name="bug_severity" value="enhancement">
@@ -79,9 +79,9 @@
<input type="submit" id="commit" value="Submit Request">
</form>
-<p>Thanks for contacting us.
+<p>Thanks for contacting us.
You will be notified by email of any progress made in resolving your
request.
</p>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/BMO/template/en/default/bug/create/custom_forms.none.tmpl b/extensions/BMO/template/en/default/bug/create/custom_forms.none.tmpl
index 7b588f765..0d37a1386 100644
--- a/extensions/BMO/template/en/default/bug/create/custom_forms.none.tmpl
+++ b/extensions/BMO/template/en/default/bug/create/custom_forms.none.tmpl
@@ -168,12 +168,6 @@ custom_forms = {
title => "Intern Requests",
},
]
- "Mozilla Labs" => [
- {
- link => "https://github.com/mozilla/personas-plus/issues",
- title => "Report issue with Personas Plus on Github"
- }
- ],
"Legal" => [
{
title => 'Mozilla Foundation Vendor Request',
diff --git a/extensions/BMO/template/en/default/email/bugmail.html.tmpl b/extensions/BMO/template/en/default/email/bugmail.html.tmpl
index 0b08e4a86..7f2754fdc 100644
--- a/extensions/BMO/template/en/default/email/bugmail.html.tmpl
+++ b/extensions/BMO/template/en/default/email/bugmail.html.tmpl
@@ -111,7 +111,7 @@
[% END %]
[% END %]
</ul>
- Configure your email settings at
+ Configure your email settings at
<a href="[% urlbase FILTER none %]userprefs.cgi?tab=email">[% urlbase FILTER none %]userprefs.cgi?tab=email</a>.
</div>
diff --git a/extensions/BMO/template/en/default/global/choose-product.html.tmpl b/extensions/BMO/template/en/default/global/choose-product.html.tmpl
index dfa9b5af4..74c9f7b0d 100644
--- a/extensions/BMO/template/en/default/global/choose-product.html.tmpl
+++ b/extensions/BMO/template/en/default/global/choose-product.html.tmpl
@@ -36,7 +36,10 @@
"extensions/BMO/web/styles/choose_product.css",
"extensions/ProdCompSearch/web/styles/prod_comp_search.css",
];
- javascript_urls = [ "extensions/ProdCompSearch/web/js/prod_comp_search.js" ];
+ javascript_urls = [
+ "extensions/BMO/web/js/new-bug-frequent-comp.js",
+ "extensions/ProdCompSearch/web/js/prod_comp_search.js",
+ ];
cgi = Bugzilla.cgi;
classification = cgi.param('classification');
@@ -68,6 +71,13 @@
%]
</div>
+[% IF NOT is_describe %]
+<section id="frequent-components" hidden>
+ <h2>Choose from your most-used components</h2>
+ <div class="results"></div>
+</section>
+[% END %]
+
<section id="product-list">
<h2>or choose from the following selections</h2>
@@ -103,10 +113,18 @@
icon="component.png"
%]
[% INCLUDE easyproduct
+ name="GeckoView"
+ icon="firefox_android.png"
+ %]
+ [% INCLUDE easyproduct
name="Mozilla Localizations"
icon="localization.png"
%]
[% INCLUDE easyproduct
+ name="Data Platform and Tools"
+ icon="telemetry.png"
+ %]
+ [% INCLUDE easyproduct
name="Thunderbird"
icon="thunderbird.png"
%]
@@ -114,10 +132,6 @@
name="SeaMonkey"
icon="seamonkey.png"
%]
- [% INCLUDE easyproduct
- name="Data Platform and Tools"
- icon="telemetry.png"
- %]
<section class="product other">
<h3>
<a href="[% target FILTER uri %]?full=1
diff --git a/extensions/BMO/template/en/default/hook/bug/field-help-end.none.tmpl b/extensions/BMO/template/en/default/hook/bug/field-help-end.none.tmpl
index dda75a9c6..c70b35825 100644
--- a/extensions/BMO/template/en/default/hook/bug/field-help-end.none.tmpl
+++ b/extensions/BMO/template/en/default/hook/bug/field-help-end.none.tmpl
@@ -20,13 +20,13 @@
[% USE Bugzilla %]
[% IF Bugzilla.request_cache.bmo_fields_page %]
- [%
+ [%
vars.help_html.priority =
"This field describes the importance and order in which $terms.abug
should be fixed compared to other ${terms.bugs}. This field is utilized
by the programmers/engineers to prioritize their work to be done where
P1 is considered the highest and P5 is the lowest."
-
+
vars.help_html.bug_severity =
"This field describes the impact of ${terms.abug}.
<table>
@@ -60,9 +60,9 @@
<th>enhancement</th>
<td>Request for enhancement</td>
</table>"
-
- vars.help_html.rep_platform =
- "This is the hardware platform against which the $terms.bug was reported.
+
+ vars.help_html.rep_platform =
+ "This is the hardware platform against which the $terms.bug was reported.
Legal platforms include:
<ul>
<li>All (happens on all platforms; cross-platform ${terms.bug})</li>
@@ -71,10 +71,10 @@
</ul>
<b>Note:</b> When searching, selecting the option
<em>All</em> does not
- select $terms.bugs assigned against any platform. It merely selects
- $terms.bugs that are marked as occurring on all platforms, i.e. are
+ select $terms.bugs assigned against any platform. It merely selects
+ $terms.bugs that are marked as occurring on all platforms, i.e. are
designated <em>All</em>.",
-
+
vars.help_html.op_sys =
"This is the operating system against which the $terms.bug was
reported. Legal operating systems include:
@@ -86,10 +86,10 @@
</ul>
Sometimes the operating system implies the platform, but not
always. For example, Linux can run on x86_64, ARM, and others.",
-
+
vars.help_html.assigned_to =
"This is the person in charge of resolving the ${terms.bug}. Every time
- this field changes, the status changes to
+ this field changes, the status changes to
<b>NEW</b> to make it
easy to see which new $terms.bugs have appeared on a person's list.</p>",
%]
diff --git a/extensions/BMO/template/en/default/hook/bug/show-header-end.html.tmpl b/extensions/BMO/template/en/default/hook/bug/show-header-end.html.tmpl
index c49d06b73..9458fd375 100644
--- a/extensions/BMO/template/en/default/hook/bug/show-header-end.html.tmpl
+++ b/extensions/BMO/template/en/default/hook/bug/show-header-end.html.tmpl
@@ -18,7 +18,7 @@
[% title = title _ "($filtered_alias) " %]
[% END %]
[% title = title _ filtered_desc %]
-[% javascript = javascript _
+[% javascript = javascript _
"document.title = document.title.replace(/^" _ terms.Bug _ " /, '');"
%]
[% js_bug_id = bug.bug_id FILTER js %]
diff --git a/extensions/BMO/template/en/default/hook/flag/type_comment-form.html.tmpl b/extensions/BMO/template/en/default/hook/flag/type_comment-form.html.tmpl
new file mode 100644
index 000000000..7703bed74
--- /dev/null
+++ b/extensions/BMO/template/en/default/hook/flag/type_comment-form.html.tmpl
@@ -0,0 +1,202 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+<template class="approval-request" data-flags="approval‑mozilla‑beta approval‑mozilla‑release">
+ <fieldset>
+ <legend>Beta/Release Uplift Approval Request</legend>
+ <table>
+ <tr>
+ <th id="_ar_beta_i1_label">Feature/[% terms.Bug %] causing the regression</th>
+ <td><input type="text" placeholder="[% terms.Bug %] ID" aria-labelledby="_ar_beta_i1_label" data-type="b[% %]ug"></td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i2_label">User impact if declined</th>
+ <td><textarea aria-labelledby="_ar_beta_i2_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i3_label">Is this code covered by automated tests?</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_beta_i3_label">
+ <div class="item"><input id="_ar_beta_i3_r1" type="radio" name="_ar_beta_i3_radio" value="Yes"><label for="_ar_beta_i3_r1">Yes</label></div>
+ <div class="item"><input id="_ar_beta_i3_r2" type="radio" name="_ar_beta_i3_radio" value="No"><label for="_ar_beta_i3_r2">No</label></div>
+ <div class="item"><input id="_ar_beta_i3_r3" type="radio" name="_ar_beta_i3_radio" value="Unknown"><label for="_ar_beta_i3_r3">Unknown</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i4_label">Has the fix been verified in Nightly?</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_beta_i4_label">
+ <div class="item"><input id="_ar_beta_i4_r1" type="radio" name="_ar_beta_i4_radio" value="Yes"><label for="_ar_beta_i4_r1">Yes</label></div>
+ <div class="item"><input id="_ar_beta_i4_r2" type="radio" name="_ar_beta_i4_radio" value="No"><label for="_ar_beta_i4_r2">No</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i5_label">Needs manual test from QE?</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_beta_i5_label">
+ <div class="item"><input id="_ar_beta_i5_r1" type="radio" name="_ar_beta_i5_radio" value="Yes"><label for="_ar_beta_i5_r1">Yes</label></div>
+ <div class="item"><input id="_ar_beta_i5_r2" type="radio" name="_ar_beta_i5_radio" value="No"><label for="_ar_beta_i5_r2">No</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i6_label">If yes, steps to reproduce</th>
+ <td><textarea aria-labelledby="_ar_beta_i6_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i7_label">List of other uplifts needed</th>
+ <td><input type="text" placeholder="[% terms.Bug %] IDs" aria-labelledby="_ar_beta_i7_label" data-type="b[% %]ugs"></td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i8_label">Risk to taking this patch</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_beta_i8_label">
+ <div class="item"><input id="_ar_beta_i8_r1" type="radio" name="_ar_beta_i8_radio" value="Low"><label for="_ar_beta_i8_r1">Low</label></div>
+ <div class="item"><input id="_ar_beta_i8_r2" type="radio" name="_ar_beta_i8_radio" value="Medium"><label for="_ar_beta_i8_r2">Medium</label></div>
+ <div class="item"><input id="_ar_beta_i8_r3" type="radio" name="_ar_beta_i8_radio" value="High"><label for="_ar_beta_i8_r3">High</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i9_label">Why is the change risky/not risky?<br>(and alternatives if risky)</th>
+ <td><textarea aria-labelledby="_ar_beta_i9_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_beta_i10_label">String changes made/needed</th>
+ <td><input type="text" class="long" aria-labelledby="_ar_beta_i10_label"></td>
+ </tr>
+ </table>
+ </fieldset>
+</template>
+
+<template class="approval-request" data-flags="approval‑mozilla‑esr*">
+ <fieldset>
+ <legend>ESR Uplift Approval Request</legend>
+ <table>
+ <tr>
+ <th id="_ar_esr_i1_label">If this is not a sec:{high,crit} [% terms.bug %], please state case for ESR consideration</th>
+ <td><textarea aria-labelledby="_ar_esr_i1_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_esr_i2_label">User impact if declined</th>
+ <td><textarea aria-labelledby="_ar_esr_i2_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_esr_i3_label">Fix Landed on Version</th>
+ <td><input type="text" aria-labelledby="_ar_esr_i3_label"></td>
+ </tr>
+ <tr>
+ <th id="_ar_esr_i4_label">Risk to taking this patch</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_esr_i4_label">
+ <div class="item"><input id="_ar_esr_i4_r1" type="radio" name="_ar_esr_i4_radio" value="Low"><label for="_ar_esr_i4_r1">Low</label></div>
+ <div class="item"><input id="_ar_esr_i4_r2" type="radio" name="_ar_esr_i4_radio" value="Medium"><label for="_ar_esr_i4_r2">Medium</label></div>
+ <div class="item"><input id="_ar_esr_i4_r3" type="radio" name="_ar_esr_i4_radio" value="High"><label for="_ar_esr_i4_r3">High</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_esr_i5_label">Why is the change risky/not risky?<br>(and alternatives if risky)</th>
+ <td><textarea aria-labelledby="_ar_esr_i5_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_esr_i6_label">String or UUID changes made by this patch</th>
+ <td><input type="text" class="long" aria-labelledby="_ar_esr_i6_label"></td>
+ </tr>
+ </table>
+ <p>See <a href="https://wiki.mozilla.org/Release_Management/ESR_Landing_Process" target="_blank">ESR Landing Process</a> for more info.</p>
+ </fieldset>
+</template>
+
+<template class="approval-request" data-flags="approval‑mozilla‑geckoview*">
+ <fieldset>
+ <legend>GeckoView Uplift Approval Request</legend>
+ <table>
+ <tr>
+ <th id="_ar_gkv_i1_label">If this is not a sec:{high,crit} [% terms.bug %], please state case for consideration</th>
+ <td><textarea aria-labelledby="_ar_gkv_i1_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_gkv_i2_label">User impact if declined</th>
+ <td><textarea aria-labelledby="_ar_gkv_i2_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_gkv_i3_label">Fix Landed on Version</th>
+ <td><input type="text" aria-labelledby="_ar_gkv_i3_label"></td>
+ </tr>
+ <tr>
+ <th id="_ar_gkv_i4_label">Risk to taking this patch</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_gkv_i4_label">
+ <div class="item"><input id="_ar_gkv_i4_r1" type="radio" name="_ar_gkv_i4_radio" value="Low"><label for="_ar_gkv_i4_r1">Low</label></div>
+ <div class="item"><input id="_ar_gkv_i4_r2" type="radio" name="_ar_gkv_i4_radio" value="Medium"><label for="_ar_gkv_i4_r2">Medium</label></div>
+ <div class="item"><input id="_ar_gkv_i4_r3" type="radio" name="_ar_gkv_i4_radio" value="High"><label for="_ar_gkv_i4_r3">High</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_gkv_i5_label">Why is the change risky/not risky?<br>(and alternatives if risky)</th>
+ <td><textarea aria-labelledby="_ar_gkv_i5_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_gkv_i6_label">String or UUID changes made by this patch</th>
+ <td><input type="text" class="long" aria-labelledby="_ar_gkv_i6_label"></td>
+ </tr>
+ </table>
+ <p>See <a href="https://wiki.mozilla.org/Release_Management/Uplift_rules" target="_blank">Patch uplifting rules</a> for more info.</p>
+ </fieldset>
+</template>
+
+<template class="approval-request" data-flags="sec‑approval">
+ <fieldset>
+ <legend>Security Approval Request</legend>
+ <table>
+ <tr>
+ <th id="_ar_sec_i1_label">How easily could an exploit be constructed based on the patch?</th>
+ <td><textarea aria-labelledby="_ar_sec_i1_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i2_label">Do comments in the patch, the check-in comment, or tests included in the patch paint a bulls-eye on the security problem?</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_sec_i2_label">
+ <div class="item"><input id="_ar_sec_i2_r1" type="radio" name="_ar_sec_i2_radio" value="Yes"><label for="_ar_sec_i2_r1">Yes</label></div>
+ <div class="item"><input id="_ar_sec_i2_r2" type="radio" name="_ar_sec_i2_radio" value="No"><label for="_ar_sec_i2_r2">No</label></div>
+ <div class="item"><input id="_ar_sec_i2_r3" type="radio" name="_ar_sec_i2_radio" value="Unknown"><label for="_ar_sec_i2_r3">Unknown</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i3_label">Which older supported branches are affected by this flaw?</th>
+ <td><input type="text" aria-labelledby="_ar_sec_i3_label"></td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i4_label">If not all supported branches, which [% terms.bug %] introduced the flaw?</th>
+ <td><input type="text" placeholder="[% terms.Bug %] ID" aria-labelledby="_ar_sec_i4_label" data-type="b[% %]ug"></td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i5_label">Do you have backports for the affected branches?</th>
+ <td>
+ <div role="radiogroup" class="buttons toggle" aria-labelledby="_ar_sec_i5_label">
+ <div class="item"><input id="_ar_sec_i5_r1" type="radio" name="_ar_sec_i5_radio" value="Yes"><label for="_ar_sec_i5_r1">Yes</label></div>
+ <div class="item"><input id="_ar_sec_i5_r2" type="radio" name="_ar_sec_i5_radio" value="No"><label for="_ar_sec_i5_r2">No</label></div>
+ </div>
+ </td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i6_label">If not, how different, hard to create, and risky will they be?</th>
+ <td><textarea aria-labelledby="_ar_sec_i6_label"></textarea></td>
+ </tr>
+ <tr>
+ <th id="_ar_sec_i7_label">How likely is this patch to cause regressions; how much testing does it need?</th>
+ <td><textarea aria-labelledby="_ar_sec_i7_label"></textarea></td>
+ </tr>
+ </table>
+ </fieldset>
+</template>
diff --git a/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl b/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
index 0566f48b3..6300b0d15 100644
--- a/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
+++ b/extensions/BMO/template/en/default/hook/global/header-additional_header.html.tmpl
@@ -22,6 +22,7 @@
<link rel="shortcut icon" href="extensions/BMO/web/images/favicon.ico">
[% IF bug %]
<link rel="canonical" href="[% Bugzilla.localconfig.canonical_urlbase FILTER none %]show_bug.cgi?id=[% bug.bug_id FILTER uri %]">
+<link rel="shorturl" href="[% Bugzilla.localconfig.canonical_urlbase FILTER none %][% bug.bug_id FILTER uri %]">
[% END %]
[%# *** Bug List Navigation *** %]
diff --git a/extensions/BMO/template/en/default/hook/index-intro.html.tmpl b/extensions/BMO/template/en/default/hook/index-intro.html.tmpl
deleted file mode 100644
index ddee1db2f..000000000
--- a/extensions/BMO/template/en/default/hook/index-intro.html.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-<a id="docs" class="bz_common_actions"
- href="https://bmo.readthedocs.org/"><span>Documentation</span></a>
diff --git a/extensions/BMO/template/en/default/pages/persona_deprecated.html.tmpl b/extensions/BMO/template/en/default/pages/persona_deprecated.html.tmpl
deleted file mode 100644
index 18b7a3f60..000000000
--- a/extensions/BMO/template/en/default/pages/persona_deprecated.html.tmpl
+++ /dev/null
@@ -1,53 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% PROCESS global/header.html.tmpl
- title = "Persona Deprecated"
-%]
-
-<h2>Persona Deprecated</h2>
-
-<p>
- Beginning on October 25th, 2016, <a href="https://login.persona.org">Persona</a> is no longer a supported authentication method
- for bugzilla.mozilla.org (BMO). The Mozilla supported Persona service will cease operations on November 30th, 2016 so therefore
- BMO will not longer be able to use the service for authentication. You can go
- <a href="https://wiki.mozilla.org/Identity/Persona_Shutdown_Guidelines_for_Reliers">here</a> for more information about Persona
- and the reasons for shutting down service.
-</p>
-
-<p>
- For users of Persona on BMO, there are two other methods for authentication that are supported and you will need to switch
- over to one of them after your current session expires starting October 25th, 2016.
-</p>
-
-<h3>Native Login</h3>
-
-<p>
- BMO has always supported native authentication using a password securely stored in our database. If you have used Persona since
- first creating your BMO account, you will probably not know this password. But you can reset it to something you do know by first
- logging out, and then clicking on 'Forgot Password' at the right-hand top of the page. Enter your email you used with Persona in
- the text field and click 'Reset Password'.
-</p>
-
-<p>
- You will receive an email with a link you can use to reset your current password to something you can use from now on.
- After you reset your password, simply enter your login and the password in the login fields at the top of any BMO page.
-</p>
-
-<h3>Github Login</h3>
-
-<p>
- <a href="https://github.com">Github</a> is also a BMO supported method of authentication. To use Github, first log out and then
- click 'Login' at the top of any BMO page and then click on the 'Github' login image. You will need to have a Github account that
- has an email address the same as the Persona email you were using, otherwise a different BMO account will be created. You will
- be able to choose the email address you want to use for BMO if you have more than one configured in your Github profile. If none
- of the email addresses you have configured in Github match what you were using for Persona, native login described above may be
- your best choice if you want to retain your BMO data.
-</p>
-
-[% PROCESS global/footer.html.tmpl %]
diff --git a/extensions/BMO/template/en/default/pages/release_tracking_report.html.tmpl b/extensions/BMO/template/en/default/pages/release_tracking_report.html.tmpl
index 8ee3d0d59..6c0387ec0 100644
--- a/extensions/BMO/template/en/default/pages/release_tracking_report.html.tmpl
+++ b/extensions/BMO/template/en/default/pages/release_tracking_report.html.tmpl
@@ -97,7 +97,7 @@ var default_query = '[% default_query FILTER js %]';
</span>
</td>
</tr>
-
+
<tr>
<td>&nbsp;</td>
<td colspan="2">
diff --git a/extensions/BMO/template/en/default/pages/upgrade-3.6.html.tmpl b/extensions/BMO/template/en/default/pages/upgrade-3.6.html.tmpl
index 9e6d72d66..6091810db 100644
--- a/extensions/BMO/template/en/default/pages/upgrade-3.6.html.tmpl
+++ b/extensions/BMO/template/en/default/pages/upgrade-3.6.html.tmpl
@@ -74,7 +74,7 @@
<p>Work continues on improving usability for the next release of
[%+ terms.Bugzilla %], but the results of the research have already
had an impact on this 3.6 release.</p>
-
+
<h4>Improved Quicksearch</h4>
<p>The "quicksearch" box that appears on the front page of
@@ -113,7 +113,7 @@
<p>There is now a "Browse" link in the header of each [% terms.Bugzilla %]
page that presents a very basic interface that allows users to simply
browse through all open [% terms.bugs %] in particular components.</p>
-
+
<h4>JSON-RPC Interface</h4>
<p>[% terms.Bugzilla %] now has support for the
@@ -134,7 +134,7 @@
mandatory.</li>
<li><b>[% terms.Bug %] Filing:</b> "Bookmarkable templates" now
support the "alias" and "estimated hours" fields.</li>
-
+
<li><b>[% terms.Bug %] Editing:</b> In previous versions of
[%+ terms.Bugzilla %], if you added a private comment to [% terms.abug %],
then <em>none</em> of the changes that you made at that time were
@@ -165,10 +165,10 @@
<li><b>Attachments:</b> When you click on an "attachment 12345" link
in a comment, if the attachment is a patch, you will now see the
formatted "Diff" view instead of the raw patch.</li>
- <li><b>Attachments</b>: For text attachments, we now let the browser
+ <li><b>Attachments</b>: For text attachments, we now let the browser
auto-detect the character encoding, instead of forcing the browser to
always assume the attachment is in UTF-8.</li>
-
+
<li><b>Search:</b> You can now display [% terms.bug %] flags as a column
in search results.</li>
<li><b>Search:</b> When viewing search results, you can see which columns are
@@ -188,7 +188,7 @@
<kbd>buglist.cgi</kbd> now accepts nearly every valid field in
[%+ terms.Bugzilla %] as a direct URL parameter, like
<kbd>&amp;field=value</kbd>.</li>
-
+
<li><b>Requests:</b> When viewing the "My Requests" page, you can now
see the lists as a normal search result by clicking a link at the
bottom of each table.</li>
@@ -208,7 +208,7 @@
if there are no [% terms.bugs %] that match your searches.</li>
<li>The arrows in dependency graphs now point the other way, so that
[%+ terms.bugs %] point at their dependencies.</li>
-
+
<li><b>New Charts:</b> You can now convert an existing Saved Search
into a data series for New Charts.</li>
<li><b>New Charts:</b> There is now an interface that allows you to
@@ -241,7 +241,7 @@
<li>Information about duplicates is now stored in the database instead
of being stored in the <kbd>data/</kbd> directory. On large installations
this could save several hundred megabytes of disk space.</li>
-
+
<li>When editing a group, you can now specify that members of a group
are allowed to grant others membership in that group itself.</li>
<li>The ability to compress BMP attachments to PNGs is now an Extension.
diff --git a/extensions/BMO/template/en/default/pages/user_activity.html.tmpl b/extensions/BMO/template/en/default/pages/user_activity.html.tmpl
index 5603b943f..1d6e222c6 100644
--- a/extensions/BMO/template/en/default/pages/user_activity.html.tmpl
+++ b/extensions/BMO/template/en/default/pages/user_activity.html.tmpl
@@ -99,7 +99,7 @@
There used to be an issue in <a href="https://www.bugzilla.org/">Bugzilla</a>
which caused activity data to be lost if there were a large number of cc's
or dependencies. That has been fixed, but some data was already lost in
- your activity table that could not be regenerated. The changes that
+ your activity table that could not be regenerated. The changes that
could not reliably determine are prefixed by '?'.
</p>
[% END %]
diff --git a/extensions/BMO/web/js/new-bug-frequent-comp.js b/extensions/BMO/web/js/new-bug-frequent-comp.js
new file mode 100644
index 000000000..88879738d
--- /dev/null
+++ b/extensions/BMO/web/js/new-bug-frequent-comp.js
@@ -0,0 +1,123 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This Source Code Form is "Incompatible With Secondary Licenses", as
+ * defined by the Mozilla Public License, v. 2.0. */
+
+/**
+ * Reference or define the Bugzilla app namespace.
+ * @namespace
+ */
+var Bugzilla = Bugzilla || {}; // eslint-disable-line no-var
+
+/**
+ * Show the current user's most-used components on the New Bug page.
+ */
+Bugzilla.NewBugFrequentComp = class NewBugFrequentComp {
+ /**
+ * Initialize a new NewBugFrequentComp instance.
+ */
+ constructor() {
+ this.$container = document.querySelector('#frequent-components');
+
+ if (this.$container && BUGZILLA.user.login) {
+ this.init();
+ }
+ }
+
+ /**
+ * Initialize the UI.
+ */
+ async init() {
+ this.$results = this.$container.querySelector('.results');
+ this.$message = this.$results.appendChild(document.createElement('p'));
+ this.$message.textContent = 'Loading...';
+ this.$results.setAttribute('aria-busy', 'true');
+ this.$container.hidden = false;
+
+ // Get the current params that may contain `cloned_bug_id` and `format`
+ const current_params = new URLSearchParams(location.search);
+
+ try {
+ const links = (await this.fetch()).map(({ product, component }) => {
+ const params = new URLSearchParams(current_params);
+
+ params.append('product', product);
+ params.append('component', component);
+
+ return {
+ href: `/enter_bug.cgi?${params.toString()}`,
+ text: `${product} :: ${component}`,
+ };
+ });
+
+ this.$message.remove();
+ this.$results.insertAdjacentHTML('beforeend',
+ `<ul>${links.map(({ href, text }) =>
+ `<li><a href="${href.htmlEncode()}">${text.htmlEncode()}</a></li>`
+ ).join('')}</ul>`
+ );
+ } catch (error) {
+ this.$message.textContent = error.message || 'Your frequent components could not be retrieved.';
+ }
+
+ this.$results.removeAttribute('aria-busy');
+ }
+
+ /**
+ * Retrieve frequently used components.
+ * @param {Number} [max=10] Maximum number of results.
+ * @returns {Promise} Results or error.
+ */
+ async fetch(max = 10) {
+ const params = new URLSearchParams({
+ email1: BUGZILLA.user.login,
+ emailreporter1: '1',
+ emailtype1: 'exact',
+ chfield: '[Bug creation]',
+ chfieldfrom: '-1y',
+ chfieldto: 'Now',
+ include_fields: 'product,component',
+ });
+
+ return new Promise((resolve, reject) => {
+ bugzilla_ajax({
+ url: `/rest/bug?${params.toString()}`
+ }, response => {
+ if (!response.bugs) {
+ reject(new Error('Your frequent components could not be retrieved.'));
+
+ return;
+ }
+
+ if (!response.bugs.length) {
+ reject(new Error(('Your frequent components could not be found.')));
+
+ return;
+ }
+
+ const results = [];
+
+ for (const { product, component } of response.bugs) {
+ const index = results.findIndex(result => product === result.product && component === result.component);
+
+ if (index > -1) {
+ results[index].count++;
+ } else {
+ results.push({ product, component, count: 1 });
+ }
+ }
+
+ // Sort in descending order
+ results.sort((a, b) => (a.count < b.count ? 1 : a.count > b.count ? -1 : 0));
+
+ resolve(results.slice(0, max));
+ }, () => {
+ reject(new Error('Your frequent components could not be retrieved.'));
+ });
+ });
+ }
+};
+
+window.addEventListener('DOMContentLoaded', () => new Bugzilla.NewBugFrequentComp(), { once: true });
diff --git a/extensions/BMO/web/js/release_tracking_report.js b/extensions/BMO/web/js/release_tracking_report.js
index c91222e0f..158cc7521 100644
--- a/extensions/BMO/web/js/release_tracking_report.js
+++ b/extensions/BMO/web/js/release_tracking_report.js
@@ -41,7 +41,7 @@ function onProductChange() {
'<input type="checkbox" id="field_' + field.id + '_cb" ' +
'onClick="onFieldToggle(this,' + field.id + ')">' +
'</td>' +
- '<td class="disabled" id="field_' + field.id + '_td">' +
+ '<td class="disabled" id="field_' + field.id + '_td">' +
'<label for="field_' + field.id + '_cb">' +
field.desc.htmlEncode() + ':</label>' +
'</td>' +
diff --git a/extensions/BMO/web/js/sorttable.js b/extensions/BMO/web/js/sorttable.js
index 0873dc20a..c20f02647 100644
--- a/extensions/BMO/web/js/sorttable.js
+++ b/extensions/BMO/web/js/sorttable.js
@@ -3,13 +3,13 @@
version 2
7th April 2007
Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/
-
+
Instructions:
Download this file
Add <script src="sorttable.js"></script> to your HTML
Add class="sortable" to any table you'd like to make sortable
Click on the headers to sort
-
+
Thanks to many, many people for contributions and suggestions.
Licenced as X11: http://www.kryogenix.org/code/browser/licence.html
This basically means: do what you want with it.
@@ -25,20 +25,20 @@ sorttable = {
arguments.callee.done = true;
// kill the timer
if (_timer) clearInterval(_timer);
-
+
if (!document.createElement || !document.getElementsByTagName) return;
-
+
sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/;
-
+
forEach(document.getElementsByTagName('table'), function(table) {
if (table.className.search(/\bsortable\b/) != -1) {
sorttable.makeSortable(table);
}
});
-
+
},
- /*
+ /*
* Prepares the table so that it can be sorted
*
*/
@@ -53,9 +53,9 @@ sorttable = {
}
// Safari doesn't support table.tHead, sigh
if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0];
-
+
//if (table.tHead.rows.length != 1) return; // can't cope with two header rows
-
+
// Sorttable v1 put rows with a class of "sortbottom" at the bottom (as
// "total" rows, for example). This is B&R, since what you're supposed
// to do is put them in a tfoot. So, if there are sortbottom rows,
@@ -106,7 +106,7 @@ sorttable = {
table.sorttable_rows = table_rows;
table.sorttable_body_size = body_size;
table.sorttable_bodies = bodies;
-
+
// work through each column and calculate its type
@@ -185,7 +185,7 @@ sorttable = {
_check_already_sorted: function(cell) {
if (cell.className.search(/\bsorttable_sorted\b/) != -1) {
- // if we're already sorted by this column, just
+ // if we're already sorted by this column, just
// reverse the table, which is quicker
sorttable.reverse_table(cell);
@@ -194,7 +194,7 @@ sorttable = {
}
if (cell.className.search(/\bsorttable_sorted_reverse\b/) != -1) {
- // if we're already sorted by this column in reverse, just
+ // if we're already sorted by this column in reverse, just
// re-reverse the table, which is quicker
sorttable.reverse_table(cell);
@@ -271,7 +271,7 @@ sorttable = {
return;
- // First, remove sorttable_sorted classes from the other header
+ // First, remove sorttable_sorted classes from the other header
// that is currently sorted and its marker (the simbol indicating
// that its sorted.
sorttable._remove_sorted_classes(this.table.tHead);
@@ -285,7 +285,7 @@ sorttable = {
sorttable._mark_column_as_sorted(this, '&#x25BC;', 0);
sorttable.sort_table(this);
-
+
},
sort_table: function(cell) {
@@ -312,7 +312,7 @@ sorttable = {
body_size = cell.table.sorttable_body_size;
body_index = 0;
- for (var j=0; j<rows.length; j++) {
+ for (var j=0; j<rows.length; j++) {
if (j % 2)
rows[j].className = rows[j].className.replace('bz_row_even',
'bz_row_odd');
@@ -336,7 +336,7 @@ sorttable = {
cell.table.sorttable_rows = rows;
},
-
+
reverse_table: function(cell) {
oldrows = cell.table.sorttable_rows;
newrows = [];
@@ -348,7 +348,7 @@ sorttable = {
tb = cell.table.sorttable_bodies[0];
body_size = cell.table.sorttable_body_size;
body_index = 0;
-
+
var BUGLIST = '';
cell.table.sorttable_rows = [];
@@ -379,17 +379,17 @@ sorttable = {
delete newrows;
},
-
+
guessType: function(table, column) {
// guess the type of a column based on its first non-blank row
sortfn = sorttable.sort_alpha;
for (var i=0; i<table.sorttable_bodies[0].rows.length; i++) {
text = sorttable.getInnerText(table.sorttable_bodies[0].rows[i].cells[column]);
if (text != '') {
- if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
+ if (text.match(/^-?[£$¤]?[\d,.]+%?$/)) {
return sorttable.sort_numeric;
}
- // check for a date: dd/mm/yyyy or dd/mm/yy
+ // check for a date: dd/mm/yyyy or dd/mm/yy
// can have / or . or - as separator
// can be mm/dd as well
possdate = text.match(sorttable.DATE_RE)
@@ -412,7 +412,7 @@ sorttable = {
}
return sortfn;
},
-
+
getInnerText: function(node) {
// gets the text we want to use for sorting for a cell.
// strips leading and trailing whitespace.
@@ -422,7 +422,7 @@ sorttable = {
hasInputs = (typeof node.getElementsByTagName == 'function') &&
node.getElementsByTagName('input').length;
-
+
if (typeof node.getAttribute != 'undefined' && node.getAttribute("sorttable_customkey") != null) {
return node.getAttribute("sorttable_customkey");
}
@@ -457,14 +457,14 @@ sorttable = {
}
}
},
-
+
/* sort functions
each sort function takes two parameters, a and b
you are comparing a.sort_data and b.sort_data */
sort_numeric: function(a,b) {
aa = parseFloat(a.sort_data.replace(/[^0-9.-]/g,''));
if (isNaN(aa)) aa = 0;
- bb = parseFloat(b.sort_data.replace(/[^0-9.-]/g,''));
+ bb = parseFloat(b.sort_data.replace(/[^0-9.-]/g,''));
if (isNaN(bb)) bb = 0;
return aa-bb;
},
@@ -506,7 +506,7 @@ sorttable = {
if (dt1<dt2) return -1;
return 1;
},
-
+
shaker_sort: function(list, comp_func) {
// A stable sort function to allow multi-level sorting of data
// see: http://en.wikipedia.org/wiki/Cocktail_sort
@@ -536,7 +536,7 @@ sorttable = {
b++;
} // while(swap)
- }
+ }
}
/* ******************************************************************
diff --git a/extensions/BMO/web/js/swag.js b/extensions/BMO/web/js/swag.js
index cd9561b54..2a86c90f4 100644
--- a/extensions/BMO/web/js/swag.js
+++ b/extensions/BMO/web/js/swag.js
@@ -24,37 +24,37 @@ function getTotal(item_array) {
return total;
}
-function calculateTotalSwag() {
- document.getElementById('Totalswag').value =
+function calculateTotalSwag() {
+ document.getElementById('Totalswag').value =
getTotal( new Array('Lanyards',
'Stickers',
'Bracelets',
'Tattoos',
'Buttons',
'Posters'));
-
+
}
-function calculateTotalMensShirts() {
- document.getElementById('mens_total').value =
+function calculateTotalMensShirts() {
+ document.getElementById('mens_total').value =
getTotal( new Array('mens_s',
'mens_m',
'mens_l',
'mens_xl',
'mens_xxl',
'mens_xxxl'));
-
+
}
-function calculateTotalWomensShirts() {
- document.getElementById('womens_total').value =
+function calculateTotalWomensShirts() {
+ document.getElementById('womens_total').value =
getTotal( new Array('womens_s',
'womens_m',
'womens_l',
'womens_xl',
'womens_xxl',
'womens_xxxl'));
-
+
}
diff --git a/extensions/BMO/web/styles/choose_product.css b/extensions/BMO/web/styles/choose_product.css
index bcca3428e..a4ecf749f 100644
--- a/extensions/BMO/web/styles/choose_product.css
+++ b/extensions/BMO/web/styles/choose_product.css
@@ -16,6 +16,22 @@
text-align: left;
}
+#frequent-components ul {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ margin: 8px auto;
+ padding: 0;
+ list-style-type: none;
+ white-space: nowrap;
+}
+
+#frequent-components li {
+ flex: none;
+ margin: 8px 16px;
+ padding: 0;
+}
+
#product-list {
margin: 32px 0;
}
@@ -23,7 +39,7 @@
#product-list .tile {
display: flex;
flex-wrap: wrap;
- justify-content: flex-start;
+ justify-content: center;
margin: 0 auto;
}
@@ -55,6 +71,7 @@
}
@media screen and (min-width: 1024px) {
+ #frequent-components ul,
#product-list .tile {
width: 960px;
}
@@ -65,6 +82,7 @@
}
@media screen and (min-width: 768px) and (max-width: 1023px) {
+ #frequent-components ul,
#product-list .tile {
width: 720px;
}
@@ -75,6 +93,7 @@
}
@media screen and (max-width: 767px) {
+ #frequent-components ul,
#product-list .tile {
width: auto;
max-width: 480px;
diff --git a/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl b/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
index bcbea3f15..f4cc83c6e 100644
--- a/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
+++ b/extensions/BugModal/template/en/default/bug_modal/edit.html.tmpl
@@ -391,7 +391,7 @@
<li role="separator"></li>
<div class="actions">
<div><a href="buglist.cgi?product=[% bug.product FILTER uri %]&amp;bug_status=__open__"
- target="_blank" role="menuitem" tabindex="-1">See All [% terms.Bugs %] in This Product</a></div>
+ target="_blank" role="menuitem" tabindex="-1">See Open [% terms.Bugs %] in This Product</a></div>
<div><a href="enter_bug.cgi?product=[% bug.product FILTER uri %]"
target="_blank" role="menuitem" tabindex="-1">File New [% terms.Bug %] in This Product</a></div>
<div><button disabled type="button" class="minor component-watching" role="menuitem" tabindex="-1"
@@ -449,7 +449,7 @@
<div class="actions">
<div><a href="buglist.cgi?product=[% bug.product FILTER uri %]&amp;
[%~ %]component=[% bug.component FILTER uri %]&amp;bug_status=__open__"
- target="_blank" role="menuitem" tabindex="-1">See All [% terms.Bugs %] in This Component</a></div>
+ target="_blank" role="menuitem" tabindex="-1">See Open [% terms.Bugs %] in This Component</a></div>
<div><a href="enter_bug.cgi?product=[% bug.product FILTER uri %]&amp;
[%~ %]component=[% bug.component FILTER uri %]"
target="_blank" role="menuitem" tabindex="-1">File New [% terms.Bug %] in This Component</a></div>
diff --git a/extensions/BugModal/web/bug_modal.js b/extensions/BugModal/web/bug_modal.js
index a4ae83d72..c15174c8b 100644
--- a/extensions/BugModal/web/bug_modal.js
+++ b/extensions/BugModal/web/bug_modal.js
@@ -448,7 +448,7 @@ $(function() {
$('#action-history')
.click(function(event) {
event.preventDefault();
- document.location.href = 'show_activity.cgi?id=' + BUGZILLA.bug_id;
+ window.open(`show_activity.cgi?id=${BUGZILLA.bug_id}`, '_blank');
});
// use scrollTo for in-page activity links
@@ -1323,7 +1323,6 @@ $(function() {
// finally switch to edit mode if we navigate back to a page that was editing
$(window).on('pageshow', restoreEditMode);
$(window).on('pageshow', restoreSavedBugComment);
- $(window).on('focus', restoreSavedBugComment);
restoreEditMode();
restoreSavedBugComment();
});
diff --git a/extensions/BugModal/web/new_bug.js b/extensions/BugModal/web/new_bug.js
index 9c1d00854..23fc842cb 100644
--- a/extensions/BugModal/web/new_bug.js
+++ b/extensions/BugModal/web/new_bug.js
@@ -33,7 +33,7 @@ var component_load = function(product) {
function() {
alert("Network issues. Please refresh the page and try again");
}
- );
+ );
}
$(document).ready(function() {
@@ -101,7 +101,7 @@ $(document).ready(function() {
callback(initial.keywords);
}
});
-
+
$("#product").on("change", function () {
component_load($("#product").val());
});
diff --git a/extensions/BzAPI/Extension.pm b/extensions/BzAPI/Extension.pm
index 1f7cce04a..ac9502fcb 100644
--- a/extensions/BzAPI/Extension.pm
+++ b/extensions/BzAPI/Extension.pm
@@ -22,6 +22,7 @@ use Bugzilla::Util qw(trick_taint datetime_from);
use Bugzilla::Constants;
use Bugzilla::Install::Filesystem;
use Bugzilla::WebService::Constants;
+use Module::Runtime qw(require_module);
use File::Basename;
@@ -279,8 +280,7 @@ sub _preload_handlers {
foreach my $module (_resource_modules()) {
my $resource_class = "Bugzilla::Extension::BzAPI::Resources::$module";
trick_taint($resource_class);
- eval("require $resource_class");
- warn $@ if $@;
+ eval { require_module($resource_class) };
next if ($@ || !$resource_class->can('rest_handlers'));
my $handlers = $resource_class->rest_handlers;
next if (ref $handlers ne 'ARRAY' || scalar @$handlers % 2 != 0);
diff --git a/extensions/ComponentWatching/template/en/default/hook/global/reason-descs-end.none.tmpl b/extensions/ComponentWatching/template/en/default/hook/global/reason-descs-end.none.tmpl
index 8cd67bdff..155bce35c 100644
--- a/extensions/ComponentWatching/template/en/default/hook/global/reason-descs-end.none.tmpl
+++ b/extensions/ComponentWatching/template/en/default/hook/global/reason-descs-end.none.tmpl
@@ -6,5 +6,5 @@
# defined by the Mozilla Public License, v. 2.0.
#%]
-[% watch_reason_descs.${constants.REL_COMPONENT_WATCHER} =
+[% watch_reason_descs.${constants.REL_COMPONENT_WATCHER} =
"You are watching the component for the ${terms.bug}." %]
diff --git a/extensions/Example/template/en/default/hook/global/setting-descs-settings.none.tmpl b/extensions/Example/template/en/default/hook/global/setting-descs-settings.none.tmpl
index 9dc5fc767..6a4a13a13 100644
--- a/extensions/Example/template/en/default/hook/global/setting-descs-settings.none.tmpl
+++ b/extensions/Example/template/en/default/hook/global/setting-descs-settings.none.tmpl
@@ -1,6 +1,6 @@
-[%
+[%
setting_descs.product_chooser = "Product chooser to use when entering $terms.bugs",
setting_descs.pretty = "Pretty chooser with common products and icons",
setting_descs.full = "Full chooser with all products",
setting_descs.small = "Product chooser for mobile devices",
-%] \ No newline at end of file
+%]
diff --git a/extensions/Example/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/Example/template/en/default/hook/global/user-error-errors.html.tmpl
index 50d20a9f2..93f24d159 100644
--- a/extensions/Example/template/en/default/hook/global/user-error-errors.html.tmpl
+++ b/extensions/Example/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -1,6 +1,6 @@
[%# Note that error messages should generally be indented four spaces, like
# below, because when Bugzilla translates an error message into plain
- # text, it takes four spaces off the beginning of the lines.
+ # text, it takes four spaces off the beginning of the lines.
#
# Note also that I prefixed my error name with "example", the name of my
# extension, so that I wouldn't conflict with other error names in
diff --git a/extensions/Example/template/en/default/pages/example.html.tmpl b/extensions/Example/template/en/default/pages/example.html.tmpl
index 919fa15b4..e265ee55b 100644
--- a/extensions/Example/template/en/default/pages/example.html.tmpl
+++ b/extensions/Example/template/en/default/pages/example.html.tmpl
@@ -15,12 +15,12 @@
# Portions created by Canonical Ltd. are Copyright (C) 2009
# Canonical Ltd. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% PROCESS global/header.html.tmpl
- title = "Example Page"
+ title = "Example Page"
%]
<p>Here's what you passed me:</p>
diff --git a/extensions/FlagDefaultRequestee/template/en/default/hook/admin/flag-type/edit-rows.html.tmpl b/extensions/FlagDefaultRequestee/template/en/default/hook/admin/flag-type/edit-rows.html.tmpl
index edefca370..9e8b09c38 100644
--- a/extensions/FlagDefaultRequestee/template/en/default/hook/admin/flag-type/edit-rows.html.tmpl
+++ b/extensions/FlagDefaultRequestee/template/en/default/hook/admin/flag-type/edit-rows.html.tmpl
@@ -11,7 +11,7 @@
<td>
If flag is specifically requestable, this user will be entered in the
requestee field by default unless the user changes it.<br>
- [% INCLUDE global/userselect.html.tmpl
+ [% INCLUDE global/userselect.html.tmpl
name => 'default_requestee'
id => 'default_requestee'
value => type.default_requestee.login
diff --git a/extensions/FlagTypeComment/template/en/default/flag/type_comment.html.tmpl b/extensions/FlagTypeComment/template/en/default/flag/type_comment.html.tmpl
index 88d9d4dd7..56e03040a 100644
--- a/extensions/FlagTypeComment/template/en/default/flag/type_comment.html.tmpl
+++ b/extensions/FlagTypeComment/template/en/default/flag/type_comment.html.tmpl
@@ -20,35 +20,17 @@
# byron jones <glob@mozilla.com>
#%]
-[% IF ftc_flags.keys.size %]
- <script [% script_nonce FILTER none %]>
- YAHOO.util.Event.onDOMReady(function() {
- var selects = YAHOO.util.Dom.getElementsByClassName('flag_select');
- for (var i = 0; i < selects.length; i++) {
- YAHOO.util.Event.on(selects[i], 'change', ftc_on_change);
- }
- });
+<link rel="stylesheet" href="extensions/FlagTypeComment/web/styles/ftc.css">
+<script [% script_nonce FILTER none %] src="extensions/FlagTypeComment/web/js/ftc.js"></script>
- function ftc_on_change(ev) {
- var id = ev.target.id.split('-')[1];
- var state = ev.target.value;
- var commentEl = document.getElementById('comment');
- if (!commentEl) return;
- [% FOREACH type_id = ftc_flags.keys %]
- [% FOREACH state = ftc_states %]
- if ([% type_id FILTER none %] == id && '[% state FILTER js %]' == state) {
- var text = '[% ftc_flags.$type_id.$state FILTER js %]';
- var value = commentEl.value;
- if (value == text) {
- return;
- } else if (value == '') {
- commentEl.value = text;
- } else {
- commentEl.value = text + "\n\n" + value;
- }
- }
- [% END %]
+[% IF ftc_flags.keys.size %]
+ [%# plaintext templates from database %]
+ [% FOREACH type_id = ftc_flags.keys %]
+ [% FOREACH state = ftc_states %]
+ <meta name="ftc:[% type_id FILTER none %]:[% state FILTER html %]"
+ content="[% ftc_flags.$type_id.$state FILTER html_linebreak %]">
[% END %]
- }
- </script>
+ [% END %]
+ [%# HTML form templates from extensions %]
+ [% Hook.process("form") %]
[% END %]
diff --git a/extensions/FlagTypeComment/web/js/ftc.js b/extensions/FlagTypeComment/web/js/ftc.js
new file mode 100644
index 000000000..2682721bc
--- /dev/null
+++ b/extensions/FlagTypeComment/web/js/ftc.js
@@ -0,0 +1,189 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This Source Code Form is "Incompatible With Secondary Licenses", as
+ * defined by the Mozilla Public License, v. 2.0. */
+
+/**
+ * Reference or define the Bugzilla app namespace.
+ * @namespace
+ */
+var Bugzilla = Bugzilla || {}; // eslint-disable-line no-var
+
+/**
+ * Provide the ability to insert a comment template when a patch's approval flag is selected.
+ */
+Bugzilla.FlagTypeComment = class FlagTypeComment {
+ /**
+ * Initialize a new FlagTypeComment instance.
+ */
+ constructor() {
+ this.templates = [...document.querySelectorAll('template.approval-request')];
+ this.$flags = document.querySelector('#flags');
+ this.$comment = document.querySelector('#comment');
+
+ if (this.$flags && this.$comment) {
+ this.selects = [...this.$flags.querySelectorAll('.flag_select')];
+ this.selects.forEach($select => $select.addEventListener('change', () => this.flag_onselect($select)));
+ this.$comment.form.addEventListener('submit', () => this.form_onsubmit());
+ }
+ }
+
+ /**
+ * Check if a `<fieldset>` is compatible with the given flag. For example, `approval‑mozilla‑beta` matches
+ * `<fieldset data-flags="approval‑mozilla‑beta approval‑mozilla‑release">` while `approval‑mozilla‑esr60`
+ * matches `<fieldset data-flags="approval‑mozilla‑esr*">`.
+ * @param {String} name Flag name, such as `approval‑mozilla‑beta`.
+ * @param {(HTMLFieldSetElement|HTMLTemplateElement)} $element `<fieldset>` or `<template>` element with the
+ * `data-flags` attribute which is a space-separated list of flag names (wildcard chars can be used).
+ * @returns {Boolean} Whether the `<fieldset>` is compatible.
+ */
+ check_compatibility(name, $element) {
+ return !!$element.dataset.flags.split(' ')
+ .find(_name => !!name.match(new RegExp(`^${_name.replace('*', '.+')}$`, 'i')));
+ }
+
+ /**
+ * Return a list of temporary `<fieldset>`s already inserted to the current page.
+ * @type {Array<HTMLFieldSetElement>}
+ */
+ get inserted_fieldsets() {
+ return [...this.$flags.parentElement.querySelectorAll('fieldset.approval-request')];
+ }
+
+ /**
+ * Find a temporary `<fieldset>` already inserted to the current page by a flag name.
+ * @param {String} name Flag name, such as `approval‑mozilla‑beta`.
+ * @returns {HTMLFieldSetElement} Any `<fieldset>` element.
+ */
+ find_inserted_fieldset(name) {
+ return this.inserted_fieldsets.find($fieldset => this.check_compatibility(name, $fieldset));
+ }
+
+ /**
+ * Find an available `<fieldset>` embedded in HTML by a flag name.
+ * @param {String} name Flag name, such as `approval‑mozilla‑beta`.
+ * @returns {HTMLFieldSetElement} Any `<fieldset>` element.
+ */
+ find_available_fieldset(name) {
+ for (const $template of this.templates) {
+ if (this.check_compatibility(name, $template)) {
+ const $fieldset = $template.content.cloneNode(true).querySelector('fieldset');
+
+ $fieldset.className = 'approval-request';
+ $fieldset.dataset.flags = $template.dataset.flags;
+
+ return $fieldset;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Find a `<select>` element for a requested flag that matches the given `<fieldset>`.
+ * @param {HTMLFieldSetElement} $fieldset `<fieldset>` element with the `data-flags` attribute.
+ * @returns {HTMLSelectElement} Any `<select>` element.
+ */
+ find_select($fieldset) {
+ return this.selects
+ .find($_select => $_select.value === '?' && this.check_compatibility($_select.dataset.name, $fieldset));
+ }
+
+ /**
+ * Add text to the comment box at the end of any existing comment.
+ * @param {String} text Comment text to be added.
+ */
+ add_comment(text) {
+ this.$comment.value = this.$comment.value.match(/\S+/g) ? [this.$comment.value, text].join('\n\n') : text;
+ }
+
+ /**
+ * Called whenever a flag selection is changed. Insert or remove a comment template.
+ * @param {HTMLSelectElement} $select `<select>` element that the `change` event is fired.
+ */
+ flag_onselect($select) {
+ const id = Number($select.dataset.id);
+ const { name } = $select.dataset;
+ const state = $select.value;
+ let $fieldset = this.find_inserted_fieldset(name);
+
+ // Remove the temporary `<fieldset>` if not required. One `<fieldset>` can support multiple flags, so, for example,
+ // if `approval‑mozilla‑release` is unselected but `approval‑mozilla‑beta` is still selected, keep it
+ if (state !== '?' && $fieldset && !this.find_select($fieldset)) {
+ $fieldset.remove();
+ }
+
+ // Insert a temporary `<fieldset>` if available
+ if (state === '?' && !$fieldset) {
+ $fieldset = this.find_available_fieldset(name);
+
+ if ($fieldset) {
+ this.$flags.parentElement.appendChild($fieldset);
+ }
+ }
+
+ // Insert a traditional plaintext comment template if available
+ if (!$fieldset) {
+ const $meta = document.querySelector(`meta[name="ftc:${id}:${state}"]`);
+ const text = $meta ? $meta.content : '';
+
+ if (text && this.$comment.value !== text) {
+ this.add_comment(text);
+ }
+ }
+ }
+
+ /**
+ * Convert the input values into comment text and remove the temporary `<fieldset>` before submitting the form.
+ * @returns {Boolean} Always `true` to allow submitting the form.
+ */
+ form_onsubmit() {
+ for (const $fieldset of this.inserted_fieldsets) {
+ const text = [
+ `[${$fieldset.querySelector('legend').innerText}]`,
+ ...[...$fieldset.querySelectorAll('tr')].map($tr => {
+ const checkboxes = [...$tr.querySelectorAll('input[type="checkbox"]:checked')];
+ const $radio = $tr.querySelector('input[type="radio"]:checked');
+ const $input = $tr.querySelector('textarea,select,input');
+ const label = $tr.querySelector('th').innerText.replace(/\n/g, ' ');
+ let value = '';
+
+ if (checkboxes.length) {
+ value = checkboxes.map($checkbox => $checkbox.value.trim()).join(', ');
+ } else if ($radio) {
+ value = $radio.value.trim();
+ } else if ($input) {
+ value = $input.value.trim();
+
+ if ($input.dataset.type === 'bug') {
+ if (!value) {
+ value = 'None';
+ } else if (!isNaN(value)) {
+ value = `Bug ${value}`;
+ }
+ }
+
+ if ($input.dataset.type === 'bugs') {
+ if (!value) {
+ value = 'None';
+ } else {
+ value = value.split(/,\s*/).map(str => (!isNaN(str) ? `Bug ${str}` : str)).join(', ');
+ }
+ }
+ }
+
+ return `${label}: ${value}`;
+ }),
+ ].join('\n\n');
+
+ this.add_comment(text);
+ $fieldset.remove();
+ }
+
+ return true;
+ }
+};
+
+window.addEventListener('DOMContentLoaded', () => new Bugzilla.FlagTypeComment());
diff --git a/extensions/FlagTypeComment/web/styles/ftc.css b/extensions/FlagTypeComment/web/styles/ftc.css
new file mode 100644
index 000000000..93d190935
--- /dev/null
+++ b/extensions/FlagTypeComment/web/styles/ftc.css
@@ -0,0 +1,58 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This Source Code Form is "Incompatible With Secondary Licenses", as
+ * defined by the Mozilla Public License, v. 2.0. */
+
+fieldset.approval-request {
+ margin: 1em 0;
+}
+
+fieldset.approval-request legend {
+ font-weight: bold;
+}
+
+fieldset.approval-request th {
+ padding: .4em;
+ width: 20em;
+ line-height: 1.25;
+ font-weight: normal;
+ text-align: right;
+ vertical-align: top;
+ white-space: normal !important;
+}
+
+fieldset.approval-request td {
+ vertical-align: middle;
+}
+
+fieldset.approval-request label {
+ font-weight: normal !important;
+}
+
+fieldset.approval-request input[type="text"] {
+ width: 10em;
+}
+
+fieldset.approval-request input.long[type="text"] {
+ width: 40em;
+}
+
+fieldset.approval-request textarea {
+ width: 40em;
+ min-height: 5em;
+ font-size: inherit;
+ line-height: inherit;
+ font-family: inherit;
+ resize: vertical;
+}
+
+fieldset.approval-request div {
+ padding: 0 !important;
+}
+
+fieldset.approval-request table ~ p:last-child {
+ margin: .4em;
+ text-align: right;
+}
diff --git a/extensions/GitHubAuth/Extension.pm b/extensions/GitHubAuth/Extension.pm
index 24a7cf2f1..d0d9f42f1 100644
--- a/extensions/GitHubAuth/Extension.pm
+++ b/extensions/GitHubAuth/Extension.pm
@@ -74,7 +74,7 @@ sub config_modify_panels {
my $user_info_class = first { $_->{name} eq 'user_info_class' } @$auth_panel_params;
if ($user_info_class) {
- push @{ $user_info_class->{choices} }, "GitHubAuth,CGI", "Persona,GitHubAuth,CGI";
+ push @{ $user_info_class->{choices} }, "GitHubAuth,CGI";
}
my $user_verify_class = first { $_->{name} eq 'user_verify_class' } @$auth_panel_params;
diff --git a/extensions/GuidedBugEntry/template/en/default/bug/create/comment-guided.txt.tmpl b/extensions/GuidedBugEntry/template/en/default/bug/create/comment-guided.txt.tmpl
index 31408b538..153869f2f 100644
--- a/extensions/GuidedBugEntry/template/en/default/bug/create/comment-guided.txt.tmpl
+++ b/extensions/GuidedBugEntry/template/en/default/bug/create/comment-guided.txt.tmpl
@@ -1,8 +1,6 @@
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
User Agent: [% cgi.param('user_agent') %]
-[% IF cgi.param('build_id') %]
-Build ID: [% cgi.param('build_id') %][% END %]
[% IF cgi.param('firefox_for_android') %]
Firefox for Android
[% END %]
diff --git a/extensions/GuidedBugEntry/template/en/default/guided/guided.html.tmpl b/extensions/GuidedBugEntry/template/en/default/guided/guided.html.tmpl
index 7ffa04922..07d814839 100644
--- a/extensions/GuidedBugEntry/template/en/default/guided/guided.html.tmpl
+++ b/extensions/GuidedBugEntry/template/en/default/guided/guided.html.tmpl
@@ -351,7 +351,6 @@ Product: <b><span id="dupes_product_name">?</span></b>:
<input type="hidden" name="comment" id="comment" value="">
<input type="hidden" name="format" value="guided">
<input type="hidden" name="user_agent" id="user_agent" value="">
-<input type="hidden" name="build_id" id="build_id" value="">
<ul>
<li>Please fill out this form clearly, precisely and in as much detail as you can manage.</li>
diff --git a/extensions/GuidedBugEntry/web/js/guided.js b/extensions/GuidedBugEntry/web/js/guided.js
index 77847fb2e..5f3543153 100644
--- a/extensions/GuidedBugEntry/web/js/guided.js
+++ b/extensions/GuidedBugEntry/web/js/guided.js
@@ -614,9 +614,6 @@ var bugForm = {
onInit: function() {
var user_agent = navigator.userAgent;
Dom.get('user_agent').value = navigator.userAgent;
- if (navigator.buildID && navigator.buildID != navigator.userAgent) {
- Dom.get('build_id').value = navigator.buildID;
- }
Event.addListener(Dom.get('short_desc'), 'blur', function() {
Dom.get('dupes_summary').value = Dom.get('short_desc').value;
guided.setAdvancedLink();
diff --git a/extensions/GuidedBugEntry/web/js/products.js b/extensions/GuidedBugEntry/web/js/products.js
index 8ef1ea0c0..65dc04393 100644
--- a/extensions/GuidedBugEntry/web/js/products.js
+++ b/extensions/GuidedBugEntry/web/js/products.js
@@ -122,12 +122,12 @@ var products = {
"Bugzilla": {
support:
- 'Please use <a href="https://landfill.bugzilla.org/">Bugzilla Landfill</a> to file "test bugs".'
+ 'Please use <a href="https://bugzilla-dev.allizom.org/">our test server</a> to file "test bugs".'
},
"bugzilla.mozilla.org": {
related: [ "Bugzilla" ],
support:
- 'Please use <a href="https://landfill.bugzilla.org/">Bugzilla Landfill</a> to file "test bugs".'
+ 'Please use <a href="https://bugzilla-dev.allizom.org/">our test server</a> to file "test bugs".'
}
};
diff --git a/extensions/InlineHistory/web/inline-history.js b/extensions/InlineHistory/web/inline-history.js
index 6b223461e..37f1fec7c 100644
--- a/extensions/InlineHistory/web/inline-history.js
+++ b/extensions/InlineHistory/web/inline-history.js
@@ -339,7 +339,7 @@ var inline_history = {
&& flagItem[3] == flagName + flagValue
&& flagItem[4] == setterIdentity
) {
- flagLabel.innerHTML =
+ flagLabel.innerHTML =
'<a href="#' + flagItem[5] + '">' + flagName + '</a>';
break;
}
diff --git a/extensions/MozReview/Extension.pm b/extensions/MozReview/Extension.pm
deleted file mode 100644
index 907f12e56..000000000
--- a/extensions/MozReview/Extension.pm
+++ /dev/null
@@ -1,132 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::MozReview;
-
-use 5.10.1;
-use strict;
-use warnings;
-use parent qw(Bugzilla::Extension);
-
-use Bugzilla::Attachment;
-use Bugzilla::Error;
-use Bugzilla::Extension::MozReview::WebService;
-use List::MoreUtils qw( any );
-
-our $VERSION = '0.01';
-
-my @METHOD_WHITELIST = (
- 'User.get',
- 'User.login',
- 'User.valid_login',
- 'Bug.add_comment',
- 'Bug.add_attachment',
- 'Bug.attachments',
- 'Bug.get',
- 'Bug.update_attachment',
-);
-
-BEGIN {
- package Bugzilla::User::APIKey;
-
- sub is_mozreview {
- my ($self) = @_;
- my $mozreview_app_id = Bugzilla->params->{mozreview_app_id};
- return 0 unless $mozreview_app_id;
-
- return 1 if $self->app_id && $self->app_id eq $mozreview_app_id;
- }
-}
-
-sub template_before_process {
- my ($self, $args) = @_;
- my $file = $args->{'file'};
- my $vars = $args->{'vars'};
-
- return unless (($file =~ /bug\/(show-header|edit).html.tmpl$/ ||
- $file =~ /bug_modal\/(header|edit).html.tmpl$/ ||
- $file eq 'attachment/create.html.tmpl') &&
- Bugzilla->params->{mozreview_base_url});
-
- my $bug = exists $vars->{'bugs'} ? $vars->{'bugs'}[0] : $vars->{'bug'};
-
- if ($bug) {
- if ($file eq 'attachment/create.html.tmpl') {
- if ($bug->product eq 'Core' || $bug->product eq 'Firefox' ||
- $bug->product eq 'Firefox for Android') {
- $vars->{'mozreview_enabled'} = 1;
- }
- } else {
- my $has_mozreview = 0;
- my $attachments = Bugzilla::Attachment->get_attachments_by_bug($bug);
-
- foreach my $attachment (@$attachments) {
- if ($attachment->contenttype eq 'text/x-review-board-request'
- && !$attachment->isobsolete) {
- $has_mozreview = 1;
- last;
- }
- }
-
- if ($has_mozreview) {
- $vars->{'mozreview'} = 1;
- }
- }
- }
-}
-
-sub auth_delegation_confirm {
- my ($self, $args) = @_;
- my $mozreview_callback_url = Bugzilla->params->{mozreview_auth_callback_url};
- my $mozreview_app_id = Bugzilla->params->{mozreview_app_id};
-
- return unless $mozreview_callback_url;
- return unless $mozreview_app_id;
-
- if (index($args->{callback}, $mozreview_callback_url) == 0 && $args->{app_id} eq $mozreview_app_id) {
- ${$args->{skip_confirmation}} = 1;
- }
-}
-
-sub config_add_panels {
- my ($self, $args) = @_;
- my $modules = $args->{panel_modules};
- $modules->{MozReview} = "Bugzilla::Extension::MozReview::Config";
-}
-
-sub webservice {
- my ($self, $args) = @_;
- my $dispatch = $args->{dispatch};
- $dispatch->{MozReview} = "Bugzilla::Extension::MozReview::WebService";
-}
-
-sub webservice_before_call {
- my ($self, $args) = @_;
- my ($method, $full_method) = ($args->{method}, $args->{full_method});
- my $mozreview_app_id = Bugzilla->params->{mozreview_app_id} // '';
- my $user = Bugzilla->user;
- my $getter = eval { $user->authorizer->successful_info_getter() } or return;
- my $app_id = $getter->can("app_id") ? $getter->app_id // '' : '';
-
- $full_method =~ s/^Bugzilla::Extension::(\w+)::WebService\./$1./;
-
- my $is_mozreview_method = $full_method =~ /^MozReview\./;
-
- if ($is_mozreview_method && (!$mozreview_app_id || !$app_id || $mozreview_app_id ne $app_id)) {
- ThrowUserError('forbidden_method', { method => $full_method });
- }
-
- return unless $mozreview_app_id && $app_id;
-
- if ($app_id eq $mozreview_app_id && !$is_mozreview_method) {
- unless (any { $full_method eq $_ } @METHOD_WHITELIST) {
- ThrowUserError('forbidden_method', { method => $full_method });
- }
- }
-}
-
-__PACKAGE__->NAME;
diff --git a/extensions/MozReview/bin/add-mozreview-children.pl b/extensions/MozReview/bin/add-mozreview-children.pl
deleted file mode 100755
index 9faa923fa..000000000
--- a/extensions/MozReview/bin/add-mozreview-children.pl
+++ /dev/null
@@ -1,257 +0,0 @@
-#!/usr/bin/perl
-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-# This script obsoletes attachments containing URLs to MozReview parent
-# review requests and adds attachments, with review flags, for MozReview
-# child (commit) review requests to match the new scheme.
-
-use strict;
-use warnings;
-use 5.10.1;
-
-use lib qw(. lib local/lib/perl5);
-
-BEGIN {
- use Bugzilla;
- Bugzilla->extensions;
-}
-use Bugzilla::Constants qw( USAGE_MODE_CMDLINE );
-Bugzilla->usage_mode(USAGE_MODE_CMDLINE);
-
-use Bugzilla::Attachment;
-use Bugzilla::Bug;
-use Bugzilla::Constants;
-use Bugzilla::Flag;
-use Bugzilla::FlagType;
-use JSON;
-use LWP::Simple qw( get $ua );
-
-$Bugzilla::Flag::disable_flagmail = 1;
-
-if (my $proxy = Bugzilla->params->{proxy_url}) {
- $ua->proxy('https', $proxy);
-}
-
-my $MOZREVIEW_MIMETYPE = 'text/x-review-board-request';
-
-# Disable the "cannot ask for review" so we can reassign their flags to
-# the new attachments.
-Bugzilla->params->{max_reviewer_last_seen} = 0;
-
-my $rb_host = shift or die "syntax: $0 review-board-url\n";
-$rb_host =~ s#/$##;
-
-sub rr_url {
- my ($rrid) = @_;
- return $rb_host . "/r/" . $rrid . "/";
-}
-
-sub set_review_flag {
- my ($child_attach, $flag_type, $flag_status, $reviewer, $setter) = @_;
-
- my %params = (
- type_id => $flag_type->id,
- status => $flag_status
- );
-
- if ($flag_status eq "?") {
- $params{'requestee'} = $reviewer->login;
- $params{'setter'} = $setter;
- } else {
- $params{'setter'} = $reviewer;
- }
-
- return Bugzilla::Flag->set_flag($child_attach, \%params);
-}
-
-my $dbh = Bugzilla->dbh;
-
-my $bugs_query = "SELECT distinct bug_id FROM attachments WHERE mimetype='text/x-review-board-request' AND isobsolete=0";
-my $bug_ids = $dbh->selectcol_arrayref($bugs_query);
-my $total_bugs = scalar @$bug_ids;
-$total_bugs or die "No bugs were found.\n";
-my $bug_count = 0;
-
-print <<EOF;
-About to convert MozReview attachments for $total_bugs bugs.
-
-Press <Ctrl-C> to stop or <Enter> to continue...
-EOF
-getc();
-
-foreach my $bug_id (@$bug_ids) {
- $dbh->bz_start_transaction();
- my $timestamp = $dbh->selectrow_array('SELECT LOCALTIMESTAMP(0)');
- my $bug_changed = 0;
- my $bug = Bugzilla::Bug->new($bug_id);
- print "Bug " . $bug->id . " (" . ++$bug_count . "/" . $total_bugs . ")\n";
-
- my $url = $rb_host . "/api/extensions/mozreview.extension.MozReviewExtension/summary/?bug=" . $bug->id;
- print " Fetching reviews from $url...\n";
- my $body = get($url);
- die "Error fetching review requests for bug " . $bug->id
- unless defined $body;
-
- my $data = from_json($body);
- my $summaries = $data->{"review_request_summaries"};
- my $attachments = Bugzilla::Attachment->get_attachments_by_bug($bug);
- my %attach_map;
-
- my $flag_types = Bugzilla::FlagType::match({
- 'target_type' => 'attachment',
- 'product_id' => $bug->product_id,
- 'component_id' => $bug->component_id,
- 'is_active' => 1});
- my $flag_type;
-
- foreach my $ft (@$flag_types) {
- if ($ft->is_active && $ft->name eq "review") {
- $flag_type = $ft;
- last;
- }
- }
-
- if (!defined($flag_type)) {
- print " Couldn't find flag type for attachments on this bug!\n";
- $dbh->bz_rollback_transaction();
- next;
- }
-
- foreach my $attachment (@$attachments) {
- next if ($attachment->isobsolete
- || $attachment->contenttype ne $MOZREVIEW_MIMETYPE);
-
- print " Attachment " . $attachment->id . ": " . $attachment->data . "\n";
- my ($rrid) = $attachment->data =~ m#/r/(\d+)/?$#;
- if (!defined($rrid)) {
- print " Malformed or missing reviewboard URL\n";
- next;
- }
-
- $attach_map{$attachment->data} = $attachment;
- }
-
- foreach my $summary (@$summaries) {
- my $parent = $summary->{"parent"};
- my $attacher = Bugzilla::User->new({ id => $parent->{"submitter_bmo_id"},
- cache => 1 });
- Bugzilla->set_user($attacher);
- print " Parent review request " . $parent->{"id"} . "\n";
-
- # %parent_flags is used to keep track of review flags related to
- # reviewers. It maps requestee => status if status is "?" or
- # setter => status otherwise.
- my %parent_flags;
-
- my $parent_url = rr_url($parent->{"id"});
- my $parent_attach = $attach_map{$parent_url};
- if (defined($parent_attach)) {
- print " Parent attachment has ID " . $parent_attach->id . ". Obsoleting it.\n";
- foreach my $flag (@{ $parent_attach->flags }) {
- if ($flag->type->name eq "review") {
- if ($flag->status eq "?") {
- $parent_flags{$flag->requestee->id} = $flag;
- } else {
- $parent_flags{$flag->setter->id} = $flag;
- }
- }
- }
- $parent_attach->set_is_obsolete(1);
- $parent_attach->update($timestamp);
- print " Posting comment.\n";
- $bug->add_comment('',
- { isprivate => 0,
- type => CMT_ATTACHMENT_UPDATED,
- extra_data => $parent_attach->id });
- $bug_changed = 1;
- } else {
- print " Parent attachment not found.\n";
- }
-
- my @children = @{ $summary->{"children"} };
- foreach my $child (@children) {
- print " Child review request " . $child->{"id"} . "\n";
- my $child_url = rr_url($child->{"id"});
- my $child_attach = $attach_map{$child_url};
- if (defined($child_attach)) {
- print " Found attachment.\n";
- next;
- }
-
- print " No attachment found for child " . $child_url . "\n";
- my %child_attach_params = (
- bug => $bug,
- data => $rb_host . "/r/" . $child->{"id"} . "/",
- description => "MozReview Request: " . $child->{"summary"},
- filename => "reviewboard-" . $child->{"id"} . "-url.txt",
- mimetype => $MOZREVIEW_MIMETYPE,
- );
- $child_attach = Bugzilla::Attachment->create(\%child_attach_params);
- print " New attachment id: " . $child_attach->id . "\n";
- $bug_changed = 1;
-
- # Set flags. If there was a parent, check it for flags by the
- # requestee. Otherwise, set an r? flag.
-
- # Preserve the original flag hash since we need to modify it for
- # every child to find extra reviewers (see below the 'foreach').
- my %tmp_parent_flags = %parent_flags;
-
- foreach my $reviewer_id (@{ $child->{"reviewers_bmo_ids"} }) {
- my $reviewer = Bugzilla::User->new({ id => $reviewer_id,
- cache => 1 });
- print " Reviewer " . $reviewer->login . " (" . $reviewer->id . ")\n";
- $reviewer->settings->{block_reviews}->{value} = 'off';
- my $flag = $tmp_parent_flags{$reviewer->id};
- if (defined($flag)) {
- print " Flag for reviewer " . $reviewer->id . ": " . $flag->status . "\n";
-
- set_review_flag($child_attach, $flag_type, $flag->status,
- $reviewer, $attacher);
- delete $tmp_parent_flags{$reviewer->id};
- } else {
- # No flag on the parent; this probably means the reviewer
- # canceled the review, so don't set r?.
- print " No review flag for reviewer " . $reviewer->id . "\n";
- }
- }
-
- # Preserve flags that were set directly on the attachment
- # from reviewers not listed in the review request.
- foreach my $extra_reviewer_id (keys %tmp_parent_flags) {
- my $extra_reviewer = Bugzilla::User->new({
- id => $extra_reviewer_id,
- cache => 1
- });
- my $flag = $tmp_parent_flags{$extra_reviewer_id};
- print " Extra flag set for reviewer " . $extra_reviewer->login . "\n";
- set_review_flag($child_attach, $flag->type, $flag->status,
- $extra_reviewer, $flag->setter);
- }
-
- $child_attach->update($timestamp);
- print " Posting comment.\n";
- $bug->add_comment('',
- { isprivate => 0,
- type => CMT_ATTACHMENT_CREATED,
- extra_data => $child_attach->id });
- }
- }
-
- if ($bug_changed) {
- print " Updating bug.\n";
- $bug->update($timestamp);
- $dbh->do("UPDATE bugs SET lastdiffed = ?, delta_ts = ? WHERE bug_id = ?",
- undef, $timestamp, $timestamp, $bug_id);
- }
- $dbh->bz_commit_transaction();
- Bugzilla->memcached->clear_all();
-}
-
-print "Done.\n";
diff --git a/extensions/MozReview/lib/Config.pm b/extensions/MozReview/lib/Config.pm
deleted file mode 100644
index e0d6377d8..000000000
--- a/extensions/MozReview/lib/Config.pm
+++ /dev/null
@@ -1,55 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::MozReview::Config;
-
-use 5.10.1;
-use strict;
-use warnings;
-
-use Bugzilla::Config::Common;
-
-our $sortkey = 1300;
-
-sub get_param_list {
- my ($class) = @_;
-
- my @params = (
- {
- name => 'mozreview_base_url',
- type => 't',
- default => '',
- checker => \&check_urlbase
- },
- {
- name => 'mozreview_auth_callback_url',
- type => 't',
- default => '',
- checker => sub {
- my ($url) = (@_);
-
- return 'must be an HTTP/HTTPS absolute URL' unless $url =~ m{^https?://};
- return '';
- }
- },
- {
- name => 'mozreview_app_id',
- type => 't',
- default => '',
- checker => sub {
- my ($app_id) = (@_);
-
- return 'must be a hex number' unless $app_id =~ /^[[:xdigit:]]+$/;
- return '';
- },
- },
- );
-
- return @params;
-}
-
-1;
diff --git a/extensions/MozReview/lib/WebService.pm b/extensions/MozReview/lib/WebService.pm
deleted file mode 100644
index c6916d1fa..000000000
--- a/extensions/MozReview/lib/WebService.pm
+++ /dev/null
@@ -1,209 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::MozReview::WebService;
-
-use 5.10.1;
-use strict;
-use warnings;
-
-use base qw(Bugzilla::WebService);
-
-use Bugzilla::Attachment;
-use Bugzilla::Bug;
-use Bugzilla::Comment;
-use Bugzilla::Constants;
-use Bugzilla::Error;
-use Bugzilla::WebService::Constants;
-use Bugzilla::WebService::Util qw(extract_flags validate translate);
-use Bugzilla::Util qw(trim);
-
-use List::MoreUtils qw(uniq all);
-use List::Util qw(max);
-use Storable qw(dclone);
-
-use constant PUBLIC_METHODS => qw( attachments );
-
-BEGIN {
- *_attachment_to_hash = \&Bugzilla::WebService::Bug::_attachment_to_hash;
- *_flag_to_hash = \&Bugzilla::WebService::Bug::_flag_to_hash;
-}
-
-sub attachments {
- my ($self, $params) = validate(@_, 'attachments');
- my $dbh = Bugzilla->dbh;
-
- # BMO: Don't allow updating of bugs if disabled
- if (Bugzilla->params->{disable_bug_updates}) {
- ThrowErrorPage('bug/process/updates-disabled.html.tmpl',
- 'Bug updates are currently disabled.');
- }
-
- my $user = Bugzilla->login(LOGIN_REQUIRED);
-
- ThrowCodeError('param_required', { param => 'attachments' })
- unless defined $params->{attachments};
-
- my $bug = Bugzilla::Bug->check($params->{bug_id});
-
- ThrowUserError("product_edit_denied", { product => $bug->product })
- unless $user->can_edit_product($bug->product_id);
-
- my (@modified, @created);
- $dbh->bz_start_transaction();
- my $timestamp = $dbh->selectrow_array('SELECT LOCALTIMESTAMP(0)');
-
- my $comment_tags = $params->{comment_tags};
- my $attachments = $params->{attachments};
-
- if ($comment_tags) {
- ThrowUserError('comment_tag_disabled')
- unless Bugzilla->params->{comment_taggers_group};
-
- my $all_mozreview_tags = all { /^mozreview-?/i } @$comment_tags;
- if ($all_mozreview_tags || $user->can_tag_comments) {
- # there should be a method of User that does this.
- local $user->{can_tag_comments} = 1;
- $bug->set_all({ comment_tags => $comment_tags });
- }
- else {
- ThrowUserError('auth_failure',
- { group => Bugzilla->params->{comment_taggers_group},
- action => 'update',
- object => 'comment_tags' })
- }
- }
-
- foreach my $attachment (@$attachments) {
- my $flags = delete $attachment->{flags};
- my $attachment_id = delete $attachment->{attachment_id};
- my $comment = delete $attachment->{comment};
- my $attachment_obj;
-
- if ($attachment_id) {
- $attachment_obj = Bugzilla::Attachment->check({ id => $attachment_id });
- ThrowUserError("mozreview_attachment_bug_mismatch", { bug => $bug, attachment => $attachment_obj })
- if $attachment_obj->bug_id != $bug->id;
-
- # HACK: preload same bug object.
- $attachment_obj->{bug} = $bug;
-
- $attachment = translate($attachment, Bugzilla::WebService::Bug::ATTACHMENT_MAPPED_SETTERS);
-
- my ($update_flags, $new_flags) = $flags
- ? extract_flags($flags, $bug, $attachment_obj)
- : ([], []);
- if ($attachment_obj->validate_can_edit) {
- $attachment_obj->set_all($attachment);
- $attachment_obj->set_flags($update_flags, $new_flags) if $flags;
- }
- elsif (scalar @$update_flags && !scalar(@$new_flags) && !scalar keys %$attachment) {
- # Requestees can set flags targetted to them, even if they cannot
- # edit the attachment. Flag setters can edit their own flags too.
- my %flag_list = map { $_->{id} => $_ } @$update_flags;
- my $flag_objs = Bugzilla::Flag->new_from_list([ keys %flag_list ]);
- my @editable_flags;
- foreach my $flag_obj (@$flag_objs) {
- if ($flag_obj->setter_id == $user->id
- || ($flag_obj->requestee_id && $flag_obj->requestee_id == $user->id))
- {
- push(@editable_flags, $flag_list{$flag_obj->id});
- }
- }
- if (!scalar @editable_flags) {
- ThrowUserError('illegal_attachment_edit', { attach_id => $attachment_obj->id });
- }
- $attachment_obj->set_flags(\@editable_flags, []);
- }
- else {
- ThrowUserError('illegal_attachment_edit', { attach_id => $attachment_obj->id });
- }
-
- my $changes = $attachment_obj->update($timestamp);
-
- if (my $comment_text = trim($comment)) {
- $attachment_obj->bug->add_comment($comment_text,
- { isprivate => $attachment_obj->isprivate,
- type => CMT_ATTACHMENT_UPDATED,
- extra_data => $attachment_obj->id });
- }
-
- $changes = translate($changes, Bugzilla::WebService::Bug::ATTACHMENT_MAPPED_RETURNS);
-
- my %hash = (
- id => $self->type('int', $attachment_obj->id),
- last_change_time => $self->type('dateTime', $attachment_obj->modification_time),
- changes => {},
- );
-
- foreach my $field (keys %$changes) {
- my $change = $changes->{$field};
-
- # We normalize undef to an empty string, so that the API
- # stays consistent for things like Deadline that can become
- # empty.
- $hash{changes}->{$field} = {
- removed => $self->type('string', $change->[0] // ''),
- added => $self->type('string', $change->[1] // '')
- };
- }
-
- push(@modified, \%hash);
- }
- else {
- $attachment_obj = Bugzilla::Attachment->create({
- bug => $bug,
- creation_ts => $timestamp,
- data => $attachment->{data},
- description => $attachment->{summary},
- filename => $attachment->{file_name},
- mimetype => $attachment->{content_type},
- ispatch => $attachment->{is_patch},
- isprivate => $attachment->{is_private},
- });
-
- if ($flags) {
- my ($old_flags, $new_flags) = extract_flags($flags, $bug, $attachment_obj);
- $attachment_obj->set_flags($old_flags, $new_flags);
- }
-
- push(@created, $attachment_obj);
-
- $attachment_obj->update($timestamp);
- $bug->add_comment($comment,
- { isprivate => $attachment_obj->isprivate,
- type => CMT_ATTACHMENT_CREATED,
- extra_data => $attachment_obj->id });
-
- }
- }
-
- $bug->update($timestamp);
-
- $dbh->bz_commit_transaction();
- $bug->send_changes();
-
- my %attachments_created = map { $_->id => $self->_attachment_to_hash($_, $params) } @created;
- my %attachments_modified = map { (ref $_->{id} ? $_->{id}->value : $_->{id}) => $_ } @modified;
-
- return { attachments_created => \%attachments_created, attachments_modified => \%attachments_modified };
-}
-
-sub rest_resources {
- return [
- qr{^/mozreview/(\d+)/attachments$}, {
- POST => {
- method => 'attachments',
- params => sub {
- return { bug_id => $1 };
- },
- },
- },
- ];
-}
-
-1;
diff --git a/extensions/MozReview/template/en/default/admin/params/mozreview.html.tmpl b/extensions/MozReview/template/en/default/admin/params/mozreview.html.tmpl
deleted file mode 100644
index 4a35555a4..000000000
--- a/extensions/MozReview/template/en/default/admin/params/mozreview.html.tmpl
+++ /dev/null
@@ -1,20 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- title = "MozReview"
- desc = "Configure MozReview"
-%]
-
-[%
- param_descs = {
- mozreview_base_url => 'MozReview Base URL',
- mozreview_auth_callback_url => 'MozReview Auth Delegation URL',
- mozreview_app_id => 'app_id for API Keys delegated to MozReview',
- }
-%]
diff --git a/extensions/MozReview/template/en/default/hook/attachment/create-before_form.html.tmpl b/extensions/MozReview/template/en/default/hook/attachment/create-before_form.html.tmpl
deleted file mode 100644
index bfa842c89..000000000
--- a/extensions/MozReview/template/en/default/hook/attachment/create-before_form.html.tmpl
+++ /dev/null
@@ -1,17 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% RETURN UNLESS mozreview_enabled %]
-
-<div class="mozreview-ad">
- Are you attaching a patch? Consider trying out
- <a href="https://reviewboard.mozilla.org/">MozReview</a>, Mozilla's
- new repository-based code-review tool.
- <a href="https://mozilla-version-control-tools.readthedocs.io/en/latest/mozreview.html">Read
- the docs</a> to get started.
-</div>
diff --git a/extensions/MozReview/template/en/default/hook/attachment/edit-view.html.tmpl b/extensions/MozReview/template/en/default/hook/attachment/edit-view.html.tmpl
deleted file mode 100644
index 044c36ae9..000000000
--- a/extensions/MozReview/template/en/default/hook/attachment/edit-view.html.tmpl
+++ /dev/null
@@ -1,16 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- RETURN UNLESS attachment.mimetype == "text/x-review-board-request" && attachment.external_redirect;
- custom_attachment_viewer = 1;
- url = attachment.data;
-%]
-<h3>
- <a href="[% url FILTER html %]" title="[% url FILTER html %]">Show review on MozReview</a><br>
-</h3>
diff --git a/extensions/MozReview/template/en/default/hook/bug/edit-after_bug_data.html.tmpl b/extensions/MozReview/template/en/default/hook/bug/edit-after_bug_data.html.tmpl
deleted file mode 100644
index b0e4ce600..000000000
--- a/extensions/MozReview/template/en/default/hook/bug/edit-after_bug_data.html.tmpl
+++ /dev/null
@@ -1,35 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% RETURN UNLESS mozreview %]
-
-<table class="mozreview-table">
- <thead>
- <tr>
- <th>MozReview Requests</th>
- </tr>
- </thead>
-
- <tbody>
- <tr>
- <td>
- [% INCLUDE moz_review/table.html.tmpl %]
- </td>
- </tr>
- </tbody>
-
- <tfoot>
- <tr class="mozreview-hide-discarded-row bz_default_hidden">
- <td class="mozreview-hide-discarded">
- <a class="mozreview-hide-discarded-link"
- href="#"><span class="mozreview-discarded-action">Show</span>
- discarded requests</a>
- </td>
- </tr>
- </tfoot>
-</table>
diff --git a/extensions/MozReview/template/en/default/hook/bug/show-header-end.html.tmpl b/extensions/MozReview/template/en/default/hook/bug/show-header-end.html.tmpl
deleted file mode 100644
index d70e36b57..000000000
--- a/extensions/MozReview/template/en/default/hook/bug/show-header-end.html.tmpl
+++ /dev/null
@@ -1,13 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- IF mozreview;
- PROCESS moz_review/header.html.tmpl;
- END;
-%]
diff --git a/extensions/MozReview/template/en/default/hook/bug_modal/edit-module.html.tmpl b/extensions/MozReview/template/en/default/hook/bug_modal/edit-module.html.tmpl
deleted file mode 100644
index 9785fa0bd..000000000
--- a/extensions/MozReview/template/en/default/hook/bug_modal/edit-module.html.tmpl
+++ /dev/null
@@ -1,21 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% RETURN UNLESS mozreview %]
-
-[% WRAPPER bug_modal/module.html.tmpl
- title = "MozReview Requests"
- collapsed = 0
-%]
- [% INCLUDE moz_review/table.html.tmpl %]
- <div class="mozreview-hide-discarded-row bz_default_hidden">
- <button type="button" class="minor mozreview-hide-discarded-link">
- <span class="mozreview-discarded-action">Show</span> discarded requests
- </button>
- </div>
-[% END %]
diff --git a/extensions/MozReview/template/en/default/hook/bug_modal/header-end.html.tmpl b/extensions/MozReview/template/en/default/hook/bug_modal/header-end.html.tmpl
deleted file mode 100644
index d70e36b57..000000000
--- a/extensions/MozReview/template/en/default/hook/bug_modal/header-end.html.tmpl
+++ /dev/null
@@ -1,13 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- IF mozreview;
- PROCESS moz_review/header.html.tmpl;
- END;
-%]
diff --git a/extensions/MozReview/template/en/default/hook/global/header-start.html.tmpl b/extensions/MozReview/template/en/default/hook/global/header-start.html.tmpl
deleted file mode 100644
index 6ad026de6..000000000
--- a/extensions/MozReview/template/en/default/hook/global/header-start.html.tmpl
+++ /dev/null
@@ -1,11 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% IF template.name == 'attachment/create.html.tmpl' %]
- [% style_urls.push('extensions/MozReview/web/style/attachment.css') %]
-[% END %]
diff --git a/extensions/MozReview/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/MozReview/template/en/default/hook/global/user-error-errors.html.tmpl
deleted file mode 100644
index 151e63b21..000000000
--- a/extensions/MozReview/template/en/default/hook/global/user-error-errors.html.tmpl
+++ /dev/null
@@ -1,15 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% IF error == "forbidden_method" %]
- The requested method '[% method FILTER html %]' is not allowed to be called using the current API Key.
-[% ELSIF error == "mozreview_attachment_bug_mismatch" %]
- You tried to update attachment [% attachment.id FILTER html %]
- as part of adding or updating attachments on [% bug.id FILTER html %].
- That attachment actually belongs to [% terms.bug %] [% attachment.bug_id FILTER html %].
-[% END %]
diff --git a/extensions/MozReview/template/en/default/moz_review/header.html.tmpl b/extensions/MozReview/template/en/default/moz_review/header.html.tmpl
deleted file mode 100644
index 99fb81ba4..000000000
--- a/extensions/MozReview/template/en/default/moz_review/header.html.tmpl
+++ /dev/null
@@ -1,10 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% style_urls.push('extensions/MozReview/web/style/mozreview.css') %]
-[% javascript_urls.push('extensions/MozReview/web/js/mozreview.js') %]
diff --git a/extensions/MozReview/template/en/default/moz_review/table.html.tmpl b/extensions/MozReview/template/en/default/moz_review/table.html.tmpl
deleted file mode 100644
index 84b7add47..000000000
--- a/extensions/MozReview/template/en/default/moz_review/table.html.tmpl
+++ /dev/null
@@ -1,28 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-<table class="mozreview-requests" data-mozreview-url="[% Bugzilla.params.mozreview_base_url FILTER html %]">
- <thead>
- <tr>
- <th>Submitter</th>
- <th>Diff</th>
- <th>Changes</th>
- <th>Open Issues</th>
- <th>Last Updated</th>
- </tr>
- </thead>
- <tbody class="mozreview-request">
- <tr class="mozreview-loading-row">
- <td colspan="4">Loading...</td>
- </tr>
- <tr class="mozreview-loading-error-row bz_default_hidden">
- <td colspan="4">Error loading review requests:
- <span class="mozreview-load-error-string"></span></td>
- </tr>
- </tbody>
-</table>
diff --git a/extensions/MozReview/web/js/mozreview.js b/extensions/MozReview/web/js/mozreview.js
deleted file mode 100644
index 6fe51f53b..000000000
--- a/extensions/MozReview/web/js/mozreview.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This Source Code Form is "Incompatible With Secondary Licenses", as
- * defined by the Mozilla Public License, v. 2.0.
- */
-
-var MozReview = {};
-
-MozReview.getReviewRequest = function() {
- var hostUrl = $('.mozreview-requests').data('mozreviewUrl');
- var tr = $('<tr/>');
- var td = $('<td/>');
- var link = $('<a/>');
-
- var rrSummaryApiUrl = hostUrl +
- 'api/extensions/mozreview.extension.MozReviewExtension/summary/?bug=' +
- BUGZILLA.bug_id;
- var rrUiBaseUrl = hostUrl + 'r/';
-
- function rrUrl(rrId) {
- return rrUiBaseUrl + rrId + '/';
- }
-
- function rrDiffUrl(rrId) {
- return rrUrl(rrId) + 'diff/#index_header';
- }
-
- function humanizedInt(i) {
- if (i > 1000) {
- return (i / 1000).toFixed(1) + 'k';
- } else {
- return '' + i;
- }
- }
-
- function rrCommitRow(rr, firstCommit) {
- var trCommit = tr.clone();
- var tdSubmitter = td.clone();
- var tdSummary = td.clone();
- var diffLink = link.clone();
- var diffStat = '';
-
- if (firstCommit) {
- tdSubmitter.text(rr.submitter);
- }
-
- tdSummary.addClass('mozreview-summary');
- diffLink.attr('href', rrDiffUrl(rr.id));
- diffLink.text(rr.summary);
- tdSummary.append(diffLink);
-
- if (rr.diff.insert > 0) {
- diffStat = '+' + humanizedInt(rr.diff.insert);
- }
-
- if (rr.diff.delete > 0) {
- if (diffStat.length > 0) {
- diffStat += ' / ';
- }
- diffStat += '-' + humanizedInt(rr.diff.delete);
- }
-
- trCommit.append(
- tdSubmitter,
- tdSummary,
- td.clone().text(diffStat)
- .addClass('mozreview-diffstat'),
- td.clone().text(rr.issue_open_count)
- .addClass('mozreview-open-issues'),
- td.clone().text(timeAgo(new Date(rr.last_updated)))
- );
-
- if (rr.status == "discarded") {
- $('.mozreview-hide-discarded-row').removeClass('bz_default_hidden');
- trCommit.addClass('bz_default_hidden mozreview-discarded-request');
- }
-
- return trCommit;
- }
-
- $('.mozreview-hide-discarded-link').click(function(event) {
- event.preventDefault();
- if ($('.bz_default_hidden.mozreview-discarded-request').length) {
- $('.mozreview-discarded-request').removeClass('bz_default_hidden');
- $('.mozreview-discarded-action').text('Hide');
- } else {
- $('.mozreview-discarded-request').addClass('bz_default_hidden');
- $('.mozreview-discarded-action').text('Show');
- }
- });
-
- var tbody = $('tbody.mozreview-request');
-
- function displayLoadError(errStr) {
- var errRow = tbody.find('.mozreview-loading-error-row');
- errRow.find('.mozreview-load-error-string').text(errStr);
- errRow.removeClass('bz_default_hidden');
- }
-
- $.getJSON(rrSummaryApiUrl, function(data) {
- var family, parent, i, j;
-
- if (data.review_request_summaries.length === 0) {
- displayLoadError('none returned from server');
- } else {
- for (i = 0; i < data.review_request_summaries.length; i++) {
- family = data.review_request_summaries[i];
- for (j = 0; j < family.children.length; j++) {
- tbody.append(rrCommitRow(family.children[j], j == 0));
- }
- }
- }
-
- tbody.find('.mozreview-loading-row').addClass('bz_default_hidden');
- }).fail(function(jqXHR, textStatus, errorThrown) {
- var errStr;
- if (jqXHR.responseJSON && jqXHR.responseJSON.err &&
- jqXHR.responseJSON.err.msg) {
- errStr = jqXHR.responseJSON.err.msg;
- } else if (errorThrown) {
- errStr = errorThrown;
- } else {
- errStr = 'unknown';
- }
- displayLoadError(errStr);
- tbody.find('.mozreview-loading-row').addClass('bz_default_hidden');
- });
-};
-
-$().ready(function() {
- MozReview.getReviewRequest();
-});
diff --git a/extensions/MozReview/web/style/attachment.css b/extensions/MozReview/web/style/attachment.css
deleted file mode 100644
index 474bf466e..000000000
--- a/extensions/MozReview/web/style/attachment.css
+++ /dev/null
@@ -1,13 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This Source Code Form is "Incompatible With Secondary Licenses", as
- * defined by the Mozilla Public License, v. 2.0. */
-
-.mozreview-ad {
- background-color: #fff9db;
- color: #666458;
- padding: 5px;
- margin-bottom: 10px;
-}
diff --git a/extensions/MozReview/web/style/mozreview.css b/extensions/MozReview/web/style/mozreview.css
deleted file mode 100644
index a2263fc11..000000000
--- a/extensions/MozReview/web/style/mozreview.css
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this file,
- * You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This Source Code Form is "Incompatible With Secondary Licenses", as
- * defined by the Mozilla Public License, v. 2.0. */
-
-.mozreview-table {
- background: #fff;
- border: none;
- border-collapse: collapse;
- border-bottom: 1px solid rgba(0, 0, 0, 0.2);
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1);
-}
-
-.mozreview-table th {
- text-align: left;
- padding: 4px;
-}
-
-.mozreview-table td {
- vertical-align: middle !important;
- padding: 4px !important;
-}
-
-.mozreview-table thead, .mozreview-table tfoot {
- background-color: #eee;
- color: #404040;
-}
-
-.mozreview-requests {
- background: #fff;
- border: none;
- border-collapse: collapse;
-}
-
-.mozreview-requests th {
- padding: 2px;
-}
-
-.mozreview-requests td {
- padding: 2px;
-}
-
-.mozreview-requests .mozreview-summary {
- text-align: left;
-}
-
-.mozreview-requests .mozreview-open-issues {
- text-align: center;
-}
-
-.mozreview-requests .mozreview-diffstat {
- text-align: center;
- white-space: nowrap;
-}
-
-/* bug-modal specific */
-
-#module-mozreview-requests .module-content {
- padding: 0;
-}
-
-.bug_modal .mozreview-table {
- width: 100%;
-}
-
-.bug_modal .mozreview-request td {
- padding-left: 8px;
-}
-
-.bug_modal .mozreview-requests th {
- text-align: left;
- padding-left: 8px;
-}
-
-.bug_modal .mozreview-hide-discarded-row {
- padding: 4px;
-}
diff --git a/extensions/MyDashboard/template/en/default/hook/account/prefs/saved-searches-saved-row.html.tmpl b/extensions/MyDashboard/template/en/default/hook/account/prefs/saved-searches-saved-row.html.tmpl
index cd6a36705..ccc54c42a 100644
--- a/extensions/MyDashboard/template/en/default/hook/account/prefs/saved-searches-saved-row.html.tmpl
+++ b/extensions/MyDashboard/template/en/default/hook/account/prefs/saved-searches-saved-row.html.tmpl
@@ -7,7 +7,7 @@
#%]
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="in_mydashboard_[% q.id FILTER html %]"
value="1"
alt="[% q.name FILTER html %]"
diff --git a/extensions/MyDashboard/template/en/default/pages/mydashboard.html.tmpl b/extensions/MyDashboard/template/en/default/pages/mydashboard.html.tmpl
index 5c372db3c..734be28df 100644
--- a/extensions/MyDashboard/template/en/default/pages/mydashboard.html.tmpl
+++ b/extensions/MyDashboard/template/en/default/pages/mydashboard.html.tmpl
@@ -45,7 +45,7 @@
<td class="field_data">
{{#if removed}}
{{#unless added}}
- Removed:
+ Removed:
{{/unless}}
{{removed}}
{{/if}}
@@ -127,30 +127,29 @@
%]
</div>
+ [% IF Param('phabricator_enabled') %]
+ <div class="query_heading requests">
+ <a href="[% Param('phabricator_base_uri') %]/differential">Phabricator Review Requests</a>
+ </div>
+ [% END %]
+
[% BLOCK requests_table %]
<div id="[% name FILTER html %]_container" class="requests">
- <div class="query_heading">[% title FILTER html_light %]</div>
- <span id="[% name FILTER html %]_loading" class="items_found">Loading...</span>
- <span id="[% name FILTER html %]_count_refresh" class="bz_default_hidden">
- <span class="items_found" id="[% name FILTER html %]_flags_found">0 reviews found</span>
- | <a class="refresh" href="javascript:void(0);" id="[% name FILTER html %]_refresh">Refresh</a>
- | <a class="buglist" href="javascript:void(0);" id="[% name FILTER html %]_buglist">Buglist</a>
- </span>
- <div id="[% name FILTER html %]_table"></div>
+ <div class="query_heading">[% title FILTER html_light %]</div>
+ <span id="[% name FILTER html %]_loading" class="items_found">Loading...</span>
+ <span id="[% name FILTER html %]_count_refresh" class="bz_default_hidden">
+ <span class="items_found" id="[% name FILTER html %]_flags_found">0 reviews found</span>
+ | <a class="refresh" href="javascript:void(0);" id="[% name FILTER html %]_refresh">Refresh</a>
+ | <a class="buglist" href="javascript:void(0);" id="[% name FILTER html %]_buglist">Buglist</a>
+ </span>
+ <div id="[% name FILTER html %]_table"></div>
</div>
[% END %]
- [% ## no-008filter
- # requires PhabBugz extension
- IF Param('phabricator_enabled');
- title = '<a href="' _ Param('phabricator_base_uri') _ '">Phabricator</a> Reviews Requested of You';
- PROCESS requests_table name='reviews' title=title;
- END;
-
- PROCESS requests_table name='requestee' title='Flags Requested of You';
- PROCESS requests_table name='requester' title='Flags You Have Requested';
- %]
+ [% PROCESS requests_table name='requestee' title='Flags Requested of You' %]
+ [% PROCESS requests_table name='requester' title='Flags You Have Requested' %]
</div>
+
<div style="clear:both;"></div>
[% IF user.showmybugslink OR user.queries.size OR user.queries_subscribed.size %]
<hr>
diff --git a/extensions/MyDashboard/web/js/flags.js b/extensions/MyDashboard/web/js/flags.js
index 8931e277a..b340b4ee1 100644
--- a/extensions/MyDashboard/web/js/flags.js
+++ b/extensions/MyDashboard/web/js/flags.js
@@ -16,18 +16,15 @@ $(function () {
// Common
var counter = 0;
var dataSource = {
- reviews: null,
requestee: null,
requester: null
};
var dataTable = {
- reviews: null,
requestee: null,
requester: null
};
- var hasReviews = !!document.getElementById('reviews_container');
- var updateRequestsTable = function(type) {
+ var updateFlagTable = function(type) {
if (!type) return;
counter = counter + 1;
@@ -50,15 +47,14 @@ $(function () {
if (o.error && o.error.message) {
alert("Failed to load requests:\n\n" + o.error.message);
} else {
- alert("Failed to load requests.");
+ alert("Failed to load requests");
}
}
};
- var method = type === 'reviews' ? 'PhabBugz.needs_review' : 'MyDashboard.run_flag_query';
var json_object = {
version: "1.1",
- method: method,
+ method: "MyDashboard.run_flag_query",
id: counter,
params: {
type : type,
@@ -138,84 +134,6 @@ $(function () {
}
};
- var phabAuthorFormatter = function(o) {
- return '<span title="' + Y.Escape.html(o.data.author_email) + '">' +
- Y.Escape.html(o.data.author_name) + '</span>';
- };
-
- var phabRowFormatter = function(o) {
- var row = o.cell.ancestor();
-
- // space in the 'flags' tables is tight
- // render requests as two rows - diff title on first row, columns
- // on second
-
- row.insert(
- '<tr class="' + row.getAttribute('class') + '">' +
- '<td class="yui3-datatable-cell" colspan="4">' +
- '<a href="' + o.data.url + '" target="_blank">' +
- Y.Escape.html(o.data.title) + '</a></td></tr>',
- 'after');
-
- o.cell.setHTML('<a href="' + o.data.url + '">D' + o.data.id + '</a>');
-
- return false;
- };
-
- // Reviews
- if (hasReviews) {
- dataSource.reviews = new Y.DataSource.IO({ source: 'jsonrpc.cgi' });
- dataSource.reviews.on('error', function(e) {
- console.log(e);
- try {
- var response = Y.JSON.parse(e.data.responseText);
- if (response.error)
- e.error.message = response.error.message;
- } catch(ex) {
- // ignore
- }
- });
- dataTable.reviews = new Y.DataTable({
- columns: [
- { key: 'author_email', label: 'Requester', sortable: true,
- formatter: phabAuthorFormatter, allowHTML: true },
- { key: 'id', label: 'Revision', sortable: true,
- nodeFormatter: phabRowFormatter, allowHTML: true },
- { key: 'bug_id', label: 'Bug', sortable: true,
- formatter: bugLinkFormatter, allowHTML: true },
- { key: 'updated', label: 'Updated', sortable: true,
- formatter: updatedFormatter, allowHTML: true }
- ],
- strings: {
- emptyMessage: 'No review requests.',
- }
- });
-
- dataTable.reviews.plug(Y.Plugin.DataTableSort);
-
- dataTable.reviews.plug(Y.Plugin.DataTableDataSource, {
- datasource: dataSource.reviews
- });
-
- dataSource.reviews.plug(Y.Plugin.DataSourceJSONSchema, {
- schema: {
- resultListLocator: 'result.result',
- resultFields: [ 'author_email', 'author_name', 'bug_id',
- 'bug_status', 'bug_summary', 'id', 'status', 'title',
- 'updated', 'updated_fancy', 'url' ]
- }
- });
-
- dataTable.reviews.render("#reviews_table");
-
- Y.one('#reviews_refresh').on('click', function(e) {
- updateRequestsTable('reviews');
- });
- Y.one('#reviews_buglist').on('click', function(e) {
- loadBugList('reviews');
- });
- }
-
// Requestee
dataSource.requestee = new Y.DataSource.IO({ source: 'jsonrpc.cgi' });
dataSource.requestee.on('error', function(e) {
@@ -259,7 +177,7 @@ $(function () {
dataTable.requestee.render("#requestee_table");
Y.one('#requestee_refresh').on('click', function(e) {
- updateRequestsTable('requestee');
+ updateFlagTable('requestee');
});
Y.one('#requestee_buglist').on('click', function(e) {
loadBugList('requestee');
@@ -307,23 +225,18 @@ $(function () {
});
Y.one('#requester_refresh').on('click', function(e) {
- updateRequestsTable('requester');
+ updateFlagTable('requester');
});
Y.one('#requester_buglist').on('click', function(e) {
loadBugList('requester');
});
// Initial load
- if (hasReviews) {
- Y.on("contentready", function (e) {
- updateRequestsTable('reviews');
- }, "#reviews_table");
- }
Y.on("contentready", function (e) {
- updateRequestsTable("requestee");
+ updateFlagTable("requestee");
}, "#requestee_table");
Y.on("contentready", function (e) {
- updateRequestsTable("requester");
+ updateFlagTable("requester");
}, "#requester_table");
});
});
diff --git a/extensions/MyDashboard/web/js/query.js b/extensions/MyDashboard/web/js/query.js
index e5e0979a1..53139d27f 100644
--- a/extensions/MyDashboard/web/js/query.js
+++ b/extensions/MyDashboard/web/js/query.js
@@ -14,7 +14,7 @@ if (typeof(MyDashboard) == 'undefined') {
$(function() {
YUI({
base: 'js/yui3/',
- combine: false,
+ combine: false,
groups: {
gallery: {
combine: false,
diff --git a/extensions/OldBugMove/template/en/default/admin/params/oldbugmove.html.tmpl b/extensions/OldBugMove/template/en/default/admin/params/oldbugmove.html.tmpl
index ce588b168..6bbd07b7e 100644
--- a/extensions/OldBugMove/template/en/default/admin/params/oldbugmove.html.tmpl
+++ b/extensions/OldBugMove/template/en/default/admin/params/oldbugmove.html.tmpl
@@ -25,16 +25,16 @@
[% param_descs = {
- "move-to-url" =>
+ "move-to-url" =>
"The URL of the database we allow some of our $terms.bugs to"
_ " be moved to.",
- "move-to-address" =>
+ "move-to-address" =>
"To move ${terms.bugs}, an email is sent to the target database."
_ " This is the email address that that database uses to listen"
_ " for incoming ${terms.bugs}.",
- movers =>
+ movers =>
"A list of people with permission to move $terms.bugs ",
} %]
diff --git a/extensions/OldBugMove/template/en/default/hook/bug/edit-after_comment_textarea.html.tmpl b/extensions/OldBugMove/template/en/default/hook/bug/edit-after_comment_textarea.html.tmpl
index 0a7a4fa27..d55213400 100644
--- a/extensions/OldBugMove/template/en/default/hook/bug/edit-after_comment_textarea.html.tmpl
+++ b/extensions/OldBugMove/template/en/default/hook/bug/edit-after_comment_textarea.html.tmpl
@@ -21,7 +21,7 @@
[% IF oldbugmove_user_is_mover(user) AND bug.resolution != 'MOVED' %]
<p>
<input type="submit" id="oldbugmove" name="oldbugmove"
- value="Move [% terms.Bug FILTER html %] to
+ value="Move [% terms.Bug FILTER html %] to
[%= Param('move-to-url') FILTER html %]">
</p>
[% END %]
diff --git a/extensions/OldBugMove/template/en/default/hook/bug/format_comment-type.txt.tmpl b/extensions/OldBugMove/template/en/default/hook/bug/format_comment-type.txt.tmpl
index 1ce8e369d..069e55628 100644
--- a/extensions/OldBugMove/template/en/default/hook/bug/format_comment-type.txt.tmpl
+++ b/extensions/OldBugMove/template/en/default/hook/bug/format_comment-type.txt.tmpl
@@ -24,6 +24,6 @@
[%+ terms.Bug %] moved to [% Param("move-to-url") %].
If the move succeeded, [% comment.extra_data FILTER email %] will receive a mail
containing the number of the new [% terms.bug %] in the other database.
-If all went well, please paste in a link to the new [% terms.bug %].
+If all went well, please paste in a link to the new [% terms.bug %].
Otherwise, reopen this [% terms.bug %].
[% END %]
diff --git a/extensions/OldBugMove/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/OldBugMove/template/en/default/hook/global/user-error-errors.html.tmpl
index 935117780..e6f8284ba 100644
--- a/extensions/OldBugMove/template/en/default/hook/global/user-error-errors.html.tmpl
+++ b/extensions/OldBugMove/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -23,7 +23,7 @@
delete the [%+ display_value("resolution", "MOVED") FILTER html %]
resolution.
[% ELSIF error == "oldbugmove_no_manual_move" %]
- You cannot set the resolution of [% terms.abug %] to
+ You cannot set the resolution of [% terms.abug %] to
[%+ display_value("resolution", "MOVED") FILTER html %] without
moving the [% terms.bug %].
[% END %]
diff --git a/extensions/OldBugMove/template/en/default/hook/list/edit-multiple-after_groups.html.tmpl b/extensions/OldBugMove/template/en/default/hook/list/edit-multiple-after_groups.html.tmpl
index 10e6f73b3..a34392577 100644
--- a/extensions/OldBugMove/template/en/default/hook/list/edit-multiple-after_groups.html.tmpl
+++ b/extensions/OldBugMove/template/en/default/hook/list/edit-multiple-after_groups.html.tmpl
@@ -22,7 +22,7 @@
[% IF oldbugmove_user_is_mover(user) %]
<p>
<input type="submit" id="oldbugmove" name="oldbugmove"
- value="Move [% terms.Bugs FILTER html %] to
+ value="Move [% terms.Bugs FILTER html %] to
[%= Param('move-to-url') FILTER html %]">
</p>
[% END %]
diff --git a/extensions/OrangeFactor/web/js/LICENSE.processing.js b/extensions/OrangeFactor/web/js/LICENSE.processing.js
index 404e5d5eb..9070bddea 100644
--- a/extensions/OrangeFactor/web/js/LICENSE.processing.js
+++ b/extensions/OrangeFactor/web/js/LICENSE.processing.js
@@ -5,7 +5,7 @@ copyright holders.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
+without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
@@ -13,7 +13,7 @@ the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
diff --git a/extensions/OrangeFactor/web/js/LICENSE.sparklines.js b/extensions/OrangeFactor/web/js/LICENSE.sparklines.js
index 73aaca832..7c922a477 100644
--- a/extensions/OrangeFactor/web/js/LICENSE.sparklines.js
+++ b/extensions/OrangeFactor/web/js/LICENSE.sparklines.js
@@ -3,7 +3,7 @@ Copyright (C) 2008 Will Larson
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
+without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
@@ -11,7 +11,7 @@ the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
diff --git a/extensions/OrangeFactor/web/js/orange_factor.js b/extensions/OrangeFactor/web/js/orange_factor.js
index 78fbb5eb3..e9383901e 100644
--- a/extensions/OrangeFactor/web/js/orange_factor.js
+++ b/extensions/OrangeFactor/web/js/orange_factor.js
@@ -3,7 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This Source Code Form is "Incompatible With Secondary Licenses", as
- * defined by the Mozilla Public License, v. 2.0.
+ * defined by the Mozilla Public License, v. 2.0.
*/
$(function() {
diff --git a/extensions/OrangeFactor/web/js/sparklines.min.js b/extensions/OrangeFactor/web/js/sparklines.min.js
index f1043c55e..a5fed6326 100644
--- a/extensions/OrangeFactor/web/js/sparklines.min.js
+++ b/extensions/OrangeFactor/web/js/sparklines.min.js
@@ -1,4 +1,4 @@
-/* Sparklines.js - Will Larson (http://lethain.com)
+/* Sparklines.js - Will Larson (http://lethain.com)
* This code is distributed under the MIT license.
* See LICENSE.sparklines.js
* More information: https://github.com/lethain/sparklines.js
diff --git a/extensions/Persona/Extension.pm b/extensions/Persona/Extension.pm
deleted file mode 100644
index f94c54446..000000000
--- a/extensions/Persona/Extension.pm
+++ /dev/null
@@ -1,86 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::Persona;
-
-use 5.10.1;
-use strict;
-use warnings;
-
-use base qw(Bugzilla::Extension);
-
-use Bugzilla::Config qw(SetParam write_params);
-
-our $VERSION = '0.01';
-
-sub install_update_db {
- # The extension changed from BrowserID to Persona
- # so we need to update user_info_class if this system
- # was using BrowserID for verification.
- my $params = Bugzilla->params || Bugzilla::Config::read_param_file();
- my $user_info_class = $params->{'user_info_class'};
- if ($user_info_class =~ /BrowserID/) {
- $user_info_class =~ s/BrowserID/Persona/;
- SetParam('user_info_class', $user_info_class);
- write_params();
- }
-}
-
-sub auth_login_methods {
- my ($self, $args) = @_;
- my $modules = $args->{'modules'};
- if (exists($modules->{'Persona'})) {
- $modules->{'Persona'} = 'Bugzilla/Extension/Persona/Login.pm';
- }
-}
-
-sub config_modify_panels {
- my ($self, $args) = @_;
- my $panels = $args->{'panels'};
- my $auth_panel_params = $panels->{'auth'}->{'params'};
-
- my ($user_info_class) =
- grep { $_->{'name'} eq 'user_info_class' } @$auth_panel_params;
-
- if ($user_info_class) {
- push(@{ $user_info_class->{'choices'} }, "Persona,CGI");
- }
-
- # The extension changed from BrowserID to Persona
- # so we need to retain the current values for the new
- # params that will be created.
- my $params = Bugzilla->params || Bugzilla::Config::read_param_file();
- my $verify_url = $params->{'browserid_verify_url'};
- my $includejs_url = $params->{'browserid_includejs_url'};
- if ($verify_url && $includejs_url) {
- foreach my $param (@{ $panels->{'persona'}->{'params'} }) {
- if ($param->{'name'} eq 'persona_verify_url') {
- $param->{'default'} = $verify_url;
- }
- if ($param->{'name'} eq 'persona_includejs_url') {
- $param->{'default'} = $includejs_url;
- }
- }
- }
-}
-
-sub attachment_should_redirect_login {
- my ($self, $args) = @_;
- my $cgi = Bugzilla->cgi;
-
- if ($cgi->param("persona_assertion")) {
- ${$args->{do_redirect}} = 1;
- }
-}
-
-sub config_add_panels {
- my ($self, $args) = @_;
- my $modules = $args->{panel_modules};
- $modules->{Persona} = "Bugzilla::Extension::Persona::Config";
-}
-
-__PACKAGE__->NAME;
diff --git a/extensions/Persona/TODO b/extensions/Persona/TODO
deleted file mode 100644
index ac94a3c42..000000000
--- a/extensions/Persona/TODO
+++ /dev/null
@@ -1,19 +0,0 @@
-ToDo:
-
-* Cache the LWP::UserAgent in Login.pm?
-
-* Fix Bugzilla::Auth::Login::Stack to allow failure part way down the chain
- (currently, it seems that both CGI and BrowserID have to be last in order
- to report login failures correctly.)
-
-* JS inclusions noticeably slow page load. Do we want a local copy of
- browserid.js? Do the browserid folks object to that? How can we get good
- performance? How can we avoid including it in every logged-in page? Can we
- do demand loading onclick, and/or load-on-reveal?
-
-* Fix -8px margin-bottom hack in login-small-additional_methods.html.tmpl
-
-
-
-
-
diff --git a/extensions/Persona/lib/Login.pm b/extensions/Persona/lib/Login.pm
deleted file mode 100644
index 9a5e3a5b7..000000000
--- a/extensions/Persona/lib/Login.pm
+++ /dev/null
@@ -1,137 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::Persona::Login;
-
-use 5.10.1;
-use strict;
-use warnings;
-
-use base qw(Bugzilla::Auth::Login);
-
-use Bugzilla::Constants;
-use Bugzilla::Util;
-use Bugzilla::Error;
-use Bugzilla::Token;
-
-use JSON;
-use LWP::UserAgent;
-
-use constant requires_verification => 0;
-use constant is_automatic => 1;
-use constant user_can_create_account => 1;
-
-sub get_login_info {
- my ($self) = @_;
-
- my $cgi = Bugzilla->cgi;
-
- my $assertion = $cgi->param("persona_assertion");
- # Avoid the assertion being copied into any 'echoes' of the current URL
- # in the page.
- $cgi->delete('persona_assertion');
-
- if (!$assertion || !Bugzilla->params->{persona_verify_url}) {
- return { failure => AUTH_NODATA };
- }
-
- my $token = $cgi->param("token");
- $cgi->delete('token');
- check_hash_token($token, ['login']);
-
- my $urlbase = new URI(Bugzilla->localconfig->{urlbase});
- my $audience = $urlbase->scheme . "://" . $urlbase->host_port;
-
- my $ua = new LWP::UserAgent( timeout => 10 );
- if (Bugzilla->params->{persona_proxy_url}) {
- $ua->proxy('https', Bugzilla->params->{persona_proxy_url});
- }
-
- my $response = $ua->post(Bugzilla->params->{persona_verify_url},
- [ assertion => $assertion,
- audience => $audience ]);
- if ($response->is_error) {
- return { failure => AUTH_ERROR,
- user_error => 'persona_server_fail',
- details => { reason => $response->message }};
- }
-
- my $info;
- eval {
- $info = decode_json($response->decoded_content());
- };
- if ($@) {
- return { failure => AUTH_ERROR,
- user_error => 'persona_server_fail',
- details => { reason => 'Received a malformed response.' }};
- }
- if ($info->{'status'} eq 'failure') {
- return { failure => AUTH_ERROR,
- user_error => 'persona_server_fail',
- details => { reason => $info->{reason} }};
- }
-
- if ($info->{'status'} eq "okay" &&
- $info->{'audience'} eq $audience &&
- ($info->{'expires'} / 1000) > time())
- {
- my $login_data = {
- 'username' => $info->{'email'}
- };
-
- my $result = Bugzilla::Auth::Verify->create_or_update_user($login_data);
- return $result if $result->{'failure'};
-
- my $user = $result->{'user'};
-
- # You can restrict people in a particular group from logging in using
- # Persona by making that group a member of a group called
- # "no-browser-id".
- #
- # If you have your "createemailregexp" set up in such a way that a
- # newly-created account is a member of "no-browser-id", this code will
- # create an account for them and then fail their login. Which isn't
- # great, but they can still use normal-Bugzilla-login password
- # recovery.
- if ($user->in_group('no-browser-id')) {
- return { failure => AUTH_ERROR,
- user_error => 'persona_account_too_powerful' };
- }
-
- if ($user->mfa) {
- return { failure => AUTH_ERROR,
- user_error => 'mfa_prevents_login',
- details => { provider => 'Persona' } };
- }
-
- $login_data->{'user'} = $user;
- $login_data->{'user_id'} = $user->id;
-
- return $login_data;
- }
- else {
- return { failure => AUTH_LOGINFAILED };
- }
-}
-
-# Pinched from Bugzilla::Auth::Login::CGI
-sub fail_nodata {
- my ($self) = @_;
- my $cgi = Bugzilla->cgi;
- my $template = Bugzilla->template;
-
- if (Bugzilla->usage_mode != USAGE_MODE_BROWSER) {
- ThrowUserError('login_required');
- }
-
- print $cgi->header();
- $template->process("account/auth/login.html.tmpl", { 'target' => $cgi->url(-relative=>1) })
- || ThrowTemplateError($template->error());
- exit;
-}
-
-1;
diff --git a/extensions/Persona/template/en/default/admin/params/browserid.html.tmpl b/extensions/Persona/template/en/default/admin/params/browserid.html.tmpl
deleted file mode 100644
index 379d12058..000000000
--- a/extensions/Persona/template/en/default/admin/params/browserid.html.tmpl
+++ /dev/null
@@ -1,22 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- title = "Persona"
- desc = "Configure Persona Authentication"
-%]
-
-[% param_descs = {
- persona_verify_url => "This is the URL for the Persona authority that the " _
- "user will be verified against. " _
- "Example: <kbd>https://verifier.login.persona.org/verify</kbd>.",
- persona_includejs_url => "This is the URL needed by Persona to load the necessary " _
- "javascript library for authentication. " _
- "Example: <kbd>https://persona.org/include.js</kbd>."
- }
-%]
diff --git a/extensions/Persona/template/en/default/admin/params/persona.html.tmpl b/extensions/Persona/template/en/default/admin/params/persona.html.tmpl
deleted file mode 100644
index ef3cf32d2..000000000
--- a/extensions/Persona/template/en/default/admin/params/persona.html.tmpl
+++ /dev/null
@@ -1,24 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[%
- title = "Persona"
- desc = "Configure Persona Authentication"
-%]
-
-[% param_descs = {
- persona_verify_url => "This is the URL for the Persona authority that the " _
- "user will be verified against. " _
- "Example: <kbd>https://verifier.login.persona.org/verify</kbd>.",
- persona_includejs_url => "This is the URL needed by Persona to load the necessary " _
- "javascript library for authentication. " _
- "Example: <kbd>https://login.persona.org/include.js</kbd>."
- persona_proxy_url => "The URL of a HTTPS proxy server (optional). " _
- "Example: <kbd>http://proxy.example.com:3128</kbd>."
- }
-%]
diff --git a/extensions/Persona/template/en/default/hook/account/auth/login-additional_methods.html.tmpl b/extensions/Persona/template/en/default/hook/account/auth/login-additional_methods.html.tmpl
deleted file mode 100644
index 1743db9a6..000000000
--- a/extensions/Persona/template/en/default/hook/account/auth/login-additional_methods.html.tmpl
+++ /dev/null
@@ -1,9 +0,0 @@
-[% IF Param('user_info_class').split(',').contains('Persona')
- && Param('persona_includejs_url') %]
-<p>
- <img src="extensions/Persona/web/images/persona_sign_in.png" width="185" height="25" class="persona_sign_in">
-</p>
-<p>
- <strong>Note:</strong> Persona authentication will be removed on October 25th, 2016 (<a href="page.cgi?id=persona_deprecated.html">more info</a>).
-</p>
-[% END %]
diff --git a/extensions/Persona/template/en/default/hook/account/auth/login-small-additional_methods.html.tmpl b/extensions/Persona/template/en/default/hook/account/auth/login-small-additional_methods.html.tmpl
deleted file mode 100644
index 364d1528f..000000000
--- a/extensions/Persona/template/en/default/hook/account/auth/login-small-additional_methods.html.tmpl
+++ /dev/null
@@ -1,17 +0,0 @@
-[% IF Param('user_info_class').split(',').contains('Persona')
- && Param('persona_includejs_url') %]
-<script [% script_nonce FILTER none %]>
- YAHOO.util.Event.addListener('login_link[% qs_suffix FILTER js %]','click', function () {
- var login_link = YAHOO.util.Dom.get('persona_mini_login[% qs_suffix FILTER js %]');
- YAHOO.util.Dom.removeClass(login_link, 'bz_default_hidden');
- });
- YAHOO.util.Event.addListener('hide_mini_login[% qs_suffix FILTER js %]','click', function () {
- var login_link = YAHOO.util.Dom.get('persona_mini_login[% qs_suffix FILTER js %]');
- YAHOO.util.Dom.addClass(login_link, 'bz_default_hidden');
- });
-</script>
-<span id="persona_mini_login[% qs_suffix FILTER html %]" class="bz_default_hidden">
- <img src="extensions/Persona/web/images/sign_in.png" height="22" width="75" align="absmiddle"
- title="Sign in with Persona" class='persona_sign_in'> or
-</span>
-[% END %]
diff --git a/extensions/Persona/template/en/default/hook/account/create-additional_methods.html.tmpl b/extensions/Persona/template/en/default/hook/account/create-additional_methods.html.tmpl
deleted file mode 100644
index b6fb1eedc..000000000
--- a/extensions/Persona/template/en/default/hook/account/create-additional_methods.html.tmpl
+++ /dev/null
@@ -1,13 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% RETURN UNLESS Param('user_info_class').split(',').contains('Persona') %]
-
-Or, use your Persona account:
-<img src="extensions/Persona/web/images/sign_in.png" class="persona_sign_in"
- width="95" height="25" align="absmiddle">
diff --git a/extensions/Persona/template/en/default/hook/global/header-additional_header.html.tmpl b/extensions/Persona/template/en/default/hook/global/header-additional_header.html.tmpl
deleted file mode 100644
index f60bd36db..000000000
--- a/extensions/Persona/template/en/default/hook/global/header-additional_header.html.tmpl
+++ /dev/null
@@ -1,90 +0,0 @@
-[%# This Source Code Form is subject to the terms of the Mozilla Public
- # License, v. 2.0. If a copy of the MPL was not distributed with this
- # file, You can obtain one at http://mozilla.org/MPL/2.0/.
- #
- # This Source Code Form is "Incompatible With Secondary Licenses", as
- # defined by the Mozilla Public License, v. 2.0.
- #%]
-
-[% RETURN UNLESS Param('persona_includejs_url')
- && Param('user_info_class').split(',').contains('Persona') %]
-
-[%# for now don't inject persona javascript on authenticated users.
- # we've seen sessions being logged out unexpectedly
- # we should only inject this code for users who used persona to authenicate %]
-[% RETURN IF user.id %]
-
-[% USE Bugzilla %]
-[% cgi = Bugzilla.cgi %]
-
-<script [% script_nonce FILTER none %] defer src="[% Param('persona_includejs_url') %]"></script>
-<script [% script_nonce FILTER none %]>
-
-function createHidden(name, value, form) {
- var field = document.createElement('input');
- field.type = 'hidden';
- field.name = name;
- field.value = value;;
- form.appendChild(field);
-}
-
-[% login_target = cgi.url("-relative" => 1, "-query" => 1) %]
-[% IF !login_target
- OR login_target.match("^token\.cgi")
- OR login_target.match("^createaccount\.cgi") %]
- [% login_target = "index.cgi" %]
-[% END %]
-[% login_target = urlbase _ login_target %]
-
-[%# we only want to honour explicit login requests %]
-var persona_ignore_login = true;
-
-function persona_onlogin(assertion) {
- if (persona_ignore_login)
- return;
- [% IF !user.id %]
- var form = document.createElement('form');
- form.action = '[% login_target FILTER js %]';
- form.method = 'POST';
- form.style.display = 'none';
-
- createHidden('token', '[% issue_hash_token(['login']) FILTER js %]', form);
- createHidden('Bugzilla_remember', 'on', form);
- createHidden('persona_assertion', assertion, form);
-
- [% FOREACH field = cgi.param() %]
- [% NEXT IF field.search('^(Bugzilla_(login|password|restrictlogin)|token|persona_assertion)$') %]
- [% NEXT UNLESS cgi.param(field).can('slice') %]
- [% FOREACH mvalue = cgi.param(field).slice(0) %]
- createHidden('[% field FILTER js %]', '[% mvalue FILTER html_linebreak FILTER js %]', form);
- [% END %]
- [% END %]
-
- document.body.appendChild(form);
- form.submit();
- [% END %]
-}
-
-YAHOO.util.Event.on(window, 'load', persona_init);
-function persona_init() {
- navigator.id.watch({
- [%# we can't set loggedInUser to user.login as this causes cgi authenticated
- sessions to be logged out by persona %]
- loggedInUser: null,
- onlogin: persona_onlogin,
- onlogout: function () {
- [%# this should be redirecting to index.cgi?logout=1 however there's a
- persona bug which causes this to break chrome and safari logins.
- https://github.com/mozilla/browserid/issues/2423 %]
- }
- });
-}
-
-function persona_sign_in() {
- persona_ignore_login = false;
- navigator.id.request({ siteName: '[% terms.BugzillaTitle FILTER js %]' });
-}
-$(function() {
- $('.persona_sign_in').on("click", persona_sign_in);
-});
-</script>
diff --git a/extensions/Persona/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/Persona/template/en/default/hook/global/user-error-errors.html.tmpl
deleted file mode 100644
index f2e5bda24..000000000
--- a/extensions/Persona/template/en/default/hook/global/user-error-errors.html.tmpl
+++ /dev/null
@@ -1,12 +0,0 @@
-[% IF error == "persona_account_too_powerful" %]
- [% title = "Account Too Powerful" %]
- Your account is a member of a group which is not permitted to use Persona to
- log in. Please log in with your [% terms.Bugzilla %] username and password.
- <br><br>
- (Persona logins are disabled for accounts which are members of certain
- particularly sensitive groups, while we gain experience with the technology.)
-[% ELSIF error == "persona_server_fail" %]
- An error occurred during communication with the Persona servers:
- <br>
- [% reason FILTER html %]
-[% END %]
diff --git a/extensions/Persona/web/images/persona_sign_in.png b/extensions/Persona/web/images/persona_sign_in.png
deleted file mode 100644
index ab88a7154..000000000
--- a/extensions/Persona/web/images/persona_sign_in.png
+++ /dev/null
Binary files differ
diff --git a/extensions/Persona/web/images/sign_in.png b/extensions/Persona/web/images/sign_in.png
deleted file mode 100644
index 82594ba82..000000000
--- a/extensions/Persona/web/images/sign_in.png
+++ /dev/null
Binary files differ
diff --git a/extensions/PhabBugz/lib/Constants.pm b/extensions/PhabBugz/lib/Constants.pm
index 1692f8fb9..19987de25 100644
--- a/extensions/PhabBugz/lib/Constants.pm
+++ b/extensions/PhabBugz/lib/Constants.pm
@@ -19,6 +19,7 @@ our @EXPORT = qw(
PHAB_FEED_POLL_SECONDS
PHAB_USER_POLL_SECONDS
PHAB_GROUP_POLL_SECONDS
+ PHAB_TIMEOUT
);
use constant PHAB_ATTACHMENT_PATTERN => qr/^phabricator-D(\d+)/;
@@ -27,5 +28,6 @@ use constant PHAB_CONTENT_TYPE => 'text/x-phabricator-request';
use constant PHAB_FEED_POLL_SECONDS => $ENV{PHAB_FEED_POLL} // 5;
use constant PHAB_USER_POLL_SECONDS => $ENV{PHAB_USER_POLL} // 60;
use constant PHAB_GROUP_POLL_SECONDS => $ENV{PHAB_GROUP_POLL} // 300;
+use constant PHAB_TIMEOUT => $ENV{PHAB_TIMEOUT} // 60;
1;
diff --git a/extensions/PhabBugz/lib/Feed.pm b/extensions/PhabBugz/lib/Feed.pm
index f2a440bb1..71e6aa827 100644
--- a/extensions/PhabBugz/lib/Feed.pm
+++ b/extensions/PhabBugz/lib/Feed.pm
@@ -11,10 +11,10 @@ use 5.10.1;
use IO::Async::Timer::Periodic;
use IO::Async::Loop;
+use IO::Async::Signal;
use List::Util qw(first);
use List::MoreUtils qw(any uniq);
use Moo;
-use Scalar::Util qw(blessed);
use Try::Tiny;
use Type::Params qw( compile );
use Type::Utils;
@@ -48,6 +48,13 @@ my $Invocant = class_type { class => __PACKAGE__ };
sub start {
my ($self) = @_;
+ my $sig_alarm = IO::Async::Signal->new(
+ name => 'ALRM',
+ on_receipt => sub {
+ FATAL("Timeout reached");
+ exit;
+ },
+ );
# Query for new revisions or changes
my $feed_timer = IO::Async::Timer::Periodic->new(
first_interval => 0,
@@ -56,13 +63,17 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->feed_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
},
);
@@ -74,13 +85,17 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->user_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
},
);
@@ -92,13 +107,18 @@ sub start {
on_tick => sub {
try {
with_writable_database {
+ alarm(PHAB_TIMEOUT);
$self->group_query();
};
}
catch {
FATAL($_);
+ }
+ finally {
+ alarm(0);
+ Bugzilla->_cleanup();
};
- Bugzilla->_cleanup();
+
},
);
@@ -106,6 +126,7 @@ sub start {
$loop->add($feed_timer);
$loop->add($user_timer);
$loop->add($group_timer);
+ $loop->add($sig_alarm);
$feed_timer->start;
$user_timer->start;
$group_timer->start;
@@ -221,6 +242,11 @@ sub feed_query {
$delete_build_target->execute($target->{name}, $target->{value});
}
+
+ if (Bugzilla->datadog) {
+ my $dd = Bugzilla->datadog();
+ $dd->increment('bugzilla.phabbugz.feed_query_count');
+ }
}
sub user_query {
@@ -261,6 +287,11 @@ sub user_query {
};
$self->save_last_id($user_id, 'user');
}
+
+ if (Bugzilla->datadog) {
+ my $dd = Bugzilla->datadog();
+ $dd->increment('bugzilla.phabbugz.user_query_count');
+ }
}
sub group_query {
@@ -359,6 +390,11 @@ sub group_query {
INFO( "Project " . $project->name . " updated" );
}
}
+
+ if (Bugzilla->datadog) {
+ my $dd = Bugzilla->datadog();
+ $dd->increment('bugzilla.phabbugz.group_query_count');
+ }
}
sub process_revision_change {
@@ -501,105 +537,6 @@ sub process_revision_change {
$attachment->update($timestamp);
}
- # REVIEWER STATUSES
-
- my (@accepted, @denied);
- foreach my $review (@{ $revision->reviews }) {
- push @accepted, $review->{user} if $review->{status} eq 'accepted';
- push @denied, $review->{user} if $review->{status} eq 'rejected';
- }
-
- my @accepted_user_ids = map { $_->bugzilla_user->id } grep { defined $_->bugzilla_user } @accepted;
- my @denied_user_ids = map { $_->bugzilla_user->id } grep { defined $_->bugzilla_user } @denied;
- my %reviewers_hash = map { $_->{user}->name => 1 } @{ $revision->reviews };
-
- foreach my $attachment (@attachments) {
- my ($attach_revision_id) = ($attachment->filename =~ PHAB_ATTACHMENT_PATTERN);
- next if $revision->id != $attach_revision_id;
-
- # Clear old accepted review flags if no longer accepted
- my (@denied_flags, @new_flags, @removed_flags, %accepted_done, $flag_type);
- foreach my $flag (@{ $attachment->flags }) {
- next if $flag->type->name ne 'review';
- $flag_type = $flag->type if $flag->type->is_active;
- next if $flag->status ne '+';
- if (any { $flag->setter->id == $_ } @denied_user_ids) {
- INFO('Denying review flag set by ' . $flag->setter->name);
- push(@denied_flags, { id => $flag->id, setter => $flag->setter, status => 'X' });
- }
- if (any { $flag->setter->id == $_ } @accepted_user_ids) {
- INFO('Skipping as review+ already set by ' . $flag->setter->name);
- $accepted_done{$flag->setter->id}++;
- }
- if (!any { $flag->setter->id == $_ } (@accepted_user_ids, @denied_user_ids)) {
- INFO('Clearing review+ flag set by ' . $flag->setter->name);
- push(@removed_flags, { id => $flag->id, setter => $flag->setter, status => 'X' });
- }
- }
-
- $flag_type ||= first { $_->name eq 'review' && $_->is_active } @{ $attachment->flag_types };
-
- die "Unable to find review flag!" unless $flag_type;
-
- # Create new flags
- foreach my $user_id (@accepted_user_ids) {
- next if $accepted_done{$user_id};
- my $user = Bugzilla::User->check({ id => $user_id, cache => 1 });
- INFO('Setting new review+ flag for ' . $user->name);
- push(@new_flags, { type_id => $flag_type->id, setter => $user, status => '+' });
- }
-
- # Process each flag change by updating the flag and adding a comment
- foreach my $flag_data (@new_flags) {
- my $comment = $flag_data->{setter}->name . " has approved the revision.";
- $self->add_flag_comment(
- {
- bug => $bug,
- attachment => $attachment,
- comment => $comment,
- user => $flag_data->{setter},
- old_flags => [],
- new_flags => [$flag_data],
- timestamp => $timestamp
- }
- );
- }
- foreach my $flag_data (@denied_flags) {
- my $comment = $flag_data->{setter}->name . " has requested changes to the revision.\n";
- $self->add_flag_comment(
- {
- bug => $bug,
- attachment => $attachment,
- comment => $comment,
- user => $flag_data->{setter},
- old_flags => [$flag_data],
- new_flags => [],
- timestamp => $timestamp
- }
- );
- }
- foreach my $flag_data (@removed_flags) {
- my $comment;
- if ( exists $reviewers_hash{ $flag_data->{setter}->name } ) {
- $comment = "Flag set by " . $flag_data->{setter}->name . " is no longer active.\n";
- }
- else {
- $comment = $flag_data->{setter}->name . " has been removed from the revision.\n";
- }
- $self->add_flag_comment(
- {
- bug => $bug,
- attachment => $attachment,
- comment => $comment,
- user => $flag_data->{setter},
- old_flags => [$flag_data],
- new_flags => [],
- timestamp => $timestamp
- }
- );
- }
- }
-
# FINISH UP
$bug->update($timestamp);
@@ -736,6 +673,11 @@ sub process_new_user {
foreach my $attachment (@attachments) {
my ($revision_id) = ($attachment->filename =~ PHAB_ATTACHMENT_PATTERN);
+ if (!$revision_id) {
+ WARN("Skipping " . $attachment->filename . " on bug $bug_id. Filename should be fixed.");
+ next;
+ }
+
INFO("Processing revision D$revision_id");
my $revision = Bugzilla::Extension::PhabBugz::Revision->new_from_query(
@@ -839,38 +781,4 @@ sub get_group_members {
);
}
-sub add_flag_comment {
- state $check = compile(
- $Invocant,
- Dict [
- bug => Bug,
- attachment => Attachment,
- comment => Str,
- user => User,
- old_flags => ArrayRef,
- new_flags => ArrayRef,
- timestamp => Str,
- ],
- );
- my ( $self, $params ) = $check->(@_);
- my ( $bug, $attachment, $comment, $user, $old_flags, $new_flags, $timestamp )
- = @$params{qw(bug attachment comment user old_flags new_flags timestamp)};
-
- # when this function returns, Bugzilla->user will return to its previous value.
- my $restore_prev_user = Bugzilla->set_user($user, scope_guard => 1);
-
- INFO("Flag comment: $comment");
- $bug->add_comment(
- $comment,
- {
- isprivate => $attachment->isprivate,
- type => CMT_ATTACHMENT_UPDATED,
- extra_data => $attachment->id
- }
- );
-
- $attachment->set_flags( $old_flags, $new_flags );
- $attachment->update($timestamp);
-}
-
1;
diff --git a/extensions/PhabBugz/lib/Util.pm b/extensions/PhabBugz/lib/Util.pm
index a93533e75..32f860413 100644
--- a/extensions/PhabBugz/lib/Util.pm
+++ b/extensions/PhabBugz/lib/Util.pm
@@ -20,14 +20,14 @@ use Bugzilla::Util qw(trim);
use Bugzilla::Extension::PhabBugz::Constants;
use Bugzilla::Extension::PhabBugz::Types qw(:types);
-use JSON::XS qw(encode_json decode_json);
use List::Util qw(first);
-use LWP::UserAgent;
use Taint::Util qw(untaint);
use Try::Tiny;
use Type::Params qw( compile );
use Type::Utils;
use Types::Standard qw( :types );
+use Mojo::UserAgent;
+use Mojo::JSON qw(encode_json);
use base qw(Exporter);
@@ -35,7 +35,6 @@ our @EXPORT = qw(
create_revision_attachment
get_attachment_revisions
get_bug_role_phids
- get_needs_review
intersect
is_attachment_phab_revision
request
@@ -160,11 +159,10 @@ sub request {
my $ua = $request_cache->{phabricator_ua};
unless ($ua) {
- $ua = $request_cache->{phabricator_ua} = LWP::UserAgent->new(timeout => 10);
+ $ua = $request_cache->{phabricator_ua} = Mojo::UserAgent->new;
if ($params->{proxy_url}) {
- $ua->proxy('https', $params->{proxy_url});
+ $ua->proxy($params->{proxy_url});
}
- $ua->default_header('Content-Type' => 'application/x-www-form-urlencoded');
}
my $phab_api_key = $params->{phabricator_api_key};
@@ -176,25 +174,16 @@ sub request {
$data->{__conduit__} = { token => $phab_api_key };
- my $response = $ua->post($full_uri, { params => encode_json($data) });
-
+ my $response = $ua->post($full_uri => form => { params => encode_json($data) })->result;
ThrowCodeError('phabricator_api_error', { reason => $response->message })
if $response->is_error;
- my $result;
- my $result_ok = eval {
- my $content = $response->content;
- untaint($content);
- $result = decode_json( $content );
- 1;
- };
- if (!$result_ok || $result->{error_code}) {
- ThrowCodeError('phabricator_api_error',
- { reason => 'JSON decode failure' }) if !$result_ok;
- ThrowCodeError('phabricator_api_error',
- { code => $result->{error_code},
- reason => $result->{error_info} }) if $result->{error_code};
- }
+ my $result = $response->json;
+ ThrowCodeError('phabricator_api_error',
+ { reason => 'JSON decode failure' }) if !defined($result);
+ ThrowCodeError('phabricator_api_error',
+ { code => $result->{error_code},
+ reason => $result->{error_info} }) if $result->{error_code};
return $result;
}
@@ -206,48 +195,4 @@ sub set_phab_user {
return Bugzilla->set_user($user, scope_guard => 1);
}
-sub get_needs_review {
- my ($user) = @_;
- $user //= Bugzilla->user;
- return unless $user->id;
-
- my $phab_user = Bugzilla::Extension::PhabBugz::User->new_from_query(
- {
- ids => [ $user->id ]
- }
- );
-
- return [] unless $phab_user;
-
- my $diffs = request(
- 'differential.revision.search',
- {
- attachments => {
- reviewers => 1,
- },
- constraints => {
- reviewerPHIDs => [$phab_user->phid],
- statuses => ["open()"],
- },
- order => 'newest',
- }
- );
- ThrowCodeError('phabricator_api_error', { reason => 'Malformed Response' })
- unless exists $diffs->{result}{data};
-
- my @revisions;
- foreach my $revision ( @{ $diffs->{result}{data} } ) {
- foreach my $reviewer ( @{ $revision->{attachments}->{reviewers}->{reviewers} } ) {
- if ( $reviewer->{reviewerPHID} eq $phab_user->phid
- && $reviewer->{status} =~ /^(?:added|blocking)$/ )
- {
- push @revisions, $revision;
- last;
- }
- }
- }
-
- return \@revisions;
-}
-
1;
diff --git a/extensions/PhabBugz/lib/WebService.pm b/extensions/PhabBugz/lib/WebService.pm
index fa9306667..19a758a70 100644
--- a/extensions/PhabBugz/lib/WebService.pm
+++ b/extensions/PhabBugz/lib/WebService.pm
@@ -16,29 +16,23 @@ use base qw(Bugzilla::WebService);
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::User;
-use Bugzilla::Util qw(detaint_natural datetime_from time_ago trick_taint);
+use Bugzilla::Util qw(detaint_natural trick_taint);
use Bugzilla::WebService::Constants;
use Bugzilla::Extension::PhabBugz::Constants;
-use Bugzilla::Extension::PhabBugz::Util qw(
- get_needs_review
-);
-use DateTime ();
-use List::Util qw(first uniq);
+use List::Util qw(first);
use List::MoreUtils qw(any);
use MIME::Base64 qw(decode_base64);
use constant READ_ONLY => qw(
check_user_enter_bug_permission
check_user_permission_for_bug
- needs_review
);
use constant PUBLIC_METHODS => qw(
check_user_enter_bug_permission
check_user_permission_for_bug
- needs_review
set_build_target
);
@@ -99,95 +93,6 @@ sub check_user_enter_bug_permission {
};
}
-sub needs_review {
- my ($self, $params) = @_;
-
- $self->_check_phabricator();
-
- my $user = Bugzilla->login(LOGIN_REQUIRED);
- my $dbh = Bugzilla->dbh;
-
- my $reviews = get_needs_review();
-
- my $authors = Bugzilla::Extension::PhabBugz::User->match({
- phids => [
- uniq
- grep { defined }
- map { $_->{fields}{authorPHID} }
- @$reviews
- ]
- });
-
- my %author_phab_to_id = map { $_->phid => $_->bugzilla_user->id } @$authors;
- my %author_id_to_user = map { $_->bugzilla_user->id => $_->bugzilla_user } @$authors;
-
- # bug data
- my $visible_bugs = $user->visible_bugs([
- uniq
- grep { $_ }
- map { $_->{fields}{'bugzilla.bug-id'} }
- @$reviews
- ]);
-
- # get all bug statuses and summaries in a single query to avoid creation of
- # many bug objects
- my %bugs;
- if (@$visible_bugs) {
- #<<<
- my $bug_rows =$dbh->selectall_arrayref(
- 'SELECT bug_id, bug_status, short_desc ' .
- ' FROM bugs ' .
- ' WHERE bug_id IN (' . join(',', ('?') x @$visible_bugs) . ')',
- { Slice => {} },
- @$visible_bugs
- );
- #>>>
- %bugs = map { $_->{bug_id} => $_ } @$bug_rows;
- }
-
- # build result
- my $datetime_now = DateTime->now(time_zone => $user->timezone);
- my @result;
- foreach my $review (@$reviews) {
- my $review_flat = {
- id => $review->{id},
- title => $review->{fields}{title},
- url => Bugzilla->params->{phabricator_base_uri} . 'D' . $review->{id},
- };
-
- # show date in user's timezone
- my $datetime = DateTime->from_epoch(
- epoch => $review->{fields}{dateModified},
- time_zone => 'UTC'
- );
- $datetime->set_time_zone($user->timezone);
- $review_flat->{updated} = $datetime->strftime('%Y-%m-%d %T %Z');
- $review_flat->{updated_fancy} = time_ago($datetime, $datetime_now);
-
- # review requester
- if (my $author = $author_id_to_user{$author_phab_to_id{ $review->{fields}{authorPHID} }}) {
- $review_flat->{author_name} = $author->name;
- $review_flat->{author_email} = $author->email;
- }
- else {
- $review_flat->{author_name} = 'anonymous';
- $review_flat->{author_email} = 'anonymous';
- }
-
- # referenced bug
- if (my $bug_id = $review->{fields}{'bugzilla.bug-id'}) {
- my $bug = $bugs{$bug_id};
- $review_flat->{bug_id} = $bug_id;
- $review_flat->{bug_status} = $bug->{bug_status};
- $review_flat->{bug_summary} = $bug->{short_desc};
- }
-
- push @result, $review_flat;
- }
-
- return { result => \@result };
-}
-
sub set_build_target {
my ( $self, $params ) = @_;
@@ -257,12 +162,6 @@ sub rest_resources {
},
},
},
- # Review requests
- qw{^/phabbugz/needs_review$}, {
- GET => {
- method => 'needs_review',
- },
- }
];
}
diff --git a/extensions/PhabBugz/t/basic.t b/extensions/PhabBugz/t/basic.t
index 9a6723ccb..af92dc64f 100644
--- a/extensions/PhabBugz/t/basic.t
+++ b/extensions/PhabBugz/t/basic.t
@@ -17,6 +17,7 @@ use Test::More;
use Test2::Tools::Mock;
use Data::Dumper;
use JSON::MaybeXS;
+use Bugzilla::Test::Util qw(mock_useragent_tx);
use Carp;
use Try::Tiny;
@@ -98,13 +99,13 @@ my $feed = Bugzilla::Extension::PhabBugz::Feed->new;
# Same members in both
do {
- my $UserAgent = mock 'LWP::UserAgent' => (
+ my $UserAgent = mock 'Mojo::UserAgent' => (
override => [
'post' => sub {
- my ($self, $url, $params) = @_;
+ my ($self, $url, undef, $params) = @_;
my $data = decode_json($params->{params});
is_deeply($data->{transactions}, [], 'no-op');
- return mock({is_error => 0, content => '{}'});
+ return mock_useragent_tx('{}');
},
],
);
@@ -119,14 +120,14 @@ do {
# Project has members not in group
do {
- my $UserAgent = mock 'LWP::UserAgent' => (
+ my $UserAgent = mock 'Mojo::UserAgent' => (
override => [
'post' => sub {
- my ($self, $url, $params) = @_;
+ my ($self, $url, undef, $params) = @_;
my $data = decode_json($params->{params});
my $expected = [ { type => 'members.remove', value => ['foo'] } ];
is_deeply($data->{transactions}, $expected, 'remove foo');
- return mock({is_error => 0, content => '{}'});
+ return mock_useragent_tx('{}');
},
]
);
@@ -139,14 +140,14 @@ do {
# Group has members not in project
do {
- my $UserAgent = mock 'LWP::UserAgent' => (
+ my $UserAgent = mock 'Mojo::UserAgent' => (
override => [
'post' => sub {
- my ($self, $url, $params) = @_;
+ my ($self, $url, undef, $params) = @_;
my $data = decode_json($params->{params});
my $expected = [ { type => 'members.add', value => ['foo'] } ];
is_deeply($data->{transactions}, $expected, 'add foo');
- return mock({is_error => 0, content => '{}'});
+ return mock_useragent_tx('{}');
},
]
);
@@ -164,10 +165,10 @@ do {
'update' => sub { 1 },
],
);
- my $UserAgent = mock 'LWP::UserAgent' => (
+ my $UserAgent = mock 'Mojo::UserAgent' => (
override => [
'post' => sub {
- my ($self, $url, $params) = @_;
+ my ($self, $url, undef, $params) = @_;
if ($url =~ /differential\.revision\.search/) {
my $content = <<JSON;
{
@@ -215,10 +216,10 @@ do {
}
}
JSON
- return mock { is_error => 0, content => $content };
+ return mock_useragent_tx($content);
}
else {
- return mock { is_error => 1, message => "bad request" };
+ return mock_useragent_tx("bad request");
}
},
],
diff --git a/extensions/PhabBugz/t/feed-daemon-guts.t b/extensions/PhabBugz/t/feed-daemon-guts.t
index 376af18e4..0c508be98 100644
--- a/extensions/PhabBugz/t/feed-daemon-guts.t
+++ b/extensions/PhabBugz/t/feed-daemon-guts.t
@@ -12,7 +12,7 @@ use lib qw( . lib local/lib/perl5 );
BEGIN { $ENV{LOG4PERL_CONFIG_FILE} = 'log4perl-t.conf' }
use Bugzilla::Test::MockDB;
use Bugzilla::Test::MockParams;
-use Bugzilla::Test::Util qw(create_user);
+use Bugzilla::Test::Util qw(create_user mock_useragent_tx);
use Test::More;
use Test2::Tools::Mock;
use Try::Tiny;
@@ -31,7 +31,7 @@ Bugzilla->error_mode(ERROR_MODE_TEST);
my $phab_bot = create_user(PHAB_AUTOMATION_USER, '*');
-my $UserAgent = mock 'LWP::UserAgent' => ();
+my $UserAgent = mock 'Mojo::UserAgent' => ();
{
SetParam('phabricator_enabled', 0);
@@ -54,9 +54,9 @@ my $UserAgent = mock 'LWP::UserAgent' => ();
}
my @bad_response = (
- ['http error', mock({ is_error => 1, message => 'some http error' }) ],
- ['invalid json', mock({ is_error => 0, content => '<xml>foo</xml>' })],
- ['json containing error code', mock({ is_error => 0, content => encode_json({error_code => 1234 }) })],
+ ['http error', mock_useragent_tx("doesn't matter", sub { $_->code(500) }) ],
+ ['invalid json', mock_useragent_tx('<xml>foo</xml>') ],
+ ['json containing error code', mock_useragent_tx(encode_json({error_code => 1234 }))],
);
SetParam(phabricator_enabled => 1);
@@ -67,7 +67,7 @@ foreach my $bad_response (@bad_response) {
my $feed = Bugzilla::Extension::PhabBugz::Feed->new;
$UserAgent->override(
post => sub {
- my ( $self, $url, $params ) = @_;
+ my ( $self, $url, undef, $params ) = @_;
return $bad_response->[1];
}
);
diff --git a/extensions/Profanivore/README b/extensions/Profanivore/README
index 5ccab103f..86d46a2a3 100644
--- a/extensions/Profanivore/README
+++ b/extensions/Profanivore/README
@@ -1,14 +1,14 @@
-Profanivore 'eats' English profanities in comments, leaving behind instead a
-trail of droppings ('****'). It finds its food using a standard library Perl
-regexp. The profanity is only eaten where the comment was written by a user
-who does not have the global 'editbugs' privilege. The digestion happens at
+Profanivore 'eats' English profanities in comments, leaving behind instead a
+trail of droppings ('****'). It finds its food using a standard library Perl
+regexp. The profanity is only eaten where the comment was written by a user
+who does not have the global 'editbugs' privilege. The digestion happens at
display time, so the comment in the database is unaltered.
-However, it does not eat profanities when showing people their own comments;
-the aim here is to prevent people immediately noticing they are being
+However, it does not eat profanities when showing people their own comments;
+the aim here is to prevent people immediately noticing they are being
censored, and getting 'creative'.
-The purpose of Profanivore is to make it a little harder for trolls to
+The purpose of Profanivore is to make it a little harder for trolls to
vandalise public Bugzilla installations.
It does not currently affect fields other than comments.
diff --git a/extensions/Push/lib/Connector/ReviewBoard.pm b/extensions/Push/lib/Connector/ReviewBoard.pm
deleted file mode 100644
index 1c657a728..000000000
--- a/extensions/Push/lib/Connector/ReviewBoard.pm
+++ /dev/null
@@ -1,178 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-
-package Bugzilla::Extension::Push::Connector::ReviewBoard;
-
-use 5.10.1;
-use strict;
-use warnings;
-
-use base 'Bugzilla::Extension::Push::Connector::Base';
-
-use Bugzilla::Bug;
-use Bugzilla::BugMail;
-use Bugzilla::Component;
-use Bugzilla::Constants;
-use Bugzilla::Extension::Push::Constants;
-use Bugzilla::Extension::Push::Util;
-use Bugzilla::Group;
-use Bugzilla::Product;
-use Bugzilla::User;
-use Bugzilla::Util qw( trim );
-
-use constant RB_CONTENT_TYPE => 'text/x-review-board-request';
-use constant AUTOMATION_USER => 'automation@bmo.tld';
-
-sub options {
- return (
- {
- name => 'product',
- label => 'Product to create bugs in',
- type => 'string',
- default => 'Developer Services',
- required => 1,
- validate => sub {
- Bugzilla::Product->new({ name => $_[0] })
- || die "Invalid Product ($_[0])\n";
- },
- },
- {
- name => 'component',
- label => 'Component to create bugs in',
- type => 'string',
- default => 'MozReview',
- required => 1,
- validate => sub {
- my ($component, $config) = @_;
- my $product = Bugzilla::Product->new({ name => $config->{product} })
- || die "Invalid Product (" . $config->{product} . ")\n";
- Bugzilla::Component->new({ product => $product, name => $component })
- || die "Invalid Component ($component)\n";
- },
- },
- {
- name => 'version',
- label => "The bug's version",
- type => 'string',
- default => 'Production',
- required => 1,
- validate => sub {
- my ($version, $config) = @_;
- my $product = Bugzilla::Product->new({ name => $config->{product} })
- || die "Invalid Product (" . $config->{product} . ")\n";
- Bugzilla::Version->new({ product => $product, name => $version })
- || die "Invalid Version ($version)\n";
- },
- },
- {
- name => 'group',
- label => 'Security group',
- type => 'string',
- default => 'mozilla-employee-confidential',
- required => 1,
- validate => sub {
- Bugzilla::Group->new({ name => $_[0] })
- || die "Invalid Group ($_[0])\n";
- },
- },
- {
- name => 'cc',
- label => 'Comma separated list of users to CC',
- type => 'string',
- default => '',
- required => 1,
- validate => sub {
- foreach my $login (map { trim($_) } split(',', $_[0])) {
- Bugzilla::User->new({ name => $login })
- || die "Invalid User ($login)\n";
- }
- },
- },
- );
-}
-
-sub should_send {
- my ($self, $message) = @_;
-
- if ($message->routing_key =~ /^(?:attachment|bug)\.modify:.*\bis_private\b/) {
- my $payload = $message->payload_decoded();
- my $target = $payload->{event}->{target};
-
- if ($target ne 'bug' && exists $payload->{$target}->{bug}) {
- return 0 if $payload->{$target}->{bug}->{is_private};
- return 0 if $payload->{$target}->{content_type} ne RB_CONTENT_TYPE;
- }
-
- return $payload->{$target}->{is_private} ? 1 : 0;
- }
- else {
- # We're not interested in the message.
- return 0;
- }
-}
-
-sub send {
- my ($self, $message) = @_;
- my $logger = Bugzilla->push_ext->logger;
- my $config = $self->config;
-
- eval {
- my $payload = $message->payload_decoded();
- my $target = $payload->{event}->{target};
-
- # load attachments
- my $bug_id = $target eq 'bug' ? $payload->{bug}->{id} : $payload->{attachment}->{bug}->{id};
- my $attach_id = $target eq 'attachment' ? $payload->{attachment}->{id} : undef;
- Bugzilla->set_user(Bugzilla::User->super_user);
- my $bug = Bugzilla::Bug->new({ id => $bug_id, cache => 1 });
- Bugzilla->logout;
-
- # create a bug if there are any mozreview attachments
- my @reviews = grep { $_->contenttype eq RB_CONTENT_TYPE } @{ $bug->attachments };
- if (@reviews) {
-
- # build comment
- my $comment = $target eq 'bug'
- ? "Bug $bug_id has MozReview reviews and is no longer public."
- : "MozReview attachment $attach_id on Bug $bug_id is no longer public.";
- $comment .= "\n\n";
- foreach my $attachment (@reviews) {
- $comment .= $attachment->data . "\n";
- }
-
- # create bug
- my $user = Bugzilla::User->new({ name => AUTOMATION_USER, cache => 1 });
- die "Invalid User: " . AUTOMATION_USER . "\n" unless $user;
- Bugzilla->set_user($user);
- my $new_bug = Bugzilla::Bug->create({
- short_desc => "[SECURITY] Bug $bug_id is no longer public",
- product => $config->{product},
- component => $config->{component},
- bug_severity => 'normal',
- groups => [ map { trim($_) } split(',', $config->{group}) ],
- op_sys => 'Unspecified',
- rep_platform => 'Unspecified',
- version => $config->{version},
- cc => [ map { trim($_) } split(',', $config->{cc}) ],
- comment => $comment,
- });
- Bugzilla::BugMail::Send($new_bug->id, { changer => Bugzilla->user });
- Bugzilla->logout;
-
- $logger->info("Created bug " . $new_bug->id);
- }
- };
- my $error = $@;
- Bugzilla->logout;
- if ($error) {
- return (PUSH_RESULT_TRANSIENT, clean_error($error));
- }
-
- return PUSH_RESULT_OK;
-}
-
-1;
diff --git a/extensions/Push/t/ReviewBoard.t b/extensions/Push/t/ReviewBoard.t
deleted file mode 100644
index c752e34ef..000000000
--- a/extensions/Push/t/ReviewBoard.t
+++ /dev/null
@@ -1,225 +0,0 @@
-#!/usr/bin/perl -T
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-# This Source Code Form is "Incompatible With Secondary Licenses", as
-# defined by the Mozilla Public License, v. 2.0.
-use strict;
-use warnings;
-use lib qw( . lib local/lib/perl5 );
-
-use Test::More;
-use Bugzilla;
-use Bugzilla::Extension;
-use Bugzilla::Attachment;
-use Scalar::Util 'blessed';
-
-BEGIN {
- eval {
- require Test::LWP::UserAgent;
- require Test::MockObject;
- };
- if ($@) {
- plan skip_all =>
- 'Tests require Test::LWP::UserAgent and Test::MockObject';
- exit;
- }
-}
-
-BEGIN {
- Bugzilla->extensions; # load all of them
- use_ok 'Bugzilla::Extension::Push::Connector::ReviewBoard::Client';
- use_ok 'Bugzilla::Extension::Push::Constants';
-}
-
-my ($push) = grep { blessed($_) eq 'Bugzilla::Extension::Push' } @{Bugzilla->extensions };
-my $connectors = $push->_get_instance->connectors;
-my $con = $connectors->by_name('ReviewBoard');
-
-my $ua_204 = Test::LWP::UserAgent->new;
-$ua_204->map_response(
- qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
- HTTP::Response->new('204'));
-
-my $ua_404 = Test::LWP::UserAgent->new;
-$ua_404->map_response(
- qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
- HTTP::Response->new('404', undef, undef, q[{ "err": { "code": 100, "msg": "Object does not exist" }, "stat": "fail" }]));
-
-# forbidden
-my $ua_403 = Test::LWP::UserAgent->new;
-$ua_403->map_response(
- qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
- HTTP::Response->new('403', undef, undef, q[ {"err":{"code":101,"msg":"You don't have permission for this"},"stat":"fail"}]));
-
-# not logged in
-my $ua_401 = Test::LWP::UserAgent->new;
-$ua_401->map_response(
- qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
- HTTP::Response->new('401', undef, undef, q[ { "err": { "code": 103, "msg": "You are not logged in" }, "stat": "fail" } ]));
-
-# not logged in
-my $ua_500 = Test::LWP::UserAgent->new;
-$ua_500->map_response(
- qr{https://reviewboard-dev\.allizom\.org/api/review-requests/\d+},
- HTTP::Response->new('500'));
-
-$con->client->{useragent} = $ua_204;
-$con->config->{base_uri} = 'https://reviewboard-dev.allizom.org';
-$con->client->{base_uri} = 'https://reviewboard-dev.allizom.org';
-
-{
- my $msg = message(
- event => {
- routing_key => 'attachment.modify:is_private',
- target => 'attachment',
- },
- attachment => {
- is_private => 1,
- content_type => 'text/plain',
- bug => { id => 1, is_private => 0 },
- },
- );
-
- ok(not($con->should_send($msg)), "text/plain message should not be sent");
-}
-
-my $data = slurp("extensions/Push/t/rblink.txt");
-Bugzilla::User::DEFAULT_USER->{userid} = 42;
-Bugzilla->set_user(Bugzilla::User->super_user);
-diag " " . Bugzilla::User->super_user->id;
-
-my $dbh = Bugzilla->dbh;
-$dbh->bz_start_transaction;
-my $timestamp = $dbh->selectrow_array('SELECT LOCALTIMESTAMP(0)');
-my $bug = Bugzilla::Bug->new({id => 9000});
-my $attachment = Bugzilla::Attachment->create({
- bug => $bug,
- creation_ts => $timestamp,
- data => $data,
- attach_size => length($data),
- description => "rblink.txt",
- filename => "rblink.txt",
- isprivate => 1,
- ispatch => 0,
- mimetype => 'text/x-review-board-request'
-});
-diag "".$attachment->id;
-$dbh->bz_commit_transaction;
-
-{
- my $msg = message(
- event => {
- routing_key => 'attachment.modify:cc,is_private',
- target => 'attachment',
- },
- attachment => {
- id => $attachment->id,
- is_private => 1,
- content_type => 'text/x-review-board-request',
- bug => { id => $bug->id, is_private => 0 },
- },
- );
- ok($con->should_send($msg), "rb attachment should be sent");
-
- {
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_OK, "good push result");
- diag $err if $err;
- }
-
- {
- local $con->client->{useragent} = $ua_404;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_OK, "good push result for 404");
- diag $err if $err;
- }
-
-
- {
- local $con->client->{useragent} = $ua_403;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 403");
- diag $err if $err;
- }
-
-
- {
- local $con->client->{useragent} = $ua_401;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
- diag $err if $err;
- }
-
- {
- local $con->client->{useragent} = $ua_500;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 500");
- diag $err if $err;
- }
-}
-
-{
- my $msg = message(
- event => {
- routing_key => 'bug.modify:is_private',
- target => 'bug',
- },
- bug => {
- is_private => 1,
- id => $bug->id,
- },
- );
-
- ok($con->should_send($msg), "rb attachment should be sent");
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_OK, "good push result");
-
- {
- local $con->client->{useragent} = $ua_404;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_OK, "good push result for 404");
- }
-
- {
- local $con->client->{useragent} = $ua_403;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 404");
- diag $err if $err;
- }
-
-
- {
- local $con->client->{useragent} = $ua_401;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
- diag $err if $err;
- }
-
- {
- local $con->client->{useragent} = $ua_401;
- my ($rv, $err) = $con->send($msg);
- is($rv, PUSH_RESULT_TRANSIENT, "transient error on 401");
- diag $err if $err;
- }
-}
-
-sub message {
- my $msg_data = { @_ };
-
- return Test::MockObject->new
- ->set_always( routing_key => $msg_data->{event}{routing_key} )
- ->set_always( payload_decoded => $msg_data );
-}
-
-sub slurp {
- my $file = shift;
- local $/ = undef;
- open my $fh, '<', $file or die "unable to open $file";
- my $s = readline $fh;
- close $fh;
- return $s;
-}
-
-done_testing;
diff --git a/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl
index c5f18ef76..0531aeb2f 100644
--- a/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl
+++ b/extensions/REMO/template/en/default/bug/create/comment-remo-budget.txt.tmpl
@@ -24,13 +24,13 @@
# enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
# pull out various custom fields and format an initial Description entry
# from them.
- #%]
+ #%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
Requester info:
-Requester: [% cgi.param('firstname') %] [%+ cgi.param('lastname') %]
+Requester: [% cgi.param('firstname') %] [%+ cgi.param('lastname') %]
Profile page: [% cgi.param('profilepage') %]
Event page: [% cgi.param('eventpage') %]
Funtional Goals:
@@ -45,7 +45,7 @@ Paypal Account: [% cgi.param('paypal') %]
Country You Reside: [% cgi.param('country') %]
Advance payment needed: [% IF cgi.param('advancepayment') %]Yes[% ELSE %]No[% END %]
-Budget breakdown:
+Budget breakdown:
Total amount requested in $USD: [% cgi.param('budgettotal') %]
Costs per service:
diff --git a/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl b/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl
index 2d4bb6215..c4187558d 100644
--- a/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl
+++ b/extensions/REMO/template/en/default/bug/create/comment-remo-swag.txt.tmpl
@@ -25,11 +25,11 @@
# enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
# pull out various custom fields and format an initial Description entry
# from them.
- #%]
+ #%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
-Requester info:
+Requester info:
First name: [% cgi.param('firstname') %]
Last name: [% cgi.param('lastname') %]
@@ -54,9 +54,9 @@ Phone: [% cgi.param("shiptophone") %]
[%+ IF cgi.param("shiptoidrut") %]Custom reference: [% cgi.param("shiptoidrut") %][% END %]
Addition information for delivery person:
-[%+ cgi.param('shipadditional') %]
+[%+ cgi.param('shipadditional') %]
-Swag requested:
+Swag requested:
Stickers: [% IF cgi.param('stickers') %]Yes[% ELSE %]No[% END %]
Buttons: [% IF cgi.param('buttons') %]Yes[% ELSE %]No[% END %]
diff --git a/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl
index e13fba024..329670bdf 100644
--- a/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl
+++ b/extensions/REMO/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -24,7 +24,7 @@
You can only attach budget payment information to [% terms.bugs %] under
the product 'Mozilla Reps' and component 'Budget Requests'.
-[% ELSIF error == "remo_payment_bug_edit_denied" %]
+[% ELSIF error == "remo_payment_bug_edit_denied" %]
[% title = "Mozilla Reps Payment Bug Edit Denied" %]
You do not have permission to edit [% terms.bug %] '[% bug_id FILTER html %]'.
diff --git a/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl b/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl
index 95c0af6e8..b9a5f02d1 100644
--- a/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl
+++ b/extensions/REMO/template/en/default/pages/comment-remo-form-payment.txt.tmpl
@@ -26,9 +26,9 @@ Mozilla Reps Payment Request
Requester info:
-First name: [% cgi.param('firstname') %]
-Last name: [% cgi.param('lastname') %]
-Wiki user profile: [% cgi.param('wikiprofile') %]
+First name: [% cgi.param('firstname') %]
+Last name: [% cgi.param('lastname') %]
+Wiki user profile: [% cgi.param('wikiprofile') %]
Event wiki page: [% cgi.param('wikipage') %]
Budget request [% terms.bug %]: [% cgi.param('bug_id') %]
Have you already received payment for this event? [% IF cgi.param('receivedpayment') %]Yes[% ELSE %]No[% END %]
diff --git a/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl b/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl
index 1e1889089..0f594e9ae 100644
--- a/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl
+++ b/extensions/REMO/template/en/default/pages/remo-form-payment.html.tmpl
@@ -92,7 +92,7 @@
<br>
Payment information:<br>
Bank name:<br>
- Bank address: <br>
+ Bank address: <br>
IBAN:<br>
Swift code/BIC:<br>
Additional bank details (if necessary):
diff --git a/extensions/REMO/web/js/form_validate.js b/extensions/REMO/web/js/form_validate.js
index 6c8fa6f07..3e1ae60f6 100644
--- a/extensions/REMO/web/js/form_validate.js
+++ b/extensions/REMO/web/js/form_validate.js
@@ -1,7 +1,7 @@
/**
* Some Form Validation and Interaction
**/
-//Makes sure that there is an '@' in the address with a '.'
+//Makes sure that there is an '@' in the address with a '.'
//somewhere after it (and at least one character in between them
function isValidEmail(email) {
diff --git a/extensions/REMO/web/js/swag.js b/extensions/REMO/web/js/swag.js
index 3b69bbab8..1c7281108 100644
--- a/extensions/REMO/web/js/swag.js
+++ b/extensions/REMO/web/js/swag.js
@@ -24,37 +24,37 @@ function getTotal(item_array) {
return total;
}
-function calculateTotalSwag() {
- document.getElementById('Totalswag').value =
+function calculateTotalSwag() {
+ document.getElementById('Totalswag').value =
getTotal( new Array('Lanyards',
'Stickers',
'Bracelets',
'Tattoos',
'Buttons',
'Posters'));
-
+
}
-function calculateTotalMensShirts() {
- document.getElementById('mens_total').value =
+function calculateTotalMensShirts() {
+ document.getElementById('mens_total').value =
getTotal( new Array('mens_s',
'mens_m',
'mens_l',
'mens_xl',
'mens_xxl',
'mens_xxxl'));
-
+
}
-function calculateTotalWomensShirts() {
- document.getElementById('womens_total').value =
+function calculateTotalWomensShirts() {
+ document.getElementById('womens_total').value =
getTotal( new Array('womens_s',
'womens_m',
'womens_l',
'womens_xl',
'womens_xxl',
'womens_xxxl'));
-
+
}
diff --git a/extensions/SecureMail/template/en/default/account/email/encryption-required.txt.tmpl b/extensions/SecureMail/template/en/default/account/email/encryption-required.txt.tmpl
index 55b716864..872cea30c 100644
--- a/extensions/SecureMail/template/en/default/account/email/encryption-required.txt.tmpl
+++ b/extensions/SecureMail/template/en/default/account/email/encryption-required.txt.tmpl
@@ -12,7 +12,7 @@ preferences.
[% IF bug_id || email_type == 'whine' %]
In order to receive the full text of similar mails in the future, please
-go to:
+go to:
[%+ urlbase %]userprefs.cgi?tab=securemail
and provide a key or certificate.
diff --git a/extensions/SecureMail/template/en/default/account/prefs/securemail.html.tmpl b/extensions/SecureMail/template/en/default/account/prefs/securemail.html.tmpl
index db595a23f..ffe182de8 100644
--- a/extensions/SecureMail/template/en/default/account/prefs/securemail.html.tmpl
+++ b/extensions/SecureMail/template/en/default/account/prefs/securemail.html.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is the Mozilla Corporation.
- # Portions created by the Initial Developer are Copyright (C) 2008 the
+ # Portions created by the Initial Developer are Copyright (C) 2008 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
@@ -23,9 +23,9 @@
</div>
[% END %]
-<p>Some [% terms.bugs %] in this [% terms.Bugzilla %] are in groups the administrator has
-deemed 'secure'. This means emails containing information about those [% terms.bugs %]
-will only be sent encrypted. Enter your PGP/GPG public key or
+<p>Some [% terms.bugs %] in this [% terms.Bugzilla %] are in groups the administrator has
+deemed 'secure'. This means emails containing information about those [% terms.bugs %]
+will only be sent encrypted. Enter your PGP/GPG public key or
SMIME certificate here to receive full update emails for such [% terms.bugs %].</p>
<p>If you are a member of a secure group, or if you enter a key here, your password reset email will also be sent to you encrypted. If you are a member of a secure group and do not enter a key, you will not be able to reset your password without the assistance of an administrator.</p>
diff --git a/extensions/SecureMail/template/en/default/hook/account/prefs/prefs-tabs.html.tmpl b/extensions/SecureMail/template/en/default/hook/account/prefs/prefs-tabs.html.tmpl
index 70a40e592..1662e28af 100644
--- a/extensions/SecureMail/template/en/default/hook/account/prefs/prefs-tabs.html.tmpl
+++ b/extensions/SecureMail/template/en/default/hook/account/prefs/prefs-tabs.html.tmpl
@@ -17,7 +17,7 @@
# All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
- # Gervase Markham <gerv@gerv.net>
+ # Gervase Markham <gerv@gerv.net>
#%]
[% tabs = tabs.import([{
diff --git a/extensions/SecureMail/template/en/default/hook/admin/groups/create-field.html.tmpl b/extensions/SecureMail/template/en/default/hook/admin/groups/create-field.html.tmpl
index 27c644d02..a3d5069cc 100644
--- a/extensions/SecureMail/template/en/default/hook/admin/groups/create-field.html.tmpl
+++ b/extensions/SecureMail/template/en/default/hook/admin/groups/create-field.html.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is the Mozilla Corporation.
- # Portions created by the Initial Developer are Copyright (C) 2008 the
+ # Portions created by the Initial Developer are Copyright (C) 2008 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
@@ -21,5 +21,5 @@
<td colspan="3">
<input type="checkbox" id="secure_mail" name="secure_mail"
[% ' checked="checked"' IF group.secure_mail %]>
- </td>
-</tr>
+ </td>
+</tr>
diff --git a/extensions/SecureMail/template/en/default/hook/admin/groups/edit-field.html.tmpl b/extensions/SecureMail/template/en/default/hook/admin/groups/edit-field.html.tmpl
index 253fed29e..7aaf35d7d 100644
--- a/extensions/SecureMail/template/en/default/hook/admin/groups/edit-field.html.tmpl
+++ b/extensions/SecureMail/template/en/default/hook/admin/groups/edit-field.html.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is the Mozilla Corporation.
- # Portions created by the Initial Developer are Copyright (C) 2008 the
+ # Portions created by the Initial Developer are Copyright (C) 2008 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
diff --git a/extensions/SecureMail/template/en/default/hook/admin/users/userdata-end.html.tmpl b/extensions/SecureMail/template/en/default/hook/admin/users/userdata-end.html.tmpl
index e5e299ef9..cf0ec3e03 100644
--- a/extensions/SecureMail/template/en/default/hook/admin/users/userdata-end.html.tmpl
+++ b/extensions/SecureMail/template/en/default/hook/admin/users/userdata-end.html.tmpl
@@ -14,7 +14,7 @@
[% otheruser.public_key ? "Yes" : "No" %]
</td>
</tr>
-
+
<tr>
<th>Member of Secure Mail Group:</th>
<td>
diff --git a/extensions/SecureMail/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/SecureMail/template/en/default/hook/global/user-error-errors.html.tmpl
index 46b093674..507874fe4 100644
--- a/extensions/SecureMail/template/en/default/hook/global/user-error-errors.html.tmpl
+++ b/extensions/SecureMail/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is the Mozilla Corporation.
- # Portions created by the Initial Developer are Copyright (C) 2008 the
+ # Portions created by the Initial Developer are Copyright (C) 2008 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
@@ -20,8 +20,8 @@
[% IF error == "securemail_invalid_key" %]
[% title = "Invalid Public Key" %]
We were unable to read the public key that you entered. Make sure
- that you are entering either an ASCII-armored PGP/GPG public key,
- including the "BEGIN PGP PUBLIC KEY BLOCK" and "END PGP PUBLIC KEY BLOCK"
+ that you are entering either an ASCII-armored PGP/GPG public key,
+ including the "BEGIN PGP PUBLIC KEY BLOCK" and "END PGP PUBLIC KEY BLOCK"
lines, or a PEM format (Base64-encoded X.509) S/MIME key, including the
BEGIN CERTIFICATE and END CERTIFICATE lines.<br><br>[% errstr FILTER html %]
[% END %]
diff --git a/extensions/SecureMail/template/en/default/pages/securemail/help.html.tmpl b/extensions/SecureMail/template/en/default/pages/securemail/help.html.tmpl
index 928c7f1d4..378d007f0 100644
--- a/extensions/SecureMail/template/en/default/pages/securemail/help.html.tmpl
+++ b/extensions/SecureMail/template/en/default/pages/securemail/help.html.tmpl
@@ -24,8 +24,8 @@
title = "SecureMail Help"
%]
-[% terms.Bugzilla %] considers certain groups as "secure". If a [% terms.bug %] is in one of those groups, [% terms.Bugzilla %] will not send unencrypted
-email about it. To receive encrypted email rather than just a "something changed" placeholder, you must provide either
+[% terms.Bugzilla %] considers certain groups as "secure". If a [% terms.bug %] is in one of those groups, [% terms.Bugzilla %] will not send unencrypted
+email about it. To receive encrypted email rather than just a "something changed" placeholder, you must provide either
a S/MIME or a GPG/PGP key on the <a href="[% urlbase FILTER none %]userprefs.cgi?tab=securemail">SecureMail preferences tab</a>.<br>
<br>
In addition, if you have uploaded a S/MIME or GPG/PGP key using the <a href="[% urlbase FILTER none %]userprefs.cgi?tab=securemail">
@@ -36,9 +36,9 @@ be required to decrypt it to view the reset instructions.
<b>S/MIME Keys must be in PEM format - i.e. Base64-encoded text, with the first line containing BEGIN CERTIFICATE.</b></p>
-<p>S/MIME certificates can be obtained from a number of providers.
-Once you have it, export it from your browser as a .p12 file and import it into your mail client.
-You'll need to provide a password when you export - pick a strong one,
+<p>S/MIME certificates can be obtained from a number of providers.
+Once you have it, export it from your browser as a .p12 file and import it into your mail client.
+You'll need to provide a password when you export - pick a strong one,
and then back up the .p12 file somewhere safe.</p>
<p>Import on Thunderbird as follows:</p>
@@ -81,7 +81,7 @@ Then, you need to convert it to a .pem file. Here are two possible ways to do th
<p>
Open the .pem file in a text editor. You can recognise the public key because
-it starts "BEGIN CERTIFICATE" and ends "END CERTIFICATE" and
+it starts "BEGIN CERTIFICATE" and ends "END CERTIFICATE" and
has an appropriate friendly name (e.g. "StartCom Free Certificate Member's StartCom Ltd. ID").</p>
<p>Paste the contents of the .pem file into the SecureMail text field in [% terms.Bugzilla %].</p>
@@ -117,7 +117,7 @@ You’ll have to answer several questions:</p>
<p><code>gpg --armor --output pubkey.txt --export 'Your Name'</code></p>
-<p>Paste the contents of pubkey.txt into the SecureMail text field in [% terms.Bugzilla %].
+<p>Paste the contents of pubkey.txt into the SecureMail text field in [% terms.Bugzilla %].
<li>Configure your email client to use your associated private key to decrypt the encrypted emails. For Thunderbird, you need the <a href="https://addons.mozilla.org/en-us/thunderbird/addon/enigmail/">Enigmail</a> extension.</p>
</ol>
diff --git a/extensions/SiteMapIndex/template/en/default/hook/global/messages-messages.html.tmpl b/extensions/SiteMapIndex/template/en/default/hook/global/messages-messages.html.tmpl
index 0d0e9fd74..1e2b1788b 100644
--- a/extensions/SiteMapIndex/template/en/default/hook/global/messages-messages.html.tmpl
+++ b/extensions/SiteMapIndex/template/en/default/hook/global/messages-messages.html.tmpl
@@ -30,7 +30,7 @@
[% ELSIF message_tag == "sitemap_no_urlbase" %]
You have not yet set the "urlbase" parameter. We cannot update
- search engines and inform them about your sitemap without a
+ search engines and inform them about your sitemap without a
urlbase. Please set the "urlbase" parameter and re-run
checksetup.pl.
diff --git a/extensions/Splinter/web/splinter.js b/extensions/Splinter/web/splinter.js
index 277a7ff86..8fde9998a 100644
--- a/extensions/Splinter/web/splinter.js
+++ b/extensions/Splinter/web/splinter.js
@@ -116,7 +116,7 @@ Splinter.Bug = {
}
} else {
tzoffset = parseInt(m[8], 10);
- }
+ }
var unadjustedDate = new Date(Date.UTC(m[1], m[2] - 1, m[3], m[4], m[5]));
@@ -129,7 +129,7 @@ Splinter.Bug = {
return new Date(unadjustedDate.getTime() -
sign * adjustmentHours * 3600000 -
sign * adjustmentMinutes * 60000);
- },
+ },
_formatWho : function(name, email) {
if (name && email) {
@@ -207,14 +207,14 @@ Splinter.Dialog.prototype = {
draggable: false,
close: false,
hideaftersubmit: true,
- constraintoviewport: true
+ constraintoviewport: true
});
this.dialog.setHeader(prompt);
},
addButton : function (label, callback, isdefault) {
- this.buttons.push({ text : label,
- handler : function () { this.hide(); callback(); },
+ this.buttons.push({ text : label,
+ handler : function () { this.hide(); callback(); },
isDefault : isdefault });
this.dialog.cfg.queueProperty("buttons", this.buttons);
},
@@ -325,13 +325,13 @@ Splinter.Patch.Hunk.prototype = {
lines[j][2] |= Splinter.Patch.CHANGED;
}
}
-
+
currentStart = -1;
currentOldCount = 0;
currentNewCount = 0;
}
}
-
+
var i;
for (i = 0; i < rawlines.length; i++) {
var line = rawlines[i];
@@ -363,7 +363,7 @@ Splinter.Patch.Hunk.prototype = {
}
currentNewCount++;
}
- }
+ }
// git mail-formatted patches end with --\n<git version> like a signature
// This is troublesome since it looks like a subtraction at the end
@@ -398,7 +398,7 @@ Splinter.Patch.Hunk.prototype = {
if (line[1] != null) {
newLine++;
}
- }
+ }
}
};
@@ -436,22 +436,22 @@ Splinter.Patch.File.prototype = {
}
if ((oldLine != null && oldLine < hunk.oldStart + hunk.oldCount) ||
- (newLine != null && newLine < hunk.newStart + hunk.newCount))
+ (newLine != null && newLine < hunk.newStart + hunk.newCount))
{
var location = -1;
hunk.iterate(function(loc, oldl, oldText, newl, newText, flags) {
if ((oldLine == null || oldl == oldLine) &&
- (newLine == null || newl == newLine))
+ (newLine == null || newl == newLine))
{
location = loc;
}
});
-
+
if (location != -1) {
return location;
}
}
- }
+ }
throw "Bad oldLine,newLine: " + oldLine + "," + newLine;
},
@@ -645,7 +645,7 @@ Splinter.Patch.Patch.prototype = {
} else {
status = Splinter.Patch.CHANGED;
}
- }
+ }
this.files.push(new Splinter.Patch.File(filename, status, extra, hunks));
@@ -785,7 +785,7 @@ Splinter.Review.File.prototype = {
var i;
for (i = 0; i < this.comments.length; i++) {
if (this.comments[i].location == location &&
- this.comments[i].type == type)
+ this.comments[i].type == type)
{
return this.comments[i];
}
@@ -857,19 +857,19 @@ Splinter.Review.File.prototype = {
addNewLine(newLine);
unchangedLines++;
} else {
- if ((comment.type == Splinter.Patch.REMOVED
- || comment.type == Splinter.Patch.CHANGED)
- && oldText != null)
+ if ((comment.type == Splinter.Patch.REMOVED
+ || comment.type == Splinter.Patch.CHANGED)
+ && oldText != null)
{
- patchLines.push('> -' + oldText +
+ patchLines.push('> -' + oldText +
Splinter.Review._noNewLine(flags, Splinter.Patch.OLD_NONEWLINE));
addOldLine(oldLine);
}
- if ((comment.type == Splinter.Patch.ADDED
- || comment.type == Splinter.Patch.CHANGED)
- && newText != null)
+ if ((comment.type == Splinter.Patch.ADDED
+ || comment.type == Splinter.Patch.CHANGED)
+ && newText != null)
{
- patchLines.push('> +' + newText +
+ patchLines.push('> +' + newText +
Splinter.Review._noNewLine(flags, Splinter.Patch.NEW_NONEWLINE));
addNewLine(newLine);
}
@@ -1092,7 +1092,7 @@ Splinter.Review.Review.prototype = {
}
if ((oldStart == null || oldLine == oldStart + oldCount) &&
- (newStart == null || newLine == newStart + newCount))
+ (newStart == null || newLine == newStart + newCount))
{
commentText = rawlines.slice(i + 1).join("\n");
break;
@@ -1175,7 +1175,7 @@ Splinter.Review.Review.prototype = {
str += file.toString();
}
}
-
+
return str;
}
};
@@ -1276,8 +1276,8 @@ Splinter.ReviewStorage.LocalReviewStorage.prototype = {
saveDraft : function(bug, attachment, review, extraProps) {
var propertyName = this._reviewPropertyName(bug, attachment);
- if (!extraProps) {
- extraProps = {};
+ if (!extraProps) {
+ extraProps = {};
}
extraProps.isDraft = true;
this._updateOrCreateReviewInfo(bug, attachment, extraProps);
@@ -1307,7 +1307,7 @@ Splinter.UPDATE_ATTACHMENT_SUCCESS = /<title>\s*Changes\s+Submitted/;
Splinter.LINE_RE = /(?!$)([^\r\n]*)(?:\r\n|\r|\n|$)/g;
Splinter.displayError = function (msg) {
- var el = new Element(document.createElement('p'));
+ var el = new Element(document.createElement('p'));
el.appendChild(document.createTextNode(msg));
Dom.get('error').appendChild(Dom.get(el));
Dom.setStyle('error', 'display', 'block');
@@ -1318,7 +1318,7 @@ Splinter.publishReview = function () {
Splinter.theReview.setIntro(Dom.get('myComment').value);
if (Splinter.reviewStorage) {
- Splinter.reviewStorage.draftPublished(Splinter.theBug,
+ Splinter.reviewStorage.draftPublished(Splinter.theBug,
Splinter.theAttachment);
}
@@ -1346,13 +1346,13 @@ Splinter.publishReview = function () {
// This is a "magic string" used to identify review comments
if (Splinter.theReview.toString()) {
var comment = "Review of attachment " + Splinter.theAttachment.id + ":\n" +
- "-----------------------------------------------------------------\n\n" +
+ "-----------------------------------------------------------------\n\n" +
Splinter.theReview.toString();
publish_review.value = comment;
}
- if (Splinter.theAttachment.status
- && Dom.get('attachmentStatus').value != Splinter.theAttachment.status)
+ if (Splinter.theAttachment.status
+ && Dom.get('attachmentStatus').value != Splinter.theAttachment.status)
{
publish_attach_status.value = Dom.get('attachmentStatus').value;
}
@@ -1367,7 +1367,7 @@ Splinter.doDiscardReview = function () {
Dom.get('myComment').value = '';
Dom.setStyle('emptyCommentNotice', 'display', 'block');
-
+
var i;
for (i = 0; i < Splinter.theReview.files.length; i++) {
while (Splinter.theReview.files[i].comments.length > 0) {
@@ -1481,7 +1481,7 @@ Splinter.saveDraft = function () {
filesReviewed[file.filename] = true;
}
}
- Splinter.reviewStorage.saveDraft(Splinter.theBug, Splinter.theAttachment, Splinter.theReview,
+ Splinter.reviewStorage.saveDraft(Splinter.theBug, Splinter.theAttachment, Splinter.theReview,
{ 'filesReviewed' : filesReviewed });
draftSaved = true;
} else {
@@ -1614,7 +1614,7 @@ Splinter.addCommentDisplay = function (commentArea, comment) {
Dom.addClass(reviewer, 'reviewer');
reviewer.appendChild(document.createTextNode(review.who));
reviewer.appendTo(reviewInfo);
-
+
var reviewDate = new Element(document.createElement('div'));
Dom.addClass(reviewDate, 'review-date');
reviewDate.appendChild(document.createTextNode(Splinter.Utils.formatDate(review.date)));
@@ -1693,7 +1693,7 @@ Splinter.insertCommentEditor = function (commentArea, file, location, type) {
var separatorClass = Splinter.getSeparatorClass(type);
var nodes = Dom.getElementsByClassName('reviewer-0', 'div', commentArea);
- var i;
+ var i;
for (i = 0; i < nodes.length; i++) {
if (separatorClass && Dom.hasClass(nodes[i], separatorClass)) {
nodes[i].parentNode.removeChild(nodes[i]);
@@ -1714,7 +1714,7 @@ Splinter.insertCommentEditor = function (commentArea, file, location, type) {
Dom.setAttribute(commentEditor, 'id', 'commentEditor');
Dom.addClass(commentEditor, typeClass);
commentEditor.appendTo(commentArea);
-
+
var commentEditorInner = new Element(document.createElement('div'));
Dom.setAttribute(commentEditorInner, 'id', 'commentEditorInner');
commentEditorInner.appendTo(commentEditor);
@@ -1728,7 +1728,7 @@ Splinter.insertCommentEditor = function (commentArea, file, location, type) {
Dom.setAttribute(commentTextArea, 'tabindex', 1);
commentTextArea.appendChild(document.createTextNode(previousText));
commentTextArea.appendTo(commentTextFrame);
- Event.addListener('commentTextArea', 'keydown', function (e) {
+ Event.addListener('commentTextArea', 'keydown', function (e) {
if (e.which == 13 && e.ctrlKey) {
Splinter.saveComment();
} else if (e.which == 27) {
@@ -2213,7 +2213,7 @@ Splinter.addNavigationLink = function (identifier, title, callback, selected) {
var navigationDiv = Dom.get('navigation');
if (Dom.getChildren(navigationDiv).length > 0) {
navigationDiv.appendChild(document.createTextNode(' | '));
- }
+ }
var navigationLink = new Element(document.createElement('a'));
Dom.addClass(navigationLink, 'navigation-link');
@@ -2224,13 +2224,13 @@ Splinter.addNavigationLink = function (identifier, title, callback, selected) {
navigationLink.appendTo(navigationDiv);
// FIXME: Find out why I need to use an id here instead of just passing
- // navigationLink to Event.addListener()
+ // navigationLink to Event.addListener()
Event.addListener('switch-' + encodeURIComponent(identifier), 'click', function () {
if (!Dom.hasClass(this, 'navigation-link-selected')) {
callback();
}
});
-
+
if (selected) {
Dom.addClass(navigationLink, 'navigation-link-selected');
}
@@ -2241,7 +2241,7 @@ Splinter.addNavigationLink = function (identifier, title, callback, selected) {
Splinter.showOverview = function () {
Splinter.selectNavigationLink('__OVERVIEW__');
Dom.setStyle('overview', 'display', 'block');
- Dom.getElementsByClassName('file', 'div', '', function (node) {
+ Dom.getElementsByClassName('file', 'div', '', function (node) {
Dom.setStyle(node, 'display', 'none');
});
if (!Splinter.readOnly)
@@ -2358,7 +2358,7 @@ Splinter.start = function () {
Dom.setAttribute(haveDraftNotice, 'id', 'haveDraftNotice');
haveDraftNotice.appendChild(document.createTextNode('Draft'));
haveDraftNotice.appendTo(navigation);
-
+
var clear = new Element(document.createElement('div'));
Dom.addClass(clear, 'clear');
clear.appendTo(navigation);
@@ -2409,7 +2409,7 @@ Splinter.start = function () {
reviewIntro.appendTo(reviewerBox);
Dom.setStyle('oldReviews', 'display', 'block');
-
+
Splinter.appendReviewComments(review, reviewerBox);
}
}
@@ -2424,7 +2424,7 @@ Splinter.start = function () {
Dom.setStyle('restored', 'display', 'block');
for (i = 0; i < storedReviews.length; i++) {
if (storedReviews[i].bugId == Splinter.theBug.id &&
- storedReviews[i].attachmentId == Splinter.theAttachment.id)
+ storedReviews[i].attachmentId == Splinter.theAttachment.id)
{
Splinter.replaceText(Dom.get("restoredLastModified"), Splinter.Utils.formatDate(new Date(storedReviews[i].modificationTime)));
// Restore file reviewed checkboxes
@@ -2625,7 +2625,7 @@ Splinter.showChooseAttachment = function () {
responseType: YAHOO.util.DataSource.TYPE_JSARRAY,
responseSchema: { fields:["id","description","date", "extra"] }
};
-
+
var columnDefs = [
{ key: "id", label: "ID", formatter: attachLink },
{ key: "description", label: "Description", formatter: attachDesc },
@@ -2635,7 +2635,7 @@ Splinter.showChooseAttachment = function () {
var dataSource = new YAHOO.util.LocalDataSource(attachData, dsConfig);
var dataTable = new YAHOO.widget.DataTable("chooseAttachmentTable", columnDefs, dataSource);
-
+
Dom.setStyle('chooseAttachment', 'display', 'block');
};
@@ -2651,7 +2651,7 @@ Splinter.quickHelpToggle = function () {
quickHelpContent.style.display = 'none';
quickHelpShow.style.display = 'block';
}
-};
+};
Splinter.init = function () {
Splinter.showNote();
@@ -2674,7 +2674,7 @@ Splinter.init = function () {
if (Splinter.attachmentId) {
Splinter.theAttachment = Splinter.theBug.getAttachment(Splinter.attachmentId);
-
+
if (Splinter.theAttachment == null) {
Splinter.displayError("Attachment " + Splinter.attachmentId + " is not an attachment to bug " + Splinter.theBug.id);
}
@@ -2704,8 +2704,8 @@ Splinter.init = function () {
Dom.setStyle('attachInfo', 'display', 'block');
Dom.setStyle('quickHelpShow', 'display', 'block');
-
- document.title = "Patch Review of Attachment " + Splinter.theAttachment.id +
+
+ document.title = "Patch Review of Attachment " + Splinter.theAttachment.id +
" for Bug " + Splinter.theBug.id;
Splinter.thePatch = new Splinter.Patch.Patch(Splinter.theAttachment.data);
@@ -2715,4 +2715,4 @@ Splinter.init = function () {
}
};
-YAHOO.util.Event.addListener(window, 'load', Splinter.init);
+YAHOO.util.Event.addListener(window, 'load', Splinter.init);
diff --git a/extensions/Voting/template/en/default/hook/account/prefs/email-relationships.html.tmpl b/extensions/Voting/template/en/default/hook/account/prefs/email-relationships.html.tmpl
index 0bd81eae1..4c2609609 100644
--- a/extensions/Voting/template/en/default/hook/account/prefs/email-relationships.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/account/prefs/email-relationships.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/admin/products/edit-common-rows.html.tmpl b/extensions/Voting/template/en/default/hook/admin/products/edit-common-rows.html.tmpl
index fde6434de..8fa43734b 100644
--- a/extensions/Voting/template/en/default/hook/admin/products/edit-common-rows.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/admin/products/edit-common-rows.html.tmpl
@@ -14,16 +14,16 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
-[% DEFAULT
+[% DEFAULT
product.maxvotesperbug = constants.DEFAULT_VOTES_PER_BUG
product.votesperuser = 0
product.votestoconfirm = 0
%]
-
+
<tr>
<th align="right">Maximum votes per person:</th>
<td><input size="5" maxlength="5" name="votesperuser" id="votesperuser"
diff --git a/extensions/Voting/template/en/default/hook/admin/products/updated-changes.html.tmpl b/extensions/Voting/template/en/default/hook/admin/products/updated-changes.html.tmpl
index 15fb1efe0..01005d776 100644
--- a/extensions/Voting/template/en/default/hook/admin/products/updated-changes.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/admin/products/updated-changes.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/admin/sanitycheck/messages-statuses.html.tmpl b/extensions/Voting/template/en/default/hook/admin/sanitycheck/messages-statuses.html.tmpl
index bbf0350a1..ad475a76b 100644
--- a/extensions/Voting/template/en/default/hook/admin/sanitycheck/messages-statuses.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/admin/sanitycheck/messages-statuses.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/admin/users/confirm-delete-warn_safe.html.tmpl b/extensions/Voting/template/en/default/hook/admin/users/confirm-delete-warn_safe.html.tmpl
index a753e3a66..5a9d315c2 100644
--- a/extensions/Voting/template/en/default/hook/admin/users/confirm-delete-warn_safe.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/admin/users/confirm-delete-warn_safe.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/bug/edit-after_importance.html.tmpl b/extensions/Voting/template/en/default/hook/bug/edit-after_importance.html.tmpl
index b57a5cb27..e502c1e3a 100644
--- a/extensions/Voting/template/en/default/hook/bug/edit-after_importance.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/bug/edit-after_importance.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% IF bug.product_obj.votesperuser %]
@@ -23,7 +23,7 @@
with
<a href="page.cgi?id=voting/bug.html&amp;bug_id=
[%- bug.id FILTER uri %]">
- [%- bug.votes FILTER html %]
+ [%- bug.votes FILTER html %]
[% IF bug.votes == 1 %]
vote
[% ELSE %]
diff --git a/extensions/Voting/template/en/default/hook/bug/format_comment-type.txt.tmpl b/extensions/Voting/template/en/default/hook/bug/format_comment-type.txt.tmpl
index ebba6fcab..59c8eeedc 100644
--- a/extensions/Voting/template/en/default/hook/bug/format_comment-type.txt.tmpl
+++ b/extensions/Voting/template/en/default/hook/bug/format_comment-type.txt.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/bug/process/header-title.html.tmpl b/extensions/Voting/template/en/default/hook/bug/process/header-title.html.tmpl
index a4530653b..b4dd16e90 100644
--- a/extensions/Voting/template/en/default/hook/bug/process/header-title.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/bug/process/header-title.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/bug/process/results-title.html.tmpl b/extensions/Voting/template/en/default/hook/bug/process/results-title.html.tmpl
index ae0d465dc..fd8a4cadd 100644
--- a/extensions/Voting/template/en/default/hook/bug/process/results-title.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/bug/process/results-title.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/bug/show-header-end.html.tmpl b/extensions/Voting/template/en/default/hook/bug/show-header-end.html.tmpl
index 2e2c2d995..55d3bf468 100644
--- a/extensions/Voting/template/en/default/hook/bug/show-header-end.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/bug/show-header-end.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/global/code-error-errors.html.tmpl b/extensions/Voting/template/en/default/hook/global/code-error-errors.html.tmpl
index 50e915941..7763f15d8 100644
--- a/extensions/Voting/template/en/default/hook/global/code-error-errors.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/global/code-error-errors.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl b/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl
index 1becab4da..ba43380f0 100644
--- a/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl
+++ b/extensions/Voting/template/en/default/hook/global/field-descs-end.none.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/global/reason-descs-end.none.tmpl b/extensions/Voting/template/en/default/hook/global/reason-descs-end.none.tmpl
index 3a1f5a189..9aedcd50c 100644
--- a/extensions/Voting/template/en/default/hook/global/reason-descs-end.none.tmpl
+++ b/extensions/Voting/template/en/default/hook/global/reason-descs-end.none.tmpl
@@ -14,10 +14,10 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% reason_descs.${constants.REL_VOTER} = "You voted for the ${terms.bug}." %]
-[% watch_reason_descs.${constants.REL_VOTER} =
+[% watch_reason_descs.${constants.REL_VOTER} =
"You are watching a voter for the ${terms.bug}." %]
diff --git a/extensions/Voting/template/en/default/hook/global/user-error-errors.html.tmpl b/extensions/Voting/template/en/default/hook/global/user-error-errors.html.tmpl
index c2ff70728..057aa1d79 100644
--- a/extensions/Voting/template/en/default/hook/global/user-error-errors.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/global/user-error-errors.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/search/form-after_freetext_fields.html.tmpl b/extensions/Voting/template/en/default/hook/search/form-after_freetext_fields.html.tmpl
index dca1dba00..b91c14dfe 100644
--- a/extensions/Voting/template/en/default/hook/search/form-after_freetext_fields.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/search/form-after_freetext_fields.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/hook/search/search-report-select-rep_fields.html.tmpl b/extensions/Voting/template/en/default/hook/search/search-report-select-rep_fields.html.tmpl
index ca74f6d2d..c58db3800 100644
--- a/extensions/Voting/template/en/default/hook/search/search-report-select-rep_fields.html.tmpl
+++ b/extensions/Voting/template/en/default/hook/search/search-report-select-rep_fields.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/extensions/Voting/template/en/default/pages/voting.html.tmpl b/extensions/Voting/template/en/default/pages/voting.html.tmpl
index 99026c0d5..5165d32c8 100644
--- a/extensions/Voting/template/en/default/pages/voting.html.tmpl
+++ b/extensions/Voting/template/en/default/pages/voting.html.tmpl
@@ -22,19 +22,19 @@
[% PROCESS global/variables.none.tmpl %]
[% INCLUDE global/header.html.tmpl title = "Voting" %]
-<p>[% terms.Bugzilla %] has a "voting" feature. Each product allows users to
-have a certain number of votes. (Some products may not allow any, which means
-you can't vote on things in those products at all.) With your vote, you
-indicate which [% terms.bugs %] you think are the most important and
-would like to see fixed. Note that voting is nowhere near as effective
+<p>[% terms.Bugzilla %] has a "voting" feature. Each product allows users to
+have a certain number of votes. (Some products may not allow any, which means
+you can't vote on things in those products at all.) With your vote, you
+indicate which [% terms.bugs %] you think are the most important and
+would like to see fixed. Note that voting is nowhere near as effective
as providing a fix yourself.</p>
<p>Depending on how the administrator has configured the relevant product,
you may be able to vote for the same [% terms.bug %] more than once.
-Remember that you have a limited number of votes. When weighted voting
-is allowed and a limited number of votes are available to you, you will
-have to decide whether you want to distribute your votes among a large
-number of [% terms.bugs %] indicating your minimal interest or focus on
+Remember that you have a limited number of votes. When weighted voting
+is allowed and a limited number of votes are available to you, you will
+have to decide whether you want to distribute your votes among a large
+number of [% terms.bugs %] indicating your minimal interest or focus on
a few [% terms.bugs %] indicating your strong support for them.
</p>
@@ -55,8 +55,8 @@ a few [% terms.bugs %] indicating your strong support for them.
fields. (If no such link appears, then voting may not be allowed in
this [% terms.bug %]'s product.)</li>
- <li>Indicate how many votes you want to give this [% terms.bug %]. This page
- also displays how many votes you've given to other [% terms.bugs %], so you
+ <li>Indicate how many votes you want to give this [% terms.bug %]. This page
+ also displays how many votes you've given to other [% terms.bugs %], so you
may rebalance your votes as necessary.</li>
</ul>
diff --git a/heartbeat.cgi b/heartbeat.cgi
index 11bb3ac30..493674c16 100755
--- a/heartbeat.cgi
+++ b/heartbeat.cgi
@@ -44,4 +44,4 @@ FATAL("heartbeat error: $@") if !$ok && $@;
my $cgi = Bugzilla->cgi;
print $cgi->header(-type => 'text/plain', -status => $ok ? '200 OK' : '500 Internal Server Error');
-print $ok ? "Bugzilla OK\n" : "Bugzilla NOT OK\n";
+print $ok ? "Bugzilla OK\n" : "Bugzilla NOT OK\n"; \ No newline at end of file
diff --git a/images/bugzilla-magnifier.png b/images/bugzilla-magnifier.png
deleted file mode 100644
index b859b1668..000000000
--- a/images/bugzilla-magnifier.png
+++ /dev/null
Binary files differ
diff --git a/images/bugzilla-papericon.png b/images/bugzilla-papericon.png
deleted file mode 100644
index 677567929..000000000
--- a/images/bugzilla-papericon.png
+++ /dev/null
Binary files differ
diff --git a/images/bugzilla-person-alternate.png b/images/bugzilla-person-alternate.png
deleted file mode 100644
index a9e9ff213..000000000
--- a/images/bugzilla-person-alternate.png
+++ /dev/null
Binary files differ
diff --git a/images/bugzilla-person.png b/images/bugzilla-person.png
deleted file mode 100644
index 62351c265..000000000
--- a/images/bugzilla-person.png
+++ /dev/null
Binary files differ
diff --git a/images/bugzilla-questionmark2.png b/images/bugzilla-questionmark2.png
deleted file mode 100644
index 441d07f93..000000000
--- a/images/bugzilla-questionmark2.png
+++ /dev/null
Binary files differ
diff --git a/js/TUI.js b/js/TUI.js
index 2dee8ab2e..e3b8483cd 100644
--- a/js/TUI.js
+++ b/js/TUI.js
@@ -2,19 +2,19 @@
* 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 Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
- *
+ *
* Contributor(s): Dennis Melentyev <dennis.melentyev@infopulse.com.ua>
* Max Kanat-Alexander <mkanat@bugzilla.org>
*/
@@ -22,7 +22,7 @@
/* This file provides JavaScript functions to be included when one wishes
* to show/hide certain UI elements, and have the state of them being
* shown/hidden stored in a cookie.
- *
+ *
* TUI stands for Tweak UI.
*
* Requires js/util.js and the YUI Dom and Cookie libraries.
@@ -35,8 +35,8 @@ var TUI_COOKIE_NAME = 'TUI';
var TUI_alternates = new Array();
-/**
- * Hides a particular class of elements if they are shown,
+/**
+ * Hides a particular class of elements if they are shown,
* or shows them if they are hidden. Then it stores whether that
* class is now hidden or shown.
*
@@ -55,7 +55,7 @@ function TUI_toggle_class(className) {
/**
* Specifies that a certain class of items should be hidden by default,
* if the user doesn't have a TUI cookie.
- *
+ *
* @param className The class to hide by default.
*/
function TUI_hide_default(className) {
diff --git a/js/attachment.js b/js/attachment.js
index 86b10bf24..5266c3d5e 100644
--- a/js/attachment.js
+++ b/js/attachment.js
@@ -412,12 +412,17 @@ Bugzilla.AttachmentForm = class AttachmentForm {
* `<input type="file">`.
*/
process_file(file, transferred = true) {
- // Check for patches which should have the `text/plain` MIME type
+ // Detect patches that should have the `text/plain` MIME type
const is_patch = !!file.name.match(/\.(?:diff|patch)$/) || !!file.type.match(/^text\/x-(?:diff|patch)$/);
- // Check for text files which may have no MIME type or `application/*` MIME type
- const is_text = !!file.name.match(/\.(?:cpp|es|h|js|json|markdown|md|rs|rst|sh|toml|ts|tsx|xml|yaml|yml)$/);
- // Reassign the MIME type
- const type = is_patch || (is_text && !file.type) ? 'text/plain' : (file.type || 'application/octet-stream');
+ // Detect Markdown files that should have `text/plain` instead of `text/markdown` due to Firefox Bug 1421032
+ const is_markdown = !!file.name.match(/\.(?:md|mkdn?|mdown|markdown)$/);
+ // Detect common source files that may have no MIME type or `application/*` MIME type
+ const is_source = !!file.name.match(/\.(?:cpp|es|h|js|json|rs|rst|sh|toml|ts|tsx|xml|yaml|yml)$/);
+ // Detect any plaintext file
+ const is_text = file.type.startsWith('text/') || is_patch || is_markdown || is_source;
+ // Reassign the MIME type: use `text/plain` for most text files and `application/octet-stream` as a fallback
+ const type = (is_patch || is_markdown || (is_source && !file.type)) ?
+ 'text/plain' : (file.type || 'application/octet-stream');
if (this.check_file_size(file.size)) {
this.$data.required = transferred;
@@ -435,7 +440,7 @@ Bugzilla.AttachmentForm = class AttachmentForm {
}
this.update_validation();
- this.show_preview(file, file.type.startsWith('text/') || is_patch || is_text);
+ this.show_preview(file, is_text);
this.update_text();
this.update_content_type(type);
this.update_ispatch(is_patch);
diff --git a/js/change-columns.js b/js/change-columns.js
index e70cfd560..9d7b2dcfe 100644
--- a/js/change-columns.js
+++ b/js/change-columns.js
@@ -21,7 +21,7 @@ function initChangeColumns() {
var av_select = document.getElementById("available_columns");
var sel_select = document.getElementById("selected_columns");
YAHOO.util.Dom.removeClass(
- ['avail_header', av_select, 'select_button',
+ ['avail_header', av_select, 'select_button',
'deselect_button', 'up_button', 'down_button'], 'bz_default_hidden');
switch_options(sel_select, av_select, false);
sel_select.selectedIndex = -1;
@@ -37,7 +37,7 @@ function switch_options(from_box, to_box, selected) {
from_box.options[i] = null;
i = i - 1;
}
-
+
}
}
@@ -68,7 +68,7 @@ function move_up() {
}
else{
last = opt;
- }
+ }
}
updateView();
}
@@ -86,7 +86,7 @@ function move_down() {
}
else{
last = opt;
- }
+ }
}
updateView();
}
diff --git a/js/create_bug.js b/js/create_bug.js
index 62d24a642..3716f2aef 100644
--- a/js/create_bug.js
+++ b/js/create_bug.js
@@ -1,6 +1,6 @@
function toggleAdvancedFields() {
TUI_toggle_class('expert_fields');
- var elements = YAHOO.util.Dom.getElementsByClassName('expert_fields');
+ var elements = YAHOO.util.Dom.getElementsByClassName('expert_fields');
if (YAHOO.util.Dom.hasClass(elements[0], TUI_HIDDEN_CLASS)) {
handleWantsBugFlags(false);
}
@@ -47,7 +47,7 @@ YAHOO.util.Event.onDOMReady(function() {
}
// force field widths
-
+
var width = document.getElementById('short_desc').clientWidth + 'px';
var el;
diff --git a/js/custom-search.js b/js/custom-search.js
index e5c172d3b..21b0660e1 100644
--- a/js/custom-search.js
+++ b/js/custom-search.js
@@ -11,10 +11,10 @@
* The Original Code is the Bugzilla Bug Tracking System.
*
* The Initial Developer of the Original Code is BugzillaSource, Inc.
- * Portions created by the Initial Developer are Copyright (C) 2011
+ * Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
- * Contributor(s):
+ * Contributor(s):
* Max Kanat-Alexander <mkanat@bugzilla.org>
*/
@@ -39,9 +39,9 @@ function custom_search_not_changed(id) {
function custom_search_new_row() {
var row = document.getElementById('custom_search_last_row');
var clone = row.cloneNode(true);
-
+
_cs_fix_row_ids(clone);
-
+
// We only want one copy of the buttons, in the new row. So the old
// ones get deleted.
var op_button = document.getElementById('op_button');
@@ -124,7 +124,7 @@ function custom_search_open_paren() {
function custom_search_close_paren() {
var new_row = custom_search_new_row();
-
+
// We need to up the new row's id by one more, because we're going
// to insert a "CP" before it.
var id = _cs_fix_row_ids(new_row);
@@ -138,7 +138,7 @@ function custom_search_close_paren() {
paren_row.id = null;
paren_row.innerHTML = ')<input type="hidden" name="f' + (id - 1)
+ '" id="f' + (id - 1) + '" value="CP">';
-
+
new_row.parentNode.insertBefore(paren_row, new_row);
if (new_margin == 0) {
diff --git a/js/expanding-tree.js b/js/expanding-tree.js
index d210a629c..e86bff865 100644
--- a/js/expanding-tree.js
+++ b/js/expanding-tree.js
@@ -2,22 +2,22 @@
* 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 Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
- *
+ *
* Contributor(s): Mike Shaver <shaver@mozilla.org>
* Christian Reis <kiko@async.com.br>
- * André Batosti <batosti@async.com.br>
+ * André Batosti <batosti@async.com.br>
*/
if (!Node) {
@@ -130,7 +130,7 @@ function duplicated(element) {
highlighted = 0;
return;
}
- }
+ }
highlighted = element;
var elem = document.getElementById(element);
highlightedclass = elem.className;
diff --git a/js/field.js b/js/field.js
index ddf6b8b1c..db2f9ac39 100644
--- a/js/field.js
+++ b/js/field.js
@@ -19,7 +19,7 @@
* Reed Loden <reed@reedloden.com>
*/
-/* This library assumes that the needed YUI libraries have been loaded
+/* This library assumes that the needed YUI libraries have been loaded
already. */
var bz_no_validate_enter_bug = false;
@@ -97,7 +97,7 @@ function _errorFor(field, name) {
}
function createCalendar(name) {
- var cal = new YAHOO.widget.Calendar('calendar_' + name,
+ var cal = new YAHOO.widget.Calendar('calendar_' + name,
'con_calendar_' + name);
YAHOO.bugzilla['calendar_' + name] = cal;
var field = document.getElementById(name);
@@ -129,7 +129,7 @@ function showCalendar(field_name) {
};
// If somebody clicks outside the calendar, hide it.
- YAHOO.util.Event.addListener(document.body, 'click',
+ YAHOO.util.Event.addListener(document.body, 'click',
calendar.bz_myBodyCloser, calendar, true);
// Make Esc close the calendar.
@@ -152,14 +152,14 @@ function hideCalendar(field_name) {
YAHOO.util.Event.removeListener(document.body, 'keydown', cal.bz_escCal);
}
-/* This is the selectEvent for our Calendar objects on our custom
+/* This is the selectEvent for our Calendar objects on our custom
* DateTime fields.
*/
function setFieldFromCalendar(type, args, date_field) {
var dates = args[0];
var setDate = dates[0];
- // We can't just write the date straight into the field, because there
+ // We can't just write the date straight into the field, because there
// might already be a time there.
var timeRe = /\b(\d{1,2}):(\d\d)(?::(\d\d))?/;
var currentTime = timeRe.exec(date_field.value);
@@ -195,8 +195,8 @@ function setFieldFromCalendar(type, args, date_field) {
hideCalendar(date_field.id);
}
-/* Sets the calendar based on the current field value.
- */
+/* Sets the calendar based on the current field value.
+ */
function updateCalendarFromField(date_field) {
var dateRe = /(\d\d\d\d)-(\d\d?)-(\d\d?)/;
var pieces = dateRe.exec(date_field.value);
@@ -205,7 +205,7 @@ function updateCalendarFromField(date_field) {
cal.select(new Date(pieces[1], pieces[2] - 1, pieces[3]));
var selectedArray = cal.getSelectedDates();
var selected = selectedArray[0];
- cal.cfg.setProperty("pagedate", (selected.getMonth() + 1) + '/'
+ cal.cfg.setProperty("pagedate", (selected.getMonth() + 1) + '/'
+ selected.getFullYear());
cal.render();
}
@@ -242,7 +242,7 @@ function hideEditableField( container, input, action, field_id, original_value,
*/
function showEditableField (e, ContainerInputArray) {
var inputs = new Array();
- var inputArea = YAHOO.util.Dom.get(ContainerInputArray[1]);
+ var inputArea = YAHOO.util.Dom.get(ContainerInputArray[1]);
if ( ! inputArea ){
YAHOO.util.Event.preventDefault(e);
return;
@@ -292,10 +292,10 @@ function showEditableField (e, ContainerInputArray) {
* var ContainerInputArray: An array containing the (edit) and text area and the input being displayed
* var ContainerInputArray[0]: the container that will be hidden usually shows the (edit) text
* var ContainerInputArray[1]: the input area and label that will be displayed
- * var ContainerInputArray[2]: the field that is on the page, might get changed by browser autocomplete
+ * var ContainerInputArray[2]: the field that is on the page, might get changed by browser autocomplete
* var ContainerInputArray[3]: the original value from the page loading.
*
- */
+ */
function checkForChangedFieldValues(e, ContainerInputArray ) {
var el = document.getElementById(ContainerInputArray[2]);
var unhide = false;
@@ -327,7 +327,7 @@ function checkForChangedFieldValues(e, ContainerInputArray ) {
function hideAliasAndSummary(short_desc_value, alias_value) {
// check the short desc field
hideEditableField( 'summary_alias_container','summary_alias_input',
- 'editme_action','short_desc', short_desc_value);
+ 'editme_action','short_desc', short_desc_value);
// check that the alias hasn't changed
var bz_alias_check_array = new Array('summary_alias_container',
'summary_alias_input', 'alias', alias_value);
@@ -369,9 +369,9 @@ function initDefaultCheckbox(field_id){
new Array( 'bz_' + field_id + '_edit_container',
'bz_' + field_id + '_input',
'set_default_' + field_id ,'1'));
-
+
YAHOO.util.Event.addListener( window, 'load', boldOnChange,
- 'set_default_' + field_id );
+ 'set_default_' + field_id );
}
function showHideStatusItems(e, dupArrayInfo) {
@@ -398,11 +398,11 @@ function showHideStatusItems(e, dupArrayInfo) {
if ( (el.value == dupArrayInfo[1] && dupArrayInfo[0] == "is_duplicate")
- || bz_isValueInArray(close_status_array, el.value) )
+ || bz_isValueInArray(close_status_array, el.value) )
{
- YAHOO.util.Dom.removeClass('resolution_settings',
+ YAHOO.util.Dom.removeClass('resolution_settings',
'bz_default_hidden');
- YAHOO.util.Dom.removeClass('resolution_settings_warning',
+ YAHOO.util.Dom.removeClass('resolution_settings_warning',
'bz_default_hidden');
// Remove the blank option we inserted.
@@ -425,7 +425,7 @@ function showDuplicateItem(e) {
if (resolution) {
if (resolution.value == 'DUPLICATE' && bz_isValueInArray( close_status_array, bug_status.value) ) {
// hide resolution show duplicate
- YAHOO.util.Dom.removeClass('duplicate_settings',
+ YAHOO.util.Dom.removeClass('duplicate_settings',
'bz_default_hidden');
YAHOO.util.Dom.addClass('dup_id_discoverable', 'bz_default_hidden');
// check to make sure the field is visible or IE throws errors
@@ -436,7 +436,7 @@ function showDuplicateItem(e) {
}
else {
YAHOO.util.Dom.addClass('duplicate_settings', 'bz_default_hidden');
- YAHOO.util.Dom.removeClass('dup_id_discoverable',
+ YAHOO.util.Dom.removeClass('dup_id_discoverable',
'bz_default_hidden');
dup_id.blur();
}
@@ -493,7 +493,7 @@ function updateCommentTagControl(checkbox, field) {
function setClassification() {
var classification = document.getElementById('classification');
var product = document.getElementById('product');
- var selected_product = product.value;
+ var selected_product = product.value;
var select_classification = all_classifications[selected_product];
classification.value = select_classification;
bz_fireEvent(classification, 'change');
@@ -513,15 +513,15 @@ function showFieldWhen(controlled_id, controller_id, values) {
}
/**
- * Called by showFieldWhen when a field's visibility controller
- * changes values.
+ * Called by showFieldWhen when a field's visibility controller
+ * changes values.
*/
function handleVisControllerValueChange(e, args) {
var controlled_id = args[0];
var controller = args[1];
var values = args[2];
- var label_container =
+ var label_container =
document.getElementById('field_label_' + controlled_id);
var field_container =
document.getElementById('field_container_' + controlled_id);
@@ -543,11 +543,11 @@ function handleVisControllerValueChange(e, args) {
}
}
-function showValueWhen(controlled_field_id, controlled_value_ids,
+function showValueWhen(controlled_field_id, controlled_value_ids,
controller_field_id, controller_value_id)
{
var controller_field = document.getElementById(controller_field_id);
- // Note that we don't get an object for the controlled field here,
+ // Note that we don't get an object for the controlled field here,
// because it might not yet exist in the DOM. We just pass along its id.
YAHOO.util.Event.addListener(controller_field, 'change',
handleValControllerChange, [controlled_field_id, controlled_value_ids,
diff --git a/js/instant-search.js b/js/instant-search.js
index 183d5a3be..93c0ef599 100644
--- a/js/instant-search.js
+++ b/js/instant-search.js
@@ -57,7 +57,7 @@ YAHOO.bugzilla.instantSearch = {
};
// DataSource can't understand a JSON-RPC error response, so
// we have to modify the result data if we get one.
- dataSource.doBeforeParseData =
+ dataSource.doBeforeParseData =
function(oRequest, oFullResponse, oCallback) {
if (oFullResponse.error) {
oFullResponse.result = {};
@@ -67,17 +67,17 @@ YAHOO.bugzilla.instantSearch = {
}
return oFullResponse;
};
- dataSource.subscribe('dataErrorEvent',
+ dataSource.subscribe('dataErrorEvent',
function() {
YAHOO.bugzilla.instantSearch.currentSearchQuery = '';
}
);
this.dataTable = new YAHOO.widget.DataTable(
- 'results',
- this.dataTableColumns,
- dataSource,
- {
+ 'results',
+ this.dataTableColumns,
+ dataSource,
+ {
initialLoad: false,
MSG_EMPTY: 'No matching bugs found.',
MSG_ERROR: 'An error occurred while searching for bugs, please try again.'
@@ -138,7 +138,7 @@ YAHOO.bugzilla.instantSearch = {
YAHOO.bugzilla.instantSearch.dataTable.showTableMessage(
'Searching...&nbsp;&nbsp;&nbsp;' +
- '<img src="images/throbber.gif"' +
+ '<img src="extensions/GuidedBugEntry/web/images/throbber.gif"' +
' width="16" height="11">',
YAHOO.widget.DataTable.CLASS_LOADING
);
@@ -158,12 +158,12 @@ YAHOO.bugzilla.instantSearch = {
}
YAHOO.bugzilla.instantSearch.dataTable.getDataSource().sendRequest(
- YAHOO.lang.JSON.stringify(jsonObject),
+ YAHOO.lang.JSON.stringify(jsonObject),
{
success: YAHOO.bugzilla.instantSearch.onSearchResults,
failure: YAHOO.bugzilla.instantSearch.onSearchResults,
scope: YAHOO.bugzilla.instantSearch.dataTable,
- argument: YAHOO.bugzilla.instantSearch.dataTable.getState()
+ argument: YAHOO.bugzilla.instantSearch.dataTable.getState()
}
);
diff --git a/js/productform.js b/js/productform.js
index f9b420c31..12ac63e76 100644
--- a/js/productform.js
+++ b/js/productform.js
@@ -2,19 +2,19 @@
* 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 Netscape Communications
* Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All
* Rights Reserved.
- *
+ *
* Contributor(s): Christian Reis <kiko@async.com.br>
*/
@@ -52,7 +52,7 @@ function selectClassification(classfield, product, component, version, milestone
first_load = false;
return;
}
-
+
// Don't reset first_load as done in selectProduct. That's because we
// want selectProduct to handle the first_load attribute.
@@ -69,7 +69,7 @@ function selectClassification(classfield, product, component, version, milestone
if (!findall) {
// Save sel for the next invocation of selectClassification().
var tmp = sel;
-
+
// This is an optimization: if we have just added classifications to an
// existing selection, no need to clear the form elements and add
// everything again; just merge the new ones with the existing
diff --git a/js/util.js b/js/util.js
index c27dc2b11..781fd3c67 100644
--- a/js/util.js
+++ b/js/util.js
@@ -121,7 +121,7 @@ function bz_getFullWidth(fromObj)
/**
* Causes a block to appear directly underneath another block,
* overlaying anything below it.
- *
+ *
* @param item The block that you want to move.
* @param parent The block that it goes on top of.
* @return nothing
@@ -272,7 +272,7 @@ function bz_preselectedOptions(aSelect) {
/**
* Tells you whether or not a particular value is selected in a select,
- * whether it's a multi-select or a single-select. The check is
+ * whether it's a multi-select or a single-select. The check is
* case-sensitive.
*
* @param aSelect The select you're checking.
@@ -306,9 +306,9 @@ function bz_optionIndex(aSelect, aValue) {
/**
* Used to fire an event programmatically.
- *
+ *
* @param anElement The element you want to fire the event of.
- * @param anEvent The name of the event you want to fire,
+ * @param anEvent The name of the event you want to fire,
* without the word "on" in front of it.
*/
function bz_fireEvent(anElement, anEvent) {
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 000000000..c14fec40a
--- /dev/null
+++ b/public/favicon.ico
Binary files differ
diff --git a/static/metricsgraphics/css/bootstrap.min.css b/public/metricsgraphics/css/bootstrap.min.css
index a9f35ceed..a9f35ceed 100644
--- a/static/metricsgraphics/css/bootstrap.min.css
+++ b/public/metricsgraphics/css/bootstrap.min.css
diff --git a/static/metricsgraphics/css/font-awesome.min.css b/public/metricsgraphics/css/font-awesome.min.css
index ec53d4d6d..ec53d4d6d 100644
--- a/static/metricsgraphics/css/font-awesome.min.css
+++ b/public/metricsgraphics/css/font-awesome.min.css
diff --git a/static/metricsgraphics/css/google-OpenSans.min.css b/public/metricsgraphics/css/google-OpenSans.min.css
index 24b3492fc..24b3492fc 100644
--- a/static/metricsgraphics/css/google-OpenSans.min.css
+++ b/public/metricsgraphics/css/google-OpenSans.min.css
diff --git a/static/metricsgraphics/css/google-PTSerif.min.css b/public/metricsgraphics/css/google-PTSerif.min.css
index a02c2446f..a02c2446f 100644
--- a/static/metricsgraphics/css/google-PTSerif.min.css
+++ b/public/metricsgraphics/css/google-PTSerif.min.css
diff --git a/static/metricsgraphics/css/metricsgraphics.css b/public/metricsgraphics/css/metricsgraphics.css
index 0a7fbae80..5e5b51c36 100644
--- a/static/metricsgraphics/css/metricsgraphics.css
+++ b/public/metricsgraphics/css/metricsgraphics.css
@@ -314,7 +314,7 @@ circle.mg-points-mono {
tspan.mg-points-mono {
fill: #0000ff;
- stroke: #0000ff;
+ stroke: #0000ff;
}
/* a selected point in a scatterplot */
diff --git a/static/metricsgraphics/js/bootstrap.min.js b/public/metricsgraphics/js/bootstrap.min.js
index 7c1561a8b..7c1561a8b 100644
--- a/static/metricsgraphics/js/bootstrap.min.js
+++ b/public/metricsgraphics/js/bootstrap.min.js
diff --git a/static/metricsgraphics/js/d3.min.js b/public/metricsgraphics/js/d3.min.js
index 88550ae51..88550ae51 100644
--- a/static/metricsgraphics/js/d3.min.js
+++ b/public/metricsgraphics/js/d3.min.js
diff --git a/static/metricsgraphics/js/jquery.min.js b/public/metricsgraphics/js/jquery.min.js
index ab28a2472..ab28a2472 100644
--- a/static/metricsgraphics/js/jquery.min.js
+++ b/public/metricsgraphics/js/jquery.min.js
diff --git a/static/metricsgraphics/js/main.js b/public/metricsgraphics/js/main.js
index 651c3a7b8..da317488c 100644
--- a/static/metricsgraphics/js/main.js
+++ b/public/metricsgraphics/js/main.js
@@ -46,7 +46,7 @@ var theme = 'dark';
});
});
})
-
+
$('a.pill').on('click', function(event) {
event.preventDefault();
$('a.pill').removeClass('active');
@@ -119,8 +119,8 @@ var theme = 'dark';
return false;
});
-
-
+
+
$('#accessible-css').on('click', function () {
$('.head ul li a.pill').removeClass('active');
diff --git a/static/metricsgraphics/js/metricsgraphics.min.js b/public/metricsgraphics/js/metricsgraphics.min.js
index f3e931b17..f3e931b17 100644
--- a/static/metricsgraphics/js/metricsgraphics.min.js
+++ b/public/metricsgraphics/js/metricsgraphics.min.js
diff --git a/static/metricsgraphics/socorro-lens.html b/public/metricsgraphics/socorro-lens.html
index c3664db37..f0c226361 100644
--- a/static/metricsgraphics/socorro-lens.html
+++ b/public/metricsgraphics/socorro-lens.html
@@ -1,7 +1,7 @@
<html lang="en">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
- <link href='css/google-OpenSans.css' rel='stylesheet' type='text/css'>
+ <link href='css/google-OpenSans.min.css' rel='stylesheet' type='text/css'>
<link href='css/google-PTSerif.min.css' rel='stylesheet' type='text/css'>
<link href='css/font-awesome.min.css' rel='stylesheet' type='text/css'>
<link href='css/bootstrap.min.css' rel='stylesheet' type='text/css'>
@@ -31,8 +31,8 @@
<option value='esr' title='Show crashes on ESR only'>esr</option>
</select>
<select name='match' id='match' title='Select whether to match signatures exactly or similarly'>
- <option value='exact' title='Match signatures exactly'>Exact Match</option>
- <option value='like' title='Match signatures similarly' selected=selected>Like Match</option>
+ <option value='exact' title='Match signatures exactly' selected>Exact Match</option>
+ <option value='like' title='Match signatures similarly'>Like Match</option>
</select>
</div>
<div style="width:300px; height:75px; color:red; text-align:center; visibility:hidden;" id='warn'></div>
@@ -174,7 +174,7 @@
});
}
- function loadGraph(search, match) {
+ function loadGraph(search, match = 'exact') {
// Get all signatures from the Bugzilla page
var signatures = getSignaturesFromURL(search, match);
// Initialize chart data
@@ -237,4 +237,4 @@
}
</script>
</body>
-</html> \ No newline at end of file
+</html>
diff --git a/qa/t/test_create_user_accounts.t b/qa/t/test_create_user_accounts.t
index 99792367e..ba0f39671 100644
--- a/qa/t/test_create_user_accounts.t
+++ b/qa/t/test_create_user_accounts.t
@@ -25,8 +25,8 @@ logout($sel);
# expires after 3 days only and this test can be executed several times per day.
my $valid_account = 'selenium-' . random_string(10) . '@bugzilla.test';
-$sel->is_text_present_ok("Open a New Account");
-$sel->click_ok("link=Open a New Account");
+$sel->is_text_present_ok("New Account");
+$sel->click_ok("link=New Account");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Create a new Bugzilla account");
$sel->type_ok("login", $valid_account);
@@ -40,8 +40,8 @@ $sel->is_text_present_ok("A confirmation email has been sent");
$sel->click_ok('//*[@id="header-title"]//a');
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Bugzilla Main Page");
-$sel->is_text_present_ok("Open a New Account");
-$sel->click_ok("link=Open a New Account");
+$sel->is_text_present_ok("New Account");
+$sel->click_ok("link=New Account");
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Create a new Bugzilla account");
$sel->type_ok("login", $valid_account);
@@ -128,7 +128,7 @@ $sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->refresh;
$sel->wait_for_page_to_load_ok(WAIT_TIME);
$sel->title_is("Bugzilla Main Page");
-ok(!$sel->is_text_present("Open a New Account"), "No link named 'Open a New Account'");
+ok(!$sel->is_text_present("New Account"), "No link named 'New Account'");
$sel->open_ok("/$config->{bugzilla_installation}/createaccount.cgi");
$sel->title_is("Account Creation Disabled");
$error_msg = trim($sel->get_text("error_msg"));
diff --git a/qa/t/webservice_bug_get.t b/qa/t/webservice_bug_get.t
index 91de410c1..cad5c3893 100644
--- a/qa/t/webservice_bug_get.t
+++ b/qa/t/webservice_bug_get.t
@@ -38,7 +38,7 @@ $xmlrpc->bz_call_success('Bug.update', {
is_creator_accessible => 0,
keywords => { set => ['test-keyword-1', 'test-keyword-2'] },
see_also => { add => ["${base_url}show_bug.cgi?id=$public_id",
- "https://landfill.bugzilla.org/show_bug.cgi?id=123456"] },
+ "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456"] },
cf_qa_status => ['in progress', 'verified'],
cf_single_select => 'two',
}, 'Update the private bug');
@@ -53,7 +53,7 @@ $private_bug->{is_creator_accessible} = 0;
$private_bug->{is_cc_accessible} = 1;
$private_bug->{keywords} = ['test-keyword-1', 'test-keyword-2'];
$private_bug->{see_also} = ["${base_url}show_bug.cgi?id=$public_id",
- "https://landfill.bugzilla.org/show_bug.cgi?id=123456"];
+ "https://bugzilla-dev.allizom.org/show_bug.cgi?id=123456"];
$private_bug->{cf_qa_status} = ['in progress', 'verified'];
$private_bug->{cf_single_select} = 'two';
diff --git a/qa/t/webservice_bug_update.t b/qa/t/webservice_bug_update.t
index 4e3b9985b..95af809e0 100644
--- a/qa/t/webservice_bug_update.t
+++ b/qa/t/webservice_bug_update.t
@@ -222,7 +222,7 @@ sub valid_values {
{ value => { remove => [$bug_uri . $second_id] },
removed => $bug_uri . $second_id, added => '',
test => 'remove local bug URI' },
- { value => { remove => ['http://landfill.bugzilla.org/bugzilla-tip/show_bug.cgi?id=1'] },
+ { value => { remove => ['https://bugzilla-dev.allizom.org/show_bug.cgi?id=1'] },
no_changes => 1,
test => 'removing non-existent URI works' },
{ value => { add => [''] },
@@ -524,7 +524,7 @@ sub invalid_values {
{ value => { add => [random_string(20)] },
error => 'It does not seem like bug number nor an alias to a bug.',
test => 'random string fails in see_also' },
- { value => { add => ['http://landfill.bugzilla.org/'] },
+ { value => { add => ['https://bugzilla-dev.allizom.org/'] },
error => 'See Also URLs should point to one of',
test => 'no show_bug.cgi in see_also URI' },
],
diff --git a/qa/t/webservice_bug_update_see_also.t b/qa/t/webservice_bug_update_see_also.t
index 460cb13e1..0af0e78d5 100644
--- a/qa/t/webservice_bug_update_see_also.t
+++ b/qa/t/webservice_bug_update_see_also.t
@@ -17,7 +17,7 @@ use QA::Tests qw(PRIVATE_BUG_USER STANDARD_BUG_TESTS);
use Test::More tests => 117;
my ($config, $xmlrpc, $jsonrpc, $jsonrpc_get) = get_rpc_clients();
-my $bug_url = 'http://landfill.bugzilla.org/bugzilla-tip/show_bug.cgi?id=100';
+my $bug_url = 'https://bugzilla-dev.allizom.org/show_bug.cgi?id=100';
# update_see_also doesn't support logged-out users.
my @tests = grep { $_->{user} } @{ STANDARD_BUG_TESTS() };
diff --git a/reports.cgi b/reports.cgi
index 1633e37ca..cd24e1ee3 100755
--- a/reports.cgi
+++ b/reports.cgi
@@ -19,7 +19,7 @@ use Bugzilla::Error;
use Bugzilla::Status;
use File::Basename;
-use Digest::MD5 qw(md5_hex);
+use Digest::SHA qw(hmac_sha256_base64);
# If we're using bug groups for products, we should apply those restrictions
# to viewing reports, as well. Time to check the login in that case.
@@ -90,14 +90,12 @@ else {
# Filenames must not be guessable as they can point to products
# you are not allowed to see. Also, different projects can have
# the same product names.
- my $key = Bugzilla->localconfig->{'site_wide_secret'};
my $project = bz_locations()->{'project'} || '';
- my $image_file = join(':', ($key, $project, $prod_id, @datasets));
- # Wide characters cause md5_hex() to die.
- if (Bugzilla->params->{'utf8'}) {
- utf8::encode($image_file) if utf8::is_utf8($image_file);
- }
- $image_file = md5_hex($image_file) . '.png';
+ my $image_file = join(':', ($project, $prod_id, @datasets));
+ my $key = Bugzilla->localconfig->{'site_wide_secret'};
+ $image_file = hmac_sha256_base64($image_file, $key) . '.png';
+ $image_file =~ s/\+/-/g;
+ $image_file =~ s/\//_/g;
trick_taint($image_file);
if (! -e "$graph_dir/$image_file") {
diff --git a/scripts/issue-api-key.pl b/scripts/issue-api-key.pl
index 810b7e17e..e4cc1cdd0 100755
--- a/scripts/issue-api-key.pl
+++ b/scripts/issue-api-key.pl
@@ -33,10 +33,6 @@ my $params = {
api_key => $given_api_key,
};
-if ($description && $description eq 'mozreview') {
- $params->{app_id} = Bugzilla->params->{mozreview_app_id} // '';
-}
-
if ($given_api_key) {
$api_key = Bugzilla::User::APIKey->create_special($params);
} else {
diff --git a/scripts/perl-fmt b/scripts/perl-fmt
new file mode 100644
index 000000000..4b5ea3565
--- /dev/null
+++ b/scripts/perl-fmt
@@ -0,0 +1,24 @@
+#!/usr/bin/perl
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use File::Basename qw(dirname);
+use Cwd qw(realpath);
+use File::Spec::Functions qw(catfile catdir);
+use Env qw(@PATH @PERL5LIB);
+
+my $bugzilla_dir = realpath(catdir( dirname(__FILE__), '..' ));
+unshift @PERL5LIB, catdir($bugzilla_dir, 'local', 'lib', 'perl5');
+unshift @PATH, catdir($bugzilla_dir, 'local', 'bin');
+
+my $profile = catfile($bugzilla_dir, ".perltidyrc" );
+warn "formatting @ARGV\n";
+exec( perltidy => "--profile=$profile", '-nst', '-b', '-bext=/', '-conv', @ARGV );
diff --git a/scripts/secbugsreport.pl b/scripts/secbugsreport.pl
new file mode 100644
index 000000000..81041b222
--- /dev/null
+++ b/scripts/secbugsreport.pl
@@ -0,0 +1,84 @@
+#!/usr/bin/perl
+
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+#
+# Usage secbugsreport.pl YYYY MM DD, e.g. secbugsreport.pl $(date +'%Y %m %d')
+
+use 5.10.1;
+use strict;
+use warnings;
+
+use lib qw(. lib local/lib/perl5);
+
+use Bugzilla;
+use Bugzilla::Component;
+use Bugzilla::Constants;
+use Bugzilla::Error;
+use Bugzilla::Mailer;
+use Bugzilla::Report::SecurityRisk;
+
+use DateTime;
+use URI;
+use JSON::MaybeXS;
+
+BEGIN { Bugzilla->extensions }
+Bugzilla->usage_mode(USAGE_MODE_CMDLINE);
+
+exit 0 unless Bugzilla->params->{report_secbugs_active};
+exit 0 unless defined $ARGV[0] && defined $ARGV[1] && defined $ARGV[2];
+
+my $html;
+my $template = Bugzilla->template();
+my $end_date = DateTime->new( year => $ARGV[0], month => $ARGV[1], day => $ARGV[2] );
+my $start_date = $end_date->clone()->subtract( months => 6 );
+my $report_week = $end_date->ymd('-');
+my $products = decode_json( Bugzilla->params->{report_secbugs_products} );
+my $sec_keywords = [ 'sec-critical', 'sec-high' ];
+my $report = Bugzilla::Report::SecurityRisk->new(
+ start_date => $start_date,
+ end_date => $end_date,
+ products => $products,
+ sec_keywords => $sec_keywords
+);
+my $vars = {
+ urlbase => Bugzilla->localconfig->{urlbase},
+ report_week => $report_week,
+ products => $products,
+ sec_keywords => $sec_keywords,
+ results => $report->results,
+ build_bugs_link => \&build_bugs_link,
+};
+
+$template->process( 'reports/email/security-risk.html.tmpl', $vars, \$html )
+ or ThrowTemplateError( $template->error() );
+
+# For now, only send HTML email.
+my $email = Email::MIME->create(
+ header_str => [
+ From => Bugzilla->params->{'mailfrom'},
+ To => Bugzilla->params->{report_secbugs_emails},
+ Subject => "Security Bugs Report for $report_week",
+ 'X-Bugzilla-Type' => 'admin'
+ ],
+ attributes => {
+ content_type => 'text/html',
+ charset => 'UTF-8',
+ encoding => 'quoted-printable',
+ },
+ body_str => $html,
+);
+
+MessageToMTA($email);
+
+sub build_bugs_link {
+ my ( $arr, $product ) = @_;
+ my $uri = URI->new( Bugzilla->localconfig->{urlbase} . 'buglist.cgi' );
+ $uri->query_param( bug_id => ( join ',', @$arr ) );
+ $uri->query_param( product => $product ) if $product;
+ return $uri->as_string;
+}
diff --git a/scripts/syncflags.pl b/scripts/syncflags.pl
index e6b521e62..c99fd5160 100755
--- a/scripts/syncflags.pl
+++ b/scripts/syncflags.pl
@@ -75,6 +75,7 @@ if (!$tgtprodid) {
exit(1);
}
+# Normal flags such as bug flags and attachment flags
$dbh->do("INSERT INTO flaginclusions(component_id, type_id, product_id)
SELECT fi1.component_id, fi1.type_id, ? FROM flaginclusions fi1
LEFT JOIN flaginclusions fi2
@@ -85,6 +86,17 @@ $dbh->do("INSERT INTO flaginclusions(component_id, type_id, product_id)
undef,
$tgtprodid, $tgtprodid, $srcprodid);
+# Tracking type flags
+$dbh->do("INSERT INTO tracking_flags_visibility (tracking_flag_id, product_id, component_id)
+ SELECT tf1.tracking_flag_id, ?, tf1.component_id FROM tracking_flags_visibility tf1
+ LEFT JOIN tracking_flags_visibility tf2
+ ON tf1.tracking_flag_id = tf2.tracking_flag_id
+ AND tf2.product_id = ?
+ WHERE tf1.product_id = ?
+ AND tf2.tracking_flag_id IS NULL",
+ undef,
+ $tgtprodid, $tgtprodid, $srcprodid);
+
# It's complex to determine which items now need to be flushed from memcached.
# As this is expected to be a rare event, we just flush the entire cache.
Bugzilla->memcached->clear_all();
diff --git a/skins/standard/IE-fixes.css b/skins/standard/IE-fixes.css
index fd96e4afe..0e3443fcf 100644
--- a/skins/standard/IE-fixes.css
+++ b/skins/standard/IE-fixes.css
@@ -26,8 +26,8 @@ form#Create #comp_desc {
margin: .5em 1em;
}
-#bug_id_container, .search_field_grid,
-.search_email_fields, ul.bug_changes li {
+#bug_id_container, .search_field_grid,
+.search_email_fields, ul.bug_changes li {
zoom: 1;
display: inline;
}
diff --git a/skins/standard/attachment.css b/skins/standard/attachment.css
index cec2d49e1..008bc7031 100644
--- a/skins/standard/attachment.css
+++ b/skins/standard/attachment.css
@@ -133,10 +133,6 @@ table.attachment_info td {
display: block;
}
-#smallCommentFrame, #attachment_flags {
- float: left;
-}
-
#smallCommentFrame {
margin-right: 1.5em;
}
diff --git a/skins/standard/dependency-tree.css b/skins/standard/dependency-tree.css
index cab167171..0aea49704 100644
--- a/skins/standard/dependency-tree.css
+++ b/skins/standard/dependency-tree.css
@@ -17,7 +17,7 @@
* Rights Reserved.
*
* Contributor(s): Christian Reis <kiko@async.com.br>
- * André Batosti <batosti@async.com.br>
+ * André Batosti <batosti@async.com.br>
*/
ul.tree {
@@ -31,19 +31,19 @@ ul.tree ul {
display: block;
}
-ul.tree li {
+ul.tree li {
/* see http://www.kryogenix.org/code/browser/aqlists/ for idea */
- padding-top: 3px;
- text-indent: -1.2em;
- padding-left: 0.5em;
+ padding-top: 3px;
+ text-indent: -1.2em;
+ padding-left: 0.5em;
padding-bottom: 3px;
list-style-type: none;
background: url("dependency-tree/bug-item.png") no-repeat;
}
ul.tree li a.b {
- padding-left: 30px;
- margin-right: -14px;
+ padding-left: 30px;
+ margin-right: -14px;
text-decoration: none;
}
@@ -64,7 +64,7 @@ ul.tree a.tree_link img {
.summ_info {
/* change to inline if you would like to see the full bug details
* displayed in the list */
- display: none;
+ display: none;
font-size: 75%;
}
diff --git a/skins/standard/duplicates.css b/skins/standard/duplicates.css
index e89b72c59..c9fca7523 100644
--- a/skins/standard/duplicates.css
+++ b/skins/standard/duplicates.css
@@ -2,18 +2,18 @@
* 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 Everything Solved, Inc.
* Portions created by the Initial Developer are Copyright (C) 2009
* the Initial Developer. All Rights Reserved.
- *
+ *
* Contributor(s):
* Max Kanat-Alexander <mkanat@bugzilla.org>
*/
@@ -23,7 +23,7 @@
}
#duplicates_table .resolved {
- background-color: #d9d9d9;
+ background-color: #d9d9d9;
color: black;
}
diff --git a/skins/standard/enter_bug.css b/skins/standard/enter_bug.css
index 34be42f7a..7f610b82b 100644
--- a/skins/standard/enter_bug.css
+++ b/skins/standard/enter_bug.css
@@ -62,7 +62,7 @@
/* The Possible Duplicates table on enter_bug. */
#possible_duplicates th {
- text-align: center;
+ text-align: center;
background: none;
border-collapse: collapse;
}
diff --git a/skins/standard/global.css b/skins/standard/global.css
index e7028f892..3ccf6e8fb 100644
--- a/skins/standard/global.css
+++ b/skins/standard/global.css
@@ -79,6 +79,52 @@
}
/* fixed global header (end) */
+/* global message (begin) */
+ #message-container {
+ text-align: center;
+ line-height: 1.5;
+ }
+
+ #message-container .inner {
+ box-sizing: border-box;
+ margin: 0 auto;
+ padding: 8px;
+ width: 1024px;
+ }
+
+ #message-container p {
+ margin: 0;
+ }
+
+ #message-container .noscript {
+ color: #EEE;
+ background-color: #333;
+ }
+
+ #message-container .warning {
+ color: #EEE;
+ background-color: #C00;
+ }
+
+ #message-container .announcement {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.2);
+ color: #555;
+ background-color: lightyellow;
+ }
+
+ #message-container .announcement p.warning {
+ color: red;
+ }
+
+ /* Reset legacy style */
+ #message-container .announcement #message {
+ margin: 0;
+ border: 0;
+ padding: 0;
+ color: #555;
+ }
+/* global message (end) */
+
/* header (begin) */
#header {
flex: none;
@@ -243,7 +289,7 @@
}
#header .link-file .icon::before {
- content: '\E254';
+ content: '\E89C';
}
#header .link-dashboard .icon::before {
@@ -404,6 +450,7 @@
/* narrower global header (begin) */
@media screen and (max-width: 1024px) {
+ #message-container .inner,
#header .inner {
width: 800px;
}
@@ -1110,6 +1157,67 @@ select, select[multiple] {
font-size: 12px;
}
+.buttons.toggle[role="radiogroup"] {
+ display: inline-flex;
+}
+
+.buttons.toggle[role="radiogroup"] .item {
+ display: flex;
+}
+
+.buttons.toggle[role="radiogroup"] input[type="radio"] {
+ position: absolute;
+ left: -99999px;
+}
+
+.buttons.toggle[role="radiogroup"] label {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ z-index: 1;
+ border: 1px solid #B2B2B2;
+ padding: 4px 12px;
+ min-width: 1em;
+ min-height: 1em;
+ background-color: #FFF;
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, .1);
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ user-select: none;
+}
+
+.buttons.toggle[role="radiogroup"] .item:first-child label {
+ border-radius: 4px 0 0 4px;
+}
+
+.buttons.toggle[role="radiogroup"] .item:last-child label {
+ border-radius: 0 4px 4px 0;
+}
+
+.buttons.toggle[role="radiogroup"] .item:not(:first-child) label {
+ margin-left: -1px;
+ border-left-color: #D2D2D2;
+}
+
+.buttons.toggle[role="radiogroup"] .item:not(:last-child) label {
+ border-right-color: #D2D2D2;
+}
+
+.buttons.toggle[role="radiogroup"] input[type="radio"]:checked + label {
+ z-index: 2;
+ border-color: #B2B2B2;
+ color: #111;
+ background-color: #DDD;
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, .2);
+}
+
+.buttons.toggle[role="radiogroup"] input[type="radio"]:focus + label {
+ z-index: 2;
+ border-color: #42A4E0;
+ box-shadow: inset 1px 1px 2px rgba(0, 0, 0, .2), 0 0 0 2px rgba(73, 173, 227, .4);
+}
+
hr {
border: none;
height: 1px;
@@ -1122,14 +1230,6 @@ hr {
display: none;
}
-#mfa-warning {
- flex: none;
- margin: 0 -15px;
- padding: 10px 15px;
- color: #FFF;
- background-color: #FF5300;
-}
-
#bugzilla-body {
flex: auto;
position: relative;
diff --git a/skins/standard/index.css b/skins/standard/index.css
index 9fe9202db..62b7deb3f 100644
--- a/skins/standard/index.css
+++ b/skins/standard/index.css
@@ -50,34 +50,6 @@
font-weight: bold;
}
- .bz_common_actions {
- text-align: center;
- }
- .bz_common_actions ul {
- list-style-type: none;
- padding: 0;
- }
- .bz_common_actions ul li {
- display: inline;
- vertical-align: top;
- }
- .bz_common_actions ul li a {
- display: inline-block;
- height: 170px;
- width: 145px;
- margin: 0 2ex 2em 0;
- }
- .bz_common_actions ul li a span {
- position: relative;
- top: 90%;
- font-weight: bold;
- }
- .bz_common_actions a,
- .bz_common_actions a:visited,
- .bz_common_actions a:hover {
- text-decoration: none;
- }
-
#quicksearchForm
{
clear: both;
@@ -110,6 +82,76 @@
padding: 0;
}
+ #tiles {
+ display: flex;
+ margin: 32px 0;
+ padding: 0;
+ list-style-type: none;
+ }
+
+ #tiles li {
+ flex: none;
+ margin: 0;
+ padding: 0;
+ }
+
+ #tiles a {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ border-radius: 8px;
+ width: 160px;
+ height: 160px;
+ }
+
+ #tiles a:hover,
+ #tiles a:focus,
+ #tiles a:active {
+ background-color: rgba(0, 0, 0, .05);
+ text-decoration: none;
+ }
+
+ #tiles span {
+ display: block;
+ }
+
+ #tiles .icon {
+ width: 120px;
+ height: 120px;
+ font-size: 120px;
+ line-height: 120px;
+ font-family: "Material Icons";
+ color: #777;
+ }
+
+ #tile-docs .icon::before {
+ content: "\E887";
+ }
+
+ #tile-search .icon::before {
+ content: "\E8A0";
+ }
+
+ #tile-new-bug .icon::before {
+ content: "\E89C";
+ }
+
+ #tile-prefs .icon::before {
+ content: "\E8B8";
+ }
+
+ #tile-new-account .icon::before,
+ #tile-login .icon::before {
+ content: "\E853";
+ }
+
+ #tiles .label {
+ margin-top: 4px;
+ font-size: 14px;
+ color: #555;
+ }
+
ul.additional_links
{
list-style: none;
@@ -135,49 +177,5 @@
{
color: #ccc;
}
-/* index page (end) */
-
-
- #enter_bug
- {
- background: url(../../images/bugzilla-papericon.png) no-repeat;
- }
- #query
- {
- background: url(../../images/bugzilla-magnifier.png) no-repeat;
- }
- #account
- {
- background: url(../../images/bugzilla-person-alternate.png) no-repeat;
- margin-right: 0;
- }
- #docs
- {
- background: url(../../images/bugzilla-questionmark2.png) no-repeat !important;
- }
-
- #page-index .intro { display: inline; }
- #docs { background: url(../standard/index/help.png) no-repeat; }
-
- .bz_common_actions
- {
- display: block;
- height: 170px;
- width: 145px;
- float: left;
- margin: 0 2ex 2em 0;
- text-align: center;
- }
- .bz_common_actions span
- {
- position: relative;
- top: 95%;
- font-weight: bold;
- }
- .bz_common_actions,
- .bz_common_actions:visited,
- .bz_common_actions:hover
- {
- text-decoration: none;
- }
+/* index page (end) */
diff --git a/skins/standard/index/file-a-bug.png b/skins/standard/index/file-a-bug.png
deleted file mode 100644
index cf4c941b6..000000000
--- a/skins/standard/index/file-a-bug.png
+++ /dev/null
Binary files differ
diff --git a/skins/standard/index/help.png b/skins/standard/index/help.png
deleted file mode 100644
index 6f9035b64..000000000
--- a/skins/standard/index/help.png
+++ /dev/null
Binary files differ
diff --git a/skins/standard/index/new-account.png b/skins/standard/index/new-account.png
deleted file mode 100644
index 4ad9ff203..000000000
--- a/skins/standard/index/new-account.png
+++ /dev/null
Binary files differ
diff --git a/skins/standard/index/search.png b/skins/standard/index/search.png
deleted file mode 100644
index 8d33ebd1e..000000000
--- a/skins/standard/index/search.png
+++ /dev/null
Binary files differ
diff --git a/skins/standard/search_form.css b/skins/standard/search_form.css
index 71ce22484..d191fac4d 100644
--- a/skins/standard/search_form.css
+++ b/skins/standard/search_form.css
@@ -14,7 +14,7 @@
* Portions created by the Initial Developer are Copyright (C) 2010 the
* Initial Developer. All Rights Reserved.
*
- * Contributor(s):
+ * Contributor(s):
* Guy Pyrzak <guy.pyrzak@gmail.com>
*/
@@ -26,7 +26,7 @@
white-space: nowrap;
}
-#bug_id_container {
+#bug_id_container {
display: inline-block;
vertical-align: middle;
padding-bottom: 1ex;
@@ -36,7 +36,7 @@
width: 9em;
}
-.container_date_from,
+.container_date_from,
.container_date_to {
width: 14em;
padding-bottom: 1ex;
@@ -59,15 +59,15 @@
display: inline-block;
}
-.search_field_grid .field_help_link,
-.history_query .field_help_link
+.search_field_grid .field_help_link,
+.history_query .field_help_link
{
display: block;
text-align: left;
}
#chart .section_help {
- font-size: 0.8em;
+ font-size: 0.8em;
font-weight: normal
}
@@ -88,7 +88,7 @@
display: block;
}
-#summary_field.search_field_row input,
+#summary_field.search_field_row input,
#summary_field.search_field_row select
{
display: inline;
@@ -164,13 +164,13 @@ div.bz_section_title {
}
div.bz_section_title a {
- font-weight: bold;
+ font-weight: bold;
}
div.bz_section_title span {
font-size: 0.75em;
- margin-left: 1em;
-}
+ margin-left: 1em;
+}
#summary_field label {
font-weight: bold;
@@ -184,9 +184,9 @@ div.bz_section_title span {
margin-top: 2em;
}
-.hide_people_filter #people_filter_section,
-.hide_history_filter #history_filter_section,
-.hide_detailed_information #detailed_information_section
+.hide_people_filter #people_filter_section,
+.hide_history_filter #history_filter_section,
+.hide_detailed_information #detailed_information_section
{
display: none;
}
diff --git a/skins/standard/show_bug.css b/skins/standard/show_bug.css
index 0ef6722f9..2326e6046 100644
--- a/skins/standard/show_bug.css
+++ b/skins/standard/show_bug.css
@@ -1,9 +1,9 @@
.bz_alias_short_desc_container {
- margin: 8px 0;
- padding: 0.3em;
- background-color: rgb(208, 208, 208);
+ margin: 8px 0;
+ padding: 0.3em;
+ background-color: rgb(208, 208, 208);
border-radius: 0.5em;
- font-size: 125%;
+ font-size: 125%;
font-weight: bold;
}
@@ -30,7 +30,7 @@ table#flags {
}
.related_actions {
- font-size: 0.85em;
+ font-size: 0.85em;
float: right;
list-style-type: none;
white-space: nowrap;
@@ -86,7 +86,7 @@ table#flags {
text-align: center;
}
-.bz_time_tracking_table th,
+.bz_time_tracking_table th,
.bz_time_tracking_table td {
padding: 4px;
}
@@ -98,11 +98,11 @@ table#flags {
width: 7em;
}
-#summary tr td {
+#summary tr td {
vertical-align:top;
}
-#status {
+#status {
margin-bottom: 3ex;
}
diff --git a/t/.perlcritic-history b/t/.perlcritic-history
index fc5e3d6eb..0119922a7 100644
--- a/t/.perlcritic-history
+++ b/t/.perlcritic-history
@@ -77,7 +77,7 @@ $VAR1 = [
'Perl::Critic::Policy::Modules::RequireEndWithOne' => 0,
'Perl::Critic::Policy::InputOutput::ProhibitTwoArgOpen' => 2,
'Perl::Critic::Policy::ValuesAndExpressions::RequireConstantVersion' => 0,
- 'Perl::Critic::Policy::InputOutput::RequireCheckedSyscalls' => 3,
+ 'Perl::Critic::Policy::InputOutput::RequireCheckedSyscalls' => 4,
'Perl::Critic::Policy::ValuesAndExpressions::RequireInterpolationOfMetachars' => 0,
'Perl::Critic::Policy::TestingAndDebugging::RequireUseStrict' => 0,
'Perl::Critic::Policy::ControlStructures::ProhibitUntilBlocks' => 0,
diff --git a/t/006spellcheck.t b/t/006spellcheck.t
index 70181ef85..a7e7c6d72 100644
--- a/t/006spellcheck.t
+++ b/t/006spellcheck.t
@@ -75,9 +75,9 @@ foreach my $file (@testitems) {
last;
}
}
-
+
close (FILE);
-
+
if ($found_word) {
ok(0,"$file: found SPELLING ERROR $found_word --WARNING");
} else {
@@ -86,6 +86,6 @@ foreach my $file (@testitems) {
} else {
ok(0,"could not open $file for spellcheck --WARNING");
}
-}
+}
exit 0;
diff --git a/t/007util.t b/t/007util.t
index b8e9505d8..b6d23bc32 100644
--- a/t/007util.t
+++ b/t/007util.t
@@ -18,7 +18,7 @@ use Support::Files;
use Test::More tests => 17;
use DateTime;
-BEGIN {
+BEGIN {
use_ok('Bugzilla');
use_ok('Bugzilla::Util');
}
@@ -53,13 +53,13 @@ is(format_time("2002.11.24 00:05:56", "%Y-%m-%d %R %Z"), "2002-11-24 00:05 $tz",
my %email_strings = (
'somebody@somewhere.com' => 'somebody',
'Somebody <somebody@somewhere.com>' => 'Somebody <somebody>',
- 'One Person <one@person.com>, Two Person <two@person.com>'
+ 'One Person <one@person.com>, Two Person <two@person.com>'
=> 'One Person <one>, Two Person <two>',
'This string contains somebody@somewhere.com and also this@that.com'
=> 'This string contains somebody and also this',
);
foreach my $input (keys %email_strings) {
- is(Bugzilla::Util::email_filter($input), $email_strings{$input},
+ is(Bugzilla::Util::email_filter($input), $email_strings{$input},
"email_filter('$input')");
}
diff --git a/t/008filter.t b/t/008filter.t
index 443fb2b4f..d86e6c7a6 100644
--- a/t/008filter.t
+++ b/t/008filter.t
@@ -11,7 +11,7 @@
# This test scans all our templates for every directive. Having eliminated
# those which cannot possibly cause XSS problems, it then checks the rest
-# against the safe list stored in the filterexceptions.pl file.
+# against the safe list stored in the filterexceptions.pl file.
# Sample exploit code: '>"><script>alert('Oh dear...')</script>
@@ -42,17 +42,17 @@ foreach my $path (@Support::Templates::include_paths) {
chdir $topdir; # absolute path
my @testitems = Support::Templates::find_actual_files($path);
chdir $topdir; # absolute path
-
+
next unless @testitems;
-
+
# Some people require this, others don't. No-one knows why.
chdir $path; # relative path
-
+
# We load a %safe list of acceptable exceptions.
if (-r "filterexceptions.pl") {
do "filterexceptions.pl";
if (ON_WINDOWS) {
- # filterexceptions.pl uses / separated paths, while
+ # filterexceptions.pl uses / separated paths, while
# find_actual_files returns \ separated ones on Windows.
# Here, we convert the filter exception hash to use \.
foreach my $file (keys %safe) {
@@ -65,16 +65,16 @@ foreach my $path (@Support::Templates::include_paths) {
}
}
}
-
+
# We preprocess the %safe hash of lists into a hash of hashes. This allows
- # us to flag which members were not found, and report that as a warning,
+ # us to flag which members were not found, and report that as a warning,
# thereby keeping the lists clean.
foreach my $file (keys %safe) {
if (ref $safe{$file} eq 'ARRAY') {
my $list = $safe{$file};
$safe{$file} = {};
foreach my $directive (@$list) {
- $safe{$file}{$directive} = 0;
+ $safe{$file}{$directive} = 0;
}
}
}
@@ -105,14 +105,14 @@ foreach my $path (@Support::Templates::include_paths) {
if (!directive_ok($file, $directive)) {
# This intentionally makes no effort to eliminate duplicates; to do
- # so would merely make it more likely that the user would not
+ # so would merely make it more likely that the user would not
# escape all instances when attempting to correct an error.
push(@unfiltered, "$lineno:$directive");
}
- }
+ }
my $fullpath = File::Spec->catfile($path, $file);
-
+
if (@unfiltered) {
my $uflist = join("\n ", @unfiltered);
ok(0, "($lang/$flavor) $fullpath has unfiltered directives:\n $uflist\n--ERROR");
@@ -121,12 +121,12 @@ foreach my $path (@Support::Templates::include_paths) {
# Find any members of the exclusion list which were not found
my @notfound;
foreach my $directive (keys %{$safe{$file}}) {
- push(@notfound, $directive) if ($safe{$file}{$directive} == 0);
+ push(@notfound, $directive) if ($safe{$file}{$directive} == 0);
}
if (@notfound) {
my $nflist = join("\n ", @notfound);
- ok(0, "($lang/$flavor) $fullpath - filterexceptions.pl has extra members:\n $nflist\n" .
+ ok(0, "($lang/$flavor) $fullpath - filterexceptions.pl has extra members:\n $nflist\n" .
"--WARNING");
}
else {
@@ -141,7 +141,7 @@ sub directive_ok {
my ($file, $directive) = @_;
# Comments
- return 1 if $directive =~ /^#/;
+ return 1 if $directive =~ /^#/;
# Remove any leading/trailing whitespace.
$directive =~ s/^\s*//;
@@ -183,7 +183,7 @@ sub directive_ok {
# Simple assignments
return 1 if $directive =~ /^[\w\.\$\{\}]+\s+=\s+/;
- # Conditional literals with either sort of quotes
+ # Conditional literals with either sort of quotes
# There must be no $ in the string for it to be a literal
return 1 if $directive =~ /^(["'])[^\$]*[^\\]\1/;
return 1 if $directive =~ /^(["'])\1/;
@@ -191,10 +191,10 @@ sub directive_ok {
# Special values always used for numbers
return 1 if $directive =~ /^[ijkn]$/;
return 1 if $directive =~ /^count$/;
-
+
# Params
return 1 if $directive =~ /^Param\(/;
-
+
# Hooks
return 1 if $directive =~ /^Hook.process\(/;
@@ -206,12 +206,12 @@ sub directive_ok {
# Special Template Toolkit loop variable
return 1 if $directive =~ /^loop\.(index|count)$/;
-
+
# Branding terms
return 1 if $directive =~ /^terms\./;
-
+
# Things which are already filtered
- # Note: If a single directive prints two things, and only one is
+ # Note: If a single directive prints two things, and only one is
# filtered, we may not catch that case.
return 1 if $directive =~ /FILTER\ (html|csv|js|base64|css_class_quote|ics|
quoteUrls|time|uri|xml|lower|html_light|
diff --git a/t/009bugwords.t b/t/009bugwords.t
index 740cbf6aa..ebfd99507 100644
--- a/t/009bugwords.t
+++ b/t/009bugwords.t
@@ -9,9 +9,9 @@
#Bugzilla Test 9#
####bugwords#####
-# Bugzilla has a mechanism for taking various words, including "bug", "bugs",
+# Bugzilla has a mechanism for taking various words, including "bug", "bugs",
# and "a bug" and automatically replacing them in the templates with the local
-# terminology. It does this by using the 'terms' hash, so "bug" becomes
+# terminology. It does this by using the 'terms' hash, so "bug" becomes
# "[% terms.bug %]". This test makes sure the relevant words aren't used
# bare.
@@ -27,7 +27,7 @@ use Bugzilla::Util;
use File::Spec;
-use Test::More tests => ($Support::Templates::num_actual_files);
+use Test::More tests => ($Support::Templates::num_actual_files);
# Find all the templates
my @testitems;
@@ -38,10 +38,10 @@ for my $path (@Support::Templates::include_paths) {
foreach my $file (@testitems) {
my @errors;
-
+
# Read the entire file into a string
local $/;
- open (FILE, "<$file") || die "Can't open $file: $!\n";
+ open (FILE, "<$file") || die "Can't open $file: $!\n";
my $slurp = <FILE>;
close (FILE);
@@ -53,7 +53,7 @@ foreach my $file (@testitems) {
my @lineno = ($` =~ m/\n/gs);
my $lineno = scalar(@lineno) + 1;
-
+
# "a bug", "bug", "bugs"
if (grep /(a?[\s>]bugs?[\s.:;,<])/i, $text) {
# Exclude variable assignment.
@@ -63,14 +63,14 @@ foreach my $file (@testitems) {
}
}
}
-
+
if (scalar(@errors)) {
ok(0, "$file contains invalid bare words (e.g. 'bug') --WARNING");
-
+
foreach my $error (@errors) {
print "$error->[0]: $error->[1]\n";
}
- }
+ }
else {
ok(1, "$file has no invalid barewords");
}
diff --git a/t/012throwables.t b/t/012throwables.t
index 4317c0e89..af7a27eb2 100644
--- a/t/012throwables.t
+++ b/t/012throwables.t
@@ -48,7 +48,7 @@ foreach my $include_path (@include_paths) {
my $file = File::Spec->catfile($include_path, $path);
$file =~ s/\s.*$//; # nuke everything after the first space
$file =~ s|\\|/|g if ON_WINDOWS; # convert \ to / in path if on windows
- $test_templates{$file} = ()
+ $test_templates{$file} = ()
if $file =~ m#global/(code|user)-error(?:-errors)?\.html\.tmpl#;
# Make sure the extension is not disabled
@@ -77,14 +77,14 @@ foreach my $file (keys %test_templates) {
Register(\%test_templates, $file, "could not open file --WARNING");
next;
}
-
+
my $lineno=0;
while (my $line = <TMPL>) {
$lineno++;
if ($line =~ /\[%\s[A-Z]+\s*error\s*==\s*"(.+)"\s*%\]/) {
my $errtag = $1;
if ($errtag =~ /\s/) {
- Register(\%test_templates, $file,
+ Register(\%test_templates, $file,
"has an error definition \"$errtag\" at line $lineno with "
. "space(s) embedded --ERROR");
}
@@ -125,7 +125,7 @@ foreach my $file (keys %test_modules) {
push @{$Errors{$errtype}{$errtag}{used_in}{$file}}, $lineno;
}
}
-
+
close(TMPL);
}
@@ -148,7 +148,7 @@ foreach my $errtype (keys %Errors) {
if (scalar @langs) {
UsedIn($errtype, $errtag, join(', ',@langs));
}
-
+
# Now check for tag usage in all DEFINED languages
foreach my $lang (keys %{$Errors{$errtype}{$errtag}{defined_in}}) {
if (!defined $Errors{$errtype}{$errtag}{used_in}) {
@@ -162,7 +162,7 @@ foreach my $errtype (keys %Errors) {
# And make sure that everything defined in WS_ERROR_CODE
# is actually a valid error.
foreach my $err_name (keys %{WS_ERROR_CODE()}) {
- if (!defined $Errors{'code'}{$err_name}
+ if (!defined $Errors{'code'}{$err_name}
&& !defined $Errors{'user'}{$err_name})
{
Register(\%test_modules, 'WS_ERROR_CODE',
@@ -218,18 +218,18 @@ sub UsedIn {
my ($errtype, $errtag, $lang) = @_;
$lang = $lang || "any";
foreach my $file (keys %{$Errors{$errtype}{$errtag}{used_in}}) {
- Register(\%test_modules, $file,
- "$errtype error tag '$errtag' is used at line(s) ("
- . join (',', @{$Errors{$errtype}{$errtag}{used_in}{$file}})
+ Register(\%test_modules, $file,
+ "$errtype error tag '$errtag' is used at line(s) ("
+ . join (',', @{$Errors{$errtype}{$errtag}{used_in}{$file}})
. ") but not defined for language(s): $lang");
}
}
sub DefinedIn {
my ($errtype, $errtag, $lang) = @_;
foreach my $file (keys %{$Errors{$errtype}{$errtag}{defined_in}{$lang}}) {
- Register(\%test_templates, $file,
+ Register(\%test_templates, $file,
"$errtype error tag '$errtag' is defined at line(s) ("
- . join (',', @{$Errors{$errtype}{$errtag}{defined_in}{$lang}{$file}})
+ . join (',', @{$Errors{$errtype}{$errtag}{defined_in}{$lang}{$file}})
. ") but is not used anywhere", 1);
}
}
diff --git a/t/json-boxes.t b/t/json-boxes.t
new file mode 100644
index 000000000..4d9816e83
--- /dev/null
+++ b/t/json-boxes.t
@@ -0,0 +1,36 @@
+#!/usr/bin/perl
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+use strict;
+use warnings;
+use 5.10.1;
+use lib qw( . lib local/lib/perl5 );
+
+use Scalar::Util qw(weaken);
+use Mojo::JSON qw(encode_json);
+use Scalar::Util qw(refaddr);
+use Test2::V0;
+
+use ok 'Bugzilla::WebService::JSON';
+
+my $json = Bugzilla::WebService::JSON->new;
+my $ref = {foo => 1};
+is(refaddr $json->decode($json->encode($ref)), refaddr $ref);
+
+my $box = $json->encode($ref);
+
+is($json->decode(q[{"foo":1}]), {foo => 1});
+is($json->decode($box), {foo => 1});
+
+is "$box", $box->label;
+
+$box->encode;
+
+is encode_json([ $box ]), encode_json([ encode_json($box->value) ]);
+is "$box", q[{"foo":1}];
+
+done_testing;
diff --git a/t/markdown.t b/t/markdown.t
index 0344706c9..83e0dc051 100644
--- a/t/markdown.t
+++ b/t/markdown.t
@@ -9,7 +9,7 @@ use strict;
use warnings;
use lib qw( . lib local/lib/perl5 );
use Bugzilla;
-use Test::More;
+use Test2::V0;
my $parser = Bugzilla->markdown_parser;
@@ -61,7 +61,9 @@ my $table_html = <<'HTML';
<tr>
<td>val1</td>
<td align="center">val2</td>
-</tr></tbody></table>
+</tr>
+</tbody>
+</table>
HTML
is(
diff --git a/t/mojo-example.t b/t/mojo-example.t
new file mode 100644
index 000000000..8ed4835da
--- /dev/null
+++ b/t/mojo-example.t
@@ -0,0 +1,76 @@
+#!/usr/bin/perl
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+use strict;
+use warnings;
+use 5.10.1;
+use lib qw( . lib local/lib/perl5 );
+
+BEGIN {
+ $ENV{LOG4PERL_CONFIG_FILE} = 'log4perl-t.conf';
+ # There's a plugin called Hostage that makes the application require specific Host: headers.
+ # we disable that for these tests.
+ $ENV{BUGZILLA_DISABLE_HOSTAGE} = 1;
+}
+
+# this provides a default urlbase.
+# Most localconfig options the other Bugzilla::Test::Mock* modules take care for us.
+use Bugzilla::Test::MockLocalconfig ( urlbase => 'http://bmo-web.vm' );
+
+# This configures an in-memory sqlite database.
+use Bugzilla::Test::MockDB;
+
+# This redirects reads and writes from the config file (data/params)
+use Bugzilla::Test::MockParams (
+ phabricator_enabled => 1,
+ announcehtml => '<div id="announcement">Mojo::Test is awesome</div>',
+);
+
+# Util provides a few functions more making mock data in the DB.
+use Bugzilla::Test::Util qw(create_user issue_api_key);
+
+use Test2::V0;
+use Test2::Tools::Mock;
+use Test::Mojo;
+
+my $api_user = create_user('api@mozilla.org', '*');
+my $api_key = issue_api_key('api@mozilla.org')->api_key;
+
+# Mojo::Test loads the application and provides methods for
+# testing requests without having to run a server.
+my $t = Test::Mojo->new('Bugzilla::Quantum');
+
+# we ensure this file exists so the /__lbhearbeat__ test passes.
+$t->app->home->child('__lbheartbeat__')->spurt('httpd OK');
+
+# Method chaining is used extensively.
+$t->get_ok('/__lbheartbeat__')->status_is(200)->content_is('httpd OK');
+
+# this won't work until we can mock memcached.
+# $t->get_ok('/__heartbeat__')->status_is(200);
+
+# we can use json_is or json_like to check APIs.
+# The first pair to json_like is a JSON pointer (RFC 6901)
+$t->get_ok('/bzapi/configuration')->status_is(200)->json_like( '/announcement' => qr/Mojo::Test is awesome/ );
+
+# for web requests, you use text_like (or text_is) with CSS selectors.
+$t->get_ok('/')->status_is(200)->text_like( '#announcement' => qr/Mojo::Test is awesome/ );
+
+# Chaining is not magical, you can break up longer lines
+# by calling methods on $t, as below.
+$t->get_ok('/rest/whoami' => { 'X-Bugzilla-API-Key' => $api_key });
+$t->status_is(200);
+$t->json_is('/name' => $api_user->login);
+$t->json_is('/id' => $api_user->id);
+
+# Each time you call $t->get_ok, post_ok, etc the previous request is cleared.
+$t->get_ok('/rest/whoami');
+$t->status_is(200);
+$t->json_is('/name' => '');
+$t->json_is('/id' => 0);
+
+done_testing;
diff --git a/t/security-risk.t b/t/security-risk.t
new file mode 100644
index 000000000..520953bc0
--- /dev/null
+++ b/t/security-risk.t
@@ -0,0 +1,156 @@
+#!/usr/bin/perl
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+# This Source Code Form is "Incompatible With Secondary Licenses", as
+# defined by the Mozilla Public License, v. 2.0.
+use strict;
+use warnings;
+use 5.10.1;
+use lib qw( . lib local/lib/perl5 );
+use Bugzilla;
+
+BEGIN { Bugzilla->extensions };
+
+use Test::More;
+use Test2::Tools::Mock;
+use Try::Tiny;
+
+use ok 'Bugzilla::Report::SecurityRisk';
+can_ok('Bugzilla::Report::SecurityRisk', qw(new results));
+
+sub check_open_state_mock {
+ my ($state) = @_;
+ return grep { /^$state$/ } qw(UNCOMFIRMED NEW ASSIGNED REOPENED);
+}
+
+try {
+ use Bugzilla::Report::SecurityRisk;
+ my $report = Bugzilla::Report::SecurityRisk->new(
+ start_date => DateTime->new( year => 2000, month => 1, day => 9 ),
+ end_date => DateTime->new( year => 2000, month => 1, day => 16 ),
+ products => [ 'Firefox', 'Core' ],
+ sec_keywords => [ 'sec-critical', 'sec-high' ],
+ check_open_state => \&check_open_state_mock,
+ initial_bug_ids => [ 1, 2, 3, 4 ],
+ initial_bugs => {
+ 1 => {
+ id => 1,
+ product => 'Firefox',
+ sec_level => 'sec-high',
+ is_open => 0,
+ created_at => DateTime->new( year => 2000, month => 1, day => 1 ),
+ },
+ 2 => {
+ id => 2,
+ product => 'Core',
+ sec_level => 'sec-critical',
+ is_open => 0,
+ created_at => DateTime->new( year => 2000, month => 1, day => 1 ),
+ },
+ 3 => {
+ id => 3,
+ product => 'Core',
+ sec_level => 'sec-high',
+ is_open => 1,
+ created_at => DateTime->new( year => 2000, month => 1, day => 5 ),
+ },
+ 4 => {
+ id => 4,
+ product => 'Firefox',
+ sec_level => 'sec-critical',
+ is_open => 1,
+ created_at => DateTime->new( year => 2000, month => 1, day => 10 ),
+ },
+ },
+ events => [
+ # Canned event's should be in reverse chronological order.
+ {
+ bug_id => 2,
+ bug_when => DateTime->new( year => 2000, month => 1, day => 14 ),
+ field_name => 'keywords',
+ removed => '',
+ added => 'sec-critical',
+
+ },
+ {
+ bug_id => 1,
+ bug_when => DateTime->new( year => 2000, month => 1, day => 12 ),
+ field_name => 'bug_status',
+ removed => 'ASSIGNED',
+ added => 'RESOLVED',
+ },
+ ],
+ );
+ my $actual_results = $report->results;
+ my $expected_results = [
+ {
+ date => DateTime->new( year => 2000, month => 1, day => 9 ),
+ bugs_by_product => {
+ 'Firefox' => {
+ # Rewind the event that caused 1 to close.
+ open => [1],
+ closed => [],
+ median_age_open => 8
+ },
+ 'Core' => {
+ # 2 wasn't a sec-critical bug on the report date.
+ open => [3],
+ closed => [],
+ median_age_open => 4
+ }
+ },
+ bugs_by_sec_keyword => {
+ 'sec-critical' => {
+ # 2 wasn't a sec-crtical bug and 4 wasn't created yet on the report date.
+ open => [],
+ closed => [],
+ median_age_open => 0
+ },
+ 'sec-high' => {
+ # Rewind the event that caused 1 to close.
+ open => [ 1, 3 ],
+ closed => [],
+ median_age_open => 6
+ }
+ },
+ },
+ { # The report on 2000-01-16 matches the state of initial_bugs.
+ date => DateTime->new( year => 2000, month => 1, day => 16 ),
+ bugs_by_product => {
+ 'Firefox' => {
+ open => [4],
+ closed => [1],
+ median_age_open => 6
+ },
+ 'Core' => {
+ open => [3],
+ closed => [2],
+ median_age_open => 11
+ }
+ },
+ bugs_by_sec_keyword => {
+ 'sec-critical' => {
+ open => [4],
+ closed => [2],
+ median_age_open => 6
+ },
+ 'sec-high' => {
+ open => [3],
+ closed => [1],
+ median_age_open => 11
+ }
+ },
+ },
+ ];
+
+ is_deeply($actual_results, $expected_results, 'Report results are accurate');
+
+}
+catch {
+ fail('got an exception during main part of test');
+ diag($_);
+};
+
+done_testing;
diff --git a/template/en/default/account/auth/login.html.tmpl b/template/en/default/account/auth/login.html.tmpl
index 8cf5e85ef..84e5bd62a 100644
--- a/template/en/default/account/auth/login.html.tmpl
+++ b/template/en/default/account/auth/login.html.tmpl
@@ -26,7 +26,7 @@
[% IF !target %]
[% target = "index.cgi" %]
[% END %]
-
+
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
@@ -57,7 +57,7 @@
<input type="password" id="Bugzilla_password" name="Bugzilla_password" required>
</div>
- [% IF Param('rememberlogin') == 'defaulton' ||
+ [% IF Param('rememberlogin') == 'defaulton' ||
Param('rememberlogin') == 'defaultoff' %]
<div class="field-remember">
<input type="checkbox" id="Bugzilla_remember" name="Bugzilla_remember" value="on"
diff --git a/template/en/default/account/create.html.tmpl b/template/en/default/account/create.html.tmpl
index 914fe05b4..f557d05db 100644
--- a/template/en/default/account/create.html.tmpl
+++ b/template/en/default/account/create.html.tmpl
@@ -20,7 +20,7 @@
[%# INTERFACE
# none
- #
+ #
# Param("maintainer") is used to display the maintainer's email.
# Param("emailsuffix") is used to pre-fill the email field.
#%]
diff --git a/template/en/default/account/created.html.tmpl b/template/en/default/account/created.html.tmpl
index d794198bc..539fb44c2 100644
--- a/template/en/default/account/created.html.tmpl
+++ b/template/en/default/account/created.html.tmpl
@@ -37,4 +37,4 @@
created within [% constants.MAX_TOKEN_AGE FILTER html %] days.
</p>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/account/email/confirm.html.tmpl b/template/en/default/account/email/confirm.html.tmpl
index 39add3238..c0f094366 100644
--- a/template/en/default/account/email/confirm.html.tmpl
+++ b/template/en/default/account/email/confirm.html.tmpl
@@ -21,7 +21,7 @@
[%# INTERFACE:
# token: string. The token to be used in this address change.
#%]
-
+
[% title = "Confirm Change Email" %]
[% PROCESS global/header.html.tmpl %]
diff --git a/template/en/default/account/email/request-new.txt.tmpl b/template/en/default/account/email/request-new.txt.tmpl
index 8fb36926f..45f5ab11f 100644
--- a/template/en/default/account/email/request-new.txt.tmpl
+++ b/template/en/default/account/email/request-new.txt.tmpl
@@ -29,7 +29,7 @@ X-Bugzilla-Type: admin
[%+ terms.Bugzilla %] has received a request to create a user account
using your email address ([% email %]).
-To continue creating an account using this email address, visit the
+To continue creating an account using this email address, visit the
following link by [% expiration_ts FILTER time("%B %e, %Y at %H:%M %Z") %]:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=request_new_account
diff --git a/template/en/default/account/password/forgotten-password.txt.tmpl b/template/en/default/account/password/forgotten-password.txt.tmpl
index e014658dc..70373f52b 100644
--- a/template/en/default/account/password/forgotten-password.txt.tmpl
+++ b/template/en/default/account/password/forgotten-password.txt.tmpl
@@ -25,7 +25,7 @@ To: [% emailaddress %]
Subject: [% terms.Bugzilla %] Change Password Request
X-Bugzilla-Type: admin
-You have (or someone impersonating you has) requested to change your
+You have (or someone impersonating you has) requested to change your
[%+ terms.Bugzilla %] password. To complete the change, visit the following link:
[%+ urlbase %]token.cgi?t=[% token FILTER uri %]&a=cfmpw
diff --git a/template/en/default/account/prefs/apikey.html.tmpl b/template/en/default/account/prefs/apikey.html.tmpl
index cdbee848b..c4b4074c1 100644
--- a/template/en/default/account/prefs/apikey.html.tmpl
+++ b/template/en/default/account/prefs/apikey.html.tmpl
@@ -34,25 +34,15 @@ here.</p>
<th>Revoked</th>
</tr>
- [%# because mozreview api-keys only work for the mozreview api, we hide the
- # key and prevent renaming #%]
[% FOREACH api_key IN api_keys %]
<tr[% IF api_key.revoked %] class="apikey_revoked bz_tui_hidden" style="display:none"[% END %]>
<td>
- [% IF api_key.is_mozreview %]
- <i>hidden</i>
- [% ELSE %]
- [% api_key.api_key FILTER html %]
- [% END %]
+ [% api_key.api_key FILTER html %]
</td>
<td>
- [% IF api_key.is_mozreview %]
- MozReview
- [% ELSE %]
- <input name="description_[% api_key.id FILTER html %]"
- id="description_[% api_key.id FILTER html %]"
- value="[% api_key.description FILTER html %]">
- [% END %]
+ <input name="description_[% api_key.id FILTER html %]"
+ id="description_[% api_key.id FILTER html %]"
+ value="[% api_key.description FILTER html %]">
</td>
[% IF api_key.last_used %]
<td>[% api_key.last_used FILTER time %]
diff --git a/template/en/default/account/prefs/email.html.tmpl b/template/en/default/account/prefs/email.html.tmpl
index 014bf4f3d..132625368 100644
--- a/template/en/default/account/prefs/email.html.tmpl
+++ b/template/en/default/account/prefs/email.html.tmpl
@@ -78,7 +78,7 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
<td width="150"></td>
<td>
[% prefname = "email-$constants.REL_ANY-$constants.EVT_FLAG_REQUESTED" %]
- <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
+ <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1"
[% " checked"
IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_FLAG_REQUESTED} %]>
@@ -90,7 +90,7 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
<td width="150"></td>
<td>
[% prefname = "email-$constants.REL_ANY-$constants.EVT_REQUESTED_FLAG" %]
- <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
+ <input type="checkbox" name="[% prefname %]" id="[% prefname %]"
value="1"
[% " checked"
IF user.mail_settings.${constants.REL_ANY}.${constants.EVT_REQUESTED_FLAG} %]>
@@ -159,7 +159,7 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
] %]
[% IF Param('useqacontact') %]
- [% relationships.push({ id = constants.REL_QA,
+ [% relationships.push({ id = constants.REL_QA,
description = "QA Contact" }) %]
[% END %]
@@ -188,18 +188,18 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
</th>
[% END %]
</tr>
-
- [% FOREACH event = events %]
+
+ [% FOREACH event = events %]
[% count = loop.count() %]
<tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
[% FOREACH relationship = relationships %]
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="email-[% relationship.id %]-[% event.id %]"
value="1"
[%# The combinations don't always make sense; disable a couple %]
- [% IF event.id == constants.EVT_ADDED_REMOVED AND
- no_added_removed.contains(relationship.id)
+ [% IF event.id == constants.EVT_ADDED_REMOVED AND
+ no_added_removed.contains(relationship.id)
%]
disabled
[% ELSIF user.mail_settings.${relationship.id}.${event.id} %]
@@ -212,9 +212,9 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
</td>
</tr>
[% END %]
-
+
<tr>
- <td colspan="[% num_columns FILTER html %]"
+ <td colspan="[% num_columns FILTER html %]"
align="center" width="50%">
&nbsp;
</td>
@@ -223,12 +223,12 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
</td>
</tr>
- [% FOREACH event = neg_events %]
+ [% FOREACH event = neg_events %]
[% count = loop.count() %]
<tr class="bz_row_[% count % 2 == 1 ? "odd" : "even" %]">
[% FOREACH relationship = relationships %]
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="neg-email-[% relationship.id %]-[% event.id %]"
value="1"
[% " checked" IF NOT user.mail_settings.${relationship.id}.${event.id} %]>
@@ -239,16 +239,16 @@ document.write('<input type="button" value="Disable All Bugmail" onclick="SetChe
</td>
</tr>
[% END %]
-
+
</table>
<hr>
<b>User Watching</b>
<p>
-If you watch a user, it is as if you are standing in their shoes for the
+If you watch a user, it is as if you are standing in their shoes for the
purposes of getting email. Email is sent or not according to <u>your</u>
-preferences for <u>their</u> relationship to the [% terms.bug %]
+preferences for <u>their</u> relationship to the [% terms.bug %]
(e.g. Assignee).
</p>
@@ -277,7 +277,7 @@ You are currently not watching any users.
size => 60
multiple => 5
%]
-</p>
+</p>
<p id="watching_you">Users watching you:<br>
[% IF watchers.size %]
@@ -294,7 +294,7 @@ You are currently not watching any users.
<p>
You can specify a list of [% terms.bugs %] from which you never want to get
any email notification of any kind by adding their ID(s) as a comma-separated
- list. Removing [% terms.abug %] by selecting it from the current ignored list
+ list. Removing [% terms.abug %] by selecting it from the current ignored list
will re-enable email notifications for the [% terms.bug %].
</p>
[% IF user.bugs_ignored.size %]
@@ -324,5 +324,5 @@ You are currently not watching any users.
[% END %]
<p>Add [% terms.bugs %]:<br>
- <input type="text" id="add_ignored_bugs"
+ <input type="text" id="add_ignored_bugs"
name="add_ignored_bugs" size="60"></p>
diff --git a/template/en/default/account/prefs/permissions.html.tmpl b/template/en/default/account/prefs/permissions.html.tmpl
index d3c787b07..a4597205c 100644
--- a/template/en/default/account/prefs/permissions.html.tmpl
+++ b/template/en/default/account/prefs/permissions.html.tmpl
@@ -85,7 +85,7 @@
[% IF user.in_group('bz_sudoers') %]
<br>
- You are a member of the <b>bz_sudoers</b> group, so you can
+ You are a member of the <b>bz_sudoers</b> group, so you can
<a href="relogin.cgi?action=prepare-sudo">impersonate someone else</a>.
[% END %]
</td>
diff --git a/template/en/default/account/prefs/prefs.html.tmpl b/template/en/default/account/prefs/prefs.html.tmpl
index ec24eb100..631b08a10 100644
--- a/template/en/default/account/prefs/prefs.html.tmpl
+++ b/template/en/default/account/prefs/prefs.html.tmpl
@@ -25,11 +25,11 @@
# description: string. Description of the tab (used in tab title).
# saveable: boolean. True if tab has a form which can be submitted.
# True if user is not receiving self-generated mail.
- # Note: For each tab name, a template "prefs/${tab.name}.tmpl" must exist,
+ # Note: For each tab name, a template "prefs/${tab.name}.tmpl" must exist,
# and its interface must be fulfilled.
# current_tab: A direct reference to one of the hashes in the tabs list.
# This tab will be displayed.
- # changes_saved: boolean/string. True if the CGI processed form data before
+ # changes_saved: boolean/string. True if the CGI processed form data before
# displaying anything, and can contain an optional custom
# message if required (which Perl still evaluates as True).
# dont_show_button: boolean. Prevent the display of the "Submit Changes" button.
@@ -134,7 +134,7 @@
<input type="hidden" name="token" value="[% token FILTER html %]">
[% END %]
-[% PROCESS "account/prefs/${current_tab.name}.html.tmpl"
+[% PROCESS "account/prefs/${current_tab.name}.html.tmpl"
IF current_tab.name.defined %]
[% IF current_tab.saveable %]
diff --git a/template/en/default/account/prefs/saved-searches.html.tmpl b/template/en/default/account/prefs/saved-searches.html.tmpl
index 426b593dc..e611aa682 100644
--- a/template/en/default/account/prefs/saved-searches.html.tmpl
+++ b/template/en/default/account/prefs/saved-searches.html.tmpl
@@ -43,7 +43,7 @@
<p>Your saved searches are as follows:</p>
<blockquote>
- <table border="1" cellpadding="3">
+ <table border="1" cellpadding="3">
<tr>
<th>
Search
@@ -82,7 +82,7 @@
&nbsp;
</td>
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="showmybugslink"
value="1"
[% " checked" IF user.showmybugslink %]>
@@ -114,7 +114,7 @@
[% END %]
</td>
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="link_in_footer_[% q.id FILTER html %]"
value="1"
alt="[% q.name FILTER html %]"
@@ -127,7 +127,7 @@
<option value="">Don't share</option>
[% FOREACH group = queryshare_groups %]
<option value="[% group.id %]"
- [% ' selected="selected"'
+ [% ' selected="selected"'
IF q.shared_with_group.id == group.id %]
>[% group.name FILTER html %]</option>
[% END %]
@@ -160,7 +160,7 @@
[% IF user.queries_available.size %]
<p>You may use these searches saved and shared by others:</p>
- <table border="1" cellpadding="3">
+ <table border="1" cellpadding="3">
<tr>
<th>
Search
@@ -197,7 +197,7 @@
[% q.name FILTER uri %]">Edit</a>
</td>
<td align="center">
- <input type="checkbox"
+ <input type="checkbox"
name="link_in_footer_[% q.id FILTER html %]"
value="1"
alt="[% q.name FILTER html %]"
diff --git a/template/en/default/account/profile-activity.html.tmpl b/template/en/default/account/profile-activity.html.tmpl
index aa6a63e85..64a950e86 100644
--- a/template/en/default/account/profile-activity.html.tmpl
+++ b/template/en/default/account/profile-activity.html.tmpl
@@ -26,7 +26,7 @@
# listselectionvalues: selection values to recreate the current user list.
#
# profile_changes: An array of hashes containing the following fields:
- #
+ #
# who: string; login name of who made the change
# activity_when: string; when the change was made
# what: string; the description of the field which was changed
@@ -83,4 +83,4 @@
[% END %]
</p>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/add.html.tmpl b/template/en/default/admin/classifications/add.html.tmpl
index 1a6941f67..90b15d539 100644
--- a/template/en/default/admin/classifications/add.html.tmpl
+++ b/template/en/default/admin/classifications/add.html.tmpl
@@ -34,6 +34,6 @@
<input type="hidden" name="token" value="[% token FILTER html %]">
</FORM>
-[% PROCESS admin/classifications/footer.html.tmpl %]
+[% PROCESS admin/classifications/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/del.html.tmpl b/template/en/default/admin/classifications/del.html.tmpl
index 5a3800f7a..ffd7d2f02 100644
--- a/template/en/default/admin/classifications/del.html.tmpl
+++ b/template/en/default/admin/classifications/del.html.tmpl
@@ -58,6 +58,6 @@
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
-[% PROCESS admin/classifications/footer.html.tmpl %]
+[% PROCESS admin/classifications/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/edit-common.html.tmpl b/template/en/default/admin/classifications/edit-common.html.tmpl
index e0db0089f..b839c9384 100644
--- a/template/en/default/admin/classifications/edit-common.html.tmpl
+++ b/template/en/default/admin/classifications/edit-common.html.tmpl
@@ -24,7 +24,7 @@
<tr>
<th align="right">Classification:</th>
- <td><input size=64 maxlength=64 name="classification"
+ <td><input size=64 maxlength=64 name="classification"
value="[% classification.name FILTER html %]"></td>
</tr>
<tr>
diff --git a/template/en/default/admin/classifications/edit.html.tmpl b/template/en/default/admin/classifications/edit.html.tmpl
index 17d04de67..138ecd50b 100644
--- a/template/en/default/admin/classifications/edit.html.tmpl
+++ b/template/en/default/admin/classifications/edit.html.tmpl
@@ -55,13 +55,13 @@
</tr>
</table>
- <input type=hidden name="classificationold"
+ <input type=hidden name="classificationold"
value="[% classification.name FILTER html %]">
<input type=hidden name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type=submit value="Update">
</form>
-[% PROCESS admin/classifications/footer.html.tmpl %]
+[% PROCESS admin/classifications/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/classifications/select.html.tmpl b/template/en/default/admin/classifications/select.html.tmpl
index bc78cbb6e..af29be324 100644
--- a/template/en/default/admin/classifications/select.html.tmpl
+++ b/template/en/default/admin/classifications/select.html.tmpl
@@ -34,7 +34,7 @@
[% FOREACH cl = classifications %]
<tr>
<td valign="top"><a href="editclassifications.cgi?action=edit&amp;classification=[% cl.name FILTER uri %]"><b>[% cl.name FILTER html %]</b></a></td>
- <td valign="top">
+ <td valign="top">
[% IF cl.description %]
[% cl.description FILTER html_light %]
[% ELSE %]
@@ -63,4 +63,4 @@
</tr>
</table>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/confirm-delete.html.tmpl b/template/en/default/admin/components/confirm-delete.html.tmpl
index a3dae68bb..60b08b430 100644
--- a/template/en/default/admin/components/confirm-delete.html.tmpl
+++ b/template/en/default/admin/components/confirm-delete.html.tmpl
@@ -49,7 +49,7 @@ from '[% product.name FILTER html %]' product
<tr>
<td valign="top">Default assignee:</td>
<td valign="top">[% comp.default_assignee.login FILTER html %]</td>
-
+
[% IF Param('useqacontact') %]
</tr>
<tr>
@@ -103,23 +103,23 @@ from '[% product.name FILTER html %]' product
</table>
<h2>Confirmation</h2>
-
+
[% IF comp.bug_count %]
[% IF !Param("allowbugdeletion") %]
<p>
Sorry, there
- [% IF comp.bug_count > 1 %]
- are [% comp.bug_count %] [%+ terms.bugs %]
+ [% IF comp.bug_count > 1 %]
+ are [% comp.bug_count %] [%+ terms.bugs %]
[% ELSE %]
- is [% comp.bug_count %] [%+ terms.bug %]
+ is [% comp.bug_count %] [%+ terms.bug %]
[% END %]
- outstanding for this component. You must reassign
+ outstanding for this component. You must reassign
[% IF comp.bug_count > 1 %]
- those [% terms.bugs %]
+ those [% terms.bugs %]
[% ELSE %]
that [% terms.bug %]
[% END %]
@@ -130,8 +130,8 @@ from '[% product.name FILTER html %]' product
<table border="0" cellpadding="20" width="70%" bgcolor="red"><tr><td>
- There [% IF comp.bug_count > 1 %]
- are [% comp.bug_count %] [%+ terms.bugs %]
+ There [% IF comp.bug_count > 1 %]
+ are [% comp.bug_count %] [%+ terms.bugs %]
[% ELSE %]
is 1 [% terms.bug %]
[% END %]
@@ -147,7 +147,7 @@ from '[% product.name FILTER html %]' product
[% IF comp.bug_count == 0 || Param('allowbugdeletion') %]
<p>Do you really want to delete this component?</p>
-
+
<form method="post" action="editcomponents.cgi">
<input type="submit" id="delete" value="Yes, delete">
<input type="hidden" name="action" value="delete">
@@ -160,4 +160,4 @@ from '[% product.name FILTER html %]' product
[% PROCESS admin/components/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/components/create.html.tmpl b/template/en/default/admin/components/create.html.tmpl
index b6b79f8b6..13b2c8e41 100644
--- a/template/en/default/admin/components/create.html.tmpl
+++ b/template/en/default/admin/components/create.html.tmpl
@@ -23,7 +23,7 @@
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
-
+
[% title = BLOCK %]Add component to the [% product.name FILTER html %] product[% END %]
[% PROCESS global/header.html.tmpl
javascript_urls = [ "js/field.js" ]
@@ -35,7 +35,7 @@
<table border="0" cellpadding="4" cellspacing="0">
[% PROCESS "admin/components/edit-common.html.tmpl" %]
-
+
</table>
<hr>
<input type="submit" id="create" value="Add">
diff --git a/template/en/default/admin/components/edit.html.tmpl b/template/en/default/admin/components/edit.html.tmpl
index e1083e7e8..ecfb3e299 100644
--- a/template/en/default/admin/components/edit.html.tmpl
+++ b/template/en/default/admin/components/edit.html.tmpl
@@ -44,7 +44,7 @@
<tr>
<th class="field_label"><label for="isactive">Enabled For [% terms.Bugs %]:</label></th>
- <td><input id="isactive" name="isactive" type="checkbox" value="1"
+ <td><input id="isactive" name="isactive" type="checkbox" value="1"
[% 'checked="checked"' IF comp.isactive %]></td>
</tr>
<tr>
@@ -67,7 +67,7 @@
<input type="hidden" name="componentold" value="[% comp.name FILTER html %]">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
<input type="hidden" name="token" value="[% token FILTER html %]">
- <input type="submit" value="Save Changes" id="update"> or <a
+ <input type="submit" value="Save Changes" id="update"> or <a
href="editcomponents.cgi?action=del&amp;product=
[%- product.name FILTER uri %]&amp;component=
[%- comp.name FILTER uri %]">Delete</a> this component.
diff --git a/template/en/default/admin/components/footer.html.tmpl b/template/en/default/admin/components/footer.html.tmpl
index ec1869b29..aa3509bb7 100644
--- a/template/en/default/admin/components/footer.html.tmpl
+++ b/template/en/default/admin/components/footer.html.tmpl
@@ -19,7 +19,7 @@
#%]
[%# INTERFACE:
- # comp: object; Bugzilla::Component object representing the component
+ # comp: object; Bugzilla::Component object representing the component
# product: object; Bugzilla::Product object representing the product to
# which the component belongs.
#%]
@@ -27,26 +27,26 @@
<hr>
<p>
-Edit
+Edit
[% IF comp && !no_edit_component_link %]
- component <a
+ component <a
title="Edit Component '[% comp.name FILTER html %]'"
href="editcomponents.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]&amp;component=[% comp.name FILTER uri %]">
- '[% comp.name FILTER html %]'</a>
+ '[% comp.name FILTER html %]'</a>
or edit
[% END %]
[% IF !no_edit_other_components_link %]
-other components of product <a
+other components of product <a
title="Choose a component from product '[% product.name FILTER html %]' to edit"
href="editcomponents.cgi?product=
- [%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>,
- or edit
+ [%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>,
+ or edit
[% END %]
-product <a
+product <a
title="Edit Product '[% product.name FILTER html %]'"
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
diff --git a/template/en/default/admin/components/list.html.tmpl b/template/en/default/admin/components/list.html.tmpl
index b45b97565..7a333d33d 100644
--- a/template/en/default/admin/components/list.html.tmpl
+++ b/template/en/default/admin/components/list.html.tmpl
@@ -42,17 +42,17 @@
[% columns = [
- {
+ {
name => "name"
heading => "Edit component..."
contentlink => edit_contentlink
},
- {
+ {
name => "description"
- heading => "Description"
+ heading => "Description"
allow_html_content => 1
},
- {
+ {
name => "initialowner"
heading => "Default Assignee"
},
diff --git a/template/en/default/admin/components/select-product.html.tmpl b/template/en/default/admin/components/select-product.html.tmpl
index 0910f9802..7defbd065 100644
--- a/template/en/default/admin/components/select-product.html.tmpl
+++ b/template/en/default/admin/components/select-product.html.tmpl
@@ -32,14 +32,14 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit components of..."
- contentlink => "editcomponents.cgi?product=%%name%%"
+ contentlink => "editcomponents.cgi?product=%%name%%"
},
- {
+ {
name => "description"
- heading => "Description"
+ heading => "Description"
allow_html_content => 1
}
]
diff --git a/template/en/default/admin/custom_fields/cf-js.js.tmpl b/template/en/default/admin/custom_fields/cf-js.js.tmpl
index cc1a4e4aa..e7c669af1 100644
--- a/template/en/default/admin/custom_fields/cf-js.js.tmpl
+++ b/template/en/default/admin/custom_fields/cf-js.js.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is NASA.
- # Portions created by NASA are Copyright (C) 2008
+ # Portions created by NASA are Copyright (C) 2008
# San Jose State University Foundation. All Rights Reserved.
#
# Contributor(s): Max Kanat-Alexander <mkanat@bugzilla.org>
diff --git a/template/en/default/admin/custom_fields/create.html.tmpl b/template/en/default/admin/custom_fields/create.html.tmpl
index 2b3f0eadb..79a9603a3 100644
--- a/template/en/default/admin/custom_fields/create.html.tmpl
+++ b/template/en/default/admin/custom_fields/create.html.tmpl
@@ -110,7 +110,7 @@ YAHOO.util.Event.onDOMReady(function() {onChangeType(document.getElementById('ty
<input type="text" id="reverse_desc" name="reverse_desc" value="" size="40" disabled="disabled">
<br>
Use this label for the list of [% terms.bugs %] that link to
- [%+ terms.abug %] with this
+ [%+ terms.abug %] with this
[%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %]
field. For example, if the description is "Is a duplicate of",
the reverse description would be "Duplicates of this [% terms.bug %]".
diff --git a/template/en/default/admin/custom_fields/edit.html.tmpl b/template/en/default/admin/custom_fields/edit.html.tmpl
index ab6eeec0c..147d6ee93 100644
--- a/template/en/default/admin/custom_fields/edit.html.tmpl
+++ b/template/en/default/admin/custom_fields/edit.html.tmpl
@@ -92,7 +92,7 @@
value="[% field.reverse_desc FILTER html %]">
<br>
Use this label for the list of [% terms.bugs %] that link to
- [%+ terms.abug %] with this
+ [%+ terms.abug %] with this
[%+ field_types.${constants.FIELD_TYPE_BUG_ID} FILTER html %] field.
For example, if the description is "Is a duplicate of",
the reverse description would be "Duplicates of this [% terms.bug %]".
@@ -111,7 +111,7 @@
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
[% NEXT IF sel_field.id == field.id %]
<option value="[% sel_field.id FILTER html %]"
- [% ' selected="selected"'
+ [% ' selected="selected"'
IF sel_field.id == field.visibility_field.id %]>
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
@@ -121,7 +121,7 @@
<label for="visibility_values">
<strong>is set to any of:</strong>
</label>
- <select multiple="multiple" size="5" name="visibility_values"
+ <select multiple="multiple" size="5" name="visibility_values"
id="visibility_values" class="field_value">
[% FOREACH value = field.visibility_field.legal_values %]
<option value="[% value.id FILTER html %]"
@@ -131,7 +131,7 @@
[% END %]
[%+ display_value(field.visibility_field.name, value.name) FILTER html %]
</option>
- [% END %]
+ [% END %]
</select>
</td>
</tr>
@@ -156,7 +156,7 @@
[% FOREACH sel_field = Bugzilla.fields({ is_select => 1 }) %]
[% NEXT IF sel_field.id == field.id %]
<option value="[% sel_field.id FILTER html %]"
- [% ' selected="selected"'
+ [% ' selected="selected"'
IF sel_field.id == field.value_field.id %]>
[% sel_field.description FILTER html %]
([% sel_field.name FILTER html %])
diff --git a/template/en/default/admin/custom_fields/list.html.tmpl b/template/en/default/admin/custom_fields/list.html.tmpl
index 689aa0591..d4d12b0ed 100644
--- a/template/en/default/admin/custom_fields/list.html.tmpl
+++ b/template/en/default/admin/custom_fields/list.html.tmpl
@@ -91,7 +91,7 @@
contentlink => delete_contentlink
}
}
-%]
+%]
[% PROCESS admin/table.html.tmpl
columns = columns
diff --git a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
index 088154120..8abc7e148 100644
--- a/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
+++ b/template/en/default/admin/fieldvalues/confirm-delete.html.tmpl
@@ -20,7 +20,7 @@
#%]
[% title = BLOCK %]
- Delete Value '[% value.name FILTER html %]' from the
+ Delete Value '[% value.name FILTER html %]' from the
'[% field.description FILTER html %]' ([% field.name FILTER html %]) field
[% END %]
@@ -63,11 +63,11 @@
[% IF value.is_default || value.bug_count || (value_count == 1)
|| value.controls_visibility_of_fields.size
- || value.controlled_values_array.size
+ || value.controlled_values_array.size
%]
<p>Sorry, but the '[% value.name FILTER html %]' value cannot be deleted
- from the '[% field.description FILTER html %]' field for the following
+ from the '[% field.description FILTER html %]' field for the following
reason(s):</p>
<ul class="warningmessages">
@@ -85,7 +85,7 @@
[% IF value.bug_count %]
<li>
[% IF value.bug_count > 1 %]
- There are [% value.bug_count FILTER html %] [%+ terms.bugs %]
+ There are [% value.bug_count FILTER html %] [%+ terms.bugs %]
with this field value.
[% ELSE %]
There is 1 [% terms.bug %] with this field value.
@@ -97,7 +97,7 @@
href="buglist.cgi?[% field.name FILTER uri %]=
[%- value.name FILTER uri %]">
[% IF value.bug_count > 1 %]
- those [% terms.bugs %]
+ those [% terms.bugs %]
[% ELSE %]
that [% terms.bug %]
[% END %]
@@ -117,7 +117,7 @@
[% FOREACH field = value.controls_visibility_of_fields %]
<a href="editfields.cgi?action=edit&name=
[%- field.name FILTER uri %]">
- [%- field.description FILTER html %]
+ [%- field.description FILTER html %]
([% field.name FILTER html %])</a><br>
[% END %]
</li>
@@ -158,4 +158,4 @@
no_edit_link = 1
+%]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/fieldvalues/create.html.tmpl b/template/en/default/admin/fieldvalues/create.html.tmpl
index 019831489..c96111f22 100644
--- a/template/en/default/admin/fieldvalues/create.html.tmpl
+++ b/template/en/default/admin/fieldvalues/create.html.tmpl
@@ -17,7 +17,7 @@
[%# INTERFACE:
# field: object; the field the value is being created for
#%]
-
+
[% title = BLOCK %]
Add Value for the '[% field.description FILTER html %]' ([% field.name FILTER html %]) field
[% END %]
@@ -26,7 +26,7 @@
%]
<p>
- This page allows you to add a new value for the
+ This page allows you to add a new value for the
'[% field.description FILTER html %]' field.
</p>
@@ -47,7 +47,7 @@
<tr>
<th align="right"><label for="is_open">Status Type:</label></th>
<td>
- <input type="radio" id="open_status" name="is_open" value="1"
+ <input type="radio" id="open_status" name="is_open" value="1"
checked="checked">
<label for="open_status">Open</label><br>
<input type="radio" id="closed_status" name="is_open" value="0">
@@ -65,7 +65,7 @@
[% IF field.value_field %]
<tr>
<th align="right">
- <label for="visibility_value_id">Only appears when
+ <label for="visibility_value_id">Only appears when
[%+ field.value_field.description FILTER html %] is set to:
</label>
</th>
diff --git a/template/en/default/admin/fieldvalues/edit.html.tmpl b/template/en/default/admin/fieldvalues/edit.html.tmpl
index 9c42ce639..8d20e1e41 100644
--- a/template/en/default/admin/fieldvalues/edit.html.tmpl
+++ b/template/en/default/admin/fieldvalues/edit.html.tmpl
@@ -21,7 +21,7 @@
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]
- Edit Value '[% value.name FILTER html %]' for the
+ Edit Value '[% value.name FILTER html %]' for the
'[% field.description FILTER html %]' ([% field.name FILTER html %]) field
[% END %]
[% PROCESS global/header.html.tmpl
@@ -49,7 +49,7 @@
</tr>
<tr>
<th align="right"><label for="sortkey">Sortkey:</label></th>
- <td><input id="sortkey" size="6" maxlength="6" name="sortkey"
+ <td><input id="sortkey" size="6" maxlength="6" name="sortkey"
value="[%- value.sortkey FILTER html %]"></td>
</tr>
[% IF field.name == "bug_status" %]
@@ -71,7 +71,7 @@
[% FOREACH field_value = field.value_field.legal_values %]
[% NEXT IF field_value.name == '' %]
<option value="[% field_value.id FILTER none %]"
- [% ' selected="selected"'
+ [% ' selected="selected"'
IF field_value.id == value.visibility_value.id %]>
[% IF field.value_field.name == 'component' %]
[% field_value.product.name FILTER html %]:
@@ -86,7 +86,7 @@
[% END %]
<tr>
<th align="right"><label for="is_active">Enabled for [% terms.bugs %]:</label></th>
- <td><input id="is_active" name="is_active" type="checkbox" value="1"
+ <td><input id="is_active" name="is_active" type="checkbox" value="1"
[%+ 'checked="checked"' IF value.is_active %]
[%+ 'disabled="disabled"' IF value.is_default OR value.is_static %]>
[% IF value.is_default %]
diff --git a/template/en/default/admin/fieldvalues/footer.html.tmpl b/template/en/default/admin/fieldvalues/footer.html.tmpl
index 7d4a41d47..1b94b5c0e 100644
--- a/template/en/default/admin/fieldvalues/footer.html.tmpl
+++ b/template/en/default/admin/fieldvalues/footer.html.tmpl
@@ -36,7 +36,7 @@
[% END %]
[% IF value.defined && !no_edit_link %]
- Edit value <a
+ Edit value <a
title="Edit value '[% value.name FILTER html %]' for the '
[%- field.name FILTER html %]' field"
href="editvalues.cgi?action=edit&amp;field=
@@ -46,7 +46,7 @@
[% END %]
[% UNLESS no_edit_other_link %]
- Edit other values for the <a
+ Edit other values for the <a
href="editvalues.cgi?field=
[%- field.name FILTER uri %]">'[% field.description FILTER html %]'</a> field.
diff --git a/template/en/default/admin/fieldvalues/list.html.tmpl b/template/en/default/admin/fieldvalues/list.html.tmpl
index 2b6aedb6f..d84f9a59d 100644
--- a/template/en/default/admin/fieldvalues/list.html.tmpl
+++ b/template/en/default/admin/fieldvalues/list.html.tmpl
@@ -16,7 +16,7 @@
[%# INTERFACE:
# values: array of hashes having the following properties:
# - name: string; The value.
- # - sortkey: number; The sortkey used to order the value when
+ # - sortkey: number; The sortkey used to order the value when
# displayed to the user in a list.
#
# field: object; the field we are editing values for.
@@ -41,12 +41,12 @@
[% columns = [
- {
+ {
name => "name"
heading => "Edit field value..."
contentlink => edit_contentlink
},
- {
+ {
name => "sortkey"
heading => "Sortkey"
},
diff --git a/template/en/default/admin/fieldvalues/select-field.html.tmpl b/template/en/default/admin/fieldvalues/select-field.html.tmpl
index 3704d42aa..33f6f656b 100644
--- a/template/en/default/admin/fieldvalues/select-field.html.tmpl
+++ b/template/en/default/admin/fieldvalues/select-field.html.tmpl
@@ -16,7 +16,7 @@
[%# INTERFACE:
# fields: Array of hashes. Each hash contains only one key, "name."
- # The names are the same as the keys from field_descs
+ # The names are the same as the keys from field_descs
# (see global/field-descs.html.tmpl).
#%]
@@ -30,7 +30,7 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit field values for..."
content_use_field = 1
diff --git a/template/en/default/admin/flag-type/edit.html.tmpl b/template/en/default/admin/flag-type/edit.html.tmpl
index 69dc05bd3..b3cdf52e8 100644
--- a/template/en/default/admin/flag-type/edit.html.tmpl
+++ b/template/en/default/admin/flag-type/edit.html.tmpl
@@ -120,7 +120,7 @@
<option value="[% comp FILTER html %]">[% comp FILTER html %]</option>
[% END %]
</select><br>
- <input type="submit" id="categoryAction-include"
+ <input type="submit" id="categoryAction-include"
name="categoryAction-include" value="Include">
<input type="submit" id="categoryAction-exclude"
name="categoryAction-exclude" value="Exclude">
@@ -128,13 +128,13 @@
<td style="vertical-align: top;">
<b>Inclusions:</b><br>
[% PROCESS category_select name="inclusion_to_remove" categories = inclusions %]<br>
- <input type="submit" id="categoryAction-removeInclusion"
+ <input type="submit" id="categoryAction-removeInclusion"
name="categoryAction-removeInclusion" value="Remove Inclusion">
</td>
<td style="vertical-align: top;">
<b>Exclusions:</b><br>
[% PROCESS category_select name="exclusion_to_remove" categories = exclusions %]<br>
- <input type="submit" id="categoryAction-removeExclusion"
+ <input type="submit" id="categoryAction-removeExclusion"
name="categoryAction-removeExclusion" value="Remove Exclusion">
</td>
</tr>
diff --git a/template/en/default/admin/groups/confirm-remove.html.tmpl b/template/en/default/admin/groups/confirm-remove.html.tmpl
index 54d961623..a3830702c 100644
--- a/template/en/default/admin/groups/confirm-remove.html.tmpl
+++ b/template/en/default/admin/groups/confirm-remove.html.tmpl
@@ -46,21 +46,21 @@
<p>This option will remove all explicitly defined users
from '[% group.name FILTER html %].'</p>
[% END %]
-
+
<p>Generally, you will only need to do this when upgrading groups
created with [% terms.Bugzilla %] versions 2.16 and earlier. Use
this option with <b>extreme care</b> and consult the documentation
for further information.
</p>
-
+
<form method="post" action="editgroups.cgi">
<input type="hidden" name="group_id" value="[% group.id FILTER html %]">
<input type="hidden" name="regexp" value="[% regexp FILTER html %]">
<input type="hidden" name="action" value="remove_regexp">
-
+
<input name="token" type="hidden" value="[% token FILTER html %]">
<input id="confirm" name="confirm" type="submit" value="Confirm">
<p>Or <a href="editgroups.cgi">return to the Edit Groups page</a>.</p>
</form>
-
-[% PROCESS global/footer.html.tmpl %]
+
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/create.html.tmpl b/template/en/default/admin/groups/create.html.tmpl
index a6facbfe1..6b733538a 100644
--- a/template/en/default/admin/groups/create.html.tmpl
+++ b/template/en/default/admin/groups/create.html.tmpl
@@ -100,8 +100,8 @@ than deleting the group would be. <b>Note: If you are creating
a group, you probably want it to be usable for [% terms.bugs %], in which
case you should leave this checked.</b></p>
-<p><b>User RegExp</b> is optional, and if filled in, will
-automatically grant membership to this group to anyone with an
+<p><b>User RegExp</b> is optional, and if filled in, will
+automatically grant membership to this group to anyone with an
email address that matches this regular expression.</p>
<p>
@@ -111,13 +111,13 @@ email address that matches this regular expression.</p>
in comments in [% terms.bugs %] besides the name of the author of comments.
</p>
-<p>By default, the new group will be associated with existing
-products. Unchecking the "Insert new group into all existing
-products" option will prevent this and make the group become
+<p>By default, the new group will be associated with existing
+products. Unchecking the "Insert new group into all existing
+products" option will prevent this and make the group become
visible only when its controls have been added to a product.</p>
<p>Back to the <a href="./">main [% terms.bugs %] page</a>
or to the <a href="editgroups.cgi">group list</a>.
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/delete.html.tmpl b/template/en/default/admin/groups/delete.html.tmpl
index b93c84b25..794ca259c 100644
--- a/template/en/default/admin/groups/delete.html.tmpl
+++ b/template/en/default/admin/groups/delete.html.tmpl
@@ -71,12 +71,12 @@
[% IF group.bugs.size %]
<p><b>[% group.bugs.size FILTER html %] [%+ terms.bug %] reports are
- visible only to this group. You cannot delete this group while any
+ visible only to this group. You cannot delete this group while any
[%+ terms.bugs %] are using it.</b>
<br><a href="buglist.cgi?field0-0-0=bug_group&amp;type0-0-0=equals&amp;value0-0-0=
[%- group.name FILTER uri %]">Show me
- which [% terms.bugs %]</a> -
+ which [% terms.bugs %]</a> -
<label><input type="checkbox" name="removebugs">Remove
all [% terms.bugs %] from this group restriction for me.</label></p>
@@ -113,7 +113,7 @@
[% SET hidden = 0 %]
[% IF data.controls.othercontrol == constants.CONTROLMAPMANDATORY
AND data.controls.membercontrol == constants.CONTROLMAPMANDATORY
- AND data.controls.entry
+ AND data.controls.entry
%]
[% SET hidden = 1 %]
[% END %]
@@ -133,14 +133,14 @@
<p><label><input type="checkbox" name="unbind">Delete this group anyway,
and remove these controls.</label></p>
[% END %]
-
+
[% IF group.flag_types.size %]
<p><b>This group restricts who can make changes to flags of certain types.
You cannot delete this group while there are flag types using it.</b>
<br><a href="editflagtypes.cgi?action=list&amp;group=
[%- group.id FILTER uri %]">Show
- me which types</a> -
+ me which types</a> -
<label><input type="checkbox" name="removeflags">Remove all
flag types from this group for me.</label></p>
[% END %]
@@ -167,7 +167,7 @@
<h2>Confirmation</h2>
<p>Do you really want to delete this group?</p>
- [% IF group.users.size || group.bugs.size || group.products.size
+ [% IF group.users.size || group.bugs.size || group.products.size
|| group.flags.size
%]
<p><b>You must check all of the above boxes or correct the
@@ -184,4 +184,4 @@
Go back to the <a href="editgroups.cgi">group list</a>.
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/groups/edit.html.tmpl b/template/en/default/admin/groups/edit.html.tmpl
index f0dce8c85..0f764c841 100644
--- a/template/en/default/admin/groups/edit.html.tmpl
+++ b/template/en/default/admin/groups/edit.html.tmpl
@@ -26,7 +26,7 @@
# group - A Bugzilla::Group representing the group being edited.
# *_current - Arrays of Bugzilla::Group objects that show the current
# values for this group, as far as grants.
- # *_available - Arrays of Bugzilla::Group objects that show the current
+ # *_available - Arrays of Bugzilla::Group objects that show the current
# available values for each grant.
#%]
@@ -58,7 +58,7 @@
<th>Group:</th>
<td>
[% IF group.is_bug_group %]
- <input type="text" name="name" size="60"
+ <input type="text" name="name" size="60"
value="[% group.name FILTER html %]">
[% ELSE %]
[% group.name FILTER html %]
@@ -70,7 +70,7 @@
<th>Description:</th>
<td>
[% IF group.is_bug_group %]
- <input type="text" name="desc" size="70"
+ <input type="text" name="desc" size="70"
value="[% group.description FILTER html %]">
[% ELSE %]
[% group.description FILTER html %]
@@ -81,7 +81,7 @@
<tr>
<th>User Regexp:</th>
<td>
- <input type="text" name="regexp" size="40"
+ <input type="text" name="regexp" size="40"
value="[% group.user_regexp FILTER html %]">
</td>
</tr>
@@ -126,7 +126,7 @@
<tr>
<th>Use For [% terms.Bugs %]:</th>
<td>
- <input type="checkbox" name="isactive"
+ <input type="checkbox" name="isactive"
value="1" [% 'checked="checked"' IF group.is_active %]>
</td>
</tr>
@@ -139,10 +139,10 @@
<table class="grant_table">
<tr>
<th class="one">Groups That Are a Member of This Group<br>
- (&quot;Users in <var>X</var> are automatically in
+ (&quot;Users in <var>X</var> are automatically in
[%+ group.name FILTER html %]&quot;)</th>
<th>Groups That This Group Is a Member Of<br>
- (&quot;If you are in [% group.name FILTER html %], you are
+ (&quot;If you are in [% group.name FILTER html %], you are
automatically also in...&quot;)</th>
</tr>
<tr>
@@ -151,7 +151,7 @@
items_available = members_available
items_current = members_current %]
</td>
-
+
<td>[% PROCESS select_pair name = "member_of" size = 10
items_available = member_of_available
items_current = member_of_current %]</td>
@@ -162,7 +162,7 @@
<tr>
<th class="one">
Groups That Can Grant Membership in This Group<br>
- (&quot;Users in <var>X</var> can add other users to
+ (&quot;Users in <var>X</var> can add other users to
[%+ group.name FILTER html %]&quot;)
</th>
@@ -212,11 +212,11 @@
<input type="submit" id="update-group" value="Update Group">
<input type="hidden" name="token" value="[% token FILTER html %]">
</form>
-
+
<h4>Mass Remove</h4>
<p>You can use this form to do mass-removal of users from groups.
- This is often very useful if you upgraded from [% terms.Bugzilla %]
+ This is often very useful if you upgraded from [% terms.Bugzilla %]
2.16.</p>
<table><tr><td>
@@ -227,7 +227,7 @@
<input type="text" size="20" name="regexp">
<input type="submit" id="remove-membership" value="Remove Memberships">
- <p>If you leave the field blank, all explicit memberships in
+ <p>If you leave the field blank, all explicit memberships in
this group will be removed.</p>
<input type="hidden" name="action" value="confirm_remove">
@@ -235,10 +235,10 @@
</fieldset>
</form>
</td></tr></table>
-
+
<p>Back to the <a href="editgroups.cgi">group list</a>.</p>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
[% BLOCK select_pair %]
<table class="select_pair">
diff --git a/template/en/default/admin/groups/list.html.tmpl b/template/en/default/admin/groups/list.html.tmpl
index 1d137dc5f..e3e96ee87 100644
--- a/template/en/default/admin/groups/list.html.tmpl
+++ b/template/en/default/admin/groups/list.html.tmpl
@@ -86,7 +86,7 @@
content => "&nbsp;"
}
}
- }
+ }
%]
[% FOREACH group IN ["chartgroup", "insidergroup", "timetrackinggroup", "querysharegroup"] %]
@@ -120,7 +120,7 @@
content => "user"
}
}
-%]
+%]
[% PROCESS admin/table.html.tmpl
columns = columns
diff --git a/template/en/default/admin/keywords/confirm-delete.html.tmpl b/template/en/default/admin/keywords/confirm-delete.html.tmpl
index 20a6deee7..7fd93439a 100644
--- a/template/en/default/admin/keywords/confirm-delete.html.tmpl
+++ b/template/en/default/admin/keywords/confirm-delete.html.tmpl
@@ -35,7 +35,7 @@
There are [% keyword.bug_count FILTER html %] [%+ terms.bugs %] with
this keyword set.
[% END %]
-
+
Are you <b>sure</b> you want to delete
the <code>[% keyword.name FILTER html %]</code> keyword?
</p>
@@ -50,4 +50,4 @@
<p><a href="editkeywords.cgi">Edit other keywords</a>.</p>
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/keywords/create.html.tmpl b/template/en/default/admin/keywords/create.html.tmpl
index e5d6aa0df..02bf84218 100644
--- a/template/en/default/admin/keywords/create.html.tmpl
+++ b/template/en/default/admin/keywords/create.html.tmpl
@@ -22,7 +22,7 @@
[%# INTERFACE:
# none
#%]
-
+
[% PROCESS global/header.html.tmpl
title = "Add keyword"
subheader = "This page allows you to add a new keyword."
diff --git a/template/en/default/admin/milestones/confirm-delete.html.tmpl b/template/en/default/admin/milestones/confirm-delete.html.tmpl
index 068e8e254..1d47610df 100644
--- a/template/en/default/admin/milestones/confirm-delete.html.tmpl
+++ b/template/en/default/admin/milestones/confirm-delete.html.tmpl
@@ -63,20 +63,20 @@
</table>
<h2>Confirmation</h2>
-
+
[% IF milestone.bug_count %]
<table border="0" cellpadding="20" width="70%" bgcolor="red">
<tr><td>
There
- [% IF milestone.bug_count > 1 %]
- are [% milestone.bug_count FILTER none %] [%+ terms.bugs %]
+ [% IF milestone.bug_count > 1 %]
+ are [% milestone.bug_count FILTER none %] [%+ terms.bugs %]
[% ELSE %]
is 1 [% terms.bug %]
[% END %]
entered for this milestone! When you delete this milestone,
<b><blink>ALL</blink></b> of these [% terms.bugs %] will be retargeted
- to [% product.default_milestone FILTER html %], the default milestone for
+ to [% product.default_milestone FILTER html %], the default milestone for
the [% product.name FILTER html %] product.
</td></tr>
</table>
@@ -95,4 +95,4 @@
[% PROCESS admin/milestones/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/milestones/create.html.tmpl b/template/en/default/admin/milestones/create.html.tmpl
index d7c2f580f..740ef2e67 100644
--- a/template/en/default/admin/milestones/create.html.tmpl
+++ b/template/en/default/admin/milestones/create.html.tmpl
@@ -22,7 +22,7 @@
# product: object; Bugzilla::Product object representing the product to
# which the milestone belongs.
#%]
-
+
[% title = BLOCK %]Add Milestone to Product '[% product.name FILTER html %]'[% END %]
[% subheader = BLOCK %]This page allows you to add a new milestone to product
'[% product.name FILTER html %]'.[% END %]
diff --git a/template/en/default/admin/milestones/footer.html.tmpl b/template/en/default/admin/milestones/footer.html.tmpl
index 1cae69e17..f35283d6f 100644
--- a/template/en/default/admin/milestones/footer.html.tmpl
+++ b/template/en/default/admin/milestones/footer.html.tmpl
@@ -40,11 +40,11 @@
[% UNLESS no_add_milestone_link %]
<a title="Add a milestone to product '[% product.name FILTER html %]'"
href="editmilestones.cgi?action=add&amp;product=
- [%- product.name FILTER uri %]">Add</a> a milestone.
+ [%- product.name FILTER uri %]">Add</a> a milestone.
[% END %]
[% IF milestone.name && !no_edit_milestone_link %]
- Edit milestone <a
+ Edit milestone <a
title="Edit Milestone '[% milestone.name FILTER html %]' of product '
[%- product.name FILTER html %]'"
href="editmilestones.cgi?action=edit&amp;product=
@@ -54,13 +54,13 @@
[% END %]
[% UNLESS no_edit_other_milestones_link %]
- Edit other milestones of product <a
+ Edit other milestones of product <a
href="editmilestones.cgi?product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
[% END %]
- Edit product <a
+ Edit product <a
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
diff --git a/template/en/default/admin/milestones/list.html.tmpl b/template/en/default/admin/milestones/list.html.tmpl
index 6392f567f..4a79b9c31 100644
--- a/template/en/default/admin/milestones/list.html.tmpl
+++ b/template/en/default/admin/milestones/list.html.tmpl
@@ -45,12 +45,12 @@
[% columns = [
- {
+ {
name => "name"
heading => "Edit milestone..."
contentlink => edit_contentlink
},
- {
+ {
name => "sortkey"
heading => "Sortkey"
},
@@ -88,8 +88,8 @@
content => "(Default milestone)"
override_contentlink => 1
contentlink => undef
- }
-%]
+ }
+%]
[% Hook.process('before_table') %]
diff --git a/template/en/default/admin/milestones/select-product.html.tmpl b/template/en/default/admin/milestones/select-product.html.tmpl
index 587db6d65..ab052377b 100644
--- a/template/en/default/admin/milestones/select-product.html.tmpl
+++ b/template/en/default/admin/milestones/select-product.html.tmpl
@@ -32,14 +32,14 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit milestones of..."
- contentlink => "editmilestones.cgi?product=%%name%%"
+ contentlink => "editmilestones.cgi?product=%%name%%"
},
- {
+ {
name => "description"
- heading => "Description"
+ heading => "Description"
allow_html_content => 1
}
]
diff --git a/template/en/default/admin/params/bugchange.html.tmpl b/template/en/default/admin/params/bugchange.html.tmpl
index 15d4f1e29..324603125 100644
--- a/template/en/default/admin/params/bugchange.html.tmpl
+++ b/template/en/default/admin/params/bugchange.html.tmpl
@@ -41,7 +41,7 @@
"If off, then all $terms.bugs initially have the default " _
"milestone for the product being filed in.",
- musthavemilestoneonaccept =>
+ musthavemilestoneonaccept =>
"If you are using ${field_descs.target_milestone}, do you want to require"
_ " that the milestone be set in order for a user to set"
_ " ${terms.abug}'s status to ${accept_status}?",
diff --git a/template/en/default/admin/params/bugfields.html.tmpl b/template/en/default/admin/params/bugfields.html.tmpl
index a0d9664ad..9c09610e1 100644
--- a/template/en/default/admin/params/bugfields.html.tmpl
+++ b/template/en/default/admin/params/bugfields.html.tmpl
@@ -37,7 +37,7 @@
usebugaliases => "Do you wish to use $terms.bug aliases, which allow you to assign " _
"$terms.bugs an easy-to-remember name by which you can refer to them?",
- use_see_also =>
+ use_see_also =>
"Do you wish to use the See Also field? It allows you refer to"
_ " $terms.bugs in other installations. Even if you disable this field,"
_ " $terms.bug relationships (URLs) already set on $terms.bugs will"
diff --git a/template/en/default/admin/params/common.html.tmpl b/template/en/default/admin/params/common.html.tmpl
index cd135e1d2..e7b480c69 100644
--- a/template/en/default/admin/params/common.html.tmpl
+++ b/template/en/default/admin/params/common.html.tmpl
@@ -138,7 +138,7 @@
<font color="red">
<blink>Unknown param type [% param.type FILTER html %]!!!</blink>
</font>
- [% END %]
+ [% END %]
</p>
[% UNLESS param.no_reset %]
<p>
diff --git a/template/en/default/admin/params/general.html.tmpl b/template/en/default/admin/params/general.html.tmpl
index 05e8f09a2..248d818a9 100644
--- a/template/en/default/admin/params/general.html.tmpl
+++ b/template/en/default/admin/params/general.html.tmpl
@@ -49,16 +49,12 @@
_ " afterward.</p>",
announcehtml =>
- "If this field is non-empty, then $terms.Bugzilla will"
- _ " display whatever is in this field at the top of every"
- _ " HTML page. The HTML you put in this field is not wrapped or"
- _ " enclosed in anything. You might want to wrap it inside a"
- _ "<tt>&lt;div&gt;</tt>. Give the div <em>id=\"message\"</em> to get"
- _ " green text inside a red box, or <em>class=\"bz_private\"</em> for"
- _ " dark red on a red background. Anything defined in "
- _ " <tt>skins/standard/global.css</tt>"
- _ " will work. To get centered text, use <em>style=\"text-align: "
- _ " center;\"</em>.",
+ "If this field is non-empty, then $terms.Bugzilla will display whatever is"
+ _ " in this field at the top of every HTML page. The HTML you put in this"
+ _ " field is not wrapped or enclosed in anything. You might want to wrap it"
+ _ " inside a <code>&lt;p&gt;</code> tag. Give it"
+ _ " <code>class=\"warning\"</code> to make the text red. Anything defined"
+ _ " in <code>skins/standard/global.css</code> will work.",
upgrade_notification =>
"$terms.Bugzilla can inform you when a new release is available."
diff --git a/template/en/default/admin/params/groupsecurity.html.tmpl b/template/en/default/admin/params/groupsecurity.html.tmpl
index 041af6833..1fca6488c 100644
--- a/template/en/default/admin/params/groupsecurity.html.tmpl
+++ b/template/en/default/admin/params/groupsecurity.html.tmpl
@@ -50,13 +50,13 @@
usevisibilitygroups => "Do you wish to restrict visibility of users to members of " _
"specific groups?",
-
+
strict_isolation => "Don't allow users to be assigned to, " _
"be qa-contacts on, " _
"be added to CC list, " _
"or make or remove dependencies " _
"involving any bug that is in a product on which that " _
- "user is forbidden to edit.",
+ "user is forbidden to edit.",
}
%]
diff --git a/template/en/default/admin/params/index.html.tmpl b/template/en/default/admin/params/index.html.tmpl
index de6a56f2e..3ded64710 100644
--- a/template/en/default/admin/params/index.html.tmpl
+++ b/template/en/default/admin/params/index.html.tmpl
@@ -37,7 +37,7 @@
<a href="editparams.cgi?section=
[%- panel.name FILTER uri %]#[% param.name FILTER uri %]_desc">
[% param.name FILTER html %]</a>
- </td>
+ </td>
<td>
[% panel.title FILTER html %]
</td>
diff --git a/template/en/default/admin/params/reports.html.tmpl b/template/en/default/admin/params/reports.html.tmpl
new file mode 100644
index 000000000..79b6af35d
--- /dev/null
+++ b/template/en/default/admin/params/reports.html.tmpl
@@ -0,0 +1,20 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+[%
+ title = "Reports"
+ desc = "Configure reporting parameters"
+%]
+
+[% param_descs = {
+ report_secbugs_active => "Enable or disable the security $terms.bugs report feature."
+ report_secbugs_emails =>
+ "Comma delimited list of the email addresses that the security $terms.bugs report will be sent to.",
+ report_secbugs_products =>
+ "JSON array of the products the security $terms.bugs report will report on. e.g [\"Prod1\", \"Prod2\"]",
+ }
+%]
diff --git a/template/en/default/admin/params/usermatch.html.tmpl b/template/en/default/admin/params/usermatch.html.tmpl
index d574edca7..8eaf53889 100644
--- a/template/en/default/admin/params/usermatch.html.tmpl
+++ b/template/en/default/admin/params/usermatch.html.tmpl
@@ -30,7 +30,7 @@
"sites where there are a large number of users.",
ajax_user_autocompletion => "If this option is set, typing characters in a certain user " _
- "fields will display a list of matches that can be selected from.",
+ "fields will display a list of matches that can be selected from.",
maxusermatches => "Search for no more than this many matches.<br> " _
"If set to '1', no users will be displayed on ambiguous matches. " _
diff --git a/template/en/default/admin/products/confirm-delete.html.tmpl b/template/en/default/admin/products/confirm-delete.html.tmpl
index aa728df75..1bd04a5e1 100644
--- a/template/en/default/admin/products/confirm-delete.html.tmpl
+++ b/template/en/default/admin/products/confirm-delete.html.tmpl
@@ -18,7 +18,7 @@
#
# (classification fields available if Param('useclassification') is enabled:)
#
- # classification: Bugzilla::Classification object; The classification
+ # classification: Bugzilla::Classification object; The classification
# the product is in
#
#%]
diff --git a/template/en/default/admin/products/create.html.tmpl b/template/en/default/admin/products/create.html.tmpl
index d2167c64b..e7046dbe8 100644
--- a/template/en/default/admin/products/create.html.tmpl
+++ b/template/en/default/admin/products/create.html.tmpl
@@ -15,7 +15,7 @@
[%# INTERFACE:
# classification: Bugzilla::Classification object; If classifications
- # are enabled, then this is
+ # are enabled, then this is
# the currently selected classification
#
#%]
@@ -43,7 +43,7 @@
<tr>
<th align="right">Version:</th>
- <td><input size="64" maxlength="255" name="version"
+ <td><input size="64" maxlength="255" name="version"
value="[% version FILTER html %]">
</td>
</tr>
@@ -63,7 +63,7 @@
</form>
[% PROCESS "admin/products/footer.html.tmpl"
- no_add_product_link = 1
+ no_add_product_link = 1
no_edit_product_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/edit-common.html.tmpl b/template/en/default/admin/products/edit-common.html.tmpl
index 4812707cd..2bb0c8920 100644
--- a/template/en/default/admin/products/edit-common.html.tmpl
+++ b/template/en/default/admin/products/edit-common.html.tmpl
@@ -29,10 +29,10 @@
<td><b>[% classification.name FILTER html %]</b></td>
</tr>
[% END %]
-
+
<tr>
<th align="right">Product:</th>
- <td><input size="64" maxlength="64" name="product"
+ <td><input size="64" maxlength="64" name="product"
value="[% product.name FILTER html %]">
</td>
</tr>
@@ -62,7 +62,7 @@
</td>
</tr>
[% END %]
-
+
<tr>
<th align="right">Open for [% terms.bug %] entry:</th>
<td><input type="checkbox" name="is_active" value="1"
diff --git a/template/en/default/admin/products/edit.html.tmpl b/template/en/default/admin/products/edit.html.tmpl
index 3bd78a958..ad928b716 100644
--- a/template/en/default/admin/products/edit.html.tmpl
+++ b/template/en/default/admin/products/edit.html.tmpl
@@ -20,7 +20,7 @@
#
# (classification fields available if Param('useclassification') is enabled:)
#
- # classification: Bugzilla::Classification object; The classification
+ # classification: Bugzilla::Classification object; The classification
# the product is in
#%]
@@ -134,16 +134,16 @@ versions:</a>
[% product.bug_count FILTER html %]</a></td>
</tr>
</table>
-
- <input type="hidden" name="product_old_name"
+
+ <input type="hidden" name="product_old_name"
value="[% product.name FILTER html %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="token" value="[% token FILTER html %]">
<input type="submit" id="update-product" value="Save Changes">
</form>
-
+
[% PROCESS "admin/products/footer.html.tmpl"
- no_add_product_link = 1
+ no_add_product_link = 1
no_edit_product_link = 1 %]
[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/products/footer.html.tmpl b/template/en/default/admin/products/footer.html.tmpl
index 78e1864a7..542a526df 100644
--- a/template/en/default/admin/products/footer.html.tmpl
+++ b/template/en/default/admin/products/footer.html.tmpl
@@ -17,7 +17,7 @@
# product: Bugzilla::Product Object; the product
#
# classification: Bugzilla::Classification object ; If classifications
- # are enabled, then this is the currently
+ # are enabled, then this is the currently
# selected classification
#
# no_XXX_link: boolean; if defined, then don't show the corresponding
@@ -35,7 +35,7 @@
[% classification_url_part_start = BLOCK %]classification=
[%- classification.name FILTER uri %]
[% END %]
- [% classification_text = BLOCK %]
+ [% classification_text = BLOCK %]
of classification '[% classification.name FILTER html %]'
[% END %]
[% END %]
@@ -58,8 +58,8 @@
[% END %]
[% IF product && !no_edit_product_link %]
- Edit product <a
- title="Edit Product '[% product.name FILTER html %]'
+ Edit product <a
+ title="Edit Product '[% product.name FILTER html %]'
[%- classification_text %]"
href="editproducts.cgi?action=edit&amp;product=[% product.name FILTER uri %]">
'[% product.name FILTER html %]'</a>.
@@ -68,7 +68,7 @@
[%# Edit other products (in a classification if specified): %]
[% UNLESS no_edit_other_products_link %]
- Edit <a
+ Edit <a
href="editproducts.cgi?
[%- classification_url_part_start FILTER none %]">other products
[% classification_text %]</a>.
diff --git a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
index f9c836980..05abc5fdb 100644
--- a/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
+++ b/template/en/default/admin/products/groupcontrol/confirm-edit.html.tmpl
@@ -27,7 +27,7 @@
[% PROCESS global/header.html.tmpl title = title %]
[% FOREACH group = mandatory_groups %]
<P>
-group '[% group.name FILTER html %]' impacts [% group.count %]
+group '[% group.name FILTER html %]' impacts [% group.count %]
[%+ terms.bugs %] for
which the group is newly mandatory and will be added.
[% END %]
diff --git a/template/en/default/admin/products/groupcontrol/edit.html.tmpl b/template/en/default/admin/products/groupcontrol/edit.html.tmpl
index 8c634ebfe..027c80172 100644
--- a/template/en/default/admin/products/groupcontrol/edit.html.tmpl
+++ b/template/en/default/admin/products/groupcontrol/edit.html.tmpl
@@ -23,8 +23,8 @@
[% title = BLOCK %]
Edit Group Controls for [% product.name FILTER html %]
[% END %]
-[% PROCESS global/header.html.tmpl
- title = title
+[% PROCESS global/header.html.tmpl
+ title = title
%]
<form method="post" action="editproducts.cgi">
diff --git a/template/en/default/admin/products/groupcontrol/updated.html.tmpl b/template/en/default/admin/products/groupcontrol/updated.html.tmpl
index 353ce5c75..5bc7cd4d2 100644
--- a/template/en/default/admin/products/groupcontrol/updated.html.tmpl
+++ b/template/en/default/admin/products/groupcontrol/updated.html.tmpl
@@ -10,7 +10,7 @@
#
# The Original Code is the Bugzilla Bug Tracking System.
#
- # Contributor(s): André Batosti <batosti@async.com.br>
+ # Contributor(s): André Batosti <batosti@async.com.br>
#
#%]
@@ -37,7 +37,7 @@
[% IF changes._group_controls.now_mandatory.size %]
[% FOREACH g = changes._group_controls.now_mandatory %]
- Adding [% terms.bugs %] to group '[% g.name FILTER html %]' which is
+ Adding [% terms.bugs %] to group '[% g.name FILTER html %]' which is
mandatory for this product<p>
[% g.bug_count FILTER html %] [%+ terms.bugs %] added<p>
[% END %]
diff --git a/template/en/default/admin/products/list-classifications.html.tmpl b/template/en/default/admin/products/list-classifications.html.tmpl
index 161cc4b5b..94f19f108 100644
--- a/template/en/default/admin/products/list-classifications.html.tmpl
+++ b/template/en/default/admin/products/list-classifications.html.tmpl
@@ -28,17 +28,17 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit products of..."
contentlink => 'editproducts.cgi?classification=%%name%%'
},
- {
+ {
name => "description"
heading => "Description"
allow_html_content => 1
},
- {
+ {
name => "product_count"
align => "right"
heading => "Product Count"
diff --git a/template/en/default/admin/products/list.html.tmpl b/template/en/default/admin/products/list.html.tmpl
index 0641c6283..dceeefed6 100644
--- a/template/en/default/admin/products/list.html.tmpl
+++ b/template/en/default/admin/products/list.html.tmpl
@@ -14,10 +14,10 @@
#%]
[%# INTERFACE:
- # products: array of Bugzilla::Product objects
+ # products: array of Bugzilla::Product objects
#
# classification: Bugzilla::Classification object; If classifications
- # are enabled, then this is
+ # are enabled, then this is
# the currently selected classification
# showbugcounts: boolean; true if bug counts should be included in the table
#%]
@@ -28,7 +28,7 @@
[% classification_url_part = BLOCK %]&amp;classification=
[%- classification.name FILTER uri %]
[%- END %]
- [% classification_title = BLOCK %]
+ [% classification_title = BLOCK %]
in classification '[% classification.name FILTER html %]'
[% END %]
[% END %]
@@ -38,17 +38,17 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit product..."
contentlink => 'editproducts.cgi?action=edit&amp;product=%%name%%'
},
- {
+ {
name => "description"
heading => "Description"
allow_html_content => 1
},
- {
+ {
name => "is_active"
heading => "Open For New $terms.Bugs"
yesno_field => 1
diff --git a/template/en/default/admin/products/updated.html.tmpl b/template/en/default/admin/products/updated.html.tmpl
index d93022a6e..5ddea6675 100644
--- a/template/en/default/admin/products/updated.html.tmpl
+++ b/template/en/default/admin/products/updated.html.tmpl
@@ -32,7 +32,7 @@
[% END %]
[% END %]
-[% title = BLOCK %]Updating Product '[% product.name FILTER html %]'
+[% title = BLOCK %]Updating Product '[% product.name FILTER html %]'
[% classification_text FILTER none %][% END %]
[% PROCESS global/header.html.tmpl
title = title
@@ -63,7 +63,7 @@
[% IF product.is_active %]
open for
[% ELSE %]
- closed to
+ closed to
[% END %]
new [% terms.bugs %].
</p>
@@ -79,15 +79,15 @@
[% IF changes.allows_unconfirmed.defined %]
<p>
[% IF product.allows_unconfirmed %]
- The product now allows the
+ The product now allows the
[%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status.
[% ELSE %]
- The product no longer allows the
+ The product no longer allows the
[%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status.
- Note that any
+ Note that any
<a href="buglist.cgi?product=
- [%- product.name FILTER uri %]&amp;bug_status=UNCONFIRMED">
- [%- terms.bugs %] that currently have the
+ [%- product.name FILTER uri %]&amp;bug_status=UNCONFIRMED">
+ [%- terms.bugs %] that currently have the
[%+ display_value('bug_status', 'UNCONFIRMED') FILTER html %] status</a>
will remain in that status until they are edited.
[% END %]
diff --git a/template/en/default/admin/settings/edit.html.tmpl b/template/en/default/admin/settings/edit.html.tmpl
index eeb6c3203..23c8fdbce 100644
--- a/template/en/default/admin/settings/edit.html.tmpl
+++ b/template/en/default/admin/settings/edit.html.tmpl
@@ -96,7 +96,7 @@ page, and the Default Value will automatically apply to everyone.
</td>
</tr>
</table>
-
+
</form>
[% ELSE %]
There are no preferences to edit.
diff --git a/template/en/default/admin/sudo.html.tmpl b/template/en/default/admin/sudo.html.tmpl
index e88ae2617..24b934732 100644
--- a/template/en/default/admin/sudo.html.tmpl
+++ b/template/en/default/admin/sudo.html.tmpl
@@ -17,7 +17,7 @@
#
# Contributor(s): A. Karl Kornel <karl@kornel.name>
#%]
-
+
[% PROCESS global/variables.none.tmpl %]
[% PROCESS global/header.html.tmpl
@@ -26,28 +26,28 @@
style_urls = ['skins/standard/admin.css']
doc_section = "useradmin.html#impersonatingusers"
%]
-
+
[% DEFAULT target_login = "" %]
<p>
- The <b>sudo</b> feature of [% terms.Bugzilla %] allows you to impersonate a
- user for a short time While an sudo session is in progress, every action you
- perform will be taking place as if you had logged in as the user whom will be
+ The <b>sudo</b> feature of [% terms.Bugzilla %] allows you to impersonate a
+ user for a short time While an sudo session is in progress, every action you
+ perform will be taking place as if you had logged in as the user whom will be
impersonating.
</p>
<p class="areyoureallyreallysure">
- This is a very powerful feature; you should be very careful while using it.
+ This is a very powerful feature; you should be very careful while using it.
Your actions may be logged more carefully than normal.
</p>
<form action="relogin.cgi" method="POST">
<p>
- To begin,
+ To begin,
[% IF Param('usemenuforusers') %]
- select
+ select
[% ELSE %]
- enter the login of
+ enter the login of
[% END %]
<label for="target_login">the <u>u</u>ser to impersonate</label>:
[% INCLUDE global/userselect.html.tmpl
@@ -58,39 +58,39 @@
size => 30
%]
</p>
-
+
[% IF !Param('usemenuforusers') %]
<p>
The username must be entered exactly. No matching will be performed.
</p>
[% END %]
-
+
<p>
Next, please take a moment to explain <label for="reason">why you are doing
this:<br>
<input type="text" id="reason" name="reason" size="80" maxlength="200"
value="[% reason_default FILTER html %]">
</p>
-
+
<p>
The message you enter here will be sent to the impersonated user by email.
- You may leave this empty if you wish, but they will still know that you
+ You may leave this empty if you wish, but they will still know that you
are impersonating them.
</p>
-
+
[% IF user.authorizer.can_login %]
<p>
Finally, enter <label for="current_password">your [% terms.Bugzilla %]
password</label>:
<input type="password" id="current_password" name="current_password" size="20">
<br>
- This is done for two reasons. First of all, it is done to reduce
- the chances of someone doing large amounts of damage using your
- already-logged-in account. Second, it is there to force you to take the
+ This is done for two reasons. First of all, it is done to reduce
+ the chances of someone doing large amounts of damage using your
+ already-logged-in account. Second, it is there to force you to take the
time to consider if you really need to use this feature.
</p>
[% END %]
-
+
<p>
Click the button to begin the session:
<input type="submit" id="begin_sudo" value="Begin Session">
diff --git a/template/en/default/admin/table.html.tmpl b/template/en/default/admin/table.html.tmpl
index 69fae3dac..f96688b2c 100644
--- a/template/en/default/admin/table.html.tmpl
+++ b/template/en/default/admin/table.html.tmpl
@@ -21,8 +21,8 @@
[%# INTERFACE:
#
- # columns:
- # array of hashes representing the columns in the table.
+ # columns:
+ # array of hashes representing the columns in the table.
# Each hash contains data for a single column. Hash keys:
# name: Name of the field in the data param
# heading: The text to print at the header cell
@@ -30,11 +30,11 @@
# Expressions of format %%xxx%% are replaced with value
# with the key xxx in data hash of the current row.
# content: If specified, the content of this variable is used
- # instead of the data pulled from the current row.
+ # instead of the data pulled from the current row.
# NOTE: This value is only partially HTML filtered!
- # content_use_field: If defined and true, then each value in the
+ # content_use_field: If defined and true, then each value in the
# column corresponds with a key in the
- # field_descs field, and that value from the
+ # field_descs field, and that value from the
# field_descs hash will be used instead of "content."
# See fieldvalues/select-field for an example of use.
# This content WILL be HTML-filtered in this case.
@@ -69,7 +69,7 @@
# against. The second hash then again points to another hash. Within this
# third hash (3), the keys represent values to match against. The item
# contains a fourth hash (4) specifying overridden values.
- #
+ #
# Each column value mentioned in the 'columns' documentation above
# can be overwritten (apart from name and heading). To override a
# table-cell value 'xxx', specify a new 'xxx' value, and specify a
@@ -123,7 +123,7 @@
[%# Are there any specific overrides for this column? %]
[% FOREACH match_field = overrides.${c.name}.keys %]
-
+
[% override = overrides.${c.name}.${match_field}.${row.$match_field} %]
[% NEXT UNLESS override %]
@@ -153,7 +153,7 @@
[% END %]
<a href="[% link_uri %]">
[% END %]
-
+
[% IF content_use_field && field_descs.exists(row.${c.name}) %]
[% colname = row.${c.name} %]
[% field_descs.${colname} FILTER html %]
@@ -174,11 +174,11 @@
[% END %]
[% END %]
[% END %]
-
+
[% IF contentlink %]
</a>
[% END %]
-
+
</td>
[% END %]
</tr>
diff --git a/template/en/default/admin/users/search.html.tmpl b/template/en/default/admin/users/search.html.tmpl
index b9dbccb36..a6994ac3f 100644
--- a/template/en/default/admin/users/search.html.tmpl
+++ b/template/en/default/admin/users/search.html.tmpl
@@ -21,7 +21,7 @@
# id: group id
# name: group name
#%]
-
+
[% PROCESS global/header.html.tmpl
title = "Search users"
diff --git a/template/en/default/admin/users/userdata.html.tmpl b/template/en/default/admin/users/userdata.html.tmpl
index c4ab07010..32cc43f10 100644
--- a/template/en/default/admin/users/userdata.html.tmpl
+++ b/template/en/default/admin/users/userdata.html.tmpl
@@ -24,7 +24,7 @@
<th><label for="login">Login name:</label></th>
<td>
[% IF editusers %]
- <input size="64" maxlength="255" name="login"
+ <input size="64" maxlength="255" name="login"
id="login" value="[% otheruser.login FILTER html %]">
[% IF editform %]
[% IF !otheruser.in_group('bz_sudo_protect') %]
diff --git a/template/en/default/admin/versions/confirm-delete.html.tmpl b/template/en/default/admin/versions/confirm-delete.html.tmpl
index 39091d5fc..64d931cb1 100644
--- a/template/en/default/admin/versions/confirm-delete.html.tmpl
+++ b/template/en/default/admin/versions/confirm-delete.html.tmpl
@@ -67,16 +67,16 @@
[% IF version.bug_count %]
<p>
Sorry, there
- [% IF version.bug_count > 1 %]
- are [% version.bug_count FILTER none %] [%+ terms.bugs %]
+ [% IF version.bug_count > 1 %]
+ are [% version.bug_count FILTER none %] [%+ terms.bugs %]
[% ELSE %]
- is [% version.bug_count FILTER none %] [%+ terms.bug %]
+ is [% version.bug_count FILTER none %] [%+ terms.bug %]
[% END %]
- outstanding for this version. You must move
+ outstanding for this version. You must move
[% IF version.bug_count > 1 %]
- those [% terms.bugs %]
+ those [% terms.bugs %]
[% ELSE %]
that [% terms.bug %]
[% END %]
@@ -85,7 +85,7 @@
[% ELSE %]
<p>Do you really want to delete this version?</p>
-
+
<form method="post" action="editversions.cgi">
<input type="submit" id="delete" value="Yes, delete">
<input type="hidden" name="action" value="delete">
@@ -98,4 +98,4 @@
[% PROCESS admin/versions/footer.html.tmpl %]
-[% PROCESS global/footer.html.tmpl %]
+[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/admin/versions/create.html.tmpl b/template/en/default/admin/versions/create.html.tmpl
index 2b75dabeb..3529c3238 100644
--- a/template/en/default/admin/versions/create.html.tmpl
+++ b/template/en/default/admin/versions/create.html.tmpl
@@ -22,7 +22,7 @@
# product: object; Bugzilla::Product object representing the product to
# which the version is being created for
#%]
-
+
[% title = BLOCK %]Add Version to Product '[% product.name FILTER html %]'[% END %]
[% subheader = BLOCK %]This page allows you to add a new version to product
'[% product.name FILTER html %]'.[% END %]
diff --git a/template/en/default/admin/versions/footer.html.tmpl b/template/en/default/admin/versions/footer.html.tmpl
index ae26e5744..6c94b9ce1 100644
--- a/template/en/default/admin/versions/footer.html.tmpl
+++ b/template/en/default/admin/versions/footer.html.tmpl
@@ -38,11 +38,11 @@
[% UNLESS no_add_version_link %]
<a title="Add a version to product '[% product.name FILTER html %]'"
href="editversions.cgi?action=add&amp;product=
- [%- product.name FILTER uri %]">Add</a> a version.
+ [%- product.name FILTER uri %]">Add</a> a version.
[% END %]
[% IF version.name && !no_edit_version_link %]
- Edit version <a
+ Edit version <a
title="Edit Version '[% version.name FILTER html %]' of product '
[%- product.name FILTER html %]'"
href="editversions.cgi?action=edit&amp;product=
@@ -52,13 +52,13 @@
[% END %]
[% UNLESS no_edit_other_versions_link %]
- Edit other versions of product <a
+ Edit other versions of product <a
href="editversions.cgi?product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
[% END %]
- Edit product <a
+ Edit product <a
href="editproducts.cgi?action=edit&amp;product=
[%- product.name FILTER uri %]">'[% product.name FILTER html %]'</a>.
diff --git a/template/en/default/admin/versions/list.html.tmpl b/template/en/default/admin/versions/list.html.tmpl
index 69435d220..f77b7e870 100644
--- a/template/en/default/admin/versions/list.html.tmpl
+++ b/template/en/default/admin/versions/list.html.tmpl
@@ -41,7 +41,7 @@
[% columns = [
- {
+ {
name => "name"
heading => "Edit version..."
contentlink => edit_contentlink
diff --git a/template/en/default/admin/versions/select-product.html.tmpl b/template/en/default/admin/versions/select-product.html.tmpl
index 7fded475e..ccb46a193 100644
--- a/template/en/default/admin/versions/select-product.html.tmpl
+++ b/template/en/default/admin/versions/select-product.html.tmpl
@@ -32,14 +32,14 @@
%]
[% columns = [
- {
+ {
name => "name"
heading => "Edit versions of..."
- contentlink => "editversions.cgi?product=%%name%%"
+ contentlink => "editversions.cgi?product=%%name%%"
},
- {
+ {
name => "description"
- heading => "Description"
+ heading => "Description"
allow_html_content => 1
}
]
diff --git a/template/en/default/attachment/create.html.tmpl b/template/en/default/attachment/create.html.tmpl
index 2727a225c..95336ed8e 100644
--- a/template/en/default/attachment/create.html.tmpl
+++ b/template/en/default/attachment/create.html.tmpl
@@ -39,7 +39,6 @@
doc_section = "attachments.html"
%]
-[%# BMO hook for displaying MozReview message %]
[% Hook.process('before_form') %]
<form name="entryform" method="post" action="attachment.cgi" enctype="multipart/form-data">
diff --git a/template/en/default/attachment/diff-file.html.tmpl b/template/en/default/attachment/diff-file.html.tmpl
index d510b5a5e..7bd04160a 100644
--- a/template/en/default/attachment/diff-file.html.tmpl
+++ b/template/en/default/attachment/diff-file.html.tmpl
@@ -68,7 +68,7 @@ incremental_restore()
<a href="[% bonsai_prefix %]#[% section.old_start %]">
[% END %]
[% IF section.old_lines > 1 %]
- &nbsp;Lines&nbsp;[% section.old_start %]-[% section.old_start +
+ &nbsp;Lines&nbsp;[% section.old_start %]-[% section.old_start +
section.old_lines - 1 %]
[% ELSE %]
Line&nbsp;[% section.old_start %]
@@ -77,7 +77,7 @@ incremental_restore()
</a>
[% END %]
&nbsp;&nbsp;[% section.func_info FILTER html IF section.func_info %]
- [% END %]
+ [% END %]
</th><th>
<a href="#[% file.filename FILTER html %]_sec[% section_num %]">Link&nbsp;Here</a>&nbsp;
</th></tr></table>
diff --git a/template/en/default/attachment/diff-footer.html.tmpl b/template/en/default/attachment/diff-footer.html.tmpl
index e9965a9a8..fe98162e2 100644
--- a/template/en/default/attachment/diff-footer.html.tmpl
+++ b/template/en/default/attachment/diff-footer.html.tmpl
@@ -34,7 +34,7 @@
<span>Return to [% "$terms.bug $bugid" FILTER bug_link(bugid) FILTER none %]</span>
[% PROCESS global/footer.html.tmpl %]
-
+
[% ELSE %]
</body>
</html>
diff --git a/template/en/default/attachment/edit.html.tmpl b/template/en/default/attachment/edit.html.tmpl
index d06d4ad56..44d388ec1 100644
--- a/template/en/default/attachment/edit.html.tmpl
+++ b/template/en/default/attachment/edit.html.tmpl
@@ -62,8 +62,8 @@
<div id="attachment_attributes">
<div id="attachment_information_read_only" class="[% "bz_private" IF attachment.isprivate %]">
<div class="title">
- [% "[patch]" IF attachment.ispatch%]
- <span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]">
+ [% "[patch]" IF attachment.ispatch%]
+ <span class="[% "bz_obsolete" IF attachment.isobsolete %]" title="[% "obsolete" IF attachment.isobsolete %]">
[% attachment.description FILTER html %]
</span>
[% IF can_edit %]
@@ -96,28 +96,28 @@
wrap = 'soft'
classes = 'block' _ editable_or_hide
defaultcontent = attachment.description
- %]
+ %]
</div>
<div id="attachment_filename">
<label for="filename">Filename:</label>
<input type="text" size="20" class="text block[% editable_or_hide %]"
id="filename" name="filename"
- value="[% attachment.filename FILTER html %]">
+ value="[% attachment.filename FILTER html %]">
</div>
<div id="attachment_mimetype">
<label for="contenttypeentry">MIME Type:</label>
<input type="text" size="20" class="text block[% editable_or_hide %]"
id="contenttypeentry" name="contenttypeentry"
- value="[% attachment.contenttype FILTER html %]">
+ value="[% attachment.contenttype FILTER html %]">
</div>
-
+
<div id="attachment_creator">
<span class="label">Creator:</span>
[%+ INCLUDE global/user.html.tmpl who = attachment.attacher %]
</div>
-
+
<div id="attachment_size">
<span class="label">Size:</span>
[% IF attachment.datasize %]
@@ -136,7 +136,7 @@
<div class="readonly">
<div class="checkboxes">
<div id="attachment_isobsolete">
- <input type="checkbox" id="isobsolete" name="isobsolete" value="1"
+ <input type="checkbox" id="isobsolete" name="isobsolete" value="1"
[%+ 'checked="checked"' IF attachment.isobsolete %]>
<label for="isobsolete">obsolete</label>
</div>
@@ -156,7 +156,7 @@
</div>
[% END %]
</div>
- </div>
+ </div>
</div>
<div id="attachment_view_window">
@@ -249,8 +249,8 @@
[% ELSE %]
<div id="noview">
<p><b>
- Attachment is not viewable in your browser because its MIME type
- ([% attachment.contenttype FILTER html %]) is not one that your browser is
+ Attachment is not viewable in your browser because its MIME type
+ ([% attachment.contenttype FILTER html %]) is not one that your browser is
able to display.
</b></p>
<p><b>
@@ -285,12 +285,12 @@
[% Hook.process('form_before_submit') %]
- [% IF user.id %]
+ [% IF user.id %]
<div id="update_container">
<input type="submit" value="Submit" id="update">
</div>
- [% END %]
- </div>
+ [% END %]
+ </div>
</div>
</div>
</form>
diff --git a/template/en/default/bug/create/comment-guided.txt.tmpl b/template/en/default/bug/create/comment-guided.txt.tmpl
index 67748e594..3e9f84027 100644
--- a/template/en/default/bug/create/comment-guided.txt.tmpl
+++ b/template/en/default/bug/create/comment-guided.txt.tmpl
@@ -24,11 +24,10 @@
# enter_bug.cgi) can be access via Bugzilla.cgi.param. It can be used to
# pull out various custom fields and format an initial Description entry
# from them.
- #%]
+ #%]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
User-Agent: [%+ cgi.user_agent() %]
-Build Identifier: [%+ cgi.param("buildid") %]
[%+ cgi.param("comment") IF cgi.param("comment") %]
@@ -42,12 +41,12 @@ Steps to Reproduce:
[% END %]
[% IF cgi.param("actual_results") %]
-Actual Results:
+Actual Results:
[%+ cgi.param("actual_results") %]
[% END %]
[% IF cgi.param("expected_results") %]
-Expected Results:
+Expected Results:
[%+ cgi.param("expected_results") %]
[% END %]
diff --git a/template/en/default/bug/create/create-guided.html.tmpl b/template/en/default/bug/create/create-guided.html.tmpl
index a1c2c2e08..cfdb0ba4e 100644
--- a/template/en/default/bug/create/create-guided.html.tmpl
+++ b/template/en/default/bug/create/create-guided.html.tmpl
@@ -62,7 +62,7 @@ function PutDescription() {
<h3 id="step1">Step 1 of 3 - has your [% terms.bug %] already been reported?</h3>
<p>
- <font color="red">Please don't skip this step - half of all
+ <font color="red">Please don't skip this step - half of all
[% terms.bugs %] filed are
reported already.</font>
Check the two lists of frequently-reported [% terms.bugs %]:
@@ -79,7 +79,7 @@ function PutDescription() {
<p>
<a href="duplicates.cgi?[% productstring %]&amp;format=simple" target="somebugs">All-time Top 20</a> (loaded initially) |
- <a href="duplicates.cgi?[% productstring %]&amp;format=simple&amp;sortby=delta&amp;reverse=1&amp;maxrows=100&amp;changedsince=14" target="somebugs">Hot in the last two weeks</a>
+ <a href="duplicates.cgi?[% productstring %]&amp;format=simple&amp;sortby=delta&amp;reverse=1&amp;maxrows=100&amp;changedsince=14" target="somebugs">Hot in the last two weeks</a>
</p>
<iframe name="somebugs" id="somebugs"
@@ -100,8 +100,8 @@ function PutDescription() {
<input type="hidden" name="order" value="relevance desc">
<input type="hidden" name="bug_status" value="__all__">
<input type="hidden" name="product" value="[% product.name FILTER html %]">
- [% IF product.name == "Firefox" OR
- product.name == "Thunderbird" OR
+ [% IF product.name == "Firefox" OR
+ product.name == "Thunderbird" OR
product.name == "SeaMonkey" OR
product.name == "Camino" %]
<input type="hidden" name="product" value="Core">
@@ -130,7 +130,7 @@ function PutDescription() {
<h3 id="step2">Step 2 of 3 - give information</h3>
<p>
- If you've tried a few searches and your [% terms.bug %] really isn't in
+ If you've tried a few searches and your [% terms.bug %] really isn't in
there, tell us all about it.
</p>
@@ -191,7 +191,7 @@ function PutDescription() {
</td>
</tr>
</table>
-
+
<p>
The area where the problem occurs.
To pick the right component, you could use the same one as
@@ -228,33 +228,6 @@ function PutDescription() {
</td>
</tr>
- [% IF product.name.match("Firefox|Camino|SeaMonkey") %]
- [% matches = cgi.user_agent('Gecko/(\d+)') %]
- [% buildid = cgi.user_agent() IF matches %]
- [% END %]
-
- [%# Accept URL parameter build ID for non-browser products %]
- [% IF cgi.param("buildid") %]
- [% buildid = cgi.param("buildid") %]
- [% END %]
-
- <tr bgcolor="[% tablecolour %]">
- <td align="right" valign="top">
- <b>Build Identifier</b>
- </td>
- <td valign="top">
- <input type="text" size="80" name="buildid" value="[% buildid FILTER html %]">
- <p>
- This should identify the exact version of the product you were using.
- If the above field is blank or you know it is incorrect, copy the
- user agent text from the product's Help | Troubleshooting Information menu
- (for browsers this will begin with "Mozilla/5.0...").
- If the product won't start, instead paste the complete URL you downloaded
- it from.
- </p>
- </td>
- </tr>
-
<tr>
<td align="right" valign="top">
<b>URL</b>
@@ -275,7 +248,7 @@ function PutDescription() {
<b>Summary</b>
</td>
<td valign="top">
- <input type="text" size="80" name="short_desc" id="short_desc"
+ <input type="text" size="80" name="short_desc" id="short_desc"
maxlength="255" spellcheck="true">
<p>
A sentence which summarises the problem.
@@ -317,7 +290,7 @@ function PutDescription() {
<tt>
<font color="#009900">Good example</font>: After a crash which
happened when I was sorting in the Bookmark Manager,<br> all of my
- top-level bookmark folders beginning with the letters Q to Z are
+ top-level bookmark folders beginning with the letters Q to Z are
no longer present.
</tt>
</p>
@@ -423,7 +396,7 @@ function PutDescription() {
</p>
</td>
</tr>
-
+
<tr>
<td valign="top" align="right">
<b>Severity</b>
@@ -452,7 +425,7 @@ function PutDescription() {
</option>
</select>
<p>
- Say how serious the problem is, or if your [% terms.bug %] is a
+ Say how serious the problem is, or if your [% terms.bug %] is a
request for a new feature.
</p>
</td>
@@ -474,12 +447,12 @@ function PutDescription() {
<p>
That's it! Thanks very much. You'll be notified by email about any
- progress that is made on fixing your [% terms.bug %].
+ progress that is made on fixing your [% terms.bug %].
-<p>
+<p>
Please be warned
- that we get a lot of [% terms.bug %] reports filed - it may take quite a
- while to get around to yours. You can help the process by making sure your
+ that we get a lot of [% terms.bug %] reports filed - it may take quite a
+ while to get around to yours. You can help the process by making sure your
[%+ terms.bug %] is
complete and easy to understand, and by quickly replying to any questions
which may arrive by email.
diff --git a/template/en/default/bug/create/user-message.html.tmpl b/template/en/default/bug/create/user-message.html.tmpl
index 51e787870..4d13da96d 100644
--- a/template/en/default/bug/create/user-message.html.tmpl
+++ b/template/en/default/bug/create/user-message.html.tmpl
@@ -29,8 +29,8 @@
[% PROCESS global/variables.none.tmpl %]
-Before reporting [% terms.abug %], please read the
-<a href="[% terms.BugWritingGuidelinesURL %]">
+Before reporting [% terms.abug %], please read the
+<a href="https://developer.mozilla.org/docs/Mozilla/QA/Bug_writing_guidelines">
[% terms.bug %] writing guidelines</a>, please look at the list of
<a href="duplicates.cgi">most frequently reported [% terms.bugs %]</a>, and please
<a href="query.cgi">search</a> for the [% terms.bug %].
diff --git a/template/en/default/bug/dependency-tree.html.tmpl b/template/en/default/bug/dependency-tree.html.tmpl
index 17f00803f..6e1478be0 100644
--- a/template/en/default/bug/dependency-tree.html.tmpl
+++ b/template/en/default/bug/dependency-tree.html.tmpl
@@ -26,7 +26,7 @@
[% filtered_desc = blocked_tree.$bugid.short_desc FILTER html %]
[% PROCESS global/header.html.tmpl
title = "Dependency tree for $terms.Bug $bugid"
- header = "Dependency tree for
+ header = "Dependency tree for
<a href=\"show_bug.cgi?id=$bugid\">$terms.Bug $bugid</a>"
javascript_urls = ["js/expanding-tree.js"]
style_urls = ["skins/standard/dependency-tree.css"]
@@ -35,10 +35,10 @@
%]
[% PROCESS depthControlToolbar %]
-
+
[% INCLUDE tree_section ids=dependson_ids type=1 %]
-
-[% INCLUDE tree_section ids=blocked_ids type=2 %]
+
+[% INCLUDE tree_section ids=blocked_ids type=2 %]
[% PROCESS depthControlToolbar %]
@@ -58,18 +58,18 @@
[% global.seen = {} %]
[%# Display the tree of bugs that this bug depends on. %]
<h3>
- <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a>
+ <a href="show_bug.cgi?id=[% bugid %]">[% terms.Bug %] [%+ bugid %]</a>
[% IF type == 1 %]
[% tree_name = "dependson_tree" %]
[% IF ids.size %]
- depends on
+ depends on
[% ELSE %]
does not depend on any [% 'open ' IF hide_resolved %][% terms.bugs %].
[% END %]
[% ELSIF type == 2 %]
[% tree_name = "blocked_tree" %]
- [% IF ids.size %]
- blocks
+ [% IF ids.size %]
+ blocks
[% ELSE %]
does not block any [% 'open ' IF hide_resolved %][% terms.bugs %].
[% END %]
@@ -78,7 +78,7 @@
[%+ (ids.size == 1) ? "one" : ids.size %]
[%+ IF hide_resolved %]open[% END %]
[%+ (ids.size == 1) ? terms.bug : terms.bugs %]:
- [% END %]
+ [% END %]
</h3>
[% IF ids.size %]
[%# 27 chars is the length of buglist.cgi?tweak=&bug_id=" %]
@@ -117,8 +117,8 @@
[% bug = tree.$bugid %]
<li>
[%- INCLUDE bullet bugid=bugid tree=tree -%]
- <span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
- id="[% bugid FILTER html %]"
+ <span class="summ[% "_deep" IF tree.dependencies.$bugid.size %]"
+ id="[% bugid FILTER html %]"
[% IF global.seen.$bugid %]
onMouseover="duplicatedover('[% bugid FILTER html %]')"
onMouseout="duplicatedout('[% bugid FILTER html %]')"
@@ -143,9 +143,9 @@
[% BLOCK bullet %]
[% IF tree.dependencies.$bugid.size && ! global.seen.$bugid %]
[% extra_class = " b_open" %]
- [% extra_args = 'onclick="return doToggle(this, event)"' %]
+ [% extra_args = 'onclick="return doToggle(this, event)"' %]
[% END %]
- <a id="b[% bugid %]"
+ <a id="b[% bugid %]"
class="b [%+ extra_class FILTER none %]"
title="Click to expand or contract this portion of the tree. Hold down the Ctrl key while clicking to expand or contract all subtrees."
[% extra_args FILTER none %]>&nbsp;&nbsp;</a>
@@ -209,7 +209,7 @@
style="display: inline; margin: 0px;">
[%# set to one form %]
<input type="submit" id="change_maxdepth"
- value="&nbsp;1&nbsp;"
+ value="&nbsp;1&nbsp;"
[% "disabled" IF realdepth < 2 || maxdepth == 1 %]>
<input name="id" type="hidden" value="[% bugid %]">
<input name="maxdepth" type="hidden" value="1">
@@ -260,7 +260,7 @@
<input name="maxdepth" type="hidden" value="[% maxdepth + 1 %]">
[% END %]
<input name="hide_resolved" type="hidden" value="[% hide_resolved %]">
- <input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;"
+ <input type="submit" id="increase_depth" value="&nbsp;&gt;&nbsp;"
[% "disabled" IF realdepth < 2 || !maxdepth || maxdepth >= realdepth %]>
</form>
</td>
diff --git a/template/en/default/bug/edit.html.tmpl b/template/en/default/bug/edit.html.tmpl
index 445e5fe0d..6a1edc163 100644
--- a/template/en/default/bug/edit.html.tmpl
+++ b/template/en/default/bug/edit.html.tmpl
@@ -110,27 +110,27 @@
<table class="edit_form">
<tr>
[%# 1st Column %]
- <td id="bz_show_bug_column_1" class="bz_show_bug_column">
+ <td id="bz_show_bug_column_1" class="bz_show_bug_column">
<table>
[%# *** ID, product, component, status, resolution, Hardware, and OS *** %]
[% PROCESS section_status %]
-
+
[% PROCESS section_spacer %]
-
+
[% PROCESS section_details1 %]
-
+
[% PROCESS section_spacer %]
-
+
[%# *** severity, priority, version and milestone *** %]
- [% PROCESS section_details2 %]
-
+ [% PROCESS section_details2 %]
+
[%# *** assigned to and qa contact *** %]
[% PROCESS section_people %]
-
+
[% PROCESS section_spacer %]
-
+
[% PROCESS section_url_keyword_whiteboard %]
-
+
[% PROCESS section_spacer %]
[%# *** Dependencies and duplicates *** %]
@@ -138,7 +138,7 @@
[% PROCESS section_dependson_blocks %]
- [% IF user.id %]
+ [% IF user.id %]
<tr>
<td colspan="2">
<span style="float:left">
@@ -187,7 +187,6 @@
<table id="bz_big_form_parts" cellspacing="0" cellpadding="0"><tr>
<td>
- [%# BMO hook for adding MozReview table %]
[% Hook.process("after_bug_data") %]
[% IF user.is_timetracker %]
@@ -230,7 +229,7 @@
[% ELSE %]
[% PROCESS summon_comment_box %]
[% END %]
-
+
</form>
@@ -242,35 +241,35 @@
[%# That's the main table, which contains all editable fields. %]
<div class="bz_alias_short_desc_container edit_form">
<span class="last_comment_link">
- <a href="#c[% bug.comments.size - 1 %]"
+ <a href="#c[% bug.comments.size - 1 %]"
accesskey="l"><b>L</b>ast Comment</a>
- </span>
+ </span>
<a href="show_bug.cgi?id=[% bug.bug_id %]">
[%-# %]<b>[% terms.Bug %]&nbsp;[% bug.bug_id FILTER html %]</b>
- [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
+ [%-# %]</a> -<span id="summary_alias_container" class="bz_default_hidden">
[% IF Param("usebugaliases") %]
[% IF bug.alias != "" %]
- (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
+ (<span id="alias_nonedit_display">[% bug.alias FILTER html %]</span>)
[% END %]
[% END %]
<span role="heading" aria-level="1" id="short_desc_nonedit_display">[% bug.short_desc FILTER quoteUrls(bug) FILTER wbr %]</span>
- [% IF bug.check_can_change_field('short_desc', 0, 1) ||
+ [% IF bug.check_can_change_field('short_desc', 0, 1) ||
bug.check_can_change_field('alias', 0, 1) %]
<small class="editme">(<a href="#" id="editme_action">edit</a>)</small>
[% END %]
</span>
-
-
+
+
<div id="summary_alias_input">
- <table id="summary">
+ <table id="summary">
[% IF Param("usebugaliases") %]
<tr>
- [% IF bug.check_can_change_field('alias', 0, 1) %]
+ [% IF bug.check_can_change_field('alias', 0, 1) %]
<td>
- <label
- for="alias"
- title="a name for the
- [% terms.bug %] that can be used in place of its ID number,
+ <label
+ for="alias"
+ title="a name for the
+ [% terms.bug %] that can be used in place of its ID number,
[%%] e.g. when adding it to a list of dependencies"
>Alias</label>:</td><td>
[% ELSIF bug.alias %]
@@ -281,12 +280,12 @@
[% INCLUDE input inputname => "alias"
size => "40"
maxlength => "40"
- no_td => 1
- %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
+ no_td => 1
+ %][% ")" IF NOT bug.check_can_change_field('alias', 0, 1)
&& bug.alias %]
</td>
</tr>
- [% END %]
+ [% END %]
[%# *** Summary *** %]
<tr>
<td>
@@ -334,7 +333,7 @@
value = bug.classification
editable = bug.check_can_change_field('product', 0, 1) %]
</tr>
- [%###############%]
+ [%###############%]
[%# Component #%]
[%###############%]
<tr>
@@ -352,9 +351,9 @@
[% PROCESS select selname => "version" %]
</tr>
- [%############%]
+ [%############%]
[%# PLATFORM #%]
- [%############%]
+ [%############%]
<tr>
<th class="field_label">
<label for="rep_platform" accesskey="h">Platform</label>:
@@ -364,8 +363,8 @@
bug = bug, field = bug_fields.rep_platform,
no_tds = 1, value = bug.rep_platform
editable = bug.check_can_change_field('rep_platform', 0, 1) %]
- [%+ INCLUDE bug/field.html.tmpl
- bug = bug, field = bug_fields.op_sys,
+ [%+ INCLUDE bug/field.html.tmpl
+ bug = bug, field = bug_fields.op_sys,
no_tds = 1, value = bug.op_sys
editable = bug.check_can_change_field('op_sys', 0, 1) %]
[%# BMO - hook for hw/os detection from reporter %]
@@ -396,7 +395,7 @@
[% END %]
[% END %]
[% IF bug.user.canedit || bug.user.isreporter %]
- (<a href="#add_comment"
+ (<a href="#add_comment"
onclick="window.setTimeout(function() { document.getElementById('bug_status').focus(); }, 10)">edit</a>)
[% END %]
</span>
@@ -413,7 +412,7 @@
[% INCLUDE input inputname => "status_whiteboard" size => "40" colspan => 2 %]
</tr>
[% END %]
-
+
[% IF use_keywords %]
<tr>
<th class="field_label">
@@ -468,7 +467,7 @@
[% PROCESS select selname = "target_milestone" %]
</tr>
[% END %]
-
+
[% END %]
[%############################################################################%]
@@ -488,7 +487,7 @@
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
(<a href="#" id="bz_assignee_edit_action">edit</a>)
[% IF bug.assigned_to.id != user.id %]
- (<a title="Reassign to yourself"
+ (<a title="Reassign to yourself"
href="#" id="bz_assignee_take_action">take</a>)
[% END %]
</span>
@@ -506,10 +505,10 @@
<label id="set_default_assignee_label" for="set_default_assignee">Reset Assignee to default</label>
</div>
<script>
- hideEditableField('bz_assignee_edit_container',
- 'bz_assignee_input',
- 'bz_assignee_edit_action',
- 'assigned_to',
+ hideEditableField('bz_assignee_edit_container',
+ 'bz_assignee_input',
+ 'bz_assignee_edit_action',
+ 'assigned_to',
'[% bug.assigned_to.login FILTER js %]' );
hideEditableField('bz_assignee_edit_container',
'bz_assignee_input',
@@ -517,7 +516,7 @@
'assigned_to',
'[% bug.assigned_to.login FILTER js %]',
'[% user.login FILTER js %]' );
- initDefaultCheckbox('assignee');
+ initDefaultCheckbox('assignee');
</script>
[% ELSE %]
[% INCLUDE global/user.html.tmpl who = bug.assigned_to %]
@@ -537,7 +536,7 @@
[% INCLUDE global/user.html.tmpl who = bug.qa_contact %]
(<a href="#" id="bz_qa_contact_edit_action">edit</a>)
[% IF bug.qa_contact.id != user.id %]
- (<a title="Change QA contact to yourself"
+ (<a title="Change QA contact to yourself"
href="#" id="bz_qa_contact_take_action">take</a>)
[% END %]
</span>
@@ -556,15 +555,15 @@
<label for="set_default_qa_contact" id="set_default_qa_contact_label">Reset QA Contact to default</label>
</div>
<script>
- hideEditableField('bz_qa_contact_edit_container',
- 'bz_qa_contact_input',
- 'bz_qa_contact_edit_action',
- 'qa_contact',
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_edit_action',
+ 'qa_contact',
'[% bug.qa_contact.login FILTER js %]');
- hideEditableField('bz_qa_contact_edit_container',
- 'bz_qa_contact_input',
- 'bz_qa_contact_take_action',
- 'qa_contact',
+ hideEditableField('bz_qa_contact_edit_container',
+ 'bz_qa_contact_input',
+ 'bz_qa_contact_take_action',
+ 'qa_contact',
'[% bug.qa_contact.login FILTER js %]',
'[% user.login FILTER js %]');
initDefaultCheckbox('qa_contact');
@@ -610,7 +609,7 @@
%]
<td>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
- <span id="bz_url_edit_container" class="bz_default_hidden">
+ <span id="bz_url_edit_container" class="bz_default_hidden">
<a href="[% bug.bug_file_loc FILTER html %]" target="_blank"
rel="noreferrer" title="[% bug.bug_file_loc FILTER html %]"
[% IF NOT is_safe_url(bug.bug_file_loc) %]
@@ -639,10 +638,10 @@
</span>
[% IF bug.check_can_change_field("bug_file_loc", 0, 1) %]
<script>
- hideEditableField('bz_url_edit_container',
- 'bz_url_input_area',
- 'bz_url_edit_action',
- 'bug_file_loc',
+ hideEditableField('bz_url_edit_container',
+ 'bz_url_input_area',
+ 'bz_url_edit_action',
+ 'bug_file_loc',
"[% bug.bug_file_loc FILTER js %]");
</script>
[% END %]
@@ -678,20 +677,20 @@
[% BLOCK section_dependson_blocks %]
<tr>
- [% INCLUDE dependencies
+ [% INCLUDE dependencies
field = bug_fields.dependson deps = bug.depends_on_obj %]
</tr>
-
+
<tr>
- [% INCLUDE dependencies
+ [% INCLUDE dependencies
field = bug_fields.blocked deps = bug.blocks_obj %]
-
+
<tr>
<th>&nbsp;</th>
-
+
<td colspan="2" align="left" id="show_dependency_tree_or_graph">
Show dependency <a href="showdependencytree.cgi?id=[% bug.bug_id %]&amp;hide_resolved=1">tree</a>
-
+
[% IF Param('webdotbase') %]
/&nbsp;<a href="showdependencygraph.cgi?id=[% bug.bug_id %]">graph</a>
[% END %]
@@ -721,7 +720,7 @@
[% IF NOT emitted_description %]
[% emitted_description = 1 %]
<div id="bz_restrict_group_visibility_help">
- <b>Only users in all of the selected groups can view this
+ <b>Only users in all of the selected groups can view this
[%+ terms.bug %]:</b>
<p class="instructions">
Unchecking all boxes makes this a more public [% terms.bug %].
@@ -730,7 +729,7 @@
[% END %]
[% IF group.ingroup %]
- <input type="hidden" name="defined_groups"
+ <input type="hidden" name="defined_groups"
value="[% group.name FILTER html %]">
[% END %]
@@ -745,20 +744,20 @@
[% IF emitted_description %]
[% IF NOT inallgroups %]
- <p class="instructions">Only members of a group can change the
+ <p class="instructions">Only members of a group can change the
visibility of [% terms.abug %] for that group.</p>
[% END %]
[% END %]
[% IF inagroup %]
<div id="bz_enable_role_visibility_help">
- <b>Users in the roles selected below can always view
+ <b>Users in the roles selected below can always view
this [% terms.bug %]:</b>
</div>
<div id="bz_enable_role_visibility">
<div>
- [% user_can_edit_accessible =
- bug.check_can_change_field("reporter_accessible", 0, 1)
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("reporter_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_reporter_accessible" value="1">
@@ -770,8 +769,8 @@
<label for="reporter_accessible">Reporter</label>
</div>
<div>
- [% user_can_edit_accessible =
- bug.check_can_change_field("cclist_accessible", 0, 1)
+ [% user_can_edit_accessible =
+ bug.check_can_change_field("cclist_accessible", 0, 1)
%]
[% IF user_can_edit_accessible %]
<input type="hidden" name="defined_cclist_accessible" value="1">
@@ -809,7 +808,7 @@
[% bug.creation_ts FILTER time("%Y-%m-%d %H:%M %Z") %] by [% INCLUDE global/user.html.tmpl who = bug.reporter %]
</td>
</tr>
-
+
<tr>
<th class="field_label">
Modified:
@@ -818,7 +817,7 @@
[% bug.delta_ts FILTER time("%Y-%m-%d %H:%M %Z") %]
(<a href="show_activity.cgi?id=[% bug.bug_id %]">[%# terms.Bug %]History</a>)
</td>
-
+
</tr>
[% END %]
@@ -844,10 +843,10 @@
|| (!has_role
&& user.settings.state_addselfcc.value == 'cc_unless_role') %]>
<label for="addselfcc">Add me to CC list</label>
- <br>
+ <br>
[% END %]
[% END %]
- [% bug.cc.size || 0 FILTER html %]
+ [% bug.cc.size || 0 FILTER html %]
[% IF bug.cc.size == 1 %]
user
[% ELSE %]
@@ -863,7 +862,7 @@
(<a href="#" id="cc_edit_area_showhide">[% IF user.id %]edit[% ELSE %]show[% END %]</a>)
[% IF user.id && bug.cc.size %]
<br>
- <ul class="cc_list_display">
+ <ul class="cc_list_display">
[% FOREACH c = bug.cc %]
<li>[% c FILTER email FILTER html %]</li>
[% END %]
@@ -912,11 +911,11 @@
</div>
[% IF user.id || bug.cc.size %]
<script>
- hideEditableField( 'cc_edit_area_showhide_container',
- 'cc_edit_area',
- 'cc_edit_area_showhide',
- '',
- '');
+ hideEditableField( 'cc_edit_area_showhide_container',
+ 'cc_edit_area',
+ 'cc_edit_area_showhide',
+ '',
+ '');
</script>
[% END %]
</td>
@@ -952,7 +951,7 @@
[% BLOCK section_see_also %]
[% IF Param('use_see_also') || bug.see_also.size %]
<tr>
- [% INCLUDE bug/field.html.tmpl
+ [% INCLUDE bug/field.html.tmpl
field = bug_fields.see_also
value = bug.see_also
editable = bug.check_can_change_field('see_also', 0, 1)
@@ -1011,7 +1010,7 @@
YAHOO.util.Dom.removeClass(rows[i], 'bz_default_hidden');
}
YAHOO.util.Event.preventDefault(e);
- });
+ });
</script>
[% END %]
</td>
@@ -1070,31 +1069,31 @@
<td>
<span id="[% field.name FILTER html %]_input_area">
[% IF bug.check_can_change_field(field.name, 0, 1) %]
- <input name="[% field.name FILTER html %]"
+ <input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" class="text_input"
value="[% bug.${field.name}.join(', ') FILTER html %]">
[% END %]
</span>
-
+
[% FOREACH dep_bug = deps %]
[% dep_bug.id FILTER bug_link(dep_bug, use_alias => 1)
FILTER none %][% " " %]
[% END %]
[% IF bug.check_can_change_field(field.name, 0, 1) %]
- <span id="[% field.name FILTER html %]_edit_container"
+ <span id="[% field.name FILTER html %]_edit_container"
class="edit_me bz_default_hidden">
(<a href="#" id="[% field.name FILTER html %]_edit_action">edit</a>)
</span>
<script>
- hideEditableField('[% field.name FILTER js %]_edit_container',
- '[% field.name FILTER js %]_input_area',
- '[% field.name FILTER js %]_edit_action',
- '[% field.name FILTER js %]',
+ hideEditableField('[% field.name FILTER js %]_edit_container',
+ '[% field.name FILTER js %]_input_area',
+ '[% field.name FILTER js %]_edit_action',
+ '[% field.name FILTER js %]',
'[% bug.${field.name}.join(', ') FILTER js %]');
</script>
[% END %]
</td>
-
+
[% END %]
[%############################################################################%]
@@ -1160,7 +1159,7 @@
[% INCLUDE bug/field.html.tmpl
field = bug_fields.deadline, value = bug.deadline, no_tds = 1
editable = bug.check_can_change_field('deadline', 0, 1) %]
- </td>
+ </td>
</tr>
<tr>
<td colspan="7" class="bz_summarize_time">
@@ -1169,7 +1168,7 @@
blocking this [% terms.bug %])</a>
</td>
</tr>
- </table>
+ </table>
[% END %]
[%############################################################################%]
@@ -1179,7 +1178,7 @@
[% BLOCK comment_box %]
<div id="add_comment" class="bz_section_additional_comments">
[% IF user.id %]
- <label for="comment" accesskey="c"><b>Additional
+ <label for="comment" accesskey="c"><b>Additional
<u>C</u>omments</b></label>:
[% IF user.is_insider && bug.check_can_change_field('longdesc', 0, 1) %]
@@ -1240,7 +1239,7 @@
before you can comment on or make changes to this [% terms.bug %].
</fieldset>
</td>
- </tr>
+ </tr>
</table>
[% END %]
</div>
@@ -1267,7 +1266,7 @@
[% BLOCK select %]
<td>
- [% IF bug.check_can_change_field(selname, 0, 1)
+ [% IF bug.check_can_change_field(selname, 0, 1)
AND bug.choices.${selname}.size > 1 %]
<input type="hidden" id="[% selname %]_dirty">
<select id="[% selname %]" name="[% selname %]">
@@ -1307,7 +1306,7 @@
[% val FILTER html %]
[% END %]
[% END %]
- [% IF no_td != 1 %]
+ [% IF no_td != 1 %]
</td>
[% END %]
[% END %]
@@ -1315,7 +1314,7 @@
[% BLOCK commit_button %]
[% IF user.id %]
<div class="knob-buttons">
- <input type="submit" value="Save Changes"
+ <input type="submit" value="Save Changes"
id="commit[% id FILTER css_class_quote %]">
</div>
[% END %]
diff --git a/template/en/default/bug/field-events.js.tmpl b/template/en/default/bug/field-events.js.tmpl
index 3133c159b..64dbc3b7d 100644
--- a/template/en/default/bug/field-events.js.tmpl
+++ b/template/en/default/bug/field-events.js.tmpl
@@ -10,7 +10,7 @@
#
# The Original Code is the Bugzilla Bug Tracking System.
#
- # The Initial Developer of the Original Code is the San Jose State
+ # The Initial Developer of the Original Code is the San Jose State
# University Foundation. Portions created by the Initial Developer
# are Copyright (C) 2008 the Initial Developer. All Rights Reserved.
#
diff --git a/template/en/default/bug/field-help.none.tmpl b/template/en/default/bug/field-help.none.tmpl
index d52d598eb..782318c8f 100644
--- a/template/en/default/bug/field-help.none.tmpl
+++ b/template/en/default/bug/field-help.none.tmpl
@@ -63,11 +63,11 @@ cc =>
"Users who may not have a direct role to play on this $terms.bug, but who
are interested in its progress.",
-classification =>
+classification =>
"$terms.Bugs are categorised into Classifications, Products and"
- _ " Components. classifications is the top-level categorisation.",
+ _ " Components. classifications is the top-level categorisation.",
-component =>
+component =>
"Components are second-level categories; each belongs to a"
_ " particular Product. Select a Product to narrow down this list.",
@@ -123,10 +123,10 @@ qa_contact =>
remaining_time =>
"The number of hours of work left on this $terms.bug, calculated by
- subtracting the $vars.field_descs.work_time from the
+ subtracting the $vars.field_descs.work_time from the
${vars.field_descs.estimated_time}.",
-rep_platform =>
+rep_platform =>
"The hardware platform the $terms.bug was observed on.",
reporter =>
@@ -144,7 +144,7 @@ see_also =>
<p>You should normally use this field to refer to $terms.bugs in
<em>other</em> installations. For $terms.bugs in this
- installation, it is better to use the $vars.field_descs.dependson and
+ installation, it is better to use the $vars.field_descs.dependson and
$vars.field_descs.blocked fields.</p>",
short_desc =>
@@ -217,7 +217,7 @@ email1 =>
[% END %]
[% IF Param('useclassification') %]
- [% vars.help_html.product = vars.help_html.product
+ [% vars.help_html.product = vars.help_html.product
_ " Select a Classification to narrow down this list." %]
[% END %]
@@ -229,14 +229,14 @@ email1 =>
[% field_type_desc = BLOCK -%]
[% field_types.$field_type FILTER html %]
[%- END %]
- [% vars.help_html.${help_field} =
+ [% vars.help_html.${help_field} =
"A custom $field_type_desc field in this installation"
_ " of ${terms.Bugzilla}." %]
[% END %]
[%# Add help for the search types, for query.cgi. %]
[% type_desc = BLOCK %]
- The type of [% vars.field_descs.${help_field} FILTER html %] search you
+ The type of [% vars.field_descs.${help_field} FILTER html %] search you
would like.
[% END %]
[% SET type_name = help_field _ '_type' %]
diff --git a/template/en/default/bug/field-label.html.tmpl b/template/en/default/bug/field-label.html.tmpl
index 94180fabc..851935283 100644
--- a/template/en/default/bug/field-label.html.tmpl
+++ b/template/en/default/bug/field-label.html.tmpl
@@ -37,7 +37,7 @@
<label for="[% field.name FILTER html %]"[% IF accesskey %] accesskey="[% accesskey FILTER html %]"[% END %]>
[% END %]
- <a
+ <a
[% IF help_html.${field.name}.defined %]
title="[% help_html.${field.name} FILTER txt FILTER collapse FILTER html %]"
class="field_help_link"
diff --git a/template/en/default/bug/field.html.tmpl b/template/en/default/bug/field.html.tmpl
index 1d6048cdd..d15a6ea60 100644
--- a/template/en/default/bug/field.html.tmpl
+++ b/template/en/default/bug/field.html.tmpl
@@ -31,9 +31,9 @@
# allow_dont_change: display the --do_not_change-- option for select fields.
# value_span: A colspan for the table cell containing
# the field value.
- # no_tds: boolean; if true, don't display the label <th> or the
+ # no_tds: boolean; if true, don't display the label <th> or the
# wrapping <td> for the field.
- # bug (optional): The current Bugzilla::Bug being displayed, or a hash
+ # bug (optional): The current Bugzilla::Bug being displayed, or a hash
# with default field values being displayed on a page.
#%]
@@ -45,7 +45,7 @@
[% IF NOT no_tds %]
[% PROCESS "bug/field-label.html.tmpl" %]
<td class="field_value [% ' bz_hidden_field' IF hidden %]"
- id="field_container_[% field.name FILTER html %]"
+ id="field_container_[% field.name FILTER html %]"
[% " colspan=\"$value_span\"" FILTER none IF value_span %]>
[% END %]
[% Hook.process('start_field_column') %]
@@ -85,7 +85,7 @@
</span>
- [% IF value %]
+ [% IF value %]
[% value FILTER bug_link(value, use_alias => 1) FILTER none %]
[% END %]
<span id="[% field.name FILTER html %]_edit_container" class="edit_me bz_default_hidden">
@@ -98,11 +98,11 @@
'[% field.name FILTER js %]',
"[% value FILTER js %]");
</script>
- [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
constants.FIELD_TYPE_MULTI_SELECT ] %]
<input type="hidden" id="[% field.name FILTER html %]_dirty">
- <select id="[% field.name FILTER html %]"
- name="[% field.name FILTER html %]"
+ <select id="[% field.name FILTER html %]"
+ name="[% field.name FILTER html %]"
[% IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]
[% SET field_size = 5 %]
[% IF field.legal_values.size < 5 %]
@@ -125,7 +125,7 @@
[% END %]
[% FOREACH legal_value = legal_values %]
[% NEXT IF NOT legal_value.is_active AND NOT value.contains(legal_value.name).size %]
-
+
[%# Purpose: hide field values from those who can't change them %]
[% IF field.name.match("^cf_blocking_") OR
field.name.match("^cf_status_") OR
@@ -135,7 +135,7 @@
[% NEXT UNLESS bug.check_can_change_field(field.name, '---', legal_value.name) OR
value.contains(legal_value.name).size %]
[% END %]
-
+
[% IF field.name == "resolution" &&
legal_value.name != bug.resolution %]
[% r = legal_value.name %]
@@ -149,7 +149,7 @@
[% END %]
[% NEXT IF r == "EXPIRED" %]
[% END %]
-
+
<option value="[% legal_value.name FILTER html %]"
id="v[% legal_value.id FILTER html %]_
[%- field.name FILTER html %]"
@@ -257,10 +257,10 @@
[% CASE constants.FIELD_TYPE_TEXTAREA %]
<div class="uneditable_textarea">[% value FILTER html %]</div>
[% CASE constants.FIELD_TYPE_BUG_ID %]
- [% IF value %]
+ [% IF value %]
[% value FILTER bug_link(value, use_alias => 1) FILTER none %]
[% END %]
- [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT
constants.FIELD_TYPE_MULTI_SELECT ] %]
[% FOREACH val = value %]
[% display_value(field.name, val) FILTER html %]
diff --git a/template/en/default/bug/format_comment.txt.tmpl b/template/en/default/bug/format_comment.txt.tmpl
index 156798026..9c1f1385f 100644
--- a/template/en/default/bug/format_comment.txt.tmpl
+++ b/template/en/default/bug/format_comment.txt.tmpl
@@ -17,7 +17,7 @@
# Contributor(s): Marc Schumann <wurblzap@gmail.com>
#%]
-[%# NOTE: Everywhere you use this template, you must call
+[%# NOTE: Everywhere you use this template, you must call
# "FILTER remove('^X')" on the result. This is unfortunately the only way
# to preserve leading whitespace in comments.
#%]
diff --git a/template/en/default/bug/knob.html.tmpl b/template/en/default/bug/knob.html.tmpl
index 16aa160f6..a49739928 100644
--- a/template/en/default/bug/knob.html.tmpl
+++ b/template/en/default/bug/knob.html.tmpl
@@ -31,7 +31,7 @@
editable = bug.choices.bug_status.size > 1
%]
- [% IF bug.resolution
+ [% IF bug.resolution
OR bug.check_can_change_field('resolution', bug.resolution, 1)
%]
<noscript><br>resolved&nbsp;as&nbsp;</noscript>
@@ -65,7 +65,7 @@
</div>
[% ELSIF bug.dup_id %]
<noscript><br> duplicate</noscript>
- <span id="duplicate_display">of
+ <span id="duplicate_display">of
[% "${terms.bug} ${bug.dup_id}" FILTER bug_link(bug.dup_id) FILTER none %]</span>
[% END %]
</div>
diff --git a/template/en/default/bug/link.html.tmpl b/template/en/default/bug/link.html.tmpl
index dc09848da..da70d49b9 100644
--- a/template/en/default/bug/link.html.tmpl
+++ b/template/en/default/bug/link.html.tmpl
@@ -54,8 +54,8 @@
[% anchor = "#c$comment_num" %]
[% END %]
-<a class="bz_bug_link
- bz_status_[% bug.bug_status FILTER css_class_quote %]
+<a class="bz_bug_link
+ bz_status_[% bug.bug_status FILTER css_class_quote %]
[% ' bz_closed' IF !bug.isopened %]"
title="[% link_title FILTER collapse FILTER html %]"
href="[% urlbase FILTER html IF full_url %]show_bug.cgi?id=
diff --git a/template/en/default/bug/new_bug.html.tmpl b/template/en/default/bug/new_bug.html.tmpl
index 9e0b2c1ab..80a603944 100644
--- a/template/en/default/bug/new_bug.html.tmpl
+++ b/template/en/default/bug/new_bug.html.tmpl
@@ -7,7 +7,7 @@
[% PROCESS global/variables.none.tmpl %]
[% title = BLOCK %]Enter [% terms.Bug %] [% END %]
-[% PROCESS bug_modal/common_header.html.tmpl
+[% PROCESS bug_modal/common_header.html.tmpl
title = title
jquery = [ "selectize" ]
jquery_css = [ "js/jquery/plugins/selectize/selectize.bootstrap3.css" ]
@@ -82,7 +82,7 @@
editable = 1
help = "describecomponents.cgi?product=$filtered_product"
%]
-
+
<span aria-owns="product-name product-latch">
<span role="button" aria-label="show product information" aria-expanded="false" tabindex="0"
class="spin-latch" id="product-latch" data-latch="product" data-for="product">&#9656;</span>
diff --git a/template/en/default/bug/process/midair.html.tmpl b/template/en/default/bug/process/midair.html.tmpl
index 157cb44b4..95029a438 100644
--- a/template/en/default/bug/process/midair.html.tmpl
+++ b/template/en/default/bug/process/midair.html.tmpl
@@ -79,9 +79,9 @@ You have the following choices:
<ul>
<li>
<form method="post" action="process_bug.cgi">
- <input type="hidden" name="delta_ts"
+ <input type="hidden" name="delta_ts"
value="[% bug.delta_ts FILTER html %]">
- [% PROCESS "global/hidden-fields.html.tmpl"
+ [% PROCESS "global/hidden-fields.html.tmpl"
exclude="^Bugzilla_login|Bugzilla_password|delta_ts$" %]
<input type="submit" id="process" value="Submit my changes anyway">
This will cause all of the above changes to be overwritten
diff --git a/template/en/default/bug/process/verify-new-product.html.tmpl b/template/en/default/bug/process/verify-new-product.html.tmpl
index 1d2e8689f..01494ec84 100644
--- a/template/en/default/bug/process/verify-new-product.html.tmpl
+++ b/template/en/default/bug/process/verify-new-product.html.tmpl
@@ -48,23 +48,23 @@
exclude = '^' _ exclude_items.join('|') _ '$' %]
<input type="hidden" name="confirm_product_change" value="1">
-
+
[%# Verify the version, component, and target milestone fields. %]
<h3>Verify Version, Component
- [%- ", Target Milestone"
+ [%- ", Target Milestone"
IF Param("usetargetmilestone")
&& bug.check_can_change_field('target_milestone', 0, 1) %]</h3>
<p>
-[% IF Param("usetargetmilestone")
- && bug.check_can_change_field('target_milestone', 0, 1)
+[% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
%]
- You are moving the [% terms.bug %](s) to the product
+ You are moving the [% terms.bug %](s) to the product
<b>[% product.name FILTER html %]</b>,
and the version, component, and/or target milestone fields are no longer
correct. Please set the correct version, component, and target milestone now:
[% ELSE %]
- You are moving the [% terms.bug %](s) to the product
+ You are moving the [% terms.bug %](s) to the product
<b>[% product.name FILTER html %]</b>,
and the version and component fields are no longer correct.
Please set the correct version and component now:
@@ -80,7 +80,7 @@
[% ELSE %]
[% SET default_version = defaults.version %]
[% END %]
- [% PROCESS "global/select-menu.html.tmpl"
+ [% PROCESS "global/select-menu.html.tmpl"
name="version"
options=versions
default=default_version
@@ -99,8 +99,8 @@
default=default_component
size=10 %]
</td>
- [% IF Param("usetargetmilestone")
- && bug.check_can_change_field('target_milestone', 0, 1)
+ [% IF Param("usetargetmilestone")
+ && bug.check_can_change_field('target_milestone', 0, 1)
%]
<td>
<b>Target Milestone:</b><br>
@@ -117,7 +117,7 @@
[% IF verify_bug_groups %]
<h3>Verify [% terms.Bug %] Group</h3>
-
+
[% IF old_groups.size %]
<p>These groups are not legal for the '[% product.name FILTER html %]'
product or you are not allowed to restrict [% terms.bugs %] to these groups.<br>
diff --git a/template/en/default/bug/show-multiple.html.tmpl b/template/en/default/bug/show-multiple.html.tmpl
index a0a4ecbf1..add29adbc 100644
--- a/template/en/default/bug/show-multiple.html.tmpl
+++ b/template/en/default/bug/show-multiple.html.tmpl
@@ -63,7 +63,7 @@
[% BLOCK bug_display %]
<h1>
- [% terms.Bug %]
+ [% terms.Bug %]
<a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">[% bug.bug_id FILTER html %]</a>
[% IF Param("usebugaliases") AND bug.alias AND NOT bug.error %]
(<a href="show_bug.cgi?id=[% bug.alias FILTER uri %]">
@@ -245,7 +245,7 @@
</td>
<td>
[% PROCESS formattimeunit
- time_unit=bug.estimated_time -
+ time_unit=bug.estimated_time -
(bug.actual_time + bug.remaining_time) %]
</td>
</tr>
@@ -299,9 +299,9 @@
</tr>
[% END %]
[% END %]
-
+
[% Hook.process("last_row", "bug/show-multiple.html.tmpl") %]
-
+
</table>
@@ -357,7 +357,7 @@
[% FOREACH c = bug.cc %]
[% c FILTER email FILTER html %][% ", " IF not loop.last() %]
[% END %]
- [% ELSIF name == "reporter" || name == "assigned_to"
+ [% ELSIF name == "reporter" || name == "assigned_to"
|| name == "qa_contact" %]
<th class="rightcell">[% field_descs.${name} FILTER html %]:</th>
<td>[% bug.${name}.identity FILTER email FILTER html %]</td>
diff --git a/template/en/default/bug/show.xml.tmpl b/template/en/default/bug/show.xml.tmpl
index c0f32d69e..cc10cf95e 100644
--- a/template/en/default/bug/show.xml.tmpl
+++ b/template/en/default/bug/show.xml.tmpl
@@ -27,9 +27,9 @@
<bugzilla version="[% constants.BUGZILLA_VERSION %]"
urlbase="[% urlbase FILTER xml %]"
- [%# Note that the maintainer's email is not filtered,
+ [%# Note that the maintainer's email is not filtered,
# intentionally. Even logged-out users should be able
- # to see that, since it will be in error messages anyway.
+ # to see that, since it will be in error messages anyway.
%]
maintainer="[% Param('maintainer') FILTER xml %]"
[% IF user.id %]
@@ -83,7 +83,7 @@
</long_desc>
[% END %]
[% END %]
-
+
[% IF displayfields.attachment %]
[% FOREACH a = bug.attachments %]
[% NEXT IF a.isprivate && !user.is_insider %]
@@ -112,7 +112,7 @@
</attachment>
[% END %]
[% END %]
-
+
[% Hook.process("bug_end") %]
</bug>
@@ -151,7 +151,7 @@
[% BLOCK section_flags %]
[% RETURN UNLESS displayfields.flag %]
-
+
[% FOREACH flag = obj.flags %]
<flag name="[% flag.type.name FILTER xml %]"
id="[% flag.id FILTER xml %]"
diff --git a/template/en/default/bug/summarize-time.html.tmpl b/template/en/default/bug/summarize-time.html.tmpl
index 9f2742694..1efc8223e 100644
--- a/template/en/default/bug/summarize-time.html.tmpl
+++ b/template/en/default/bug/summarize-time.html.tmpl
@@ -27,10 +27,10 @@
[% header = title %]
[% END %]
-[% PROCESS global/header.html.tmpl
- title = title
+[% PROCESS global/header.html.tmpl
+ title = title
generate_api_token = 1
- header = header
+ header = header
style_urls = ["skins/standard/summarize-time.css"]
doc_section = "timetracking.html"
javascript_urls = [ "js/util.js", "js/field.js" ]
@@ -100,7 +100,7 @@
[% END %]
[% additional = "$global.owner_count.size developers @
- $global.bug_count.size $terms.bugs" %]
+ $global.bug_count.size $terms.bugs" %]
[% INCLUDE section_total colspan=3 additional=additional %]
</table>
[% END %]
@@ -161,7 +161,7 @@
[% subtotal = subtotal + work_time %]
[% login_name = owner.login_name %]
[% global.owner_count.$login_name = 1 %]
- [% IF detailed %]
+ [% IF detailed %]
[% cid = cid + 1 %]
<tr class="owner_header[% 2 FILTER none IF cid % 2 %]">
<td>&nbsp;</td>
@@ -279,8 +279,8 @@
<table>
<tr>
<td align="right">
- <b><label accesskey="s"
- for="start_date">Period <u>s</u>tarting</label></b>:
+ <b><label accesskey="s"
+ for="start_date">Period <u>s</u>tarting</label></b>:
</td><td colspan="3">
<input type="text" id="start_date" name="start_date" size="11" autofocus
align="right" value="[% start_date FILTER html %]" maxlength="10"
@@ -291,7 +291,7 @@
</button>
<div id="con_calendar_start_date"></div>
&nbsp;
- <b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>:
+ <b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>:
<input type="text" name="end_date" size="11" id="end_date"
align="right" value ="[% end_date FILTER html %]" maxlength="10"
onchange="updateCalendarFromField(this)">
@@ -312,11 +312,11 @@
</td><td colspan="2">
<input type="radio" name="group_by" id="number" value="number" [%+
'checked="checked"' IF group_by == "number"
- %]><label
+ %]><label
for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label>
<input type="radio" name="group_by" id="owner" value="owner" [%+
'checked="checked"' IF group_by == "owner"
- %]><label
+ %]><label
for="owner" accesskey="d"><u>D</u>eveloper</label>
</td><td colspan="2">
<label for="ctype"><b>Format</b></label>: <select name="ctype" id="ctype">
diff --git a/template/en/default/config.js.tmpl b/template/en/default/config.js.tmpl
index 0d6358312..b794678fe 100644
--- a/template/en/default/config.js.tmpl
+++ b/template/en/default/config.js.tmpl
@@ -75,7 +75,7 @@ var [% cf.name FILTER js %] = [ [% FOREACH x = cf.legal_values %]'[% x.name FILT
// A list of all products and their components, versions, and target milestones:
-
+
var component = new Object();
var version = new Object();
var target_milestone = new Object();
@@ -89,7 +89,7 @@ var target_milestone = new Object();
// Product and Component Exceptions
// ================================
//
-// A blacklist for some commonly used words or word fragments
+// A blacklist for some commonly used words or word fragments
// that occur in a product or component name but should *not*
// trigger product/component search in QuickSearch.
@@ -112,7 +112,7 @@ var component_exceptions = new Array(
[% PROCESS "global/field-descs.none.tmpl" %]
var field = [
[% FOREACH x = field %]
- { name: '[% x.name FILTER js %]',
+ { name: '[% x.name FILTER js %]',
description: '[% (field_descs.${x.name} OR x.description) FILTER js %]',
[%-# These values are meaningful for custom fields only. %]
[% IF x.custom %]
diff --git a/template/en/default/email/bugmail-common.txt.tmpl b/template/en/default/email/bugmail-common.txt.tmpl
index b6cadaf11..e65378b60 100644
--- a/template/en/default/email/bugmail-common.txt.tmpl
+++ b/template/en/default/email/bugmail-common.txt.tmpl
@@ -16,7 +16,7 @@
#
# Contributor(s): Guy Pyrzak <guy.pyrzak@gmail.com>
#%]
-
+
[% PROCESS "global/field-descs.none.tmpl" %]
[% field_label = field_descs.${change.field_name} %]
@@ -35,4 +35,3 @@
[% IF change.field_name == 'longdescs.isprivate' %]
[% field_label = field_label.replace('^(Comment )?', "Comment #${change.num} ") %]
[% END %]
- \ No newline at end of file
diff --git a/template/en/default/email/bugmail-header.txt.tmpl b/template/en/default/email/bugmail-header.txt.tmpl
index 679e705cd..b1a440e03 100644
--- a/template/en/default/email/bugmail-header.txt.tmpl
+++ b/template/en/default/email/bugmail-header.txt.tmpl
@@ -19,7 +19,7 @@
# Frédéric Buclin <LpSolit@gmail.com>
# Guy Pyrzak <guy.pyrzak@gmail.com>
#%]
-
+
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS "global/reason-descs.none.tmpl" %]
[% isnew = bug.lastdiffed ? 0 : 1 %]
diff --git a/template/en/default/email/bugmail.html.tmpl b/template/en/default/email/bugmail.html.tmpl
index 8b567b691..51a862d37 100644
--- a/template/en/default/email/bugmail.html.tmpl
+++ b/template/en/default/email/bugmail.html.tmpl
@@ -16,7 +16,7 @@
#
# Contributor(s): Guy Pyrzak <guy.pyrzak@gmail.com>
#%]
-
+
[% PROCESS "global/field-descs.none.tmpl" %]
[% PROCESS "global/reason-descs.none.tmpl" %]
diff --git a/template/en/default/email/lockout.txt.tmpl b/template/en/default/email/lockout.txt.tmpl
index 94e9c74cb..ff40011b3 100644
--- a/template/en/default/email/lockout.txt.tmpl
+++ b/template/en/default/email/lockout.txt.tmpl
@@ -27,7 +27,7 @@ X-Bugzilla-Type: admin
The address [% address %] failed too many login attempts (
[%- constants.MAX_LOGIN_ATTEMPTS +%]) for
-the account [% locked_user.login %].
+the account [% locked_user.login %].
The login attempts occurred at these times:
diff --git a/template/en/default/email/new-api-key.txt.tmpl b/template/en/default/email/new-api-key.txt.tmpl
index aed904def..9ab13d90b 100644
--- a/template/en/default/email/new-api-key.txt.tmpl
+++ b/template/en/default/email/new-api-key.txt.tmpl
@@ -26,10 +26,7 @@ or update the key at the following URL:
[%+ urlbase %]userprefs.cgi?tab=apikey
-[% IF new_key.app_id == Param('mozreview_app_id') %]
-This API key was automatically created by MozReview. If you did not recently log in to
-MozReview, please disable the key at the above URL, and change your password immediately.
-[% ELSIF new_key.app_id == Param('phabricator_app_id') %]
+[% IF new_key.app_id == Param('phabricator_app_id') %]
This API key was automatically created by Mozilla's Phabricator instance. If you did not recently
log in to Phabricator, please disable the key at the above URL, and change your password immediately.
[% ELSE %]
diff --git a/template/en/default/email/sudo.txt.tmpl b/template/en/default/email/sudo.txt.tmpl
index 74fbc4976..9e1290ac9 100644
--- a/template/en/default/email/sudo.txt.tmpl
+++ b/template/en/default/email/sudo.txt.tmpl
@@ -27,7 +27,7 @@ Subject: [[% terms.Bugzilla %]] Your account [% user.login -%]
is being impersonated
X-Bugzilla-Type: admin
- [%+ sudoer.identity %] has used the 'sudo' feature to access
+ [%+ sudoer.identity %] has used the 'sudo' feature to access
[%+ terms.Bugzilla %] using your account.
[% IF reason %]
@@ -38,6 +38,6 @@ X-Bugzilla-Type: admin
[%+ sudoer.identity %] did not provide a reason for doing this.
[% END %]
- If you feel that this action was inappropriate, please contact
-[%+ Param("maintainer") %]. For more information on this feature,
+ If you feel that this action was inappropriate, please contact
+[%+ Param("maintainer") %]. For more information on this feature,
visit <[% urlbase %]page.cgi?id=sudo.html>.
diff --git a/template/en/default/email/whine.txt.tmpl b/template/en/default/email/whine.txt.tmpl
index 32d8da8a0..b29bef663 100644
--- a/template/en/default/email/whine.txt.tmpl
+++ b/template/en/default/email/whine.txt.tmpl
@@ -26,7 +26,7 @@ X-Bugzilla-Type: whine
[This e-mail has been automatically generated.]
-You have one or more [% terms.bugs %] assigned to you in the [% terms.Bugzilla %]
+You have one or more [% terms.bugs %] assigned to you in the [% terms.Bugzilla %]
[% terms.bug %] tracking system ([% urlbase %]) that require
attention.
@@ -50,7 +50,7 @@ it if you like!):
[% urlbase %]buglist.cgi?bug_status=CONFIRMED&assigned_to=[% email %]
-Or, you can use the general query page, at
+Or, you can use the general query page, at
[%+ urlbase %]query.cgi
Appended below are the individual URLs to get to all of your [% display_value("bug_status", "CONFIRMED") %] [%+ terms.bugs %]
diff --git a/template/en/default/extensions/extension.pm.tmpl b/template/en/default/extensions/extension.pm.tmpl
index ebeb73719..7f0383c67 100644
--- a/template/en/default/extensions/extension.pm.tmpl
+++ b/template/en/default/extensions/extension.pm.tmpl
@@ -23,7 +23,7 @@ use B[% %]ugzilla::Extension::[% name %]::Util;
our $VERSION = '0.01';
-# See the documentation of B[% %]ugzilla::Hook ("perldoc B[% %]ugzilla::Hook"
+# See the documentation of B[% %]ugzilla::Hook ("perldoc B[% %]ugzilla::Hook"
# in the bugzilla directory) for a list of all available hooks.
sub install_update_db {
my ($self, $args) = @_;
diff --git a/template/en/default/extensions/hook-readme.txt.tmpl b/template/en/default/extensions/hook-readme.txt.tmpl
index 63e09e419..d99375cfa 100644
--- a/template/en/default/extensions/hook-readme.txt.tmpl
+++ b/template/en/default/extensions/hook-readme.txt.tmpl
@@ -8,6 +8,6 @@
Template hooks go in this directory. Template hooks are called in normal
[%+ terms.Bugzilla %] templates like [[% '%' %] Hook.process('some-hook') %].
-More information about them can be found in the documentation of
+More information about them can be found in the documentation of
B[% %]ugzilla::Extension. (Do "perldoc B[% %]ugzilla::Extension" from the main
[%+ terms.Bugzilla %] directory to see that documentation.)
diff --git a/template/en/default/extensions/name-readme.txt.tmpl b/template/en/default/extensions/name-readme.txt.tmpl
index 5403bab7f..b8d6d3c5d 100644
--- a/template/en/default/extensions/name-readme.txt.tmpl
+++ b/template/en/default/extensions/name-readme.txt.tmpl
@@ -18,7 +18,7 @@ That would be how to load a file called some-template.html.tmpl that
was in this directory.
Note that you have to be careful that the full path of your template
-never conflicts with a template that exists in [% terms.Bugzilla %] or in
+never conflicts with a template that exists in [% terms.Bugzilla %] or in
another extension, or your template might override that template. That's why
we created this directory called '[% name FILTER lower %]' for you, so you
can put your templates in here to help avoid conflicts.
diff --git a/template/en/default/extensions/util.pm.tmpl b/template/en/default/extensions/util.pm.tmpl
index 3493007f4..7aa9f8c6c 100644
--- a/template/en/default/extensions/util.pm.tmpl
+++ b/template/en/default/extensions/util.pm.tmpl
@@ -18,10 +18,10 @@ use 5.10.1;
use strict;
use parent qw(Exporter);
our @EXPORT = qw(
-
+
);
-# This file can be loaded by your extension via
+# This file can be loaded by your extension via
# "use B[% %]ugzilla::Extension::[% name %]::Util". You can put functions
# used by your extension in here. (Make sure you also list them in
# @EXPORT.)
diff --git a/template/en/default/flag/list.html.tmpl b/template/en/default/flag/list.html.tmpl
index 6e411add9..bf1c8a6b3 100644
--- a/template/en/default/flag/list.html.tmpl
+++ b/template/en/default/flag/list.html.tmpl
@@ -131,6 +131,7 @@
title="[% type.description FILTER html %]"
onchange="toggleRequesteeField(this);"
class="flag_select flag_type-[% type.id %]"
+ data-id="[% type.id %]" data-name="[% type.name FILTER html FILTER no_break %]"
[% IF !can_edit_flag %] disabled="disabled"[% END %]>
[%# Only display statuses the user is allowed to set. %]
[% IF !flag
diff --git a/template/en/default/global/choose-classification.html.tmpl b/template/en/default/global/choose-classification.html.tmpl
index fbac48479..b3007a172 100644
--- a/template/en/default/global/choose-classification.html.tmpl
+++ b/template/en/default/global/choose-classification.html.tmpl
@@ -32,7 +32,7 @@
<tr>
<th align="right">
<a href="[% target FILTER uri %]?classification=__all
- [% IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
+ [% IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
All</a>:
</th>
@@ -47,7 +47,7 @@
<tr>
<th align="right">
<a href="[% target FILTER uri %]?classification=[% class.name FILTER uri -%]
- [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
+ [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
[% class.name FILTER html %]</a>:
</th>
diff --git a/template/en/default/global/choose-product.html.tmpl b/template/en/default/global/choose-product.html.tmpl
index ae00bf503..8cd23a910 100644
--- a/template/en/default/global/choose-product.html.tmpl
+++ b/template/en/default/global/choose-product.html.tmpl
@@ -56,7 +56,7 @@
<tr>
<th align="right" valign="top">
<a href="[% target %]?product=[% p.name FILTER uri -%]
- [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
+ [%- IF cloned_bug_id %]&amp;cloned_bug_id=[% cloned_bug_id FILTER uri %][% END -%]
[%- IF format %]&amp;format=[% format FILTER uri %][% END %]">
[% p.name FILTER html FILTER no_break %]</a>:&nbsp;
</th>
diff --git a/template/en/default/global/code-error.html.tmpl b/template/en/default/global/code-error.html.tmpl
index b37e7ca7b..8aaf10127 100644
--- a/template/en/default/global/code-error.html.tmpl
+++ b/template/en/default/global/code-error.html.tmpl
@@ -315,7 +315,7 @@
[% ELSIF error == "jobqueue_status_error" %]
An error occurred while checking the job queue status. Try again at a
- later time.
+ later time.
[% ELSIF error == "ldap_bind_failed" %]
Failed to bind to the LDAP server. The error message was:
@@ -514,13 +514,15 @@
[%# We only want HTML error messages for ERROR_MODE_WEBPAGE %]
[% USE Bugzilla %]
-[% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
- [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
- [% error_message FILTER none %]
- [% ELSE %]
- [% error_message FILTER txt %]
+[% IF Bugzilla.usage_mode != constants.USAGE_MODE_MOJO %]
+ [% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
+ [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
+ [% error_message FILTER none %]
+ [% ELSE %]
+ [% error_message FILTER txt %]
+ [% END %]
+ [% RETURN %]
[% END %]
- [% RETURN %]
[% END %]
[% UNLESS header_done %]
diff --git a/template/en/default/global/confirm-user-match.html.tmpl b/template/en/default/global/confirm-user-match.html.tmpl
index b74dd5ded..71d0dbacb 100644
--- a/template/en/default/global/confirm-user-match.html.tmpl
+++ b/template/en/default/global/confirm-user-match.html.tmpl
@@ -60,7 +60,7 @@
[% USE Bugzilla %]
- <form method="post"
+ <form method="post"
[% IF script -%]
action="[% script %]"
[%- END -%]
diff --git a/template/en/default/global/header.html.tmpl b/template/en/default/global/header.html.tmpl
index 9db9a1404..5db263981 100644
--- a/template/en/default/global/header.html.tmpl
+++ b/template/en/default/global/header.html.tmpl
@@ -98,7 +98,6 @@
<meta charset="UTF-8">
[% END %]
[% USE Bugzilla %]
- <base href="[% urlbase FILTER html %]">
[% IF Bugzilla.cgi.should_block_referrer %]
<meta name="referrer" content="origin">
@@ -107,6 +106,10 @@
[% END %]
[%- js_BUGZILLA = {
+ user => {
+ # TODO: Move all properties form bug_modal/header.html.tmpl
+ login => user.login,
+ },
param => {
maxattachmentsize => Param('maxattachmentsize'),
maxusermatches => Param('maxusermatches'),
@@ -242,6 +245,40 @@
#%]
<div id="wrapper">
+
+<aside id="message-container" role="complementary">
+ <noscript>
+ <div class="noscript">
+ <div class="inner">
+ <p>Please enable JavaScript in your browser to use all the features on this site.</p>
+ </div>
+ </div>
+ </noscript>
+ [% IF Bugzilla.request_cache.mfa_warning
+ AND user.mfa_required_date
+ AND NOT Bugzilla.request_cache.on_mfa_page %]
+ <div class="warning">
+ <div class="inner">
+ <p>
+ Please <a href="userprefs.cgi?tab=mfa">enable two-factor authentication</a>
+ [% IF Param('mfa_group_grace_period') %]
+ before <i>[% user.mfa_required_date FILTER time %]</i>.
+ [% ELSE %]
+ now.
+ [% END %]
+ </p>
+ </div>
+ </div>
+ [% END %]
+ [% IF Param('announcehtml') %]
+ <div class="announcement">
+ <div class="inner">
+ [% Param('announcehtml') FILTER none %]
+ </div>
+ </div>
+ [% END %]
+</aside>
+
<header id="header" role="banner">
<div class="inner">
<h1 id="header-title" class="title"><a href="./" title="Go to home page">[% terms.Bugzilla %]</a></h1>
@@ -342,12 +379,10 @@
<li role="presentation">
<a href="userprefs.cgi" role="menuitem" tabindex="-1">Preferences</a>
</li>
- [% IF user.authorizer.can_logout %]
- <li role="separator"></li>
- <li role="presentation">
- <a href="index.cgi?logout=1" role="menuitem" tabindex="-1">Log out</a>
- </li>
- [% END %]
+ <li role="separator"></li>
+ <li role="presentation">
+ <a href="index.cgi?logout=1" role="menuitem" tabindex="-1">Log out</a>
+ </li>
[% IF sudoer %]
<li role="presentation">
<a href="relogin.cgi?action=end-sudo" role="menuitem" tabindex="-1">End sudo session impersonating [% user.login FILTER html %]</a>
@@ -369,19 +404,6 @@
</div>
</header> [%# header %]
-[% IF Bugzilla.request_cache.mfa_warning
- AND user.mfa_required_date
- AND NOT Bugzilla.request_cache.on_mfa_page %]
- <aside id="mfa-warning">
- Please <a href="userprefs.cgi?tab=mfa">enable two-factor authentication</a>
- [% IF Param('mfa_group_grace_period') %]
- before <i>[% user.mfa_required_date FILTER time %]</i>.
- [% ELSE %]
- now.
- [% END %]
- </aside>
-[% END %]
-
<main id="bugzilla-body" tabindex="-1">
<div id="main-inner">
@@ -392,10 +414,6 @@
<h2>[% header FILTER none %]</h2>
[% END %]
-[% IF Param('announcehtml') %]
-[% Param('announcehtml') FILTER none %]
-[% END %]
-
[% IF message %]
<div id="message">[% message %]</div>
[% END %]
diff --git a/template/en/default/global/reason-descs.none.tmpl b/template/en/default/global/reason-descs.none.tmpl
index 426085f0d..b79a5bbb4 100644
--- a/template/en/default/global/reason-descs.none.tmpl
+++ b/template/en/default/global/reason-descs.none.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/template/en/default/global/select-menu.html.tmpl b/template/en/default/global/select-menu.html.tmpl
index f8d4d68e2..64d8b9a46 100644
--- a/template/en/default/global/select-menu.html.tmpl
+++ b/template/en/default/global/select-menu.html.tmpl
@@ -24,25 +24,25 @@
# multiple: boolean; whether or not the menu is multi-select
#
# size: integer; the number of items to display at once
- #
+ #
# options: array or hash; the items with which to populate the array.
# If a hash is passed, the hash keys become the names displayed
# to the user while the hash values become the value of the item.
- #
+ #
# default: string; the item selected in the menu by default.
- #
+ #
# onchange: code; JavaScript to be run when the user changes the value
# selected in the menu.
#%]
-
-[%# Get the scalar representation of the options reference,
+
+[%# Get the scalar representation of the options reference,
# which looks like "ARRAY(0xA352BA3F)" or "HASH(0xA352BA3F)",
# so we can figure out whether it is a reference to an array
# or a hash.
#%]
[% options_type = BLOCK %][% options %][% END %]
-<select name="[% name FILTER html %]"
+<select name="[% name FILTER html %]"
[% IF onchange %]onchange="[% onchange FILTER html %]"[% END %]
[% IF multiple %] multiple [% END %]
[% IF size %] size="[% size %]" [% END %]>
@@ -55,7 +55,7 @@
[% END %]
[% ELSIF options_type.search("HASH") %]
[% FOREACH option = options %]
- <option value="[% option.value FILTER html %]"
+ <option value="[% option.value FILTER html %]"
[% " selected" IF option.value == default %]>
[% option.key FILTER html %]
</option>
diff --git a/template/en/default/global/user-error.html.tmpl b/template/en/default/global/user-error.html.tmpl
index c6efb5649..53de6a420 100644
--- a/template/en/default/global/user-error.html.tmpl
+++ b/template/en/default/global/user-error.html.tmpl
@@ -1037,6 +1037,10 @@
[% title = "Invalid Authentication Method" %]
API key authentication is required.
+ [% ELSIF error == "invalid_params" %]
+ [% title = "Invalid Params" %]
+ API method received invalid params: [% type_error FILTER html %]
+
[% ELSIF error == "bug_id_does_not_exist" %]
[% title = BLOCK %]Invalid [% terms.Bug %] ID[% END %]
[% terms.Bug %] [%= bug_id FILTER html %] does not exist.
@@ -1982,13 +1986,15 @@
[%# We only want HTML error messages for ERROR_MODE_WEBPAGE %]
[% USE Bugzilla %]
-[% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
- [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
- [% error_message FILTER none %]
- [% ELSE %]
- [% error_message FILTER txt %]
+[% IF Bugzilla.usage_mode != constants.USAGE_MODE_MOJO %]
+ [% IF Bugzilla.error_mode != constants.ERROR_MODE_WEBPAGE %]
+ [% IF Bugzilla.usage_mode == constants.USAGE_MODE_BROWSER %]
+ [% error_message FILTER none %]
+ [% ELSE %]
+ [% error_message FILTER txt %]
+ [% END %]
+ [% RETURN %]
[% END %]
- [% RETURN %]
[% END %]
[% UNLESS header_done %]
diff --git a/template/en/default/global/user.html.tmpl b/template/en/default/global/user.html.tmpl
index 876d12805..2750ce8f7 100644
--- a/template/en/default/global/user.html.tmpl
+++ b/template/en/default/global/user.html.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2007
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Daniel Brooks <db48x@db48x.net>
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/template/en/default/global/value-descs.js.tmpl b/template/en/default/global/value-descs.js.tmpl
index b0fb1d4d2..e0e40da04 100644
--- a/template/en/default/global/value-descs.js.tmpl
+++ b/template/en/default/global/value-descs.js.tmpl
@@ -14,7 +14,7 @@
# Portions created by the Initial Developer are Copyright (C) 2010
# the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
diff --git a/template/en/default/global/value-descs.none.tmpl b/template/en/default/global/value-descs.none.tmpl
index 56c90ac35..5bcfc3f15 100644
--- a/template/en/default/global/value-descs.none.tmpl
+++ b/template/en/default/global/value-descs.none.tmpl
@@ -11,7 +11,7 @@
# The Original Code is the Bugzilla Bug Tracking System.
#
# The Initial Developer of the Original Code is BugzillaSource, Inc.
- # Portions created by the Initial Developer are Copyright (C) 2011
+ # Portions created by the Initial Developer are Copyright (C) 2011
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
diff --git a/template/en/default/global/variables.none.tmpl b/template/en/default/global/variables.none.tmpl
index 93002efa3..c57dac890 100644
--- a/template/en/default/global/variables.none.tmpl
+++ b/template/en/default/global/variables.none.tmpl
@@ -18,13 +18,13 @@
# Contributor(s):
#%]
-[%# This is a list of terms that may be changed to "brand" the Bugzilla
+[%# This is a list of terms that may be changed to "brand" the Bugzilla
# instance (for example, referring to "bugs" as "issues".) When used, these
- # strings are used in several different types of content, and are not
- # protected with Template-Toolkit FILTERs. Consequently, no special
+ # strings are used in several different types of content, and are not
+ # protected with Template-Toolkit FILTERs. Consequently, no special
# characters are allowed.
#
- # Remember to PROCESS rather than INCLUDE this template.
+ # Remember to PROCESS rather than INCLUDE this template.
#%]
[% terms = {
diff --git a/template/en/default/index.html.tmpl b/template/en/default/index.html.tmpl
index 2aff68615..6dbdabc0c 100644
--- a/template/en/default/index.html.tmpl
+++ b/template/en/default/index.html.tmpl
@@ -27,7 +27,7 @@
[% USE Bugzilla %]
[% PROCESS global/header.html.tmpl
title = "$terms.Bugzilla Main Page"
- header = "Main Page"
+ header = "Main Page"
style_urls = [ 'skins/standard/index.css' ]
no_yui = 1
og_image = "extensions/OpenGraph/web/moz-social-bw-rgb-1200x1200.png"
@@ -39,21 +39,50 @@
<td>
<h1 id="welcome"> Welcome to [% terms.Bugzilla %]</h1>
<div class="intro">[% Hook.process('intro') %]</div>
- <a id="enter_bug" class="bz_common_actions"
- href="enter_bug.cgi"><span>File [% terms.aBug %]</span></a>
- <a id="query" class="bz_common_actions"
- href="query.cgi"><span>Search</span></a>
- <a id="account" class="bz_common_actions"
- [% IF user.id %]
- href="userprefs.cgi"><span>User Preferences</span></a>
- [% ELSIF Param('createemailregexp')
- && user.authorizer.user_can_create_account
- %]
- href="createaccount.cgi"><span>Open a New Account</span></a>
- [% ELSE %]
- href="?GoAheadAndLogIn=1"><span>Log In</span></a>
- [% END %]
-
+ <ul id="tiles">
+ [% IF Param('docs_urlbase') %]
+ <li id="tile-docs">
+ <a href="[% docs_urlbase FILTER html %]">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">Documentation</span>
+ </a>
+ </li>
+ [% END %]
+ <li id="tile-search">
+ <a href="query.cgi">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">Advanced Search</span>
+ </a>
+ </li>
+ <li id="tile-new-bug">
+ <a href="enter_bug.cgi">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">New [% terms.Bug %]</span>
+ </a>
+ </li>
+ [% IF user.id %]
+ <li id="tile-prefs">
+ <a href="userprefs.cgi">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">Preferences</span>
+ </a>
+ </li>
+ [% ELSIF Param('createemailregexp') && user.authorizer.user_can_create_account %]
+ <li id="tile-new-account">
+ <a href="createaccount.cgi">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">New Account</span>
+ </a>
+ </li>
+ [% ELSE %]
+ <li id="tile-login">
+ <a href="?GoAheadAndLogIn=1">
+ <span class="icon" aria-hidden="true"></span>
+ <span class="label">Log In</span>
+ </a>
+ </li>
+ [% END %]
+ </ul>
<form id="quicksearchForm" name="quicksearchForm" action="buglist.cgi" data-no-csrf>
<div>
<input id="quicksearch_main" type="text" name="quicksearch" autofocus
diff --git a/template/en/default/list/change-columns.html.tmpl b/template/en/default/list/change-columns.html.tmpl
index d1aada24c..418bf09c8 100644
--- a/template/en/default/list/change-columns.html.tmpl
+++ b/template/en/default/list/change-columns.html.tmpl
@@ -61,9 +61,9 @@
</tr>
<tr>
<td>
- <select name="available_columns" id="available_columns"
+ <select name="available_columns" id="available_columns"
size="15" multiple="multiple" onchange="updateView();"
- class="bz_default_hidden">
+ class="bz_default_hidden">
</select>
</td>
<td>
@@ -76,7 +76,7 @@
onclick="move_deselect()">&larr;</button>
</td>
<td>
- <select name="selected_columns" id="selected_columns"
+ <select name="selected_columns" id="selected_columns"
size="15" multiple="multiple" onchange="updateView();">
[% FOREACH column = collist %]
<option value="[% column FILTER html %]" selected="selected">
@@ -126,9 +126,9 @@
value="[% saved_search.id FILTER html%]">
<input type="hidden" name="token"
value="[% issue_hash_token([saved_search.id, saved_search.name]) FILTER html %]">
- <input type="checkbox" id="save_columns_for_search" checked="checked"
+ <input type="checkbox" id="save_columns_for_search" checked="checked"
name="save_columns_for_search" value="1">
- <label for="save_columns_for_search">Save this column list only
+ <label for="save_columns_for_search">Save this column list only
for search '[% saved_search.name FILTER html %]'</label>
</p>
[% ELSE %]
@@ -140,7 +140,7 @@
<input type="submit" id="change" value="Change Columns">
</p>
- <input type="submit" id="resetit" name="resetit"
+ <input type="submit" id="resetit" name="resetit"
value="Reset to [% terms.Bugzilla %] default">
</form>
diff --git a/template/en/default/list/edit-multiple.html.tmpl b/template/en/default/list/edit-multiple.html.tmpl
index ead3ff54c..ae1dade52 100644
--- a/template/en/default/list/edit-multiple.html.tmpl
+++ b/template/en/default/list/edit-multiple.html.tmpl
@@ -136,7 +136,7 @@
</td>
[% END %]
</tr>
-
+
<tr>
<th><label for="bug_status">Status:</label></th>
<td colspan="3">[% PROCESS status_section %]</td>
@@ -150,7 +150,7 @@
value="[% dontchange FILTER html %]"
size="6">
</td>
- [% PROCESS bug/field.html.tmpl
+ [% PROCESS bug/field.html.tmpl
field = bug_fields.deadline, value = dontchange
editable = 1, allow_dont_change = 1 %]
</tr>
@@ -274,7 +274,7 @@
<b>Status Whiteboard:</b>
</td>
<td colspan="7">
- <input name="status_whiteboard"
+ <input name="status_whiteboard"
value="[% dontchange FILTER html %]" size="60">
</td>
</tr>
@@ -348,14 +348,14 @@
[% FOREACH group = groups %]
<tr>
<td align="center">
- <input type="checkbox" name="defined_groups"
+ <input type="checkbox" name="defined_groups"
id="defined_group_[% group.id %]"
value="[% group.name FILTER html %]"
onchange="turn_off(this, 'group_[% group.id %]')">
</td>
[% IF group.is_active %]
<td align="center">
- <input type="checkbox" name="groups"
+ <input type="checkbox" name="groups"
id="group_[% group.id FILTER html %]"
value="[% group.name FILTER html %]"
onchange="turn_off(this, 'defined_group_[% group.id %]')">
@@ -410,10 +410,10 @@
[% all_open_bugs = !current_bug_statuses.containsany(closedstates) %]
[% all_closed_bugs = !current_bug_statuses.containsany(openstates) %]
[% closed_status_array = [] %]
-
- <select name="bug_status" id="bug_status">
+
+ <select name="bug_status" id="bug_status">
<option value="[% dontchange FILTER html %]" selected="selected">[% dontchange FILTER html %]</option>
-
+
[% FOREACH bug_status = new_bug_statuses %]
<option value="[% bug_status.name FILTER html %]">
[% display_value("bug_status", bug_status.name) FILTER html %]
@@ -423,14 +423,14 @@
[% closed_status_array.push( filtered_status ) %]
[% END %]
[% END %]
-
+
[%# If all the bugs being changed are closed, allow the user to change their resolution. %]
[% IF all_closed_bugs %]
[% filtered_status = dontchange FILTER js %]
[% closed_status_array.push( filtered_status ) %]
[% END %]
</select>
-
+
<span id="resolution_settings">
<select id="resolution" name="resolution">
<option value="[% dontchange FILTER html %]" selected >[% dontchange FILTER html %]</option>
diff --git a/template/en/default/list/list.atom.tmpl b/template/en/default/list/list.atom.tmpl
index ed0c660af..5568b7bff 100644
--- a/template/en/default/list/list.atom.tmpl
+++ b/template/en/default/list/list.atom.tmpl
@@ -20,7 +20,7 @@
# Jason Remillard <jremillardshop@letterboxes.org>
# Phil Ringnalda <bugzilla@philringnalda.com>
#
- # This is a template for generating an Atom representation of a buglist.
+ # This is a template for generating an Atom representation of a buglist.
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
diff --git a/template/en/default/list/list.html.tmpl b/template/en/default/list/list.html.tmpl
index 09a6c3601..fe4354a61 100644
--- a/template/en/default/list/list.html.tmpl
+++ b/template/en/default/list/list.html.tmpl
@@ -30,11 +30,11 @@
[% PROCESS "global/field-descs.none.tmpl" %]
-[% title = "$terms.Bug List" %]
-[% IF searchname || defaultsavename %]
- [% title = title _ ": " _ (searchname OR defaultsavename) FILTER html %]
-[% ELSIF quicksearch %]
- [% title = title _ ": " _ quicksearch FILTER html %]
+[% DEFAULT title = "$terms.Bug List" %]
+[% IF searchname || defaultsavename || quicksearch %]
+ [% title = title _ ": " _ (searchname || defaultsavename || quicksearch) FILTER html %]
+[% ELSE %]
+ [% title = title FILTER html %]
[% END %]
[% qorder = order FILTER uri IF order %]
@@ -49,7 +49,7 @@
title = title
generate_api_token = dotweak
style = style
- atomlink = "buglist.cgi?$urlquerypart&title=$url_filtered_title&ctype=atom"
+ atomlink = "buglist.cgi?$urlquerypart&title=$url_filtered_title&ctype=atom"
javascript_urls = [ "js/util.js", "js/field.js" ]
style_urls = [ "skins/standard/buglist.css" ]
doc_section = "query.html#list"
@@ -90,8 +90,8 @@
[% END %]
[% SET shown_types = [
- 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
- 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
+ 'notequals', 'regexp', 'notregexp', 'lessthan', 'lessthaneq',
+ 'greaterthan', 'greaterthaneq', 'changedbefore', 'changedafter',
'changedfrom', 'changedto', 'changedby', 'notsubstring', 'nowords',
'nowordssubstr', 'notmatches', 'isempty', 'isnotempty'
] %]
@@ -144,7 +144,7 @@
[% PROCESS num_results %]
[% IF bugs.size == 0 %]
- <p>We couldn't find any [% terms.bugs %] matching your search terms.
+ <p>We couldn't find any [% terms.bugs %] matching your search terms.
You could try searching with fewer or different terms.</p>
<ul class="zero_result_links">
<li>[% PROCESS enter_bug_link %]</li>
@@ -208,7 +208,7 @@
[% END %]
[% END %]
</td>
-
+
<td>&nbsp;</td>
[% END %]
@@ -242,7 +242,7 @@
<td valign="middle" class="bz_query_edit">
<a href="[% PROCESS edit_search_url %]">Edit&nbsp;Search</a>
</td>
-
+
[% IF searchtype == "saved" %]
<td valign="middle" nowrap="nowrap" class="bz_query_forget">
|
@@ -253,20 +253,20 @@
</td>
[% ELSE %]
<td>&nbsp;</td>
-
+
<td valign="middle" class="bz_query_remember">
<form method="get" action="buglist.cgi">
- <input type="submit" id="remember" value="Remember search"> as
- <input type="hidden" name="newquery"
+ <input type="submit" id="remember" value="Remember search"> as
+ <input type="hidden" name="newquery"
value="[% urlquerypart FILTER html %][% "&order=$qorder" FILTER html IF order %]">
<input type="hidden" name="cmdtype" value="doit">
<input type="hidden" name="remtype" value="asnamed">
<input type="hidden" name="token" value="[% issue_hash_token(['savedsearch']) FILTER html %]">
<input type="text" id="save_newqueryname" name="newqueryname" size="20"
- title="New query name" value="[% defaultsavename FILTER html %]">
- </form>
+ title="New query name" value="[% defaultsavename FILTER html %]">
+ </form>
</td>
- [% END %]
+ [% END %]
</tr>
</table>
diff --git a/template/en/default/list/list.rdf.tmpl b/template/en/default/list/list.rdf.tmpl
index d7879a694..195e0883d 100644
--- a/template/en/default/list/list.rdf.tmpl
+++ b/template/en/default/list/list.rdf.tmpl
@@ -32,17 +32,17 @@
<Seq>
[% FOREACH bug = bugs %]
<li>
-
+
<bz:bug rdf:about="[% urlbase FILTER xml %]show_bug.cgi?id=[% bug.bug_id %]">
-
+
<bz:id nc:parseType="Integer">[% bug.bug_id %]</bz:id>
-
+
[% FOREACH column = displaycolumns %]
<bz:[% column %]>[% bug.$column FILTER html %]</bz:[% column %]>
[% END %]
-
+
</bz:bug>
-
+
</li>
[% END %]
diff --git a/template/en/default/list/quips.html.tmpl b/template/en/default/list/quips.html.tmpl
index 8714fec7d..2f9cac9b8 100644
--- a/template/en/default/list/quips.html.tmpl
+++ b/template/en/default/list/quips.html.tmpl
@@ -58,7 +58,7 @@
<p>
- [% terms.Bugzilla %] will pick a random quip for the headline on each
+ [% terms.Bugzilla %] will pick a random quip for the headline on each
[% terms.bug %] list.
</p>
@@ -100,7 +100,7 @@
<h2>Edit existing quips:</h2>
<p>
<strong>Note:</strong> Only approved quips will be shown.
- If the parameter 'quip_list_entry_control' is set to <q>open</q>,
+ If the parameter 'quip_list_entry_control' is set to <q>open</q>,
entered quips are automatically approved.
</p>
<form name="editform" method="post" action="quips.cgi">
diff --git a/template/en/default/list/table.html.tmpl b/template/en/default/list/table.html.tmpl
index 486f3a00a..66ce442b9 100644
--- a/template/en/default/list/table.html.tmpl
+++ b/template/en/default/list/table.html.tmpl
@@ -23,7 +23,7 @@
[%# Initialization #%]
[%############################################################################%]
-[%# Don't display the table or do any processing if there are no bugs
+[%# Don't display the table or do any processing if there are no bugs
# to display %]
[% RETURN IF !bugs.size %]
@@ -43,34 +43,34 @@
[% field_descs.qa_contact_realname = field_descs.qa_contact %]
[%# Setting maxlength => 0 means no limit. We set it for performance reasons. %]
-[% abbrev =
+[% abbrev =
{
- "bug_severity" => { maxlength => 3 , title => "Sev" } ,
- "priority" => { maxlength => 7 , title => "Pri" } ,
- "rep_platform" => { maxlength => 3 , title => "Plt" } ,
- "bug_status" => { maxlength => 4 } ,
- "assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
- "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
- "reporter" => { maxlength => 30 , ellipsis => "..." } ,
- "reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
- "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } ,
- "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } ,
- "resolution" => { maxlength => 4 } ,
+ "bug_severity" => { maxlength => 3 , title => "Sev" } ,
+ "priority" => { maxlength => 7 , title => "Pri" } ,
+ "rep_platform" => { maxlength => 3 , title => "Plt" } ,
+ "bug_status" => { maxlength => 4 } ,
+ "assigned_to" => { maxlength => 30 , ellipsis => "..." } ,
+ "assigned_to_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "reporter" => { maxlength => 30 , ellipsis => "..." } ,
+ "reporter_realname" => { maxlength => 20 , ellipsis => "..." } ,
+ "qa_contact" => { maxlength => 30 , ellipsis => "..." , title => "QAContact" } ,
+ "qa_contact_realname" => { maxlength => 20 , ellipsis => "..." , title => "QAContact" } ,
+ "resolution" => { maxlength => 4 } ,
"short_desc" => { maxlength => 0, wrap => 1 } ,
"short_short_desc" => { maxlength => 60 , ellipsis => "..." , wrap => 1 } ,
- "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } ,
+ "status_whiteboard" => { maxlength => 0, title => "Whiteboard" , wrap => 1 } ,
"keywords" => { maxlength => 0, wrap => 1 } ,
"dependson" => { maxlength => 0, wrap => 1 } ,
"blocked" => { maxlength => 0, wrap => 1 } ,
"flagtypes.name" => { maxlength => 0, wrap => 1 } ,
- "component" => { maxlength => 8 , title => "Comp" } ,
- "product" => { maxlength => 8 } ,
- "version" => { maxlength => 5 , title => "Vers" } ,
- "op_sys" => { maxlength => 4 } ,
- "bug_file_loc" => { maxlength => 30 } ,
- "target_milestone" => { maxlength => 0, title => "TargetM" } ,
+ "component" => { maxlength => 8 , title => "Comp" } ,
+ "product" => { maxlength => 8 } ,
+ "version" => { maxlength => 5 , title => "Vers" } ,
+ "op_sys" => { maxlength => 4 } ,
+ "bug_file_loc" => { maxlength => 30 } ,
+ "target_milestone" => { maxlength => 0, title => "TargetM" } ,
"longdescs.count" => { maxlength => 0, title => "# Comments" },
- "percentage_complete" => { maxlength => 0, format_value => "%d %%" } ,
+ "percentage_complete" => { maxlength => 0, format_value => "%d %%" } ,
}
%]
@@ -84,7 +84,7 @@
[% tableheader = BLOCK %]
<table class="bz_buglist sortable" cellspacing="0" cellpadding="4" width="100%">
- <thead>
+ <thead>
<tr class="bz_buglist_header bz_first_buglist_header">
[% IF dotweak %]
<th class="sorttable_nosort">&nbsp;</th>
@@ -221,16 +221,16 @@
[% IF col_abbrev.maxlength %]
<span title="[%- display_value(column, bug.$column) FILTER html %]">
[% END %]
- [% IF col_abbrev.format_value %]
- [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%]
+ [% IF col_abbrev.format_value %]
+ [%- bug.$column FILTER format(col_abbrev.format_value) FILTER html -%]
[% ELSIF column == 'actual_time' ||
column == 'remaining_time' ||
column == 'estimated_time' %]
- [% PROCESS formattimeunit time_unit=bug.$column %]
+ [% PROCESS formattimeunit time_unit=bug.$column %]
[%# Display the login name of the user if their real name is empty. %]
[% ELSIF column.match('_realname$') && bug.$column == '' %]
[% SET login_column = column.remove('_realname$') %]
- [% bug.${login_column}.truncate(col_abbrev.maxlength,
+ [% bug.${login_column}.truncate(col_abbrev.maxlength,
col_abbrev.ellipsis) FILTER html %]
[% ELSIF column == 'short_desc' || column == "short_short_desc" %]
<a href="show_bug.cgi?id=[% bug.bug_id FILTER html %]">
diff --git a/template/en/default/pages/bug-writing.html.tmpl b/template/en/default/pages/bug-writing.html.tmpl
index ec997be0a..e422f4bb1 100644
--- a/template/en/default/pages/bug-writing.html.tmpl
+++ b/template/en/default/pages/bug-writing.html.tmpl
@@ -29,7 +29,7 @@
[% INCLUDE global/header.html.tmpl title = "$terms.Bug Writing Guidelines" %]
- <p>Effective [% terms.bug %] reports are the most likely to be fixed.
+ <p>Effective [% terms.bug %] reports are the most likely to be fixed.
These guidelines explain how to write such reports.
<h3>Principles</h3>
@@ -38,7 +38,7 @@
<li>Be precise</li>
<li>Be clear - explain it so others can reproduce the [% terms.bug %]</li>
<li>One [% terms.bug %] per report</li>
- <li>No [% terms.bug %] is too trivial to report -
+ <li>No [% terms.bug %] is too trivial to report -
small [% terms.bugs %] may hide big [% terms.bugs %]</li>
<li>Clearly separate fact from speculation</li>
</ul>
@@ -50,48 +50,48 @@
software, to see whether it has already been fixed.
</li>
- <li><a href="query.cgi?format=specific">Search</a>
+ <li><a href="query.cgi?format=specific">Search</a>
[% terms.Bugzilla %], to see whether your [% terms.bug %] has
already been reported.</li>
</ol>
<h3>Reporting a New [% terms.Bug %]</h3>
-<p>If you have reproduced the [% terms.bug %] in a recent build and
+<p>If you have reproduced the [% terms.bug %] in a recent build and
no-one else appears to have reported it, then:</p>
<ol>
- <li>Choose
+ <li>Choose
"<a href="enter_bug.cgi">Enter a new [% terms.bug %]</a>"</li>
<li>Select the product in which you've found the [% terms.bug %]</li>
<li>Fill out the form. Here is some help understanding it:</li>
</ol>
<blockquote>
- <p><b>Component:</b> In which sub-part of the software does it
+ <p><b>Component:</b> In which sub-part of the software does it
exist?<br>
This field is required.
- Click the word "Component" to see a description of each
+ Click the word "Component" to see a description of each
component. If none seems appropriate, look for a "General" component.</p>
- <p><b>OS:</b> On which operating system (OS) did you find
+ <p><b>OS:</b> On which operating system (OS) did you find
it?
(e.g. Linux, Windows XP, Mac OS X.)<br>
- If you know the [% terms.bug %] happens on more than one type of
- operating system, choose <em>[% display_value("op_sys", "All") FILTER html %]</em>.
+ If you know the [% terms.bug %] happens on more than one type of
+ operating system, choose <em>[% display_value("op_sys", "All") FILTER html %]</em>.
If your OS isn't listed, choose <em>[% display_value("op_sys", "Other") FILTER html %]</em>.</p>
- <p><b>Summary:</b> How would you describe the [% terms.bug %], in
+ <p><b>Summary:</b> How would you describe the [% terms.bug %], in
approximately 60 or fewer characters?<br>
A good summary should <b>quickly and uniquely identify [% terms.abug %]
report</b>. It should explain the problem, not your suggested solution.<br>
<ul>
- <li>Good: "<tt>Cancelling a File Copy dialog crashes
+ <li>Good: "<tt>Cancelling a File Copy dialog crashes
File Manager</tt>"</li>
<li>Bad: "<tt>Software crashes</tt>"</li>
<li>Bad: "<tt>Browser should work with my web site</tt>"</li>
</ul>
-
+
<b>Description:</b>
The details of your problem report, including:</p>
@@ -110,12 +110,12 @@ Drag-selecting any page crashes Mac builds in the NSGetFactory function.
<blockquote>
<pre>
-1) View any web page. (I used the default sample page,
+1) View any web page. (I used the default sample page,
resource:/res/samples/test0.html)
-2) Drag-select the page. (Specifically, while holding down
-the mouse button, drag the mouse pointer downwards from any
-point in the browser's content region to the bottom of the
+2) Drag-select the page. (Specifically, while holding down
+the mouse button, drag the mouse pointer downwards from any
+point in the browser's content region to the bottom of the
browser's content region.)
</pre>
</blockquote>
@@ -134,7 +134,7 @@ The application crashed.
<blockquote>
<pre>
-The window should scroll downwards. Scrolled content should be selected.
+The window should scroll downwards. Scrolled content should be selected.
(Or, at least, the application should not crash.)
</pre>
</blockquote>
@@ -148,8 +148,8 @@ Build 2006-08-10 on Mac OS 10.4.3
</pre>
</blockquote>
- <p><b>Additional Builds and Platforms:</b> Whether or not
- the [% terms.bug %] takes place on other platforms (or browsers,
+ <p><b>Additional Builds and Platforms:</b> Whether or not
+ the [% terms.bug %] takes place on other platforms (or browsers,
if applicable).</p>
<blockquote>
@@ -167,13 +167,13 @@ Doesn't Occur On Build 2006-08-10 on Windows XP Home (Service Pack 2)
<li><b>Mac OS X:</b> Attach the "Crash Reporter" log that appears
upon crash.
- Only include the section directly below the crashing thread, usually
+ Only include the section directly below the crashing thread, usually
titled "Thread 0 Crashed". Please do not paste the entire log!</li>
</ul>
</blockquote>
<p>Double-check your report for errors and omissions, then press "Commit".
- Your [% terms.bug %] report will now be in
+ Your [% terms.bug %] report will now be in
the [% terms.Bugzilla %] database.<br>
</p>
</blockquote>
diff --git a/template/en/default/pages/bugzilla.dtd.tmpl b/template/en/default/pages/bugzilla.dtd.tmpl
index f7fc1b4ad..09d83fb7f 100644
--- a/template/en/default/pages/bugzilla.dtd.tmpl
+++ b/template/en/default/pages/bugzilla.dtd.tmpl
@@ -29,56 +29,56 @@
#%]
[% USE Bugzilla %]
<!ELEMENT [% "bugzilla" %] (bug+)>
-<!ATTLIST [% "bugzilla" %]
+<!ATTLIST [% "bugzilla" %]
version CDATA #REQUIRED
urlbase CDATA #REQUIRED
maintainer CDATA #REQUIRED
exporter CDATA #IMPLIED
>
-<!ELEMENT [% "bug" %] (bug_id,
- (alias?,
- creation_ts,
- short_desc,
- delta_ts,
- reporter_accessible,
- cclist_accessible,
- classification_id,
- classification,
- product,
- component,
- version,
- rep_platform,
- op_sys,
- bug_status,
- resolution?,
- dup_id?,
- see_also*,
- bug_file_loc?,
- status_whiteboard?,
- keywords*,
- priority,
- bug_severity,
- target_milestone?,
- dependson*,
- blocked*,
- everconfirmed,
- reporter,
- assigned_to,
- cc*,
- (estimated_time,
- remaining_time,
- actual_time,
- deadline?)?,
+<!ELEMENT [% "bug" %] (bug_id,
+ (alias?,
+ creation_ts,
+ short_desc,
+ delta_ts,
+ reporter_accessible,
+ cclist_accessible,
+ classification_id,
+ classification,
+ product,
+ component,
+ version,
+ rep_platform,
+ op_sys,
+ bug_status,
+ resolution?,
+ dup_id?,
+ see_also*,
+ bug_file_loc?,
+ status_whiteboard?,
+ keywords*,
+ priority,
+ bug_severity,
+ target_milestone?,
+ dependson*,
+ blocked*,
+ everconfirmed,
+ reporter,
+ assigned_to,
+ cc*,
+ (estimated_time,
+ remaining_time,
+ actual_time,
+ deadline?)?,
qa_contact?,
[% FOREACH field = Bugzilla.active_custom_fields %]
[%+ field.name FILTER xml -%]
- [%- IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]*[% ELSE %]?[% END %],
+ [%- IF field.type == constants.FIELD_TYPE_MULTI_SELECT %]*[% ELSE %]?[% END %],
[% END %]
- votes?,
- token?,
- group*,
- flag*,
- long_desc*,
+ votes?,
+ token?,
+ group*,
+ flag*,
+ long_desc*,
attachment*)?)>
<!ATTLIST [% "bug" %]
error (NotFound | NotPermitted | InvalidBugId) #IMPLIED
@@ -97,7 +97,7 @@
<!ELEMENT version (#PCDATA)>
<!ELEMENT rep_platform (#PCDATA)>
<!ELEMENT assigned_to (#PCDATA)>
-<!ATTLIST assigned_to
+<!ATTLIST assigned_to
name CDATA #REQUIRED
>
<!ELEMENT delta_ts (#PCDATA)>
@@ -172,7 +172,7 @@
<!ATTLIST flag
name CDATA #REQUIRED
id CDATA #REQUIRED
- type_id CDATA #REQUIRED
+ type_id CDATA #REQUIRED
status CDATA #REQUIRED
setter CDATA #REQUIRED
requestee CDATA #IMPLIED
diff --git a/template/en/default/pages/linked.html.tmpl b/template/en/default/pages/linked.html.tmpl
index b5d850627..1fa9f9cba 100644
--- a/template/en/default/pages/linked.html.tmpl
+++ b/template/en/default/pages/linked.html.tmpl
@@ -38,7 +38,7 @@
<hr>
<p>
- If you place it in <tt>&lt;pre&gt;</tt> tags,
+ If you place it in <tt>&lt;pre&gt;</tt> tags,
the text will end up looking like this:
</p>
diff --git a/template/en/default/pages/quicksearch.html.tmpl b/template/en/default/pages/quicksearch.html.tmpl
index 28062b535..a954da9f3 100644
--- a/template/en/default/pages/quicksearch.html.tmpl
+++ b/template/en/default/pages/quicksearch.html.tmpl
@@ -22,7 +22,7 @@
[% INCLUDE global/header.html.tmpl
title = "$terms.Bugzilla QuickSearch",
- style_urls = ['skins/standard/page.css']
+ style_urls = ['skins/standard/page.css']
onload = 'document.forms[\'f\'].quicksearch.focus()'
%]
@@ -48,18 +48,18 @@
<h2 id="basics">The Basics</h2>
<ul class="qs_help">
- <li>If you just put a word or series of words in the search box,
- [%+ terms.Bugzilla %] will search the
+ <li>If you just put a word or series of words in the search box,
+ [%+ terms.Bugzilla %] will search the
[%+ field_descs.product FILTER html %],
- [%+ field_descs.component FILTER html %],
+ [%+ field_descs.component FILTER html %],
[%+ IF use_keywords %][%+ field_descs.keywords FILTER html %],[% END %]
[%+ IF Param('usebugaliases') %][% field_descs.alias FILTER html %],[% END %]
- [%+ field_descs.short_desc FILTER html %],
+ [%+ field_descs.short_desc FILTER html %],
[%+ IF Param('usestatuswhiteboard') %][% field_descs.status_whiteboard FILTER html %],[% END %]
and [% field_descs.longdesc FILTER html %] fields for your word or words.</li>
<li>Typing just a <strong>number</strong> in the search box will take
- you directly to the [% terms.bug %] with that ID.
+ you directly to the [% terms.bug %] with that ID.
[% IF Param('usebugaliases') %]
Also, just typing the <strong>alias</strong> of [% terms.abug %]
will take you to that [% terms.bug %].
@@ -67,7 +67,7 @@
</li>
<li>Adding more terms <strong>narrows down</strong> the search, it does not
- expand it. (In other words, [% terms.Bugzilla %] searches for
+ expand it. (In other words, [% terms.Bugzilla %] searches for
[%+ terms.bugs %] that match <em>all</em> your criteria, not
[%+ terms.bugs %] that match <em>any</em> of your criteria.)</li>
@@ -88,7 +88,7 @@
see the <a href="#shortcuts">Advanced Shortcuts</a> section.</li>
<li>If you want to search <strong>specific fields</strong>, you do it like
- <kbd>field:value</kbd>, where <kbd>field</kbd> is one of the
+ <kbd>field:value</kbd>, where <kbd>field</kbd> is one of the
<a href="#fields">field names</a> lower down in this
document and <kbd>value</kbd> is the value you want to search for
in that field. If you put commas in the <kbd>value</kbd>, then it is
@@ -137,9 +137,9 @@
<p>For custom fields, they can be used and abbreviated
based on the part of their name <em>after</em> the <kbd>cf_</kbd>
if you'd like, in addition to their standard name starting with
- <kbd>cf_</kbd>. So for example,
+ <kbd>cf_</kbd>. So for example,
<kbd>[% first_field.name FILTER html %]</kbd> can be
- referred to as
+ referred to as
<kbd>[% first_field.name.replace('^cf_') FILTER html %]</kbd>,
also. However, if this causes a conflict between the standard
[%+ terms.Bugzilla %] field names and the custom field names, the
@@ -188,7 +188,7 @@
<kbd>"NOT field:value"</kbd>.</li>
<li>You can use <strong>AND</strong>, <strong>NOT</strong>,
- and <strong>OR</strong> in searches.
+ and <strong>OR</strong> in searches.
You can also use <kbd>-</kbd> to mean "NOT", and <kbd>|</kbd> to mean "OR".
There is no special character for "AND", because by default any search
@@ -197,7 +197,7 @@
<ul>
<li>
<strong>NOT</strong>:<br>
- Use <kbd><strong>-</strong><em>summary:foo</em></kbd> to exclude
+ Use <kbd><strong>-</strong><em>summary:foo</em></kbd> to exclude
[%+ terms.bugs %] with <kbd>foo</kbd> in the summary.<br>
<kbd><em>NOT summary:foo</em></kbd> would have the same effect.
</li>
@@ -224,7 +224,7 @@
<p>OR has higher precedence than AND; AND is the top level operation.
For example:</p>
<p>Searching for <em><kbd>url|location bar|field -focus</kbd></em> means
- (<kbd>url</kbd> OR <kbd>location</kbd>) AND (<kbd>bar</kbd> OR
+ (<kbd>url</kbd> OR <kbd>location</kbd>) AND (<kbd>bar</kbd> OR
<kbd>field</kbd>) AND (NOT <kbd>focus</kbd>)</p>
</li>
@@ -305,7 +305,7 @@
<td class="field_name">[% field_descs.resolution FILTER html %]</td>
<td class="field_nickname">
Make the <strong>first word</strong> of your search the name of any
- resolution, or even an abbreviation of any resolution, and
+ resolution, or even an abbreviation of any resolution, and
[%+ terms.bugs %] with that resolution will be searched. For example,
making <kbd>FIX</kbd> the first word of your search will find all
[%+ terms.bugs %] with a resolution of <kbd>FIXED</kbd>.
@@ -315,7 +315,7 @@
<tr>
<td class="field_name">[% field_descs.priority FILTER html %]</td>
<td class="field_nickname">"<strong>P1</strong>" (as a word anywhere in
- the search) means "find [% terms.bugs %] with the highest priority.
+ the search) means "find [% terms.bugs %] with the highest priority.
"P2" means the second-highest priority, and so on.
<p>Searching for "<strong>P1-3</strong>" will find [% terms.bugs %] in
any of the three highest priorities, and so on.</p>
diff --git a/template/en/default/pages/release-notes.html.tmpl b/template/en/default/pages/release-notes.html.tmpl
index 6e639d86d..9bdc1ed8d 100644
--- a/template/en/default/pages/release-notes.html.tmpl
+++ b/template/en/default/pages/release-notes.html.tmpl
@@ -20,9 +20,9 @@
[% PROCESS global/variables.none.tmpl %]
[% SET title = "$terms.Bugzilla 4.2 Release Notes" %]
-[% INCLUDE global/header.html.tmpl
+[% INCLUDE global/header.html.tmpl
title = title
- style_urls = ['skins/standard/page.css']
+ style_urls = ['skins/standard/page.css']
%]
<h1>[% title FILTER html %]</h1>
@@ -515,9 +515,9 @@
dependencies is now much faster.</li>
<li><strong>Attachments:</strong> The encoding of text files can be automatically
detected when uploading them as attachments.</li>
- <li><strong>Attachments:</strong> Clickjacking could possibly occur in an attachment
- Details page if a user attached a specially formatted HTML file. To fix this
- potential problem, the Details page always displays the HTML source instead and
+ <li><strong>Attachments:</strong> Clickjacking could possibly occur in an attachment
+ Details page if a user attached a specially formatted HTML file. To fix this
+ potential problem, the Details page always displays the HTML source instead and
users can see rendered page by clicking on View.</li>
<li><strong>Flags:</strong> Changing the requestee of a flag no longer changes
the requester.</li>
@@ -683,7 +683,7 @@
<li><a href="#v40_feat">New Features and Improvements</a></li>
<li><a href="#v40_issues">Outstanding Issues</a></li>
<li><a href="#v40_upgrading">Notes On Upgrading From a Previous Version</a></li>
- <li><a href="#v40_code_changes">Code Changes Which May Affect
+ <li><a href="#v40_code_changes">Code Changes Which May Affect
Customizations and Extensions</a></li>
<li><a href="#v40_previous">Release Notes for Previous Versions</a></li>
</ul>
@@ -708,7 +708,7 @@
<p>If you're upgrading, make sure to read <a href="#v40_upgrading">Notes
On Upgrading From a Previous Version</a>. If you are upgrading from a release
- before 3.6, make sure to read the release notes for all the
+ before 3.6, make sure to read the release notes for all the
<a href="#v40_previous">previous versions</a> in between your version
and this one, <strong>particularly the Upgrading section of each
version's release notes</strong>.</p>
@@ -778,7 +778,7 @@
<p>(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=646578">[% terms.Bug %] 646578</a>)</p></li>
<li>The "Remember values as bookmarkable template" button on the
[%+ terms.bug %] entry page will now work even when some required fields
- are empty.
+ are empty.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=640719">[% terms.Bug %] 640719</a>)</li>
<li>Email notifications about dependencies and flags had the wrong
timestamp.
@@ -787,7 +787,7 @@
<li>You can now select "UTC" as a valid timezone in General Preferences.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=646209">[% terms.Bug %] 646209</a>)</li>
<li>Automatic duplicate detection now works on PostgreSQL (although
- it is not as high-quality as on other DB platforms).
+ it is not as high-quality as on other DB platforms).
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=634144">[% terms.Bug %] 634144</a>)</li>
<li>Autcomplete for users now works even if you are using the
"emailsuffix" option.
@@ -797,7 +797,7 @@
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=644285">[% terms.Bug %] 644285</a>)</li>
<li>The "Show Votes" page now works, for installations using the Voting
extension.
- (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652381">[% terms.Bug %] 652381</a>)</li>
+ (<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=652381">[% terms.Bug %] 652381</a>)</li>
</ul>
<h2 id="v40_req">Minimum Requirements</h2>
@@ -1183,7 +1183,7 @@
another domain, inside of a web browser, thanks to support for
<a href="https://bob.ippoli.to/archives/2005/12/05/remote-json-jsonp/">JSONP</a>.
This will allow for web "mash-ups" to use [% terms.Bugzilla %] data.
- When using JSONP, you may only call functions that <em>get</em> data,
+ When using JSONP, you may only call functions that <em>get</em> data,
you may not call functions that <em>change</em> data.</p>
<p>For more details, see the
@@ -1222,7 +1222,7 @@
<h3 id="v40_feat_js_css_update">Users Get New CSS and Javascript
Automatically</h3>
-
+
<p>In past versions of [% terms.Bugzilla %], if you changed
[%+ terms.Bugzilla %]'s CSS or Javascript files, then every user of
[%+ terms.Bugzilla %] would have to clear their cache in order to get
@@ -1245,8 +1245,8 @@
<h3 id="v40_feat_apache_config">New Apache Configuration</h3>
<p>If you run [% terms.Bugzilla %] under Apache (as most people do),
- you most likely require a <strong>new Apache configuration</strong>
- for this version of [% terms.Bugzilla %]. See the
+ you most likely require a <strong>new Apache configuration</strong>
+ for this version of [% terms.Bugzilla %]. See the
<a href="#v40_upgrading">Notes On Upgrading From a Previous Version</a>
section for details.</p>
@@ -1280,7 +1280,7 @@
<li><strong>[% terms.Bugs %]:</strong> The box to "Add [% terms.Bug %] URLs"
in the See Also field is now hidden behind an "(add)" link that you
have to click to see the box.</li>
-
+
<li><strong>Searches:</strong> You can now properly search for field values
that have commas in their name, when using the Advanced Search form.</li>
<li><strong>Searches:</strong> The "URL" field can now be shown as a column
@@ -1306,7 +1306,7 @@
<li><strong>Searches:</strong> When using the Boolean Charts (now called
"Custom Search"), you can search for values "greater than or equal to"
or "less than or equal to" some value.</li>
-
+
<li><strong>Flags:</strong> If you hover your mouse over the name of
a flag setter when viewing [% terms.abug %], you can see that
flag setter's full name and complete username.</li>
@@ -1317,7 +1317,7 @@
that are restricted to certain groups now properly have the "padlock"
icon shown next to them to indicate that they may contain confidential
information.</li>
-
+
<li>When using the Reports interface, you can now choose many more fields
as the X, Y, or Z axis of a report, including custom fields.</li>
<li>[% terms.Bugzilla %] now prevents
@@ -1420,14 +1420,14 @@
<a href="https://developer.mozilla.org/docs/Web/HTTP/Headers/X-Frame-Options"><code>X-Frame-Options: SAMEORIGIN</code></a> header
with every page request in order to prevent "clickjacking" attacks. Note
that this prevents other domains from displaying [% terms.Bugzilla %]
- in an HTML frame.</li>
+ in an HTML frame.</li>
</ul>
<h4 id="v40_feat_ws_changes">WebService Changes</h4>
<ul>
<li>You can now call some JSON-RPC methods using HTTP GET, in addition to
- using HTTP POST. See the
+ using HTTP POST. See the
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Server/JSONRPC.html#Connecting_via_GET">JSON-RPC
documentation</a> for details.</li>
<li>You can now update existing [% terms.bugs %] using the
@@ -1483,15 +1483,15 @@
[%- terms.Bug %] 423439</a>: Tabs in comments will be converted
to four spaces, due to a b<!-- -->ug in Perl as of Perl 5.8.8.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
- [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
the same time, there is no "mid-air collision" protection.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
- [%- terms.Bug %] 276230</a>: The support for restricting access to
- particular Categories of New Charts is not complete. You should treat
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
the 'chartgroup' Param as the only access mechanism available.<br>
- However, charts migrated from Old Charts will be restricted to
+ However, charts migrated from Old Charts will be restricted to
the groups that are marked MANDATORY for the corresponding Product.
- There is currently no way to change this restriction, and the
+ There is currently no way to change this restriction, and the
groupings will not be updated if the group configuration
for the Product changes.</li>
</ul>
@@ -1504,7 +1504,7 @@
<p>If you run [% terms.Bugzilla %] under mod_cgi (this is the most common
configuration, involving a &lt;Directory&gt; block in your Apache config
- file), you will need to update the configuration of Apache for
+ file), you will need to update the configuration of Apache for
[%+ terms.Bugzilla %]. In particular, this line in the [% terms.Bugzilla %]
<kbd>&lt;Directory&gt;</kbd> block:</p>
@@ -1513,7 +1513,7 @@
<p>needs to become:</p>
<blockquote><code>AllowOverride Limit FileInfo Indexes</code></blockquote>
-
+
<p>For full details on how to configure Apache for [% terms.Bugzilla %],
see the
<a href="[% docs_urlbase FILTER html %]configuration.html#http-apache">Configuration</a>
@@ -1524,7 +1524,7 @@
<p>If your [% terms.Bugzilla %] runs under mod_perl, the required Apache
configuration is now simpler. The line that used to look like:</p>
-<blockquote><code>PerlSwitches -w -T -I/var/www/html/bugzilla
+<blockquote><code>PerlSwitches -w -T -I/var/www/html/bugzilla
-I/var/www/html/bugzilla/lib</code></blockquote>
<p>Now should be only:</p>
@@ -1631,7 +1631,7 @@
[% '</span>' IF db_new %]
</li>
<li><strong>perl module:</strong>
- [%+ m.dbd.module FILTER html %]
+ [%+ m.dbd.module FILTER html %]
[% '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %]
[% '</span>' IF dbd_new %]</li>
</ul>
@@ -1649,8 +1649,8 @@
[% FOREACH req = reqs %]
<tr>
<td [% ' class="req_new"' IF new.contains(req.package) %]>
- [%- req.module FILTER html %]</td>
- <td [% ' class="req_new"' IF updated.contains(req.package)
+ [%- req.module FILTER html %]</td>
+ <td [% ' class="req_new"' IF updated.contains(req.package)
OR new.contains(req.package) %]>
[%- IF req.version == 0 %]
(Any)
@@ -1658,7 +1658,7 @@
[%- req.version FILTER html %]
[% END %]
</td>
- [% IF include_feature %]
+ [% IF include_feature %]
<td>[% req.feature.join(', ') FILTER html %]</td>
[% END %]
</tr>
diff --git a/template/en/default/pages/release-notes3.html.tmpl b/template/en/default/pages/release-notes3.html.tmpl
index 2f37f8017..ae0ed36e8 100644
--- a/template/en/default/pages/release-notes3.html.tmpl
+++ b/template/en/default/pages/release-notes3.html.tmpl
@@ -19,9 +19,9 @@
[% PROCESS global/variables.none.tmpl %]
[% SET title = "$terms.Bugzilla 3.6 Release Notes" %]
-[% INCLUDE global/header.html.tmpl
+[% INCLUDE global/header.html.tmpl
title = title
- style_urls = ['skins/standard/page.css']
+ style_urls = ['skins/standard/page.css']
%]
<h3>Release Notes For Newer Versions</h3>
@@ -38,7 +38,7 @@
<li><a href="#v36_feat">New Features and Improvements</a></li>
<li><a href="#v36_issues">Outstanding Issues</a></li>
<li><a href="#v36_upgrading">Notes On Upgrading From a Previous Version</a></li>
- <li><a href="#v36_code_changes">Code Changes Which May Affect
+ <li><a href="#v36_code_changes">Code Changes Which May Affect
Customizations</a></li>
<li><a href="#v36_previous">Release Notes for Previous Versions</a></li>
</ul>
@@ -52,7 +52,7 @@
<p>If you're upgrading, make sure to read <a href="#v36_upgrading">Notes
On Upgrading From a Previous Version</a>. If you are upgrading from a release
- before 3.4, make sure to read the release notes for all the
+ before 3.4, make sure to read the release notes for all the
<a href="#v36_previous">previous versions</a> in between your version
and this one, <strong>particularly the Upgrading section of each
version's release notes</strong>.</p>
@@ -60,7 +60,7 @@
<p>We would like to thank <a href="https://www.canonical.com/">Canonical
Ltd.</a>, <a href="https://www.itasoftware.com/">ITA Software</a>,
the <a href="https://www.ibm.com/linux/ltc/">IBM Linux Technology Center</a>,
- <a href="https://www.redhat.com/">Red Hat</a>, and
+ <a href="https://www.redhat.com/">Red Hat</a>, and
<a href="https://www.novell.com/">Novell</a> for funding the development
of various features and improvements in this release of
[%+ terms.Bugzilla %].</p>
@@ -115,7 +115,7 @@
editing a product's components.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=576911">[% terms.Bug %] 576911</a>)
</li>
- <li>The updating of bugs_fulltext that happens during
+ <li>The updating of bugs_fulltext that happens during
<kbd>checksetup.pl</kbd> for upgrades to 3.6 should now be MUCH faster.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=577754">[% terms.Bug %] 577754</a>)
</li>
@@ -180,274 +180,274 @@
<li><a href="#v36_req_optional_mod">Optional Perl Modules</a></li>
</ul>
-<h3 id="v36_req_perl">Perl</h3>
-
+<h3 id="v36_req_perl">Perl</h3>
+
<p>Perl v5.8.1</p>
-<h3 id="v36_req_mysql">For MySQL Users</h3>
-
- <ul>
+<h3 id="v36_req_mysql">For MySQL Users</h3>
+
+ <ul>
<li>MySQL
v4.1.2
- </li>
- <li><strong>perl module:</strong>
- DBD::mysql v4.00</li>
+ </li>
+ <li><strong>perl module:</strong>
+ DBD::mysql v4.00</li>
</ul>
-
-<h3 id="v36_req_pg">For PostgreSQL Users</h3>
-
- <ul>
+
+<h3 id="v36_req_pg">For PostgreSQL Users</h3>
+
+ <ul>
<li>PostgreSQL
v8.00.0000
- </li>
- <li><strong>perl module:</strong>
- DBD::Pg v1.45</li>
- </ul>
-<h3 id="v36_req_oracle">For Oracle Users</h3>
-
- <ul>
+ </li>
+ <li><strong>perl module:</strong>
+ DBD::Pg v1.45</li>
+ </ul>
+<h3 id="v36_req_oracle">For Oracle Users</h3>
+
+ <ul>
<li>Oracle
v10.02.0
- </li>
- <li><strong>perl module:</strong>
- DBD::Oracle v1.19</li>
- </ul>
-
+ </li>
+ <li><strong>perl module:</strong>
+ DBD::Oracle v1.19</li>
+ </ul>
+
<h3 id="v36_req_modules">Required Perl Modules</h3>
-<table class="req_table" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <th>Module</th> <th>Version</th>
- </tr>
- <tr>
- <td >CGI</td>
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ </tr>
+ <tr>
+ <td >CGI</td>
<td >3.21
- </td>
- </tr>
- <tr>
- <td >Digest::SHA</td>
- <td >
+ </td>
+ </tr>
+ <tr>
+ <td >Digest::SHA</td>
+ <td >
(Any)
- </td>
- </tr>
- <tr>
- <td >Date::Format</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Date::Format</td>
<td >2.21
- </td>
- </tr>
- <tr>
- <td >DateTime</td>
+ </td>
+ </tr>
+ <tr>
+ <td >DateTime</td>
<td >0.28
- </td>
- </tr>
- <tr>
- <td >DateTime::TimeZone</td>
+ </td>
+ </tr>
+ <tr>
+ <td >DateTime::TimeZone</td>
<td >0.71
- </td>
- </tr>
- <tr>
- <td >DBI</td>
+ </td>
+ </tr>
+ <tr>
+ <td >DBI</td>
<td >1.41
- </td>
- </tr>
- <tr>
- <td >Template</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Template</td>
<td >2.22
- </td>
- </tr>
- <tr>
- <td >Email::Send</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Email::Send</td>
<td >2.00
- </td>
- </tr>
- <tr>
- <td >Email::MIME</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Email::MIME</td>
<td >1.861
- </td>
- </tr>
- <tr>
- <td >Email::MIME::Encodings</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Email::MIME::Encodings</td>
<td >1.313
- </td>
- </tr>
- <tr>
- <td >Email::MIME::Modifier</td>
+ </td>
+ </tr>
+ <tr>
+ <td >Email::MIME::Modifier</td>
<td >1.442
- </td>
- </tr>
- <tr>
- <td >URI</td>
- <td >
+ </td>
+ </tr>
+ <tr>
+ <td >URI</td>
+ <td >
(Any)
- </td>
- </tr>
-</table>
-
-<h3 id="v36_req_optional_mod">Optional Perl Modules</h3>
-
+ </td>
+ </tr>
+</table>
+
+<h3 id="v36_req_optional_mod">Optional Perl Modules</h3>
+
<p>The following perl modules, if installed, enable various
features of [% terms.Bugzilla %]:</p>
-<table class="req_table" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <th>Module</th> <th>Version</th>
- <th>Enables Feature</th>
- </tr>
- <tr>
- <td >GD</td>
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ <th>Enables Feature</th>
+ </tr>
+ <tr>
+ <td >GD</td>
<td >1.20
- </td>
- <td>Graphical Reports, New Charts, Old Charts</td>
- </tr>
- <tr>
- <td >Chart::Lines</td>
+ </td>
+ <td>Graphical Reports, New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td >Chart::Lines</td>
<td class="req_new">2.1
- </td>
- <td>New Charts, Old Charts</td>
- </tr>
- <tr>
- <td >Template::Plugin::GD::Image</td>
- <td >
+ </td>
+ <td>New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td >Template::Plugin::GD::Image</td>
+ <td >
(Any)
- </td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td >GD::Text</td>
- <td >
+ </td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td >GD::Text</td>
+ <td >
(Any)
- </td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td >GD::Graph</td>
- <td >
+ </td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td >GD::Graph</td>
+ <td >
(Any)
- </td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td >XML::Twig</td>
- <td >
+ </td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td >XML::Twig</td>
+ <td >
(Any)
- </td>
+ </td>
<td>Move [% terms.Bugs %] Between Installations,
- Automatic Update Notifications</td>
- </tr>
- <tr>
- <td >MIME::Parser</td>
+ Automatic Update Notifications</td>
+ </tr>
+ <tr>
+ <td >MIME::Parser</td>
<td >5.406
- </td>
- <td>Move [% terms.Bugs %] Between Installations</td>
- </tr>
- <tr>
- <td >LWP::UserAgent</td>
- <td >
+ </td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td >LWP::UserAgent</td>
+ <td >
(Any)
- </td>
- <td>Automatic Update Notifications</td>
- </tr>
- <tr>
- <td >PatchReader</td>
+ </td>
+ <td>Automatic Update Notifications</td>
+ </tr>
+ <tr>
+ <td >PatchReader</td>
<td >0.9.4
- </td>
- <td>Patch Viewer</td>
- </tr>
- <tr>
- <td >Net::LDAP</td>
- <td >
+ </td>
+ <td>Patch Viewer</td>
+ </tr>
+ <tr>
+ <td >Net::LDAP</td>
+ <td >
(Any)
- </td>
- <td>LDAP Authentication</td>
- </tr>
- <tr>
- <td >Authen::SASL</td>
- <td >
+ </td>
+ <td>LDAP Authentication</td>
+ </tr>
+ <tr>
+ <td >Authen::SASL</td>
+ <td >
(Any)
- </td>
- <td>SMTP Authentication</td>
- </tr>
- <tr>
- <td >Authen::Radius</td>
- <td >
+ </td>
+ <td>SMTP Authentication</td>
+ </tr>
+ <tr>
+ <td >Authen::Radius</td>
+ <td >
(Any)
- </td>
- <td>RADIUS Authentication</td>
- </tr>
- <tr>
- <td >SOAP::Lite</td>
+ </td>
+ <td>RADIUS Authentication</td>
+ </tr>
+ <tr>
+ <td >SOAP::Lite</td>
<td >0.710.06
- </td>
- <td>XML-RPC Interface</td>
- </tr>
- <tr>
- <td class="req_new">JSON::RPC</td>
- <td class="req_new">
+ </td>
+ <td>XML-RPC Interface</td>
+ </tr>
+ <tr>
+ <td class="req_new">JSON::RPC</td>
+ <td class="req_new">
(Any)
- </td>
- <td>JSON-RPC Interface</td>
- </tr>
- <tr>
- <td class="req_new">Test::Taint</td>
- <td class="req_new">
+ </td>
+ <td>JSON-RPC Interface</td>
+ </tr>
+ <tr>
+ <td class="req_new">Test::Taint</td>
+ <td class="req_new">
(Any)
- </td>
- <td>JSON-RPC Interface, XML-RPC Interface</td>
- </tr>
- <tr>
- <td >HTML::Parser</td>
+ </td>
+ <td>JSON-RPC Interface, XML-RPC Interface</td>
+ </tr>
+ <tr>
+ <td >HTML::Parser</td>
<td >3.40
- </td>
- <td>More HTML in Product/Group Descriptions</td>
- </tr>
- <tr>
- <td >HTML::Scrubber</td>
- <td >
+ </td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td >HTML::Scrubber</td>
+ <td >
(Any)
- </td>
- <td>More HTML in Product/Group Descriptions</td>
- </tr>
- <tr>
- <td >Email::MIME::Attachment::Stripper</td>
- <td >
+ </td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td >Email::MIME::Attachment::Stripper</td>
+ <td >
(Any)
- </td>
- <td>Inbound Email</td>
- </tr>
- <tr>
- <td >Email::Reply</td>
- <td >
+ </td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td >Email::Reply</td>
+ <td >
(Any)
- </td>
- <td>Inbound Email</td>
- </tr>
- <tr>
- <td >TheSchwartz</td>
- <td >
+ </td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td >TheSchwartz</td>
+ <td >
(Any)
- </td>
- <td>Mail Queueing</td>
- </tr>
- <tr>
- <td >Daemon::Generic</td>
- <td >
+ </td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td >Daemon::Generic</td>
+ <td >
(Any)
- </td>
- <td>Mail Queueing</td>
- </tr>
- <tr>
- <td >mod_perl2</td>
+ </td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td >mod_perl2</td>
<td >1.999022
- </td>
- <td>mod_perl</td>
- </tr>
-</table>
+ </td>
+ <td>mod_perl</td>
+ </tr>
+</table>
<h2 id="v36_feat">New Features and Improvements</h2>
<ul>
<li><a href="#v36_feat_usability">General Usability Improvements</a></li>
- <li><a href="#v36_feat_extensions">New Extensions System</a></li>
+ <li><a href="#v36_feat_extensions">New Extensions System</a></li>
<li><a href="#v36_feat_qs">Improved Quicksearch</a></li>
<li><a href="#v36_feat_browse">Simple "Browse" Interface</a></li>
<li><a href="#v36_feat_suexec">SUExec Support</a></li>
@@ -608,7 +608,7 @@
mandatory.</li>
<li><b>[% terms.Bug %] Filing:</b> "Bookmarkable templates" now
support the "alias" and "estimated hours" fields.</li>
-
+
<li><b>[% terms.Bug %] Editing:</b> In previous versions of
[%+ terms.Bugzilla %], if you added a private comment to [% terms.abug %],
then <em>none</em> of the changes that you made at that time were
@@ -639,10 +639,10 @@
<li><b>Attachments:</b> When you click on an "attachment 12345" link
in a comment, if the attachment is a patch, you will now see the
formatted "Diff" view instead of the raw patch.</li>
- <li><b>Attachments</b>: For text attachments, we now let the browser
+ <li><b>Attachments</b>: For text attachments, we now let the browser
auto-detect the character encoding, instead of forcing the browser to
always assume the attachment is in UTF-8.</li>
-
+
<li><b>Search:</b> You can now display [% terms.bug %] flags as a column
in search results.</li>
<li><b>Search:</b> When viewing search results, you can see which columns are
@@ -662,7 +662,7 @@
<kbd>buglist.cgi</kbd> now accepts nearly every valid field in
[%+ terms.Bugzilla %] as a direct URL parameter, like
<kbd>&amp;field=value</kbd>.</li>
-
+
<li><b>Requests:</b> When viewing the "My Requests" page, you can now
see the lists as a normal search result by clicking a link at the
bottom of each table.</li>
@@ -694,7 +694,7 @@
if there are no [% terms.bugs %] that match your searches.</li>
<li>The arrows in dependency graphs now point the other way, so that
[%+ terms.bugs %] point at their dependencies.</li>
-
+
<li><b>New Charts:</b> You can now convert an existing Saved Search
into a data series for New Charts.</li>
<li><b>New Charts:</b> There is now an interface that allows you to
@@ -743,7 +743,7 @@
the <kbd>lib/</kbd> dir. If you would rather use the CGI.pm from your
global Perl installation, you can delete <kbd>CGI.pm</kbd> and the
<kbd>CGI</kbd> directory from the <kbd>lib/</kbd> directory.</li>
-
+
<li>When editing a group, you can now specify that members of a group
are allowed to grant others membership in that group itself.</li>
<li>The ability to compress BMP attachments to PNGs is now an Extension.
@@ -760,7 +760,7 @@
the numeric id of each comment, whether an attachment is a URL,
the modification time of an attachment, the numeric id of a flag,
and the numeric id of a flag's type.</li>
-
+
<li><b>Parameters:</b> Parameters that aren't actually required are no longer
in the "Required" section of the Parameters page. Instead, some are in the
new "General" section, and some are in the new "Advanced" section.</li>
@@ -778,7 +778,7 @@
header sent from that proxy, and correctly use the X-Forwarded-For
as the end user's IP, instead of believing that all traffic is coming
from the proxy.</li>
-
+
<li><b>Removed Parameter:</b> The <kbd>loginnetmask</kbd> parameter has
been removed. Since [% terms.Bugzilla %] sends secure cookies, it's no
longer necessary to always restrict logins to a specific IP or block
@@ -845,19 +845,19 @@
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
[%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
- by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
- the option to rebuild the cache when it asks. Otherwise keywords may
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
not show up properly in search results.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
- [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
the same time, there is no "mid-air collision" protection.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
- [%- terms.Bug %] 276230</a>: The support for restricting access to
- particular Categories of New Charts is not complete. You should treat
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
the 'chartgroup' Param as the only access mechanism available.<br>
- However, charts migrated from Old Charts will be restricted to
+ However, charts migrated from Old Charts will be restricted to
the groups that are marked MANDATORY for the corresponding Product.
- There is currently no way to change this restriction, and the
+ There is currently no way to change this restriction, and the
groupings will not be updated if the group configuration
for the Product changes.</li>
</ul>
@@ -872,10 +872,10 @@
you can always delete the database records which contain the bad values by
logging in to your database and running the following command:</p>
-<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
+<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
(<var>1, 2, 3, 4</var>)</code></p>
-<p>Just replace "table" and "column" with the name of the table
+<p>Just replace "table" and "column" with the name of the table
and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4"
with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p>
@@ -916,7 +916,7 @@
<li><a href="#v34_feat">New Features and Improvements</a></li>
<li><a href="#v34_issues">Outstanding Issues</a></li>
<li><a href="#v34_upgrading">Notes On Upgrading From a Previous Version</a></li>
- <li><a href="#v34_code_changes">Code Changes Which May Affect
+ <li><a href="#v34_code_changes">Code Changes Which May Affect
Customizations</a></li>
<li><a href="#v34_previous">Release Notes for Previous Versions</a></li>
</ul>
@@ -930,7 +930,7 @@
<p>If you're upgrading, make sure to read <a href="#v34_upgrading">Notes
On Upgrading From a Previous Version</a>. If you are upgrading from a release
- before 3.2, make sure to read the release notes for all the
+ before 3.2, make sure to read the release notes for all the
<a href="#v34_previous">previous versions</a> in between your version
and this one, <strong>particularly the Upgrading section of each
version's release notes</strong>.</p>
@@ -975,7 +975,7 @@
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=533018">[% terms.Bug %] 533018</a>)
</li>
<li>If you tried to do a search with too many terms (resulting in a URL
- that was longer than about 7000 characters), Apache would return a
+ that was longer than about 7000 characters), Apache would return a
500 error instead of your search results.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=513989">[% terms.Bug %] 513989</a>)
</li>
@@ -1005,7 +1005,7 @@
<li>The Assignee field was empty in Whine mails.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=511216">[% terms.Bug %] 511216</a>)
</li>
- <li>Administrators can now successfully create user accounts using
+ <li>Administrators can now successfully create user accounts using
editusers.cgi when using the "Env" authentication method.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=483987">[% terms.Bug %] 483987</a>)
</li>
@@ -1040,12 +1040,12 @@
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=517793">[% terms.Bug %] 517793</a>)
</li>
<li>Attachments with Unicode characters in their names were being downloaded
- with mangled names.
+ with mangled names.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=328628">[% terms.Bug %] 328628</a>)
</li>
<li>Creating custom fields with Unicode in their database column name
is now no longer allowed, as it would break [% terms.Bugzilla %]. If you
- created such a custom field, you should delete it by first marking it
+ created such a custom field, you should delete it by first marking it
obsolete and then clicking "Delete" in the custom field list, using
<a href="editfields.cgi">editfields.cgi</a>.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=525025">[% terms.Bug %] 525025</a>)
@@ -1059,7 +1059,7 @@
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=509152">[% terms.Bug %] 509152</a>)
</li>
<li>You can now do <kbd>./install-module.pl --shell</kbd> to get a CPAN
- shell using the configuration of
+ shell using the configuration of
<a href="[% docs_urlbase FILTER html %]api/install-module.html">install-module.pl</a>,
which allows you to do more advanced Perl module installation tasks.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=445875">[% terms.Bug %] 445875</a>)
@@ -1069,7 +1069,7 @@
<h3>3.4.2</h3>
<p>This release contains fixes for multiple security issues, one of which
- is highly critical. See the
+ is highly critical. See the
<a href="https://www.bugzilla.org/security/3.0.8/">Security Advisory</a>
for details.</p>
@@ -1077,8 +1077,8 @@
this release:</p>
<ul>
- <li>Upgrades from older releases were sometimes failing during UTF-8
- conversion with a foreign key error.
+ <li>Upgrades from older releases were sometimes failing during UTF-8
+ conversion with a foreign key error.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=508181">[% terms.Bug %] 508181</a>)
</li>
<li>Sorting [% terms.bug %] lists on certain fields would result in an error.
@@ -1099,7 +1099,7 @@
</li>
<li>For users of RHEL, CentOS, Fedora, etc. jobqueue.pl can now automatically
be installed as a daemon by running <kbd>./jobqueue.pl install</kbd>
- as root.
+ as root.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=475403">[% terms.Bug %] 475403</a>)
</li>
<li>XML-RPC interface responses had an incorrect Content-Length header
@@ -1142,207 +1142,207 @@
<p>Perl v5.8.1</p>
-<h3 id="v34_req_mysql">For MySQL Users</h3>
-
-<ul>
- <li>MySQL v4.1.2</li>
- <li><strong>perl module:</strong> DBD::mysql v4.00</li>
+<h3 id="v34_req_mysql">For MySQL Users</h3>
+
+<ul>
+ <li>MySQL v4.1.2</li>
+ <li><strong>perl module:</strong> DBD::mysql v4.00</li>
</ul>
-<h3 id="v34_req_pg">For PostgreSQL Users</h3>
-
-<ul>
+<h3 id="v34_req_pg">For PostgreSQL Users</h3>
+
+<ul>
<li>PostgreSQL v8.00.0000</li>
<li><strong>perl module:</strong> DBD::Pg v1.45</li>
</ul>
<h3 id="v34_req_oracle">For Oracle Users</h3>
-
-<ul>
+
+<ul>
<li>Oracle v10.02.0</li>
<li><strong>perl module:</strong> DBD::Oracle v1.19</li>
-</ul>
-
+</ul>
+
<h3 id="v34_req_modules">Required Perl Modules</h3>
-<table class="req_table" border="0" cellspacing="0" cellpadding="0">
- <tr>
- <th>Module</th> <th>Version</th>
- </tr>
- <tr>
- <td>CGI</td>
- <td>3.21</td>
- </tr>
- <tr>
- <td class="req_new">Digest::SHA</td>
- <td class="req_new"> (Any)</td>
- </tr>
- <tr>
- <td>Date::Format</td>
- <td>2.21</td>
- </tr>
- <tr>
- <td class="req_new">DateTime</td>
- <td class="req_new">0.28</td>
- </tr>
- <tr>
- <td class="req_new">DateTime::TimeZone</td>
- <td class="req_new">0.71</td>
- </tr>
- <tr>
- <td>DBI</td>
- <td>1.41</td>
- </tr>
- <tr>
- <td>Template</td>
- <td class="req_new">2.22</td>
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
+ <th>Module</th> <th>Version</th>
+ </tr>
+ <tr>
+ <td>CGI</td>
+ <td>3.21</td>
+ </tr>
+ <tr>
+ <td class="req_new">Digest::SHA</td>
+ <td class="req_new"> (Any)</td>
+ </tr>
+ <tr>
+ <td>Date::Format</td>
+ <td>2.21</td>
+ </tr>
+ <tr>
+ <td class="req_new">DateTime</td>
+ <td class="req_new">0.28</td>
+ </tr>
+ <tr>
+ <td class="req_new">DateTime::TimeZone</td>
+ <td class="req_new">0.71</td>
+ </tr>
+ <tr>
+ <td>DBI</td>
+ <td>1.41</td>
+ </tr>
+ <tr>
+ <td>Template</td>
+ <td class="req_new">2.22</td>
+ </tr>
+ <tr>
+ <td>Email::Send</td>
+ <td>2.00</td>
+ </tr>
+ <tr>
+ <td>Email::MIME</td>
+ <td>1.861</td>
+ </tr>
+ <tr>
+ <td>Email::MIME::Encodings</td>
+ <td>1.313</td>
</tr>
<tr>
- <td>Email::Send</td>
- <td>2.00</td>
- </tr>
- <tr>
- <td>Email::MIME</td>
- <td>1.861</td>
- </tr>
- <tr>
- <td>Email::MIME::Encodings</td>
- <td>1.313</td>
- </tr>
- <tr>
- <td>Email::MIME::Modifier</td>
- <td>1.442</td>
- </tr>
- <tr>
- <td class="req_new">URI</td>
- <td class="req_new">(Any)</td>
- </tr>
-</table>
-
-<h3 id="v34_req_optional_mod">Optional Perl Modules</h3>
-
+ <td>Email::MIME::Modifier</td>
+ <td>1.442</td>
+ </tr>
+ <tr>
+ <td class="req_new">URI</td>
+ <td class="req_new">(Any)</td>
+ </tr>
+</table>
+
+<h3 id="v34_req_optional_mod">Optional Perl Modules</h3>
+
<p>The following perl modules, if installed, enable various
features of [% terms.Bugzilla %]:</p>
-<table class="req_table" border="0" cellspacing="0" cellpadding="0">
- <tr>
+<table class="req_table" border="0" cellspacing="0" cellpadding="0">
+ <tr>
<th>Module</th>
- <th>Version</th>
- <th>Enables Feature</th>
- </tr>
- <tr>
- <td>LWP::UserAgent</td>
- <td>(Any)</td>
- <td>Automatic Update Notifications</td>
- </tr>
- <tr>
- <td>Template::Plugin::GD::Image</td>
- <td>(Any)</td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td>GD::Text</td>
- <td>(Any)</td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td>GD::Graph</td>
- <td>(Any)</td>
- <td>Graphical Reports</td>
- </tr>
- <tr>
- <td>GD</td>
- <td>1.20</td>
- <td>Graphical Reports, New Charts, Old Charts</td>
- </tr>
- <tr>
- <td>Email::MIME::Attachment::Stripper</td>
- <td>(Any)</td>
- <td>Inbound Email</td>
- </tr>
- <tr>
- <td>Email::Reply</td>
- <td>(Any)</td>
- <td>Inbound Email</td>
- </tr>
- <tr>
- <td>Net::LDAP</td>
- <td>(Any)</td>
- <td>LDAP Authentication</td>
- </tr>
- <tr>
- <td class="req_new">TheSchwartz</td>
- <td class="req_new">(Any)</td>
- <td>Mail Queueing</td>
- </tr>
- <tr>
- <td class="req_new">Daemon::Generic</td>
- <td class="req_new">(Any)</td>
- <td>Mail Queueing</td>
- </tr>
- <tr>
- <td>HTML::Parser</td>
- <td>3.40</td>
- <td>More HTML in Product/Group Descriptions</td>
- </tr>
- <tr>
- <td>HTML::Scrubber</td>
- <td>(Any)</td>
- <td>More HTML in Product/Group Descriptions</td>
- </tr>
- <tr>
- <td>XML::Twig</td>
- <td>(Any)</td>
- <td>Move [% terms.Bugs %] Between Installations</td>
- </tr>
- <tr>
- <td>MIME::Parser</td>
- <td>5.406</td>
- <td>Move [% terms.Bugs %] Between Installations</td>
- </tr>
- <tr>
- <td>Chart::Base</td>
- <td>1.0</td>
- <td>New Charts, Old Charts</td>
- </tr>
- <tr>
- <td>Image::Magick</td>
- <td>(Any)</td>
- <td>Optionally Convert BMP Attachments to PNGs</td>
- </tr>
- <tr>
- <td>PatchReader</td>
- <td>0.9.4</td>
- <td>Patch Viewer</td>
- </tr>
- <tr>
- <td>Authen::Radius</td>
- <td>(Any)</td>
- <td>RADIUS Authentication</td>
- </tr>
- <tr>
- <td>Authen::SASL</td>
- <td>(Any)</td>
- <td>SMTP Authentication</td>
- </tr>
- <tr>
- <td>SOAP::Lite</td>
- <td>0.710.06</td>
- <td>XML-RPC Interface</td>
- </tr>
- <tr>
- <td>mod_perl2</td>
- <td>1.999022</td>
- <td>mod_perl</td>
- </tr>
-</table>
+ <th>Version</th>
+ <th>Enables Feature</th>
+ </tr>
+ <tr>
+ <td>LWP::UserAgent</td>
+ <td>(Any)</td>
+ <td>Automatic Update Notifications</td>
+ </tr>
+ <tr>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Text</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
+ <td>Graphical Reports</td>
+ </tr>
+ <tr>
+ <td>GD</td>
+ <td>1.20</td>
+ <td>Graphical Reports, New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td>Email::MIME::Attachment::Stripper</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td>Email::Reply</td>
+ <td>(Any)</td>
+ <td>Inbound Email</td>
+ </tr>
+ <tr>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
+ <td>LDAP Authentication</td>
+ </tr>
+ <tr>
+ <td class="req_new">TheSchwartz</td>
+ <td class="req_new">(Any)</td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td class="req_new">Daemon::Generic</td>
+ <td class="req_new">(Any)</td>
+ <td>Mail Queueing</td>
+ </tr>
+ <tr>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
+ <td>More HTML in Product/Group Descriptions</td>
+ </tr>
+ <tr>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
+ <td>Move [% terms.Bugs %] Between Installations</td>
+ </tr>
+ <tr>
+ <td>Chart::Base</td>
+ <td>1.0</td>
+ <td>New Charts, Old Charts</td>
+ </tr>
+ <tr>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
+ <td>Optionally Convert BMP Attachments to PNGs</td>
+ </tr>
+ <tr>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
+ <td>Patch Viewer</td>
+ </tr>
+ <tr>
+ <td>Authen::Radius</td>
+ <td>(Any)</td>
+ <td>RADIUS Authentication</td>
+ </tr>
+ <tr>
+ <td>Authen::SASL</td>
+ <td>(Any)</td>
+ <td>SMTP Authentication</td>
+ </tr>
+ <tr>
+ <td>SOAP::Lite</td>
+ <td>0.710.06</td>
+ <td>XML-RPC Interface</td>
+ </tr>
+ <tr>
+ <td>mod_perl2</td>
+ <td>1.999022</td>
+ <td>mod_perl</td>
+ </tr>
+</table>
<h2 id="v34_feat">New Features and Improvements</h2>
<ul>
<li><a href="#v34_feat_enter">Simple [% terms.Bug %] Filing</a></li>
<li><a href="#v34_feat_index">New Home Page</a></li>
- <li><a href="#v34_feat_spam">Email Addresses Hidden From Logged-Out
+ <li><a href="#v34_feat_spam">Email Addresses Hidden From Logged-Out
Users</a></li>
<li><a href="#v34_feat_urls">Shorter Search URLs</a></li>
<li><a href="#v34_feat_async">Asynchronous Email Sending</a></li>
@@ -1352,7 +1352,7 @@
Another Field Has a Particular Value</a></li>
<li><a href="#v34_feat_vals">Custom Fields Whose List of Values
Change Depending on the Value of Another Field</a></li>
- <li><a href="#v34_feat_bugid">New Custom Field Type:
+ <li><a href="#v34_feat_bugid">New Custom Field Type:
[%+ terms.Bug %] ID</a></li>
<li><a href="#v34_feat_see">"See Also" Field</a></li>
<li><a href="#v34_feat_cols">Re-order Columns in Search Results</a></li>
@@ -1363,7 +1363,7 @@
<h3 id="v34_feat_enter">Simple [% terms.Bug %] Filing</h3>
<p>When entering a new [% terms.bug %], the vast majority of fields are
- now hidden by default, which enormously simplifies the bug-filing form.
+ now hidden by default, which enormously simplifies the bug-filing form.
You can click "Show Advanced Fields" to show all the fields, if you want
them. [%+ terms.Bugzilla %] remembers whether you last used the "Advanced"
or "Simple" version of the [% terms.bug %]-entry form, and will display the
@@ -1447,7 +1447,7 @@
<p>Here's an example: Let's say that we create a field called "Colors",
and we make the Product field "control the values" for Colors. Then we
add Blue, Red, Black, and Yellow as legal values for the "Colors" field.
- Now we can say that "Blue" and "Red" only appear as valid choices in
+ Now we can say that "Blue" and "Red" only appear as valid choices in
Product A, "Yellow" only appears in Product B, but "Black" <em>always</em>
appears.</p>
@@ -1463,11 +1463,11 @@
<h3 id="v34_feat_see">"See Also" Field</h3>
-<p>We have added a new standard field called "See Also" to
- [%+ terms.Bugzilla %]. In this field, you can put URLs to multiple
+<p>We have added a new standard field called "See Also" to
+ [%+ terms.Bugzilla %]. In this field, you can put URLs to multiple
[%+ terms.bugs %] in any [% terms.Bugzilla %] installation, to indicate
that those [% terms.bugs %] are related to this one. It also supports
- adding URLs to [% terms.bugs %] in
+ adding URLs to [% terms.bugs %] in
<a href="https://launchpad.net/">Launchpad</a>.</p>
<p>Right now, the field just validates the URLs and then displays them, but
@@ -1502,14 +1502,14 @@
hidden from the attachment list by default. You can show them
by clicking "Show Obsolete" at the bottom of the attachment list.</li>
<li>In the Email Preferences, you can now choose to get email when
- a new [% terms.bug %] report is filed and you have a particular
+ a new [% terms.bug %] report is filed and you have a particular
role on it.</li>
<li>When resolving a mid-air collision, you can now choose to submit
only your comment.</li>
<li>You can now set the Blocks and Depends On field on the "Change
Several [% terms.Bugs %] At Once" page.</li>
<li>If your installation uses the "insidergroup" feature, you can now add
- private comments on the "Change Several [% terms.Bugs %] At Once"
+ private comments on the "Change Several [% terms.Bugs %] At Once"
page.</li>
<li>When viewing a search result, you can now hover over any abbreviated
field to see its full value.</li>
@@ -1536,7 +1536,7 @@
what security groups the [% terms.bug %] has been restricted to.</li>
<li>You can now use any custom drop-down field as an axis for a tabular
or graphical report.</li>
- <li>The <kbd>X-Bugzilla-Type</kbd> header in emails sent by
+ <li>The <kbd>X-Bugzilla-Type</kbd> header in emails sent by
[%+ terms.Bugzilla %] is now "new" for [% terms.bug %]mail sent for
newly-filed [% terms.bugs %], and "changed" for emails having to do
with updated [% terms.bugs %].</li>
@@ -1554,19 +1554,19 @@
<h4>Enhancements for Administrators and Developers</h4>
<ul>
- <li>[% terms.Bugzilla %] now uses the SHA-256 algorithm (a variant of
+ <li>[% terms.Bugzilla %] now uses the SHA-256 algorithm (a variant of
SHA-2) to encrypt passwords in the database, instead of using Unix's
"crypt" function. This allows passwords longer than eight characters
to actually be effective. Each user's password will be converted to
- SHA-256 the first time they log in after you upgrade to
+ SHA-256 the first time they log in after you upgrade to
[%+ terms.Bugzilla %] 3.4 or later.</li>
<li>If you are using database replication with [% terms.Bugzilla %],
- many more scripts now take advantage of the read-only slave (the
+ many more scripts now take advantage of the read-only slave (the
"shadowdb"). It may be safe to open up <kbd>show_bug.cgi</kbd>
to search-engine indexing by editing your <kbd>robots.txt</kbd> file,
now, if your [% terms.Bugzilla %] is on fast-enough hardware.</li>
<li>The database now uses foreign keys to enforce the validity of
- relationships between tables. Not every single table has all its
+ relationships between tables. Not every single table has all its
foreign keys yet, but most do.</li>
<li>Various parameters have been removed, in an effort to de-clutter
the parameter interface and simplify [% terms.Bugzilla %]'s code.
@@ -1574,7 +1574,7 @@
maxpatchsize, commentonclearresolution, commentonreassignbycomponent,
showallproducts. They have all been replaced with sensible default
behaviors. (For example, user watching is now always enabled.)</li>
- <li>When adding <code>&amp;debug=1</code> to the end of a
+ <li>When adding <code>&amp;debug=1</code> to the end of a
<kbd>buglist.cgi</kbd> URL, [% terms.Bugzilla %] will now also do an
EXPLAIN on the query, to help debug performance issues.</li>
<li>When editing flag types in the administrative interface, you can now
@@ -1593,7 +1593,7 @@
and <a href="[% docs_urlbase FILTER html %]api/Bugzilla/WebService/Bugzilla.html#time">B[% %]ugzilla.time</a>
(<kbd>B[% %]ugzilla.timezone</kbd> is now deprecated).
</li>
- <li>For network efficiency, you can now limit which fields are returned
+ <li>For network efficiency, you can now limit which fields are returned
from certain WebService functions, like <kbd>User.get</kbd>.</li>
<li>There is now a "permissive" argument for the <kbd>B[% %]ug.get</kbd>
WebService function, which causes it not to throw an error when you
@@ -1623,19 +1623,19 @@
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
[%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
- by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
- the option to rebuild the cache when it asks. Otherwise keywords may
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
not show up properly in search results.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
- [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
the same time, there is no "mid-air collision" protection.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
- [%- terms.Bug %] 276230</a>: The support for restricting access to
- particular Categories of New Charts is not complete. You should treat
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
the 'chartgroup' Param as the only access mechanism available.<br>
- However, charts migrated from Old Charts will be restricted to
+ However, charts migrated from Old Charts will be restricted to
the groups that are marked MANDATORY for the corresponding Product.
- There is currently no way to change this restriction, and the
+ There is currently no way to change this restriction, and the
groupings will not be updated if the group configuration
for the Product changes.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
@@ -1653,10 +1653,10 @@
you can always delete the database records which contain the bad values by
logging in to your database and running the following command:</p>
-<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
+<p><code>DELETE FROM <var>table</var> WHERE <var>column</var> IN
(<var>1, 2, 3, 4</var>)</code></p>
-<p>Just replace "table" and "column" with the name of the table
+<p>Just replace "table" and "column" with the name of the table
and column that <kbd>checksetup.pl</kbd> mentions, and "1, 2, 3, 4"
with the invalid values that <kbd>checksetup.pl</kbd> prints out.</p>
@@ -1671,7 +1671,7 @@
are any), but moving any unexpected variables into a file called
<kbd>localconfig.old</kbd>. If you want to continue having custom
varibles in <kbd>localconfig</kbd>, you will have to add them to
- the <code>LOCALCONFIG_VARS</code> constant in
+ the <code>LOCALCONFIG_VARS</code> constant in
<kbd>Bugzilla::Install::Localconfig</kbd>.</li>
<li><kbd>Bugzilla::Object-&gt;update()</kbd> now returns something different
in list context than it does in scalar context.</li>
@@ -1682,21 +1682,21 @@
search results are now defined in a subroutine called <code>COLUMNS</code>
in <kbd>Bugzilla::Search</kbd>. The data now mostly comes from the
<kbd>fielddefs</kbd> table in the database. Search.pm now takes a list
- of column names from fielddefs for its <kbd>fields</kbd> argument instead
+ of column names from fielddefs for its <kbd>fields</kbd> argument instead
of literal SQL columns.</li>
<li><kbd>Bugzilla::Field-&gt;legal_values</kbd> now returns an array of
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/Field/Choice.html">Bugzilla::Field::Choice</a>
objects instead of an array of strings. Bugzilla::Field::Choice will be used
in more places, in the future.</li>
- <li>We now use <kbd>Bugzilla::Bug-&gt;check()</kbd> instead of
+ <li>We now use <kbd>Bugzilla::Bug-&gt;check()</kbd> instead of
<kbd>ValidateBugId</kbd>.</li>
- <li>The <kbd>groups</kbd> and <kbd>bless_groups</kbd> methods in
- <kbd>Bugzilla::User</kbd> now return an arrayref of
+ <li>The <kbd>groups</kbd> and <kbd>bless_groups</kbd> methods in
+ <kbd>Bugzilla::User</kbd> now return an arrayref of
<kbd>Bugzilla::Group</kbd> objects instead of a hashref with
group ids and group names.</li>
<li>Standard [% terms.Bugzilla %] drop-down fields now have their type
set to <kbd>FIELD_TYPE_SINGLE_SELECT</kbd> in the fielddefs table.</li>
- <li><kbd>Bugzilla-&gt;usage_mode</kbd> now defaults to
+ <li><kbd>Bugzilla-&gt;usage_mode</kbd> now defaults to
<kbd>USAGE_MODE_CMDLINE</kbd> if we are not running inside a web
server.</li>
<li>We no longer delete environment variables like <kbd>$ENV{PATH}</kbd>
@@ -1725,7 +1725,7 @@
<li><a href="#v32_feat">New Features and Improvements</a></li>
<li><a href="#v32_issues">Outstanding Issues</a></li>
<li><a href="#v32_upgrading">How to Upgrade From An Older Version</a></li>
- <li><a href="#v32_code_changes">Code Changes Which May Affect
+ <li><a href="#v32_code_changes">Code Changes Which May Affect
Customizations</a></li>
<li><a href="#v32_previous">Release Notes for Previous Versions</a></li>
</ul>
@@ -1738,7 +1738,7 @@
<p>If you're upgrading, make sure to read <a href="#v32_upgrading">How to
Upgrade From An Older Version</a>. If you are upgrading from a release
- before 3.0, make sure to read the release notes for all the
+ before 3.0, make sure to read the release notes for all the
<a href="#v32_previous">previous versions</a> in between your version
and this one, <strong>particularly the "Notes For Upgraders" section of each
version's release notes</strong>.</p>
@@ -1749,7 +1749,7 @@
releases of [% terms.Bugzilla %] after 3.2. We only list the
most important fixes in each release. If you want a detailed list of
<em>everything</em> that's changed in each version, you should use our
- <a href="https://www.bugzilla.org/status/changes.html">Change Log
+ <a href="https://www.bugzilla.org/status/changes.html">Change Log
Page</a>.</p>
<h3>3.2.3</h3>
@@ -1758,7 +1758,7 @@
<li>[% terms.Bugzilla %] is now compatible with MySQL 5.1.x versions 5.1.31
and greater.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=480001">[% terms.Bug %] 480001</a>)</li>
- <li>On Windows, [% terms.Bugzilla %] sometimes would send mangled emails
+ <li>On Windows, [% terms.Bugzilla %] sometimes would send mangled emails
(that would often fail to send).
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467920">[% terms.Bug %] 467920</a>)</li>
<li><code>recode.pl</code> would sometimes crash when trying to convert
@@ -1771,7 +1771,7 @@
again (the [% terms.bug %] XML format now contains a "token" element that
can be used when updating [% terms.abug %]).
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=476678">[% terms.Bug %] 476678</a>)</li>
- <li>For installations using the <code>shadowdb</code> parameter,
+ <li>For installations using the <code>shadowdb</code> parameter,
[%+ terms.Bugzilla %] was accidentally writing to the "tokens" table
in the shadow database (instead of the master database) when using the
"Change Several [% terms.Bugs %] at Once" page.
@@ -1784,7 +1784,7 @@
<h3>3.2.2</h3>
<p>This release fixes one security issue that is critical for installations
- running 3.2.1 under mod_perl. See the
+ running 3.2.1 under mod_perl. See the
<a href="https://www.bugzilla.org/security/3.0.7/">Security Advisory</a>
for details.</p>
@@ -1808,12 +1808,12 @@
<li>If you were using the <code>PROJECT</code> environment variable
to have multiple [% terms.Bugzilla %] installations using one codebase,
- project-specific templates were being ignored.
+ project-specific templates were being ignored.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=467324">[% terms.Bug %] 467324</a>)</li>
<li>Some versions of the SOAP::Lite Perl module had a b[% %]ug that caused
- [%+ terms.Bugzilla %]'s XML-RPC service to break.
- <kbd>checksetup.pl</kbd> now checks for these bad versions and
+ [%+ terms.Bugzilla %]'s XML-RPC service to break.
+ <kbd>checksetup.pl</kbd> now checks for these bad versions and
will reject them.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=468009">[% terms.Bug %] 468009</a>)</li>
@@ -1833,15 +1833,15 @@
<h3>3.2.2</h3>
<p>This release fixes one security issue that is critical for installations
- running 3.2.1 under mod_perl. See the
- <a href="https://www.bugzilla.org/security/3.0.7/">Security Advisory</a>
+ running 3.2.1 under mod_perl. See the
+ <a href="https://www.bugzilla.org/security/3.0.7/">Security Advisory</a>
for details.</p>
<h3>3.2.1</h3>
<p>This release contains several security fixes. One fix may break any
automated scripts you have that are loading <kbd>process_bug.cgi</kbd>
- directly. We recommend that you read the entire
+ directly. We recommend that you read the entire
<a href="https://www.bugzilla.org/security/2.22.6/">Security Advisory</a>
for this release.</p>
@@ -1891,7 +1891,7 @@
<table class="req_table" border="0" cellpadding="0" cellspacing="0">
<tr> <th>Module</th> <th>Version</th> </tr>
-<tr> <td>CGI</td> <td class="req_new">3.21 (on Perl 5.8.x)
+<tr> <td>CGI</td> <td class="req_new">3.21 (on Perl 5.8.x)
or 3.33 (on Perl 5.10.x)</td> </tr>
<tr> <td>Date::Format</td> <td>2.21</td> </tr>
<tr> <td>File::Spec</td> <td>0.84</td> </tr>
@@ -1899,12 +1899,12 @@
<tr> <td>Template</td> <td class="req_new">2.15</td> </tr>
<tr> <td>Email::Send</td> <td>2.00</td> </tr>
<tr> <td>Email::MIME</td> <td class="req_new">1.861</td> </tr>
-<tr>
- <td class="req_new">Email::MIME::Encodings</td>
+<tr>
+ <td class="req_new">Email::MIME::Encodings</td>
<td class="req_new">1.313</td>
</tr>
<tr>
- <td>Email::MIME::Modifier</td>
+ <td>Email::MIME::Modifier</td>
<td class="req_new">1.442</td>
</tr>
</table>
@@ -1915,7 +1915,7 @@
features of [% terms.Bugzilla %]:</p>
<table class="req_table" border="0" cellpadding="0" cellspacing="0">
-<tr>
+<tr>
<th>Module</th>
<th>Version</th>
<th>Enables Feature</th>
@@ -1926,93 +1926,93 @@
<td>Automatic Update Notifications</td>
</tr>
<tr>
- <td>Template::Plugin::GD::Image</td>
- <td>(Any)</td>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD::Text</td>
- <td>(Any)</td>
+ <td>GD::Text</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD::Graph</td>
- <td>(Any)</td>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD</td>
- <td>1.20</td>
+ <td>GD</td>
+ <td>1.20</td>
<td>Graphical Reports, New Charts, Old Charts</td>
</tr>
<tr>
- <td>Email::MIME::Attachment::Stripper</td>
- <td>(Any)</td>
+ <td>Email::MIME::Attachment::Stripper</td>
+ <td>(Any)</td>
<td>Inbound Email</td>
</tr>
<tr>
- <td>Email::Reply</td>
- <td>(Any)</td>
+ <td>Email::Reply</td>
+ <td>(Any)</td>
<td>Inbound Email</td>
</tr>
<tr>
- <td>Net::LDAP</td>
- <td>(Any)</td>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
<td>LDAP Authentication</td>
</tr>
<tr>
- <td>HTML::Parser</td>
- <td>3.40</td>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
<td>More HTML in Product/Group Descriptions</td>
</tr>
<tr>
- <td>HTML::Scrubber</td>
- <td>(Any)</td>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
<td>More HTML in Product/Group Descriptions</td>
</tr>
<tr>
- <td>XML::Twig</td>
- <td>(Any)</td>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
<td>Move [% terms.Bugs %] Between Installations</td>
</tr>
<tr>
- <td>MIME::Parser</td>
- <td>5.406</td>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
<td>Move [% terms.Bugs %] Between Installations</td>
</tr>
<tr>
- <td>Chart::Base</td>
- <td>1.0</td>
+ <td>Chart::Base</td>
+ <td>1.0</td>
<td>New Charts, Old Charts</td>
</tr>
<tr>
- <td>Image::Magick</td>
- <td>(Any)</td>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
<td>Optionally Convert BMP Attachments to PNGs</td>
</tr>
<tr>
- <td>PatchReader</td>
- <td>0.9.4</td>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
<td>Patch Viewer</td>
</tr>
<tr>
- <td class="req_new">Authen::Radius</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">Authen::Radius</td>
+ <td class="req_new">(Any)</td>
<td>RADIUS Authentication</td>
</tr>
<tr>
- <td class="req_new">Authen::SASL</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">Authen::SASL</td>
+ <td class="req_new">(Any)</td>
<td>SMTP Authentication</td>
</tr>
<tr>
- <td>SOAP::Lite</td>
- <td>(Any)</td>
+ <td>SOAP::Lite</td>
+ <td>(Any)</td>
<td>XML-RPC Interface</td>
</tr>
<tr>
- <td>mod_perl2</td>
- <td>1.999022</td>
+ <td>mod_perl2</td>
+ <td>1.999022</td>
<td>mod_perl</td>
</tr>
</table>
@@ -2034,7 +2034,7 @@
<h3 id="v32_feat_ui">Major UI Improvements</h3>
<p>[% terms.Bugzilla %] 3.2 has had some UI assistance from the NASA
- Human-Computer Interaction department and the new
+ Human-Computer Interaction department and the new
<a href="https://wiki.mozilla.org/Bugzilla:UE">[% terms.Bugzilla %]
User Interface Team</a>.</p>
@@ -2046,7 +2046,7 @@
<p>[% terms.Bugzilla %] 3.2 now ships with a skin called "Dusk" that is
a bit more colorful than old default "Classic" skin.</p>
-<p>Upgrading installations will still default to the "Classic"
+<p>Upgrading installations will still default to the "Classic"
skin--administrators can change the default in the Default Preferences
control panel. Users can also choose to use the old skin in their
Preferences (or using the View :: Page Style menu in Firefox).</p>
@@ -2078,7 +2078,7 @@
<h3 id="v32_feat_install">Easier Installation</h3>
-<p>[% terms.Bugzilla %] now comes with a script called
+<p>[% terms.Bugzilla %] now comes with a script called
<kbd>install-module.pl</kbd> that can automatically download
and install all of the required Perl modules for [% terms.Bugzilla %].
It stores them in a directory inside your [% terms.Bugzilla %]
@@ -2091,8 +2091,8 @@
<h3 id="v32_feat_oracle">Experimental Oracle Support</h3>
-<p>[% terms.Bugzilla %] 3.2 contains experimental support for using
- Oracle as its database. Some features of [% terms.Bugzilla %] are known
+<p>[% terms.Bugzilla %] 3.2 contains experimental support for using
+ Oracle as its database. Some features of [% terms.Bugzilla %] are known
to be broken on Oracle, but hopefully will be working by our next major
release.</p>
@@ -2102,7 +2102,7 @@
you to use [% terms.Bugzilla %]!</p>
<p>The [% terms.Bugzilla %] Project thanks Oracle Corp. for their extensive
- development contributions to [% terms.Bugzilla %] which allowed this to
+ development contributions to [% terms.Bugzilla %] which allowed this to
happen!</p>
<h3 id="v32_feat_utf8">Improved UTF-8 Support</h3>
@@ -2118,7 +2118,7 @@
<p>Administrators can now specify that users who are in certain groups
should have an icon appear next to their name whenever they comment.
- This is particularly useful for distinguishing developers from
+ This is particularly useful for distinguishing developers from
[%+ terms.bug %] reporters.</p>
<h3 id="v32_feat_other">Other Enhancements and Changes</h3>
@@ -2131,35 +2131,35 @@
<ul>
<li><strong>[% terms.Bugs %]</strong>: You can now reassign
[%+ terms.abug %] at the same time as you are changing its status.</li>
- <li><strong>[% terms.Bugs %]</strong>: When entering [% terms.abug %],
+ <li><strong>[% terms.Bugs %]</strong>: When entering [% terms.abug %],
you will now see the description of a component when you select it.</li>
- <li><strong>[% terms.Bugs %]</strong>: The [% terms.bug %] view now
+ <li><strong>[% terms.Bugs %]</strong>: The [% terms.bug %] view now
contains some <a href="http://microformats.org/about/">Microformats</a>,
most notably for users' names and email addresses.</li>
<li><strong>[% terms.Bugs %]</strong>: You can now remove a QA Contact
from [% terms.abug %] simply by clearing the QA Contact field.</li>
- <li><strong>[% terms.Bugs %]</strong>: There is now a user preference
- that will allow you to exclude the quoted text when replying
+ <li><strong>[% terms.Bugs %]</strong>: There is now a user preference
+ that will allow you to exclude the quoted text when replying
to comments.</li>
<li><strong>[% terms.Bugs %]</strong>: You can now expand or collapse
individual comments in the [% terms.bug %] view.</li>
- <li><strong>Attachments</strong>: There is now "mid-air collision"
+ <li><strong>Attachments</strong>: There is now "mid-air collision"
protection when editing attachments.</li>
- <li><strong>Attachments</strong>: Patches in the Diff Viewer now show
+ <li><strong>Attachments</strong>: Patches in the Diff Viewer now show
line numbers (<a href="https://bugzilla.mozilla.org/attachment.cgi?id=327546">Example</a>).</li>
<li><strong>Attachments</strong>: After creating or updating an attachment,
you will be immediately shown the [% terms.bug %] that the attachment
is on.</li>
- <li><strong>Search</strong>: You can now reverse the sort of
+ <li><strong>Search</strong>: You can now reverse the sort of
[%+ terms.abug %] list by clicking on a column header again.</li>
<li><strong>Search</strong>: Atom feeds of [% terms.bug %] lists now
contain more fields.</li>
<li><strong>Search</strong>: QuickSearch now supports searching flags
and groups. It also now includes the OS field in the list of fields
it searches by default.</li>
- <li><strong>Search</strong>: "Help" text can now appear on query.cgi
+ <li><strong>Search</strong>: "Help" text can now appear on query.cgi
for Internet Explorer and other non-Firefox browsers. (It always
could appear for Firefox.)</li>
@@ -2167,19 +2167,19 @@
up next to the URL in most browsers. If you want to replace it,
it's in <kbd>images/favicon.ico</kbd>.</li>
- <li>You can now set the Deadline when using "Change Several
+ <li>You can now set the Deadline when using "Change Several
[%+ terms.Bugs %] At Once"</li>
- <li><strong>Saved Searches</strong> now save their column list, so if
- you customize the list of columns and save your search, it will
+ <li><strong>Saved Searches</strong> now save their column list, so if
+ you customize the list of columns and save your search, it will
always contain those columns.</li>
<li><strong>Saved Searches</strong>: When you share a search, you can
- now see how many users have subscribed to it, on
+ now see how many users have subscribed to it, on
<kbd>userprefs.cgi</kbd>.</li>
- <li><strong>Saved Searches</strong>: You can now see what group a
+ <li><strong>Saved Searches</strong>: You can now see what group a
shared search was shared to, on the list of available shared searches
in <kbd>userprefs.cgi</kbd>.</li>
- <li><strong>Flags</strong>: If your installation uses drop-down user
- lists, the flag requestee box will now contain only users who are
+ <li><strong>Flags</strong>: If your installation uses drop-down user
+ lists, the flag requestee box will now contain only users who are
actually allowed to take requests.</li>
<li><strong>Flags</strong>: If somebody makes a request to you, and you
change the requestee to somebody else, the requester is no longer set
@@ -2190,7 +2190,7 @@
<li>When using <kbd>email_in.pl</kbd>, you can now add users to the CC
list by just using <kbd>@cc</kbd> as the field name.</li>
<li>Many pages (particularly administrative pages) now contain links to
- the relevant section of the [% terms.Bugzilla %] Guide, so you can read
+ the relevant section of the [% terms.Bugzilla %] Guide, so you can read
the documentation for that page.</li>
<li>Dependency Graphs should render more quickly, as they now (by default)
only include the same [% terms.bugs %] that you'd see in the dependency
@@ -2200,39 +2200,39 @@
<h4>Enhancements For Administrators</h4>
<ul>
- <li><strong>Admin UI</strong>: Instead of having the Administration
- Control Panel links in the footer, there is now just one link called
+ <li><strong>Admin UI</strong>: Instead of having the Administration
+ Control Panel links in the footer, there is now just one link called
"Administration" that takes you to a page that links to all the
administrative controls for [% terms.Bugzilla %].</li>
<li><strong>Admin UI</strong>: Administrative pages no longer display
- confirmation pages, instead they redirect you to some useful page
+ confirmation pages, instead they redirect you to some useful page
and display a message about what changed.</li>
- <li><strong>Admin UI</strong>: The interface for editing group
+ <li><strong>Admin UI</strong>: The interface for editing group
inheritance in <kbd>editgroups.cgi</kbd> is much clearer now.</li>
- <li><strong>Admin UI</strong>: When editing a user, you can now see
+ <li><strong>Admin UI</strong>: When editing a user, you can now see
all the components where that user is the Default Assignee or Default
QA Contact.</li>
- <li><strong>Email</strong>: For installations that use SMTP to send
+ <li><strong>Email</strong>: For installations that use SMTP to send
mail (as opposed to Sendmail), [%+ terms.Bugzilla %] now supports
- SMTP Authentication, so that it can log in to your mail server
+ SMTP Authentication, so that it can log in to your mail server
before sending messages.</li>
<li><strong>Email</strong>: Using the "Test" mail delivery method now
creates a valid mbox file to make testing easier.</li>
- <li><strong>Authentication</strong>: [% terms.Bugzilla %] now correctly
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] now correctly
handles LDAP records which contain multiple email addresses. (The first
- email address in the list that is a valid [% terms.Bugzilla %] account
- will be used, or if this is a new user, the first email address in
+ email address in the list that is a valid [% terms.Bugzilla %] account
+ will be used, or if this is a new user, the first email address in
the list will be used.)</li>
- <li><strong>Authentication</strong>: [% terms.Bugzilla %] can now take
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] can now take
a list of LDAP servers to try in order until it gets a successful
connection.</li>
- <li><strong>Authentication</strong>: [% terms.Bugzilla %] now supports
+ <li><strong>Authentication</strong>: [% terms.Bugzilla %] now supports
RADIUS authentication.</li>
- <li><strong>Security</strong>: The login cookie is now created as
- "HTTPOnly" so that it can't be read by possibly malicious scripts.
+ <li><strong>Security</strong>: The login cookie is now created as
+ "HTTPOnly" so that it can't be read by possibly malicious scripts.
Also, if SSL is enabled on your installation, the login cookie is
now only sent over SSL connections.</li>
<li><strong>Security</strong>: The <code>ssl</code> parameter now protects
@@ -2240,12 +2240,12 @@
Also, SSL is now enforced appropriately in the WebServices interface when
the parameter is set.</li>
- <li><strong>Database</strong>: [% terms.Bugzilla %] now uses transactions in
+ <li><strong>Database</strong>: [% terms.Bugzilla %] now uses transactions in
the database instead of table locks. This should generally improve
performance with many concurrent users. It also means if there is
an unexpected error in the middle of a page, all database changes made
during that page will be rolled back.</li>
- <li><strong>Database</strong>: You no longer have to set
+ <li><strong>Database</strong>: You no longer have to set
<code>max_packet_size</code> in MySQL to add large attachments. However,
you may need to set it manually if you restore a mysqldump into your
database.</li>
@@ -2256,7 +2256,7 @@
<li>You can now delete custom fields, but only if they have never been
set on any [% terms.bug %].</li>
- <li>There is now a <kbd>--reset-password</kbd> argument to
+ <li>There is now a <kbd>--reset-password</kbd> argument to
<kbd>checksetup.pl</kbd> that allows you to reset a user's password
from the command line.</li>
<li>There is now a script called <kbd>sanitycheck.pl</kbd> that you can
@@ -2280,7 +2280,7 @@
<li>The voting system is off by default in new installs. This is to
prepare for the fact that it will be moved into an extension at
some point in the future.</li>
- <li>The <code>shutdownhtml</code> parameter now works even when
+ <li>The <code>shutdownhtml</code> parameter now works even when
[%+ terms.Bugzilla %]'s database server is down.</li>
</ul>
@@ -2307,19 +2307,19 @@
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
[%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
- by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
- the option to rebuild the cache when it asks. Otherwise keywords may
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
not show up properly in search results.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
- [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
the same time, there is no "mid-air collision" protection.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
- [%- terms.Bug %] 276230</a>: The support for restricting access to
- particular Categories of New Charts is not complete. You should treat
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
the 'chartgroup' Param as the only access mechanism available.<br>
- However, charts migrated from Old Charts will be restricted to
+ However, charts migrated from Old Charts will be restricted to
the groups that are marked MANDATORY for the corresponding Product.
- There is currently no way to change this restriction, and the
+ There is currently no way to change this restriction, and the
groupings will not be updated if the group configuration
for the Product changes.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
@@ -2332,7 +2332,7 @@
<h3 id="v32_upgrading_notes">Notes For Upgraders</h3>
<ul>
- <li>If you upgrade by CVS, the <kbd>extensions</kbd> and
+ <li>If you upgrade by CVS, the <kbd>extensions</kbd> and
<kbd>skins/contrib</kbd> directories are now in CVS instead of
being created by <kbd>checksetup.pl</kbd> If you do a <kbd>cvs update</kbd>
from 3.0, you will be told that your directories are "in the way" and
@@ -2347,9 +2347,9 @@
the upgrade will not be able to complete (and <kbd>checksetup.pl</kbd>
will tell you so).</li>
- <li><strong>You should also read the
+ <li><strong>You should also read the
<a href="#v30_upgrading_notes">[% terms.Bugzilla %] 3.0 Notes For Upgraders
- section</a> of the
+ section</a> of the
<a href="#v32_previous">previous release notes</a> if you are upgrading
from a version before 3.0.</strong></li>
</ul>
@@ -2357,7 +2357,7 @@
<h3>Steps For Upgrading</h3>
<p>Once you have read the notes above, see the
- <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
+ <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
documentation</a> for instructions on how to upgrade.</p>
<h2 id="v32_code_changes">Code Changes Which May Affect Customizations</h2>
@@ -2411,7 +2411,7 @@
<li><a href="#v30_issues">Outstanding Issues</a></li>
<li><a href="#v30_security">Security Fixes In This Release</a></li>
<li><a href="#v30_upgrading">How to Upgrade From An Older Version</a></li>
- <li><a href="#v30_code_changes">Code Changes Which May Affect
+ <li><a href="#v30_code_changes">Code Changes Which May Affect
Customizations</a></li>
<li><a href="#v30_previous">Release Notes for Previous Versions</a></li>
</ul>
@@ -2426,8 +2426,8 @@
<p>If you're upgrading, make sure to read <a href="#v30_upgrading">How to
Upgrade From An Older Version</a>. If you are upgrading from a release
- before 2.22, make sure to read the release notes for all the
- <a href="#v30_previous">previous versions</a> in between your version
+ before 2.22, make sure to read the release notes for all the
+ <a href="#v30_previous">previous versions</a> in between your version
and this one.</p>
<h2 id="v30_point">Updates in this 3.0.x Release</h2>
@@ -2462,9 +2462,9 @@
closing its connections to the database since 3.0.3, and so sometimes
the DB would run out of connections.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441592">[% terms.Bug %] 441592</a>)</li>
- <li>The installation script is now clear about exactly which
+ <li>The installation script is now clear about exactly which
<code>Email::</code> modules are required in Perl, thus avoiding the
- problem where emails show up with a body like
+ problem where emails show up with a body like
<samp>SCALAR(0xBF126795)</samp>.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=441541">[% terms.Bug %] 441541</a>)</li>
<li><a href="[% docs_urlbase FILTER html %]api/email_in.html">email_in.pl</a>
@@ -2493,7 +2493,7 @@
<li>Better threading of [% terms.bug %]mail in some email clients.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=376453">[% terms.Bug %] 376453</a>)</li>
- <li>There were many fixes to the Inbound Email Interface
+ <li>There were many fixes to the Inbound Email Interface
(<kbd>email_in.pl</kbd>).
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=92274">[% terms.Bug %] 92274</a>,
<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=377025">[% terms.Bug %] 377025</a>,
@@ -2528,14 +2528,14 @@
<ul>
<li>mod_perl no longer compiles [% terms.Bugzilla %]'s code for each Apache
process individually. It now compiles code only once and shares it among
- each Apache process. This greatly improves performance and highly
+ each Apache process. This greatly improves performance and highly
decreases the memory footprint.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=398241">[% terms.Bug %] 398241</a>)</li>
<li>You can now search for '---' (without quotes) in versions and milestones.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=362436">[% terms.Bug %] 362436</a>)</li>
- <li>[% terms.Bugzilla %] should no longer break lines unnecessarily in
+ <li>[% terms.Bugzilla %] should no longer break lines unnecessarily in
email subjects. This was causing trouble with some email clients.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=374424">[% terms.Bug %] 374424</a>)</li>
@@ -2545,7 +2545,7 @@
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=394796">[% terms.Bug %] 394796</a>)</li>
<li>Deleting a user account no longer deletes whines from another user who
- has the deleted account as addressee. The schedule is simply removed,
+ has the deleted account as addressee. The schedule is simply removed,
but the whine itself is left intact.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=395924">[% terms.Bug %] 395924</a>)</li>
@@ -2553,7 +2553,7 @@
fields when merging two user accounts.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=400160">[% terms.Bug %] 400160</a>)</li>
- <li>[% terms.Bugzilla %] no longer requires Apache::DBI to run under
+ <li>[% terms.Bugzilla %] no longer requires Apache::DBI to run under
mod_perl. It caused troubles such as lost connections with the DB and
didn't give any important performance gain.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=408766">[% terms.Bug %] 408766</a>)</li>
@@ -2587,7 +2587,7 @@
<code>specific_search_allow_empty_words</code>.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=385910">[% terms.Bug %] 385910</a>)</li>
<li>If you attach a file that has a MIME-type of <code>text/x-patch</code>
- or <code>text/x-diff</code>, it will automatically be treated as a
+ or <code>text/x-diff</code>, it will automatically be treated as a
patch by [% terms.Bugzilla %].
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365756">[% terms.Bug %] 365756</a>)</li>
<li>Dependency Graphs now work correctly on all mod_perl installations.
@@ -2608,19 +2608,19 @@
<li>PostgreSQL users: New Charts were failing to collect data over time.
They will now start collecting data correctly.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=257351">[% terms.Bug %] 257351</a>)</li>
- <li>Some flag mails didn't specify who the requestee was.
+ <li>Some flag mails didn't specify who the requestee was.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=379787">[% terms.Bug %] 379787</a>)</li>
<li>Instead of throwing real errors, <kbd>collectstats.pl</kbd> would
just say that it couldn't find <code>ThrowUserError</code>.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=380709">[% terms.Bug %] 380709</a>)</li>
<li>Logging into [% terms.Bugzilla %] from the home page works again
- with IIS5.
+ with IIS5.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=364008">[% terms.Bug %] 364008</a>)</li>
<li>If you were using SMTP for sending email, sometimes emails would
be missing the <code>Date</code> header.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=304999">[% terms.Bug %] 304999</a>).</li>
<li>In the XML-RPC WebService, <code>B<!-- -->ug.legal_values</code> now
- correctly returns values for custom fields if you request values
+ correctly returns values for custom fields if you request values
for custom fields.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=381737">[% terms.Bug %] 381737</a>)</li>
<li>The "[% terms.Bug %]-Writing Guidelines" page has been shortened
@@ -2634,7 +2634,7 @@
every SMTP session to your web server's error log, to help with
debugging issues with SMTP.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=384497">[% terms.Bug %] 384497</a>)</li>
- <li>If you are a "global watcher" (you get all mails from every
+ <li>If you are a "global watcher" (you get all mails from every
[%+ terms.bug %]), you can now see that in your Email Preferences.
(<a href="https://bugzilla.mozilla.org/show_bug.cgi?id=365302">[% terms.Bug %] 365302</a>)</li>
<li>The Status and Resolution of [% terms.bugs %] are now correctly
@@ -2666,7 +2666,7 @@
<h3 id="v30_req_perl">Perl</h3>
<ul>
- <li>Perl <span class="req_new">v<strong>5.8.0</strong></span> (non-Windows
+ <li>Perl <span class="req_new">v<strong>5.8.0</strong></span> (non-Windows
platforms)</li>
<li>Perl v<strong>5.8.1</strong> (Windows platforms)</li>
</ul>
@@ -2697,7 +2697,7 @@
<td>Date::Format</td> <td>2.21</td>
</tr>
<tr>
- <td>DBI</td>
+ <td>DBI</td>
<td class="req_new">1.41</td>
</tr>
<tr>
@@ -2707,15 +2707,15 @@
<td>Template</td> <td>2.12</td>
</tr>
<tr>
- <td class="req_new">Email::Send</td>
+ <td class="req_new">Email::Send</td>
<td class="req_new">2.00</td>
</tr>
<tr>
- <td>Email::MIME</td>
+ <td>Email::MIME</td>
<td>1.861</td>
</tr>
<tr>
- <td class="req_new">Email::MIME::Modifier</td>
+ <td class="req_new">Email::MIME::Modifier</td>
<td class="req_new">1.442</td>
</tr>
</table>
@@ -2731,93 +2731,93 @@
<th>Enables Feature</th>
</tr>
<tr>
- <td class="req_new">LWP::UserAgent</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">LWP::UserAgent</td>
+ <td class="req_new">(Any)</td>
<td>Automatic Update Notifications</td>
</tr>
<tr>
- <td>Template::Plugin::GD::Image</td>
- <td>(Any)</td>
+ <td>Template::Plugin::GD::Image</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD::Graph</td>
- <td>(Any)</td>
+ <td>GD::Graph</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD::Text</td>
- <td>(Any)</td>
+ <td>GD::Text</td>
+ <td>(Any)</td>
<td>Graphical Reports</td>
</tr>
<tr>
- <td>GD</td>
- <td>1.20</td>
+ <td>GD</td>
+ <td>1.20</td>
<td>Graphical Reports, New Charts, Old Charts</td>
</tr>
<tr>
- <td class="req_new">Email::MIME::Attachment::Stripper</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">Email::MIME::Attachment::Stripper</td>
+ <td class="req_new">(Any)</td>
<td>Inbound Email</td>
</tr>
<tr>
- <td class="req_new">Email::Reply</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">Email::Reply</td>
+ <td class="req_new">(Any)</td>
<td>Inbound Email</td>
</tr>
<tr>
- <td>Net::LDAP</td>
- <td>(Any)</td>
+ <td>Net::LDAP</td>
+ <td>(Any)</td>
<td>LDAP Authentication</td>
</tr>
<tr>
- <td>HTML::Parser</td>
- <td>3.40</td>
+ <td>HTML::Parser</td>
+ <td>3.40</td>
<td>More HTML in Product/Group Descriptions</td>
</tr>
<tr>
- <td>HTML::Scrubber</td>
- <td>(Any)</td>
+ <td>HTML::Scrubber</td>
+ <td>(Any)</td>
<td>More HTML in Product/Group Descriptions</td>
</tr>
<tr>
- <td>XML::Twig</td>
- <td>(Any)</td>
+ <td>XML::Twig</td>
+ <td>(Any)</td>
<td>Move [% terms.Bugs %] Between Installations</td>
</tr>
<tr>
- <td>MIME::Parser</td>
- <td>5.406</td>
+ <td>MIME::Parser</td>
+ <td>5.406</td>
<td>Move [% terms.Bugs %] Between Installations</td>
</tr>
<tr>
- <td>Chart::Base</td>
- <td>1.0</td>
+ <td>Chart::Base</td>
+ <td>1.0</td>
<td>New Charts, Old Charts</td>
</tr>
<tr>
- <td>Image::Magick</td>
- <td>(Any)</td>
+ <td>Image::Magick</td>
+ <td>(Any)</td>
<td>Optionally Convert BMP Attachments to PNGs</td>
</tr>
<tr>
- <td>PatchReader</td>
- <td>0.9.4</td>
+ <td>PatchReader</td>
+ <td>0.9.4</td>
<td>Patch Viewer</td>
</tr>
<tr>
- <td class="req_new">SOAP::Lite</td>
- <td class="req_new">(Any)</td>
+ <td class="req_new">SOAP::Lite</td>
+ <td class="req_new">(Any)</td>
<td>XML-RPC Interface</td>
</tr>
<tr>
- <td class="req_new">mod_perl2</td>
- <td class="req_new">1.999022</td>
+ <td class="req_new">mod_perl2</td>
+ <td class="req_new">1.999022</td>
<td>mod_perl</td>
</tr>
<tr>
- <td> CGI</td>
- <td>3.11</td>
+ <td> CGI</td>
+ <td>3.11</td>
<td>mod_perl</td>
</tr>
</table>
@@ -2836,13 +2836,13 @@
<li><a href="#v30_feat_ui">User Interface Improvements</a></li>
<li><a href="#v30_feat_xml">XML-RPC Interface</a></li>
<li><a href="#v30_feat_skin">Skins</a></li>
- <li><a href="#v30_feat_sbu">Unchangeable Fields Appear
+ <li><a href="#v30_feat_sbu">Unchangeable Fields Appear
Unchangeable</a></li>
<li><a href="#v30_feat_et">All Emails in Templates</a></li>
<li><a href="#v30_feat_df">No More Double-Filed [% terms.Bugs %]</a></li>
<li><a href="#v30_feat_cc">Default CC List for Components</a></li>
<li><a href="#v30_feat_emi">File/Modify [% terms.Bugs %] By Email</a></li>
- <li><a href="#v30_feat_gw">Users Who Get All [% terms.Bug %]
+ <li><a href="#v30_feat_gw">Users Who Get All [% terms.Bug %]
Notifications</a></li>
<li><a href="#v30_feat_utf8">Improved UTF-8 Support</a></li>
<li><a href="#v30_feat_upda">Automatic Update Notification</a></li>
@@ -2881,7 +2881,7 @@
<h3 id="v30_feat_sq">Shared Saved Searches</h3>
<p>Users can now choose to &quot;share&quot; their saved searches
- with a certain group. That group will then be able to
+ with a certain group. That group will then be able to
&quot;subscribe&quot; to those searches, and have them appear
in their footer.</p>
@@ -2892,7 +2892,7 @@
unsubscribe from any particular search, if they want.)</p>
<p>In order to allow a user to share their queries, they also
- have to be a member of the group specified in the
+ have to be a member of the group specified in the
<code>querysharegroup</code> parameter.</p>
<p>Users can control their shared and subscribed queries from
@@ -2900,7 +2900,7 @@
<h3 id="v30_feat_afn">Attachments and Flags on New [% terms.Bugs %]</h3>
-<p>You can now add an attachment while you are filing a new
+<p>You can now add an attachment while you are filing a new
[%+ terms.bug %].</p>
<p>You can also set flags on the [% terms.bug %] and on attachments, while
@@ -2931,9 +2931,9 @@
<ul>
<li>There is now navigation and a search box a the <em>top</em> of
each page, in addition to the bar at the bottom of the page.</li>
- <li>A re-designed &quot;Format for Printing&quot; page for
+ <li>A re-designed &quot;Format for Printing&quot; page for
[%+ terms.bugs %].</li>
- <li>The layout of <kbd>show_bug.cgi</kbd> (the [% terms.bug %] editing
+ <li>The layout of <kbd>show_bug.cgi</kbd> (the [% terms.bug %] editing
page) has been changed, and the attachment table has been redesigned.</li>
</ul>
@@ -2943,8 +2943,8 @@
protocol. It can be accessed by external applications by going
to the <kbd>xmlrpc.cgi</kbd> on your installation.</p>
-<p>Documentation can be found in the
- <a href="[% docs_urlbase FILTER html %]api/">[% terms.Bugzilla %]
+<p>Documentation can be found in the
+ <a href="[% docs_urlbase FILTER html %]api/">[% terms.Bugzilla %]
API Docs</a>, in the various <kbd>Bugzilla::WebService</kbd> modules.</p>
<h3 id="v30_feat_skin">Skins</h3>
@@ -2960,8 +2960,8 @@
<h3 id="v30_feat_sbu">Unchangeable Fields Appear Unchangeable</h3>
-<p>As long as you are logged in, when viewing [% terms.abug %], if you
- cannot change a field, it will not look like you can change it. That
+<p>As long as you are logged in, when viewing [% terms.abug %], if you
+ cannot change a field, it will not look like you can change it. That
is, the value will just appear as plain text.</p>
<h3 id="v30_feat_et">All Emails in Templates</h3>
@@ -2981,14 +2981,14 @@
<h3 id="v30_feat_df">No More Double-Filed [% terms.Bugs %]</h3>
-<p>Users of [% terms.Bugzilla %] will sometimes accidentally submit
- [%+ terms.abug %] twice, either by going back in their web browser,
- or just by refreshing a page. In the past, this could file the same
- [%+ terms.bug %] twice (or even three times) in a row, irritating
+<p>Users of [% terms.Bugzilla %] will sometimes accidentally submit
+ [%+ terms.abug %] twice, either by going back in their web browser,
+ or just by refreshing a page. In the past, this could file the same
+ [%+ terms.bug %] twice (or even three times) in a row, irritating
developers and confusing users.</p>
-<p>Now, if you try to submit [% terms.abug %] twice from the same screen
- (by going back or by refreshing the page), [% terms.Bugzilla %] will warn
+<p>Now, if you try to submit [% terms.abug %] twice from the same screen
+ (by going back or by refreshing the page), [% terms.Bugzilla %] will warn
you about what you're doing, before it actually submits the duplicate
[%+ terms.bug %].</p>
@@ -3030,7 +3030,7 @@
when you log in if there is a new release of [% terms.Bugzilla %]
available to download.</p>
-<p>You can control these notifications by changing the
+<p>You can control these notifications by changing the
<kbd>upgrade_notification</kbd> parameter.</p>
<p>If your [% terms.Bugzilla %] installation is on a machine that needs to go
@@ -3047,7 +3047,7 @@
<p>Firefox 2 users and Internet Explorer 7 users will be presented
with the option to add [% terms.Bugzilla %] to their search bar.
- This uses the
+ This uses the
<a href="page.cgi?id=quicksearch.html">QuickSearch syntax</a>.</p>
<h3 id="v30_feat_other">Other Enhancements and Changes</h3>
@@ -3061,48 +3061,48 @@
<li>In comments, quoted text (lines that start with <kbd>&gt;</kbd>)
will be a different color from normal text.</li>
<li>There is now a user preference that will add you to the CC list
- of any [% terms.bug %] you modify. Note that it's <strong>on</strong>
+ of any [% terms.bug %] you modify. Note that it's <strong>on</strong>
by default.</li>
- <li>[% terms.Bugs %] can now be filed with an initial state of
+ <li>[% terms.Bugs %] can now be filed with an initial state of
<kbd>ASSIGNED</kbd>, if you are in the <kbd>editbugs</kbd> group.</li>
<li>By default, comment fields will zoom large when you are typing in them,
and become small when you move out of them. You can disable this
in your user preferences.</li>
<li>You can hide obsolete attachments on [% terms.abug %] by clicking
&quot;Hide Obsolete&quot; at the bottom of the attachment table.</li>
- <li>If [% terms.abug %] has flags set, and you move it to a different
- product that has flags with the same name, the flags will be
+ <li>If [% terms.abug %] has flags set, and you move it to a different
+ product that has flags with the same name, the flags will be
preserved.</li>
<li>You now can't request a flag to be set by somebody who can't set it
([% terms.Bugzilla %] will throw an error if you try).</li>
<li>Many new headers have been added to outbound [% terms.Bugzilla %]
[%+ terms.bug %] emails: <code>X-Bugzilla-Status</code>,
<code>X-Bugzilla-Priority</code>, <code>X-Bugzilla-Assigned-To</code>,
- <code>X-Bugzilla-Target-Milestone</code>, and
+ <code>X-Bugzilla-Target-Milestone</code>, and
<code>X-Bugzilla-Changed-Fields</code>, <code>X-Bugzilla-Who</code>.
You can look at an email to get an idea of what they contain.</li>
<li>In addition to the old <code>X-Bugzilla-Reason</code> email header
which tells you why you got an email, if you got an email because
- you were watching somebody, there is now an
+ you were watching somebody, there is now an
<code>X-Bugzilla-Watch-Reason</code> header that tells you who you
were watching and what role they had.</li>
- <li>If you hover your mouse over a full URL (like
- <code>http://bugs.mycompany.com/show_bug.cgi?id=1212</code>) that
- links to [% terms.abug %], you will see the title of the
+ <li>If you hover your mouse over a full URL (like
+ <code>http://bugs.mycompany.com/show_bug.cgi?id=1212</code>) that
+ links to [% terms.abug %], you will see the title of the
[%+ terms.bug %]. Of course, this only works for [% terms.bugs %] in your
[%+ terms.Bugzilla %] installation.</li>
<li>If your installation has user watching enabled, you will now see
the users that you can remove from your watch-list as a multi-select
box, much like the current CC list. (Previously it was just a text
box.)</li>
- <li>When a user creates their own account in [% terms.Bugzilla %], the
+ <li>When a user creates their own account in [% terms.Bugzilla %], the
account is now not actually created until they verify their email
address by clicking on a link that is emailed to them.</li>
<li>You can change [% terms.abug %]'s resolution without reopening it.</li>
- <li>When you view the dependency tree on [% terms.abug %], resolved
+ <li>When you view the dependency tree on [% terms.abug %], resolved
[%+ terms.bugs %] will be hidden by default. (In previous versions,
resolved [% terms.bugs %] were shown by default.)</li>
- <li>When viewing [% terms.bug %] activity, fields that hold [% terms.bug %]
+ <li>When viewing [% terms.bug %] activity, fields that hold [% terms.bug %]
numbers (such as &quot;Blocks&quot;) will have the [% terms.bug %] numbers
displayed as links to those [% terms.bugs %].</li>
<li>When viewing the &quot;Keywords&quot; field in [% terms.abug %] list,
@@ -3164,22 +3164,22 @@
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=69621">
[%- terms.Bug %] 69621</a>: If you rename or remove a keyword that is
in use on [% terms.bugs %], you will need to rebuild the "keyword cache"
- by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
- the option to rebuild the cache when it asks. Otherwise keywords may
+ by running <a href="sanitycheck.cgi">sanitycheck.cgi</a> and choosing
+ the option to rebuild the cache when it asks. Otherwise keywords may
not show up properly in search results.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=99215">
- [%- terms.Bug %] 99215</a>: Flags are not protected by "mid-air
+ [%- terms.Bug %] 99215</a>: Flags are not protected by "mid-air
collision" detection. Nor are any attachment changes.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=89822">
- [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
+ [%- terms.Bug %] 89822</a>: When changing multiple [% terms.bugs %] at
the same time, there is no "mid-air collision" protection.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=276230">
- [%- terms.Bug %] 276230</a>: The support for restricting access to
- particular Categories of New Charts is not complete. You should treat
+ [%- terms.Bug %] 276230</a>: The support for restricting access to
+ particular Categories of New Charts is not complete. You should treat
the 'chartgroup' Param as the only access mechanism available.<br>
- However, charts migrated from Old Charts will be restricted to
+ However, charts migrated from Old Charts will be restricted to
the groups that are marked MANDATORY for the corresponding Product.
- There is currently no way to change this restriction, and the
+ There is currently no way to change this restriction, and the
groupings will not be updated if the group configuration
for the Product changes.</li>
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=370370">
@@ -3188,9 +3188,9 @@
<li><a href="https://bugzilla.mozilla.org/show_bug.cgi?id=361149">
[%- terms.Bug %] 361149</a>: If you are using Perl 5.8.0, you may
get a lot of warnings in your Apache error_log about "deprecated
- pseudo-hashes." These are harmless--they are a b[%# fool test %]ug in
+ pseudo-hashes." These are harmless--they are a b[%# fool test %]ug in
Perl 5.8.0. Perl 5.8.1 and later do not have this problem.</li>
- <li>[% terms.Bugzilla %] 3.0rc1 allowed custom field column names in
+ <li>[% terms.Bugzilla %] 3.0rc1 allowed custom field column names in
the database to be mixed-case. [% terms.Bugzilla %] 3.0 only allows
lowercase column names. It will fix any column names that you have
made mixed-case, but if you have custom fields that previously were
@@ -3207,9 +3207,9 @@
<h3>3.0.5</h3>
-<p>[% terms.Bugzilla %] contains one security fix for
+<p>[% terms.Bugzilla %] contains one security fix for
<a href="[% docs_urlbase FILTER html %]api/importxml.html">importxml.pl</a>.
- For details, see the
+ For details, see the
<a href="https://www.bugzilla.org/security/2.22.4/">Security Advisory</a>.</p>
<h3>3.0.4</h3>
@@ -3234,7 +3234,7 @@
<p>[% terms.Bugzilla %] 3.0 had three security issues that have been
fixed in this release: one minor information leak, one hole only
exploitable by an admin or using <code>email_in.pl</code>, and one in an
- uncommonly-used template. For details, see the
+ uncommonly-used template. For details, see the
<a href="https://www.bugzilla.org/security/2.20.4/">Security Advisory</a>.</p>
<h2 id="v30_upgrading">How to Upgrade From An Older Version</h2>
@@ -3243,7 +3243,7 @@
<ul>
<li>If you upgrade by CVS, there are several .cvsignore files
- that are now in CVS instead of being locally created by
+ that are now in CVS instead of being locally created by
<kbd>checksetup.pl</kbd>. This means that you will have to
delete those files when CVS tells you there's a conflict, and
then run <kbd>cvs update</kbd> again.</li>
@@ -3268,8 +3268,8 @@
<h3>Steps For Upgrading</h3>
-<p>Once you have read the notes above, see the
- <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
+<p>Once you have read the notes above, see the
+ <a href="[% docs_urlbase FILTER html %]upgrade.html">Upgrading
documentation</a> for instructions on how to upgrade.</p>
<h2 id="v30_code_changes">Code Changes Which May Affect Customizations</h2>
@@ -3304,8 +3304,8 @@
<h3 id="v30_code_hooks">Hooks!</h3>
-<p>[% terms.Bugzilla %] now supports a code hook mechanism. See the
- documentation for
+<p>[% terms.Bugzilla %] now supports a code hook mechanism. See the
+ documentation for
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/Hook.html">Bugzilla::Hook</a>
for more details.</p>
@@ -3315,7 +3315,7 @@
written! Let us know on the <a href="https://lists.bugzilla.org/cgi-bin/mj_wwwusr?func=lists-long-full&amp;extra=developers">developers&#64;bugzilla.org</a>
mailing list if you write a plugin.</p>
-<p>If you need more hooks, please
+<p>If you need more hooks, please
<a href="https://www.bugzilla.org/developers/reporting_bugs.html">File a b<!-- -->ug</a>!</p>
<h3 id="v30_code_api">API Documentation</h3>
@@ -3332,7 +3332,7 @@
Its code is now in various modules. Each function went to the module
that was appropriate for it.</p>
-<p>Usually we filed [% terms.abug %] in
+<p>Usually we filed [% terms.abug %] in
<a href="https://bugzilla.mozilla.org">bugzilla.mozilla.org</a> for
each function we moved. You can search there for the old name of
the function, and that should get you the information about what
@@ -3354,9 +3354,9 @@ sub y { $var++ }</pre>
<strong>gone</strong>. Instead, we now use DBI for all database
interaction.</p>
-<p>For more information about how to use
- <a href="http://search.cpan.org/perldoc?DBI">DBI</a> with
- [%+ terms.Bugzilla %], see the
+<p>For more information about how to use
+ <a href="http://search.cpan.org/perldoc?DBI">DBI</a> with
+ [%+ terms.Bugzilla %], see the
<a href="https://www.bugzilla.org/docs/developer.html#sql-sendreceive">Developer's
Guide Section About DBI</a></p>
@@ -3364,7 +3364,7 @@ sub y { $var++ }</pre>
<p>The <kbd>Bugzilla::Auth</kbd> family of modules have been completely
re-written. For details on how the new structure of authentication,
- read the
+ read the
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/Auth.html">Bugzilla::Auth
API docs</a>.</p>
@@ -3372,9 +3372,9 @@ sub y { $var++ }</pre>
<h3 id="v30_code_obj">Bugzilla::Object</h3>
-<p>There is a new base class for most of our objects,
+<p>There is a new base class for most of our objects,
<a href="[% docs_urlbase FILTER html %]api/Bugzilla/Object.html">Bugzilla::Object</a>.
- It makes it really easy to create new objects based on things that are
+ It makes it really easy to create new objects based on things that are
in the database.</p>
<h3 id="v30_code_req">Bugzilla-&gt;request-cache</h3>
@@ -3401,7 +3401,7 @@ sub y { $var++ }</pre>
<a href="[% docs_urlbase FILTER html %]api/checksetup.html">checksetup
documentation</a> and <a href="https://bugzilla.mozilla.org/showdependencytree.cgi?id=277502&amp;hide_resolved=0">[% terms.Bugzilla %]
[%+ terms.bug %] 277502</a> for details.</li>
- <li>Instead of <kbd>UserInGroup()</kbd>, all of [% terms.Bugzilla %] now
+ <li>Instead of <kbd>UserInGroup()</kbd>, all of [% terms.Bugzilla %] now
uses <kbd>Bugzilla-&gt;user-&gt;in_group</kbd></li>
<li>mod_perl doesn't like dependency loops in modules, so we now have
a test for that detects dependency loops in modules when you run
@@ -3420,7 +3420,7 @@ sub y { $var++ }</pre>
<li><kbd>Bugzilla::BugMail::MessageToMTA()</kbd> has moved into its
own module, along with other mail-handling code, called
<kbd>Bugzilla::Mailer</kbd></li>
- <li>The <kbd>CheckCanChangeField()</kbd> subroutine in
+ <li>The <kbd>CheckCanChangeField()</kbd> subroutine in
<kbd>process_bug.cgi</kbd> has been moved to <kbd>Bugzilla::Bug</kbd>,
and is now a method of [% terms.abug %] object.</li>
<li>The code that used to be in the <kbd>global/banner.html.tmpl</kbd>
@@ -3431,7 +3431,7 @@ sub y { $var++ }</pre>
<h2 id="v30_previous">Release Notes For Previous Versions</h2>
<p>Release notes for versions of [% terms.Bugzilla %] for versions
- prior to 3.0 are only available in text format:
+ prior to 3.0 are only available in text format:
<a href="[% docs_urlbase FILTER remove('html/$') FILTER html %]rel_notes.txt">Release Notes for [% terms.Bugzilla %] 2.22
and Earlier</a>.</p>
@@ -3447,7 +3447,7 @@ sub y { $var++ }</pre>
[% '</span>' IF db_new %]
</li>
<li><strong>perl module:</strong>
- [%+ m.dbd.module FILTER html %]
+ [%+ m.dbd.module FILTER html %]
[% '<span class="req_new">' IF dbd_new %]v[% m.dbd.version FILTER html %]
[% '</span>' IF dbd_new %]</li>
</ul>
@@ -3465,8 +3465,8 @@ sub y { $var++ }</pre>
[% FOREACH req = reqs %]
<tr>
<td [% ' class="req_new"' IF new.contains(req.package) %]>
- [%- req.module FILTER html %]</td>
- <td [% ' class="req_new"' IF updated.contains(req.package)
+ [%- req.module FILTER html %]</td>
+ <td [% ' class="req_new"' IF updated.contains(req.package)
OR new.contains(req.package) %]>
[%- IF req.version == 0 %]
(Any)
@@ -3474,7 +3474,7 @@ sub y { $var++ }</pre>
[%- req.version FILTER html %]
[% END %]
</td>
- [% IF include_feature %]
+ [% IF include_feature %]
<td>[% req.feature.join(', ') FILTER html %]</td>
[% END %]
</tr>
diff --git a/template/en/default/pages/sudo.html.tmpl b/template/en/default/pages/sudo.html.tmpl
index c790ff1ab..666c30bb7 100644
--- a/template/en/default/pages/sudo.html.tmpl
+++ b/template/en/default/pages/sudo.html.tmpl
@@ -22,45 +22,45 @@
[% INCLUDE global/header.html.tmpl title = "sudo: User Impersonation" %]
<p>
- [%+ terms.Bugzilla %] includes the ability to have one user impersonate
-another, in something called a <i>sudo session</i>, so long as the person
+ [%+ terms.Bugzilla %] includes the ability to have one user impersonate
+another, in something called a <i>sudo session</i>, so long as the person
doing the impersonating has the appropriate privileges.
</p>
<p>
- While a session is in progress, [% terms.Bugzilla %] will act as if the
+ While a session is in progress, [% terms.Bugzilla %] will act as if the
impersonated user is doing everything. This is especially useful for testing,
- and for doing critical work when the impersonated user is unavailable. The
- impersonated user will receive an email from [% terms.Bugzilla %] when the
+ and for doing critical work when the impersonated user is unavailable. The
+ impersonated user will receive an email from [% terms.Bugzilla %] when the
session begins; they will not be told anything else.
</p>
<p>
- To use this feature, you must be a member of the appropriate group. The group
- includes all administrators by default. Other users, and members of other
- groups, can be given access to this feature on a case-by-case basis. To
- request access, contact the maintainer of this installation:
+ To use this feature, you must be a member of the appropriate group. The group
+ includes all administrators by default. Other users, and members of other
+ groups, can be given access to this feature on a case-by-case basis. To
+ request access, contact the maintainer of this installation:
<a href="mailto:[% Param("maintainer") %]">
[%- Param("maintainer") %]</a>.
</p>
<p>
- If you would like to be protected from impersonation, you should contact the
- maintainer of this installation to see if that is possible. People with
+ If you would like to be protected from impersonation, you should contact the
+ maintainer of this installation to see if that is possible. People with
access to this feature are protected automatically.
</p>
<p id="message">
[% IF user.in_group('bz_sudoers') %]
- You are a member of the <b>bz_sudoers</b> group. You may use this
+ You are a member of the <b>bz_sudoers</b> group. You may use this
feature to impersonate others.
[% ELSE %]
- You are not a member of an appropriate group. You may not use this
+ You are not a member of an appropriate group. You may not use this
feature.
[% END %]
[% IF user.in_group('bz_sudo_protect') %]
<br>
- You are a member of the <b>bz_sudo_protect</b> group. Other people will
+ You are a member of the <b>bz_sudo_protect</b> group. Other people will
not be able to use this feature to impersonate you.
[% END %]
</p>
diff --git a/template/en/default/reports/chart.csv.tmpl b/template/en/default/reports/chart.csv.tmpl
index f9e2f2b39..08282b3eb 100644
--- a/template/en/default/reports/chart.csv.tmpl
+++ b/template/en/default/reports/chart.csv.tmpl
@@ -26,7 +26,7 @@ Date\Series
[% colsepchar %][% label FILTER csv %]
[% END %]
[%# The data, which is in the correct format for GD, is conceptually the wrong
- # way round for CSV output. So, we need to invert it here, which is why
+ # way round for CSV output. So, we need to invert it here, which is why
# these loops aren't just plain FOREACH.
#%]
[% i = 0 %]
@@ -40,5 +40,5 @@ Date\Series
[% j = j + 1 %]
[% END %]
[% i = i + 1 %]
-
-[% END %]
+
+[% END %]
diff --git a/template/en/default/reports/chart.html.tmpl b/template/en/default/reports/chart.html.tmpl
index a927c382d..256458a68 100644
--- a/template/en/default/reports/chart.html.tmpl
+++ b/template/en/default/reports/chart.html.tmpl
@@ -17,17 +17,17 @@
#
# Contributor(s): Gervase Markham <gerv@gerv.net>
#%]
-
+
[%# INTERFACE:
#%]
[% DEFAULT width = 600
- height = 350
+ height = 350
%]
[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
title = "Chart"
%]
@@ -47,20 +47,20 @@
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
[% height + 100 %]">Taller</a><br>
<a href="[% sizeurl %]&amp;width=[% width - 100 %]&amp;height=
- [% height %]">Thinner</a> *
+ [% height %]">Thinner</a> *
<a href="[% sizeurl %]&amp;width=[% width + 100 %]&amp;height=
[% height %]">Fatter</a>&nbsp;&nbsp;&nbsp;&nbsp;<br>
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
[% height - 100 %]">Shorter</a><br>
</p>
-
+
<p>
<a href="chart.cgi?
[% imagebase FILTER html %]&amp;ctype=csv&amp;action=plot">CSV</a> |
- <a href="chart.cgi?[% imagebase FILTER html %]&amp;action=assemble">Edit
+ <a href="chart.cgi?[% imagebase FILTER html %]&amp;action=assemble">Edit
this chart</a>
</p>
-
+
</div>
[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/chart.png.tmpl b/template/en/default/reports/chart.png.tmpl
index c4fa04f66..367be2066 100644
--- a/template/en/default/reports/chart.png.tmpl
+++ b/template/en/default/reports/chart.png.tmpl
@@ -30,10 +30,10 @@
[% FILTER null;
x_label_skip = (30 * chart.data.0.size / width);
-
+
graph.set(x_label => x_label,
y_label => y_label,
- y_tick_number => 8,
+ y_tick_number => 8,
y_max_value => chart.y_max_value,
x_label_position => 0.5,
x_labels_vertical => 1,
@@ -42,10 +42,10 @@
line_width => 2,
dclrs => ["lred", "lgreen", "lblue", "lyellow",
"lpurple", "lorange", "black", "green",
- "blue", "dpink", "lbrown", "gray",
+ "blue", "dpink", "lbrown", "gray",
"red", "dpurple", "gold", "marine"]);
-
- # Workaround for the fact that set_legend won't take chart.labels directly,
+
+ # Workaround for the fact that set_legend won't take chart.labels directly,
# because chart.labels is an array reference rather than an array.
graph.set_legend(chart.labels.0, chart.labels.1, chart.labels.2,
chart.labels.3, chart.labels.4, chart.labels.5,
@@ -53,7 +53,7 @@
chart.labels.9, chart.labels.10, chart.labels.11,
chart.labels.12, chart.labels.13, chart.labels.14,
chart.labels.15);
-
+
graph.plot(chart.data).png | stdout(1);
END;
-%]
diff --git a/template/en/default/reports/create-chart.html.tmpl b/template/en/default/reports/create-chart.html.tmpl
index e20d8522f..58a69b7e0 100644
--- a/template/en/default/reports/create-chart.html.tmpl
+++ b/template/en/default/reports/create-chart.html.tmpl
@@ -25,12 +25,12 @@
# series. Contains details of all series the user can see.
#%]
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
title = "Create Chart"
%]
-[% PROCESS "reports/series-common.html.tmpl"
- donames = 1
+[% PROCESS "reports/series-common.html.tmpl"
+ donames = 1
%]
<script [% script_nonce FILTER none %]>
@@ -39,7 +39,7 @@ function subcatSelected() {
var cat = document.chartform.category.value;
var subcat = document.chartform.subcategory.value;
var names = series[cat][subcat];
-
+
var namewidget = document.chartform.name;
namewidget.options.length = 0;
@@ -52,7 +52,7 @@ function subcatSelected() {
namewidget.disabled = false;
namewidget.options[0].selected = true;
-
+
checkNewState();
}
document.addEventListener("DOMContentLoaded", function(event) {
@@ -65,11 +65,11 @@ document.addEventListener("DOMContentLoaded", function(event) {
});
});
</script>
-
+
[% gttext = "Grand Total" %]
-<form method="get" action="chart.cgi" name="chartform">
-
+<form method="get" action="chart.cgi" name="chartform">
+
<table cellpadding="2" cellspacing="2" border="0">
[% IF NOT category OR category.size == 0 %]
<tr>
@@ -108,7 +108,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
id="action-assemble2">
</noscript>
</td>
-
+
[% PROCESS series_select sel = { name => 'name',
size => 5,
multiple => 1,
@@ -116,7 +116,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
# not its name.
value_in_hash => 1 } %]
- <td align="center" valign="middle">
+ <td align="center" valign="middle">
<input type="submit" name="action-add" value="Add To List"
id="action-add"><br>
</td>
@@ -135,15 +135,15 @@ document.addEventListener("DOMContentLoaded", function(event) {
<th>Data Set</th>
<th></th>
</tr>
-
+
[%# The external loop has two counters; one which keeps track of where we
# are in the old labels array, and one which keeps track of the new
# indexes for the form elements. They are different if chart.lines has
- # empty slots in it.
+ # empty slots in it.
#%]
[% labelidx = 0 %]
[% newidx = 0 %]
-
+
[% FOREACH line = chart.lines %]
[% IF NOT line %]
[%# chart.lines has an empty slot, so chart.labels will too. We
@@ -152,7 +152,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
[% labelidx = labelidx + 1 %]
[% NEXT %]
[% END %]
-
+
[% FOREACH series = line %]
<tr>
[% IF loop.first %]
@@ -161,7 +161,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
</td>
<td rowspan="[% line.size %]">
<input type="text" size="20" name="label[% newidx %]"
- value="[% (chart.labels.$labelidx OR series.name)
+ value="[% (chart.labels.$labelidx OR series.name)
FILTER html %]">
</td>
[% END %]
@@ -171,10 +171,10 @@ document.addEventListener("DOMContentLoaded", function(event) {
</td>
<td>
- [% series.category FILTER html %] /
+ [% series.category FILTER html %] /
[%+ series.subcategory FILTER html %] /
[%+ series.name FILTER html %]
- <input type="hidden" name="line[% newidx %]"
+ <input type="hidden" name="line[% newidx %]"
value="[% series.series_id %]">
</td>
@@ -190,7 +190,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
[% series.subcategory FILTER uri %]%20/%20
[% series.name FILTER uri -%]&amp;series_id=
[% series.series_id %]&amp;remaction=runseries">Run Search</a>
- </td>
+ </td>
</tr>
[% END %]
[% labelidx = labelidx + 1 %]
@@ -220,7 +220,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
<tr>
<td valign="bottom" style="text-align: center;">
- <input type="submit" name="action-sum" value="Sum"
+ <input type="submit" name="action-sum" value="Sum"
style="width: 5em;" id="action-sum"><br>
<input type="submit" name="action-remove" value="Remove"
style="width: 5em;" id="action-remove">
@@ -250,7 +250,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
</table>
[% ELSE %]
<p><i>None</i></p>
- [% END %]
+ [% END %]
</form>
[% IF user.in_group('editbugs') %]
@@ -271,7 +271,7 @@ document.addEventListener("DOMContentLoaded", function(event) {
</select>
<input id="submit_create" type="submit" value="Create a new data set">
</form>
-[% END %]
+[% END %]
[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/duplicates-table.html.tmpl b/template/en/default/reports/duplicates-table.html.tmpl
index a7abf07b8..8d27bb976 100644
--- a/template/en/default/reports/duplicates-table.html.tmpl
+++ b/template/en/default/reports/duplicates-table.html.tmpl
@@ -15,7 +15,7 @@
# Copyright (C) 1998 Netscape Communications Corporation. All
# Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Gervase Markham <gerv@gerv.net>
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
@@ -54,7 +54,7 @@
[% SET base_args = [] %]
[% FOREACH param = ['maxrows', 'openonly', 'format', 'sortvisible',
- 'changedsince', 'product']
+ 'changedsince', 'product']
%]
[% NEXT IF NOT ${param}.defined %]
[% FOREACH value = ${param} %]
@@ -74,7 +74,7 @@
<tr>
[% FOREACH column = columns %]
[% IF column.name == sortby %]
- [%# We add this to the column object so it doesn't affect future
+ [%# We add this to the column object so it doesn't affect future
# iterations of the loop.
#%]
[% column.reverse_sort = reverse ? 0 : 1 %]
@@ -112,7 +112,7 @@
[%- display_value('op_sys', bug.op_sys) FILTER html %]
</td>
<td class="target_milestone">
- [% display_value('target_milestone',
+ [% display_value('target_milestone',
bug.target_milestone) FILTER html %]
</td>
<td class="short_desc">[% bug.short_desc FILTER html %]</td>
diff --git a/template/en/default/reports/duplicates.html.tmpl b/template/en/default/reports/duplicates.html.tmpl
index ed3e7b8ac..f95fe3762 100644
--- a/template/en/default/reports/duplicates.html.tmpl
+++ b/template/en/default/reports/duplicates.html.tmpl
@@ -34,7 +34,7 @@
[% IF product.size %]
[% title = BLOCK %]
- Most Frequently Reported [% terms.Bugs %] for
+ Most Frequently Reported [% terms.Bugs %] for
[%+ product.join(', ') FILTER html %]
[% END %]
[% ELSE %]
@@ -95,7 +95,7 @@
<tr>
<td><label for="maxrows">Max rows:</label></td>
<td>
- <input size="4" name="maxrows" id="maxrows"
+ <input size="4" name="maxrows" id="maxrows"
value="[% maxrows FILTER html %]">
</td>
</tr>
@@ -129,7 +129,7 @@
<form method="post" action="buglist.cgi" data-no-csrf>
<input type="hidden" name="bug_id" value="[% bug_ids_string FILTER html %]">
- Or just give this to me as a <input type="submit" id="list"
+ Or just give this to me as a <input type="submit" id="list"
value="[% terms.bug %] list">.
(Note: the order may not be the same.)
</form>
@@ -141,7 +141,7 @@
</h3>
<p>
- The Most Frequent [% terms.Bugs %] page lists the known open
+ The Most Frequent [% terms.Bugs %] page lists the known open
[%+ terms.bugs %] which are reported most frequently,
counting the number of direct and indirect duplicates of [% terms.bugs %].
This information is provided in order to assist in minimizing
@@ -170,7 +170,7 @@
that has already been filed.</li>
<li>If you find your [% terms.bug %] in [% terms.Bugzilla %],
feel free to comment with any new or additional data you may have.</li>
- <li>If you cannot find your problem already documented in
+ <li>If you cannot find your problem already documented in
[%+ terms.Bugzilla %],
<a href="enter_bug.cgi">file a new [% terms.bug %]</a>.</li>
</ul>
diff --git a/template/en/default/reports/edit-series.html.tmpl b/template/en/default/reports/edit-series.html.tmpl
index da7d15e0a..3169d3c93 100644
--- a/template/en/default/reports/edit-series.html.tmpl
+++ b/template/en/default/reports/edit-series.html.tmpl
@@ -20,7 +20,7 @@
[% title = "Edit Series" %]
[% subheader = BLOCK %]
- [% default.category FILTER html %] /
+ [% default.category FILTER html %] /
[%+ default.subcategory FILTER html %] /
[%+ default.name FILTER html %]
[% END %]
@@ -36,20 +36,20 @@
[% END %]
<form method="get" action="chart.cgi" name="chartform">
-
- [% PROCESS reports/series.html.tmpl
+
+ [% PROCESS reports/series.html.tmpl
button_name = "Change Data Set" %]
<input type="hidden" name="action" value="alter">
<input type="hidden" name="token"
value="[% issue_hash_token([default.id, default.name]) FILTER html %]">
-
+
[% IF default.series_id %]
<input type="hidden" name="series_id" value="[% default.series_id %]">
[% END %]
</form>
<p>
- <b>Creator</b>:
+ <b>Creator</b>:
[% IF default.creator %]
<a href="mailto:[% default.creator.email FILTER html %]">
[% default.creator.email FILTER html %]</a>
@@ -63,7 +63,7 @@ set.
</p>
<p>
- <a href="query.cgi?[% default.query FILTER html %]">View
+ <a href="query.cgi?[% default.query FILTER html %]">View
series search parameters</a> |
<a href="buglist.cgi?cmdtype=dorem&amp;namedcmd=
[% default.category FILTER uri %]-
diff --git a/template/en/default/reports/email/security-risk.html.tmpl b/template/en/default/reports/email/security-risk.html.tmpl
new file mode 100644
index 000000000..0fca42e05
--- /dev/null
+++ b/template/en/default/reports/email/security-risk.html.tmpl
@@ -0,0 +1,95 @@
+[%# This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
+ # file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ #
+ # This Source Code Form is "Incompatible With Secondary Licenses", as
+ # defined by the Mozilla Public License, v. 2.0.
+ #%]
+
+[% PROCESS global/variables.none.tmpl %]
+
+<!doctype html>
+<html>
+<head>
+ <title>Security [% terms.Bugs %] Report for the week of [% report_week FILTER html %]</title>
+ <base href="[% urlbase FILTER txt %]">
+</head>
+<body>
+<p>Security [% terms.Bugs %] Report for the week of [% report_week FILTER html %]</p>
+<p>To narrow down open [% terms.bugs %] click on the link and at the bottom of the search results use the 'Edit Search' functionality to filter by component and so on.
+This will filter only the open [% terms.bugs %] counted in the report (as long as you do not modify the '[% terms.Bugs %] numbered' section of the search).
+</p>
+
+<h3>[% terms.Bugs %] By Severity</h3>
+<table style="border: 1px solid grey">
+ <tr>
+ <th style="border: 1px solid grey"></th>
+ [% FOREACH keyword IN sec_keywords %]
+ <th style="border: 1px solid grey; text-align: center" colspan="2"><b>[% keyword FILTER html %]</b></th>
+ [% END %]
+ </tr>
+ <tr>
+ <td style="border: 1px solid grey"></td>
+ [% FOREACH keyword IN sec_keywords %]
+ <td style="border: 1px solid grey; text-align: right">Open Count</td>
+ <td style="border: 1px solid grey; text-align: right">Median Days Open</td>
+ [% END %]
+ </tr>
+ [% FOREACH result IN results.reverse %]
+ <tr>
+ <td style="border: 1px solid grey">[% result.date.ymd('-') FILTER html %]</td>
+ [% FOREACH keyword IN sec_keywords %]
+ <td style="border: 1px solid grey; text-align: right">
+ [% IF result.bugs_by_sec_keyword.$keyword.open.size %]
+ <a href="[% build_bugs_link(result.bugs_by_sec_keyword.$keyword.open) FILTER html %]">
+ [% result.bugs_by_sec_keyword.$keyword.open.size FILTER html %]
+ </a>
+ [% ELSE %]
+ [% result.bugs_by_sec_keyword.$keyword.open.size FILTER html %]
+ [% END %]
+ </td>
+ <td style="border: 1px solid grey; text-align: right">
+ [% result.bugs_by_sec_keyword.$keyword.median_age_open FILTER format("%.2f") FILTER html %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+</table>
+
+<h3>Sec-Critical + Sec-High [% terms.Bugs %] by Product</h3>
+<table style="border: 1px solid grey">
+ <tr>
+ <th style="border: 1px solid grey"></th>
+ [% FOREACH product IN products %]
+ <th style="border: 1px solid grey; text-align: center" colspan="2"><b>[% product FILTER html %]</b></th>
+ [% END %]
+ </tr>
+ <tr>
+ <td style="border: 1px solid grey"></td>
+ [% FOREACH product IN products %]
+ <td style="border: 1px solid grey; text-align: right">Open Count</td>
+ <td style="border: 1px solid grey; text-align: right">Median Days Open</td>
+ [% END %]
+ </tr>
+ [% FOREACH result IN results.reverse %]
+ <tr>
+ <td style="border: 1px solid grey">[% result.date.ymd('-') FILTER html %]</td>
+ [% FOREACH product IN products %]
+ <td style="border: 1px solid grey; text-align: right">
+ [% IF result.bugs_by_product.$product.open.size %]
+ <a href="[% build_bugs_link(result.bugs_by_product.$product.open, product) FILTER html %]">
+ [% result.bugs_by_product.$product.open.size FILTER html %]
+ </a>
+ [% ELSE %]
+ [% result.bugs_by_product.$product.open.size FILTER html %]
+ [% END %]
+ </td>
+ <td style="border: 1px solid grey; text-align: right">
+ [% result.bugs_by_product.$product.median_age_open FILTER format("%.2f") FILTER html %]
+ </td>
+ [% END %]
+ </tr>
+ [% END %]
+</table>
+</body>
+</html>
diff --git a/template/en/default/reports/report-line.png.tmpl b/template/en/default/reports/report-line.png.tmpl
index 0edc0fee7..5d81b1330 100644
--- a/template/en/default/reports/report-line.png.tmpl
+++ b/template/en/default/reports/report-line.png.tmpl
@@ -51,7 +51,7 @@
line_width => 2,
dclrs => ["lred", "lgreen", "lblue", "lyellow",
"lpurple", "lorange", "black", "green",
- "blue", "dpink", "lbrown", "gray",
+ "blue", "dpink", "lbrown", "gray",
"red", "dpurple", "gold", "marine"]);
# Workaround for the fact that set_legend won't take row_names directly,
diff --git a/template/en/default/reports/report-pie.png.tmpl b/template/en/default/reports/report-pie.png.tmpl
index 27f5525dd..410359f37 100644
--- a/template/en/default/reports/report-pie.png.tmpl
+++ b/template/en/default/reports/report-pie.png.tmpl
@@ -28,12 +28,12 @@
[% FILTER null;
USE graph = GD.Graph.pie(width, height);
-
+
graph.set(title => col_field_disp,
pie_height => 20,
suppress_angle => 2,
start_angle => 180);
-
+
graph.plot(data.0).png | stdout(1);
END;
-%]
diff --git a/template/en/default/reports/report-table.html.tmpl b/template/en/default/reports/report-table.html.tmpl
index 096eb171a..af2eef5f3 100644
--- a/template/en/default/reports/report-table.html.tmpl
+++ b/template/en/default/reports/report-table.html.tmpl
@@ -28,7 +28,7 @@
# tbl_field: string. Name of the field being plotted as tables.
# col_names: array. List of values for the field being plotted as columns.
# row_names: array. List of values for the field being plotted as rows.
- # data: <depends on format>. Data to plot. Only data.$tbl is accessed.
+ # data: <depends on format>. Data to plot. Only data.$tbl is accessed.
# tbl: Name of a hash in data which is the table to be plotted.
#%]
@@ -145,7 +145,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
]
};
this.myDataTable = new YAHOO.widget.DataTable("tabular_report_container_
- [% tbl FILTER js %]", myColumnDefs, this.myDataSource,
+ [% tbl FILTER js %]", myColumnDefs, this.myDataSource,
{formatRow: totalRowFormatter});
});
</script>
@@ -184,7 +184,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
[% FOREACH col = col_names %]
[% col_totals.$col = 0 %]
[% NEXT IF col == "" %]
-
+
[% col_idx = 1 - col_idx %]
<th class="[% classes.$row_idx.$col_idx %]">
[% PROCESS value_display value = col field = col_field %]
@@ -199,7 +199,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
<tbody>
[% FOREACH row = row_names %]
[% row_total = 0 %]
-
+
[% row_idx = 1 - row_idx %]
<tr>
<td class="[% classes.$row_idx.$col_idx %]" align="right">
@@ -209,7 +209,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
[% row_total = row_total + data.$tbl.$col.$row %]
[% NEXT IF col == "" %]
[% col_totals.$col = (col_totals.$col || 0) + data.$tbl.$col.$row %]
-
+
[% col_idx = 1 - col_idx %]
<td class="[% classes.$row_idx.$col_idx %]" align="center">
[% IF data.$tbl.$col.$row AND data.$tbl.$col.$row > 0 %]
@@ -221,7 +221,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
.
[% END %]
</td>
- [% END %]
+ [% END %]
<td class="ttotal" align="right">
<a href="[% urlbase %]&amp;
[% row_field FILTER uri %]=[% row FILTER uri %]
@@ -238,7 +238,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
</td>
[% FOREACH col = col_names %]
[% NEXT IF col == "" %]
-
+
<td class="ttotal" align="center">
<a href="[% urlbase %]&amp;
[% col_field FILTER uri %]=[% col FILTER uri %]
@@ -257,7 +257,7 @@ YAHOO.util.Event.addListener(window, "load", function() {
</tbody>
</table>
</div>
-
+
</td>
</tr>
</table>
@@ -270,4 +270,4 @@ YAHOO.util.Event.addListener(window, "load", function() {
[% disp_value = value FILTER email %]
[% END %]
[% disp_value FILTER html FILTER replace('^ $','&nbsp;') %]
-[% END %]
+[% END %]
diff --git a/template/en/default/reports/report.csv.tmpl b/template/en/default/reports/report.csv.tmpl
index f26bc1f36..0687064e9 100644
--- a/template/en/default/reports/report.csv.tmpl
+++ b/template/en/default/reports/report.csv.tmpl
@@ -19,7 +19,7 @@
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
[% FOREACH tbl = tbl_names %]
- [% PROCESS "reports/report-table.csv.tmpl" %]
+ [% PROCESS "reports/report-table.csv.tmpl" %]
-[% END %]
+[% END %]
diff --git a/template/en/default/reports/report.html.tmpl b/template/en/default/reports/report.html.tmpl
index c70f3de13..8c580fd94 100644
--- a/template/en/default/reports/report.html.tmpl
+++ b/template/en/default/reports/report.html.tmpl
@@ -17,14 +17,14 @@
#
# Contributor(s): Gervase Markham <gerv@gerv.net>
#%]
-
+
[%# INTERFACE:
# col_field: string. Name of the field being plotted as columns.
# row_field: string. Name of the field being plotted as rows.
# tbl_field: string. Name of the field being plotted as tables.
# tbl_names: array. List of values for the field being plotted as tables.
# time: integer. Seconds since the epoch.
- # data: <depends on format>. Data to plot.
+ # data: <depends on format>. Data to plot.
# format: string. Format of the individual reports.
# width: integer. For image charts, height of the image.
# height: integer. For image charts, width of the image.
@@ -34,7 +34,7 @@
#%]
[% DEFAULT width = 600
- height = 350
+ height = 350
%]
[% IF min_width AND width < min_width %]
@@ -54,7 +54,7 @@
[% switchbase = switchbase FILTER html %]
[% title = BLOCK %]
- Report:
+ Report:
[% IF tbl_field %]
[% tbl_field_disp FILTER html %]
[% END %]
@@ -68,7 +68,7 @@
[% time = time FILTER time('%Y-%m-%d %H:%M:%S') FILTER html %]
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
style = "
.t1 { background-color: #ffffff } /* white */
.t2 { background-color: #dfefff } /* light blue */
@@ -86,7 +86,7 @@
<div align="center">
- [% FOREACH tbl = tbl_names %]
+ [% FOREACH tbl = tbl_names %]
[% IF tbl == "-total-" %]
[% tbl_disp = "Total" %]
[% ELSE %]
@@ -99,7 +99,7 @@
[% IF tbl %]
<h2>[% tbl_disp FILTER email FILTER html %]</h2>
[% END %]
-
+
[% imageurl = BLOCK %]report.cgi?[% imagebase FILTER html %]&amp;format=
[% format FILTER uri %]&amp;ctype=png&amp;action=plot&amp;
[% IF tbl_field %]
@@ -112,14 +112,14 @@
[% END %]
[% END %]
[% END %]
- [% END %]width=[% width %]&amp;height=[% height %]
+ [% END %]width=[% width %]&amp;height=[% height %]
[% END %]
-
+
<img alt="Graphical report results" src="[% imageurl %]"
width="[% width %]" height="[% height %]">
[% END %]
<br>
- [% END %]
+ [% END %]
<table>
<tr>
@@ -129,7 +129,7 @@
{ name => "line", description => "Line" },
{ name => "table", description => "Table" } ] %]
- [% formaturl = "report.cgi?$switchbase&amp;width=$width" _
+ [% formaturl = "report.cgi?$switchbase&amp;width=$width" _
"&amp;height=$height&amp;action=wrap" %]
[% FOREACH other_format = formats %]
[% NEXT IF other_format.name == "pie" AND row_field AND col_field %]
@@ -137,11 +137,11 @@
<a href="[% formaturl %]&amp;format=[% other_format.name %]">
[% END %]
[% other_format.description FILTER html %]
- [% "</a>" UNLESS other_format.name == format %] |
+ [% "</a>" UNLESS other_format.name == format %] |
[% END %]
- <a href="[% formaturl %]&amp;ctype=csv&amp;format=table">CSV</a>
+ <a href="[% formaturl %]&amp;ctype=csv&amp;format=table">CSV</a>
</td>
-
+
[% IF format != "table" %]
<td>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
@@ -154,7 +154,7 @@
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
[% height + 100 %]">Taller</a><br>
<a href="[% sizeurl %]&amp;width=[% width - 100 %]&amp;height=
- [% height %]">Thinner</a> *
+ [% height %]">Thinner</a> *
<a href="[% sizeurl %]&amp;width=[% width + 100 %]&amp;height=
[% height %]">Fatter</a>&nbsp;&nbsp;&nbsp;&nbsp;<br>
<a href="[% sizeurl %]&amp;width=[% width %]&amp;height=
@@ -166,7 +166,7 @@
<p>
[% IF format == "table" %]
- <a href="query.cgi?[% switchbase %]&amp;format=report-table">Edit
+ <a href="query.cgi?[% switchbase %]&amp;format=report-table">Edit
this report</a>
[% ELSE %]
<a href="query.cgi?[% switchbase %]&amp;chart_format=
@@ -175,7 +175,7 @@
</a>
[% END %]
</p>
-
+
</div>
[% PROCESS global/footer.html.tmpl %]
diff --git a/template/en/default/reports/series-common.html.tmpl b/template/en/default/reports/series-common.html.tmpl
index b8032255d..7bf387bd2 100644
--- a/template/en/default/reports/series-common.html.tmpl
+++ b/template/en/default/reports/series-common.html.tmpl
@@ -20,7 +20,7 @@
[%# INTERFACE:
# donames: boolean. True if we have a multi-select for names as well as
- # categories and subcategories.
+ # categories and subcategories.
# category: hash (keyed by category) of hashes (keyed by subcategory) of
# hashes (keyed by name), with value being the series_id of the
# series. Contains details of all series the user can see.
@@ -38,55 +38,55 @@ var series = {
"[%+ s FILTER js %]" : {
[% IF donames %]
[% FOREACH n = category.$c.$s.keys.sort %]
- "[% n FILTER js %]":
+ "[% n FILTER js %]":
[% category.$c.$s.$n FILTER js %][% ", " UNLESS loop.last %]
[% END %]
[% END %]
}[% ", " UNLESS loop.last %]
[% END %]
}[% ", " UNLESS loop.last %]
-[% END %]
+[% END %]
};
[%# This function takes necessary action on selection of a category %]
function catSelected() {
var cat = document.chartform.category.value;
var subcats = series[cat];
-
+
var subcatwidget = document.chartform.subcategory;
-
+
subcatwidget.options.length = 0;
var i = 0;
-
+
for (x in subcats) {
subcatwidget.options[i] = new Option(x, x);
i++;
}
-
+
[% IF newtext %]
subcatwidget.options[i] = new Option("[% newtext FILTER js %]", "");
- [% END %]
+ [% END %]
subcatwidget.disabled = false;
subcatwidget.options[0].selected = true;
-
+
if (document.chartform.action[1]) {
[%# On the query form, select the right radio button. %]
document.chartform.action[1].checked = true;
}
-
- checkNewState();
+
+ checkNewState();
}
[%# This function updates the disabled state of the two "new" textboxes %]
function checkNewState() {
var fm = document.chartform;
if (fm.newcategory) {
- fm.newcategory.disabled =
- (fm.category.value != "" ||
+ fm.newcategory.disabled =
+ (fm.category.value != "" ||
fm.action[1] && fm.action[1].checked == false);
- fm.newsubcategory.disabled =
- (fm.subcategory.value != "" ||
+ fm.newsubcategory.disabled =
+ (fm.subcategory.value != "" ||
fm.action[1] && fm.action[1].checked == false);
}
}
diff --git a/template/en/default/reports/series.html.tmpl b/template/en/default/reports/series.html.tmpl
index 164c30355..23e7d82f7 100644
--- a/template/en/default/reports/series.html.tmpl
+++ b/template/en/default/reports/series.html.tmpl
@@ -20,14 +20,14 @@
[%# INTERFACE:
# default: hash. Defaults for category, subcategory, name etc.
- # button_name: string. What the button will say.
+ # button_name: string. What the button will say.
# category: hash (keyed by category) of hashes (keyed by subcategory) of
# hashes (keyed by name), with value being the series_id of the
# series. Contains details of all series the user can see.
#%]
[% PROCESS "reports/series-common.html.tmpl"
- newtext = "New (name below)"
+ newtext = "New (name below)"
%]
<script [% script_nonce FILTER none %]>
@@ -63,7 +63,7 @@
size => 5 } %]
<td valign="top" name="name">
- <input type="text" name="name" maxlength="64"
+ <input type="text" name="name" maxlength="64"
value="[% default.name.0 FILTER html %]" size="25">
</td>
@@ -74,24 +74,24 @@
<span style="font-weight: bold;">&nbsp;day(s)</span><br>
[%# Change 'admin' here and in Series.pm, or remove the check
completely, if you want to change who can make series public. %]
- [% IF user.in_group('admin') %]
+ [% IF user.in_group('admin') %]
<input type="checkbox" name="public"
[%+ "checked='checked'" IF default.public.0 %]>
<span style="font-weight: bold;">Visible to all<br>
- (within group restrictions)</span>
+ (within group restrictions)</span>
[% END %]
</td>
</tr>
<tr>
<td>
- <input type="text" style="width: 100%" name="newcategory"
+ <input type="text" style="width: 100%" name="newcategory"
maxlength="64" value="[% default.newcategory.0 FILTER html %]">
</td>
<td></td>
<td>
<input type="text" style="width: 100%" name="newsubcategory"
- maxlength="64"
+ maxlength="64"
value="[% default.newsubcategory.0 FILTER html %]">
</td>
<td></td>
diff --git a/template/en/default/request/queue.html.tmpl b/template/en/default/request/queue.html.tmpl
index c4b48b024..3246c16dc 100644
--- a/template/en/default/request/queue.html.tmpl
+++ b/template/en/default/request/queue.html.tmpl
@@ -161,9 +161,9 @@ to some group are shown by default.
<tr>
<th></th>
<td>
- <label><input type="radio" name="do_union" value="0"
+ <label><input type="radio" name="do_union" value="0"
[% 'checked="checked"' IF !cgi.param('do_union') %]>AND *</label>
- <label><input type="radio" name="do_union" value="1"
+ <label><input type="radio" name="do_union" value="1"
[% 'checked="checked"' IF cgi.param('do_union') %]>OR *</label>
</td>
<td colspan="3"></td>
@@ -171,7 +171,7 @@ to some group are shown by default.
</tr>
</table>
- <p>(* The logical conjunction/disjunction between the requester
+ <p>(* The logical conjunction/disjunction between the requester
and the requestee)</p>
</form>
@@ -229,7 +229,7 @@ to some group are shown by default.
[% BLOCK start_new_table %]
[% buglist = {} %]
- <h3>[% column_headers.$group_field %]:
+ <h3>[% column_headers.$group_field %]:
[%+ (request.$group_field || "None") FILTER email FILTER html %]</h3>
<table class="requests" cellspacing="0" cellpadding="4" border="1">
<tr>
diff --git a/template/en/default/search/field.html.tmpl b/template/en/default/search/field.html.tmpl
index 456cf088a..fe0eb2144 100644
--- a/template/en/default/search/field.html.tmpl
+++ b/template/en/default/search/field.html.tmpl
@@ -26,10 +26,10 @@
# type_selected: used by the free text to indicate which type of text
# search was selected for a particular field
#%]
-
+
[% SWITCH field.type %]
[% CASE [ constants.FIELD_TYPE_FREETEXT,
- constants.FIELD_TYPE_TEXTAREA,
+ constants.FIELD_TYPE_TEXTAREA,
constants.FIELD_TYPE_UNKNOWN ] %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field
@@ -38,14 +38,14 @@
%]
[% INCLUDE "search/type-select.html.tmpl"
name = field.name _ "_type",
- types = types,
+ types = types,
selected = type_selected
- %]
- <input name="[% field.name FILTER html %]"
+ %]
+ <input name="[% field.name FILTER html %]"
id="[% field.name FILTER html %]" size="40"
[% IF autofocus %] autofocus[% END %]
[% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
- value="[% value FILTER html %]">
+ value="[% value FILTER html %]">
[% CASE constants.FIELD_TYPE_KEYWORDS %]
[% INCLUDE "bug/field-label.html.tmpl"
field = field
@@ -54,7 +54,7 @@
%]
[% INCLUDE "search/type-select.html.tmpl"
name = field.name _ "_type",
- types = types,
+ types = types,
selected = type_selected
%]
<input name="[% field.name FILTER html %]"
@@ -77,20 +77,20 @@
tag_name = "span"
editable = 1
%]
- from <input name="[% field.name FILTER html %]from"
- id="[% field.name FILTER html %]"
+ from <input name="[% field.name FILTER html %]from"
+ id="[% field.name FILTER html %]"
size="10" maxlength="10"
- value="[% value.0 FILTER html %]"
+ value="[% value.0 FILTER html %]"
onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
<button type="button" class="calendar_button"
id="button_calendar_[% field.name FILTER html %]"
onclick="showCalendar('[% field.name FILTER js %]')">
<span>Calendar</span>
</button>
- <span id="con_calendar_[% field.name FILTER html %]"></span>
- to <input name="[% field.name FILTER html %]to"
+ <span id="con_calendar_[% field.name FILTER html %]"></span>
+ to <input name="[% field.name FILTER html %]to"
id="[% field.name FILTER html %]to" size="10" maxlength="10"
- value="[% value.1 FILTER html %]"
+ value="[% value.1 FILTER html %]"
onchange="updateCalendarFromField(this);[% onchange FILTER html %]">
<button type="button" class="calendar_button"
id="button_calendar_[% field.name FILTER html %]to"
@@ -98,22 +98,22 @@
<span>Calendar</span>
</button>
<small>(YYYY-MM-DD or relative dates)</small>
-
+
<span id="con_calendar_[% field.name FILTER html %]to"></span>
<script [% script_nonce FILTER none %]>
createCalendar('[% field.name FILTER js %]');
createCalendar('[% field.name FILTER js %]to');
</script>
- [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT,
+ [% CASE [ constants.FIELD_TYPE_SINGLE_SELECT,
constants.FIELD_TYPE_MULTI_SELECT ] %]
- <div id="container_[% field.name FILTER html %]" class="search_field_grid">
+ <div id="container_[% field.name FILTER html %]" class="search_field_grid">
[% INCLUDE "bug/field-label.html.tmpl"
field = field
editable = 1
tag_name = "span"
%]
- <select name="[% field.name FILTER html%]"
- id="[% field.name FILTER html %]"
+ <select name="[% field.name FILTER html%]"
+ id="[% field.name FILTER html %]"
[% IF onchange %] onchange="[% onchange FILTER html %]"[% END %]
multiple="multiple" size="9">
[% legal_values = ${field.name} %]
@@ -122,7 +122,7 @@
[% END %]
[% FOREACH current_value = legal_values %]
[% IF current_value.id %]
- [%# current_value is a hash instead of a value which
+ [%# current_value is a hash instead of a value which
only applies for Resolution really, everywhere else current_value
is just the value %]
[% v = current_value.name OR '---' -%]
diff --git a/template/en/default/search/form.html.tmpl b/template/en/default/search/form.html.tmpl
index 4d78a53da..a9cf3ab89 100644
--- a/template/en/default/search/form.html.tmpl
+++ b/template/en/default/search/form.html.tmpl
@@ -49,7 +49,7 @@ var tms = new Array();
[%- FOREACH item = user.get_selectable_products(c.id) -%]
[%- IF item.components.size -%]
[%- sep FILTER js %]'[% item.name FILTER js %]'
- [%- sep = ',' -%]
+ [%- sep = ',' -%]
[%- END -%]
[%- END -%] ];
[% nclass = nclass+1 %]
@@ -76,7 +76,7 @@ var tms = new Array();
[% END %]
/*
- * doOnSelectProduct determines which selection should get updated
+ * doOnSelectProduct determines which selection should get updated
*
* - selectmode = 0 - init
* selectmode = 1 - classification selected
@@ -87,7 +87,7 @@ var tms = new Array();
*/
function doOnSelectProduct(selectmode) {
var f = document.forms[queryform];
- var milestone = (typeof(f.target_milestone) == "undefined" ?
+ var milestone = (typeof(f.target_milestone) == "undefined" ?
null : f.target_milestone);
if (selectmode == 0) {
// If there is no classification selected, give us a chance to fill
@@ -106,7 +106,7 @@ function doOnSelectProduct(selectmode) {
// Hide the Advanced Fields by default, unless the user has a cookie
// that specifies otherwise.
-// &#9656; and &#9662; are both utf8 escaped characters for right
+// &#9656; and &#9662; are both utf8 escaped characters for right
// and down facing arrows respectivly.
TUI_alternates['history_query'] = '&#9658;';
TUI_alternates['people_query'] = '&#9658;';
@@ -139,7 +139,7 @@ TUI_hide_default('information_query');
field = bug_fields.short_desc
types = query_types
value = default.short_desc.0
- type_selected = default.short_desc_type.0
+ type_selected = default.short_desc_type.0
accesskey = "s"
autofocus = 1
%]
@@ -151,38 +151,38 @@ TUI_hide_default('information_query');
</div>
[%# *** Classification Product Component *** %]
-
+
[% Hook.process('before_selects_top') %]
[% IF Param('useclassification') %]
[% fake_classfication = { name => bug_fields.classification.name,
type => constants.FIELD_TYPE_SINGLE_SELECT } %]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => fake_classfication
accesskey => "c"
- onchange => "doOnSelectProduct(1);"
+ onchange => "doOnSelectProduct(1);"
value => default.classification
- %]
+ %]
[% END %]
-[% INCLUDE "search/field.html.tmpl"
+[% INCLUDE "search/field.html.tmpl"
field => bug_fields.product
accesskey => "p"
- onchange => "doOnSelectProduct(2);"
+ onchange => "doOnSelectProduct(2);"
value => default.product
%]
-[% INCLUDE "search/field.html.tmpl"
+[% INCLUDE "search/field.html.tmpl"
field => bug_fields.component
accesskey => "m"
value => default.component
%]
-[% INCLUDE "search/field.html.tmpl"
+[% INCLUDE "search/field.html.tmpl"
field => bug_fields.bug_status
accesskey => "a"
value => default.bug_status
%]
-[% INCLUDE "search/field.html.tmpl"
+[% INCLUDE "search/field.html.tmpl"
field => bug_fields.resolution
- accesskey => "r"
+ accesskey => "r"
value => default.resolution
%]
@@ -193,14 +193,14 @@ TUI_hide_default('information_query');
<a href="javascript:TUI_toggle_class('information_query')">
Detailed [% terms.Bug %] Information
</a>
- <span class="section_help">Narrow results by the following fields:
- [%+ field_descs.longdesc FILTER html %]s, [%+ field_descs.bug_file_loc FILTER html %],
+ <span class="section_help">Narrow results by the following fields:
+ [%+ field_descs.longdesc FILTER html %]s, [%+ field_descs.bug_file_loc FILTER html %],
[% IF Param('usestatuswhiteboard') %] [%+ field_descs.status_whiteboard FILTER html %], [%+ END %]
[% IF use_keywords %] [%+ field_descs.keywords FILTER html %], [%+ END %]
[% IF user.is_timetracker %] [%+ field_descs.deadline FILTER html %], [%+ END %]
- [% terms.Bug %] Numbers, [%+ field_descs.version FILTER html %],
+ [% terms.Bug %] Numbers, [%+ field_descs.version FILTER html %],
[% IF Param('usetargetmilestone') %] [%+ field_descs.target_milestone FILTER html %], [%+ END %]
- [% field_descs.bug_severity FILTER html %], [%+ field_descs.priority FILTER html %], [%+ field_descs.rep_platform FILTER html %],
+ [% field_descs.bug_severity FILTER html %], [%+ field_descs.priority FILTER html %], [%+ field_descs.rep_platform FILTER html %],
[%+ field_descs.op_sys FILTER html %]
</span>
</div>
@@ -210,22 +210,22 @@ TUI_hide_default('information_query');
{ field => bug_fields.longdesc, accesskey => 'c' },
{ field => bug_fields.bug_file_loc, accesskey => 'u' },
{ field => bug_fields.status_whiteboard, accesskey => 'w' },
- { field => bug_fields.keywords, accesskey => 'k',
- qtypes => ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'] }
+ { field => bug_fields.keywords, accesskey => 'k',
+ qtypes => ['allwords', 'anywords', 'nowords', 'regexp', 'notregexp'] }
] %]
[% Hook.process('before_freetext_fields') %]
-
+
[%# loop through a bunch of free text fields and print out their text stuff %]
[% FOREACH field_container = freetext_fields %]
- [% NEXT IF field_container.field.name == 'status_whiteboard'
- AND NOT Param('usestatuswhiteboard')
+ [% NEXT IF field_container.field.name == 'status_whiteboard'
+ AND NOT Param('usestatuswhiteboard')
%]
- [% NEXT IF field_container.field.name == 'keywords'
+ [% NEXT IF field_container.field.name == 'keywords'
AND NOT use_keywords
%]
<div class="search_field_row">
[% type = field_container.field.name _ "_type" %]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => field_container.field
types => field_container.qtypes || query_types
accesskey => field_container.accesskey
@@ -238,8 +238,8 @@ TUI_hide_default('information_query');
[%# Deadline %]
[% IF user.is_timetracker %]
<div class="search_field_row">
- [% INCLUDE "search/field.html.tmpl"
- field = bug_fields.deadline
+ [% INCLUDE "search/field.html.tmpl"
+ field = bug_fields.deadline
accesskey = "l"
value = [ default.deadlinefrom.0, default.deadlineto.0 ]
%]
@@ -253,7 +253,7 @@ TUI_hide_default('information_query');
value="[% default.bug_id.0 FILTER html %]" size="20">
<div class="field_help">(comma-separated list)</div>
</div>
- should be
+ should be
<select name="bug_id_type" id="bug_id_type">
<option value="anyexact"[% " selected" IF default.bug_id_type.0 == "anyexact" %]>only included in</option>
<option value="nowords"[% " selected" IF default.bug_id_type.0 == "nowords" %]>excluded from</option>
@@ -261,44 +261,44 @@ TUI_hide_default('information_query');
</div>
[% Hook.process('after_freetext_fields') %]
-
+
[%# *** Status Resolution Severity Priority Hardware OS *** %]
<div>
[% Hook.process('before_selects_bottom') %]
[% fake_version_field = { name => bug_fields.version.name,
type => constants.FIELD_TYPE_SINGLE_SELECT }%]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => fake_version_field
value => default.version
- %]
+ %]
[% IF Param('usetargetmilestone') %]
- [% fake_target_milestone_field = { name => bug_fields.target_milestone.name ,
+ [% fake_target_milestone_field = { name => bug_fields.target_milestone.name ,
type => constants.FIELD_TYPE_SINGLE_SELECT } %]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => fake_target_milestone_field
value => default.target_milestone
%]
[% END %]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => bug_fields.bug_severity
- accesskey=> "v"
+ accesskey=> "v"
value => default.bug_severity
%]
- [% INCLUDE "search/field.html.tmpl"
+ [% INCLUDE "search/field.html.tmpl"
field => bug_fields.priority
accesskey => "i"
value => default.priority
- %]
- [% INCLUDE "search/field.html.tmpl"
- field => bug_fields.rep_platform
+ %]
+ [% INCLUDE "search/field.html.tmpl"
+ field => bug_fields.rep_platform
accesskey =>"h"
value => default.rep_platform
- %]
- [% INCLUDE "search/field.html.tmpl"
- field => bug_fields.op_sys
+ %]
+ [% INCLUDE "search/field.html.tmpl"
+ field => bug_fields.op_sys
accesskey =>"o"
value => default.op_sys
- %]
+ %]
[% Hook.process('after_selects_bottom') %]
</div>
</div>
@@ -318,14 +318,14 @@ TUI_hide_default('information_query');
[% PROCESS role_types field = { count => n, name => "emailassigned_to",
label=> "the ${terms.Bug} ${field_descs.assigned_to}" } %]
[% PROCESS role_types field = { count => n, name => "emailreporter",
- label=> "the ${field_descs.reporter}" } %]
+ label=> "the ${field_descs.reporter}" } %]
[% IF Param('useqacontact') %]
- [% PROCESS role_types field = { count => n, name => "emailqa_contact",
+ [% PROCESS role_types field = { count => n, name => "emailqa_contact",
label=> "the ${field_descs.qa_contact}" } %]
[% END %]
- [% PROCESS role_types field = { count => n, name => "emailcc",
+ [% PROCESS role_types field = { count => n, name => "emailcc",
label=> "a ${field_descs.cc} list member" } %]
- [% PROCESS role_types field = { count => n, name => "emaillongdesc",
+ [% PROCESS role_types field = { count => n, name => "emaillongdesc",
label=> " a ${field_descs.commenter}" } %]
[% PROCESS role_types field = { count => n, name => "emailbug_mentor",
label => " a ${field_descs.bug_mentor}" } %]
@@ -379,15 +379,15 @@ TUI_hide_default('information_query');
</li>
<li>
<label for="chfieldfrom">between:</label>
- <input name="chfieldfrom" id="chfieldfrom" size="10"
- value="[% default.chfieldfrom.0 FILTER html %]" onchange="updateCalendarFromField(this)">
+ <input name="chfieldfrom" id="chfieldfrom" size="10"
+ value="[% default.chfieldfrom.0 FILTER html %]" onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_chfieldfrom"
onclick="showCalendar('chfieldfrom')"><span>Calendar</span></button>
- and
+ and
<div id="con_calendar_chfieldfrom"></div>
- <input name="chfieldto" size="10" id="chfieldto"
- value="[% default.chfieldto.0 || "Now" FILTER html %]"
+ <input name="chfieldto" size="10" id="chfieldto"
+ value="[% default.chfieldto.0 || "Now" FILTER html %]"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button"
id="button_calendar_chfieldto"
@@ -398,7 +398,7 @@ TUI_hide_default('information_query');
createCalendar('chfieldfrom');
createCalendar('chfieldto');
</script>
- </li>
+ </li>
</ul>
[%############################################################################%]
diff --git a/template/en/default/search/knob.html.tmpl b/template/en/default/search/knob.html.tmpl
index e20822bf5..f5e317bc6 100644
--- a/template/en/default/search/knob.html.tmpl
+++ b/template/en/default/search/knob.html.tmpl
@@ -23,12 +23,12 @@
[%# INTERFACE:
# (incomplete!)
# ...
- # known_name: string. Possibly known stored name for the query being
+ # known_name: string. Possibly known stored name for the query being
# edited. This value is just passed through in a
# hidden field.
#%]
-
-
+
+
[% PROCESS global/variables.none.tmpl %]
[%# This is not necessary for English templates, but useful for localizers. %]
@@ -55,7 +55,7 @@
</select>
</p>
-<p>
+<p>
<input type="submit" id="[% button_name FILTER html %]"
value="[% button_name FILTER html %]">
[% IF known_name %]
@@ -81,7 +81,7 @@
</label>
</p>
[% END %]
-
+
[% IF userdefaultquery %]
<p>
<a href="query.cgi?nukedefaultquery=1&amp;token=
diff --git a/template/en/default/search/search-create-series.html.tmpl b/template/en/default/search/search-create-series.html.tmpl
index e0b7ff562..ec88fb038 100644
--- a/template/en/default/search/search-create-series.html.tmpl
+++ b/template/en/default/search/search-create-series.html.tmpl
@@ -30,28 +30,28 @@
var queryform = "chartform";
[% END %]
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
title = "Create New Data Set"
generate_api_token = 1
onload = "doOnSelectProduct(0);"
- javascript = js_data
+ javascript = js_data
javascript_urls = [ "js/util.js", "js/productform.js", "js/TUI.js", "js/field.js" ]
style_urls = [ "skins/standard/search_form.css" ]
doc_section = "reporting.html#charts-new-series"
%]
<form method="get" action="chart.cgi" name="chartform">
-
+
[% PROCESS search/form.html.tmpl %]
<p>
<input type="submit" id="action-search" name="action-search" value="Run Search">
to see which [% terms.bugs %] would be included in this data set.
</p>
-
+
<h3>Data Set Parameters</h3>
-
-[% PROCESS reports/series.html.tmpl
+
+[% PROCESS reports/series.html.tmpl
button_name = "Create Data Set" %]
<input type="hidden" name="action" value="create">
<input type="hidden" name="token" value="[% issue_hash_token(['create-series']) FILTER html %]">
@@ -61,7 +61,7 @@
catSelected();
checkNewState();
</script>
-
+
<hr>
[% PROCESS "search/boolean-charts.html.tmpl" %]
diff --git a/template/en/default/search/search-instant.html.tmpl b/template/en/default/search/search-instant.html.tmpl
index ed3942166..95d40a5eb 100644
--- a/template/en/default/search/search-instant.html.tmpl
+++ b/template/en/default/search/search-instant.html.tmpl
@@ -8,12 +8,7 @@
[% PROCESS global/variables.none.tmpl %]
-[% javascript_urls = [ 'js/instant-search.js' ] %]
-[% IF has_extension('GuidedBugEntry') %]
- [% javascript_urls.import(['extensions/GuidedBugEntry/web/js/products.js']); %]
-[% END %]
-
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
title = "Instant Search"
generate_api_token = 1
javascript_urls = javascript_urls
diff --git a/template/en/default/search/search-report-graph.html.tmpl b/template/en/default/search/search-report-graph.html.tmpl
index 57ca8a8e9..d88695284 100644
--- a/template/en/default/search/search-report-graph.html.tmpl
+++ b/template/en/default/search/search-report-graph.html.tmpl
@@ -42,7 +42,7 @@ var queryform = "reportform"
[% PROCESS "search/search-report-select.html.tmpl" %]
<p>
- Choose one or more fields as your axes, and then refine your set of
+ Choose one or more fields as your axes, and then refine your set of
[% terms.bugs %] using the rest of the form.
</p>
diff --git a/template/en/default/search/search-report-select.html.tmpl b/template/en/default/search/search-report-select.html.tmpl
index 44425898a..2eb7b797d 100644
--- a/template/en/default/search/search-report-select.html.tmpl
+++ b/template/en/default/search/search-report-select.html.tmpl
@@ -30,12 +30,12 @@
<select name="[% name FILTER html %]">
<option value="">&lt;none&gt;</option>
-
+
[% FOREACH field = report_columns.keys.sort %]
[% NEXT IF field == "classification" AND !Param('useclassification') %]
[% NEXT IF field == "target_milestone" AND !Param('usetargetmilestone') %]
[% NEXT IF field == "qa_contact" AND !Param('useqacontact') %]
- <option value="[% field FILTER html %]"
+ <option value="[% field FILTER html %]"
[% " selected" IF default.$name.0 == field %]>
[% field_descs.$field || field FILTER html %]</option>
[% END %]
diff --git a/template/en/default/search/search-report-table.html.tmpl b/template/en/default/search/search-report-table.html.tmpl
index 7ac4ac5a0..08c6523fe 100644
--- a/template/en/default/search/search-report-table.html.tmpl
+++ b/template/en/default/search/search-report-table.html.tmpl
@@ -42,7 +42,7 @@ var queryform = "reportform"
[% PROCESS "search/search-report-select.html.tmpl" %]
<p>
- Choose one or more fields as your axes, and then refine your set of
+ Choose one or more fields as your axes, and then refine your set of
[% terms.bugs %] using the rest of the form.
</p>
diff --git a/template/en/default/search/search-specific.html.tmpl b/template/en/default/search/search-specific.html.tmpl
index be314101f..704fcbc32 100644
--- a/template/en/default/search/search-specific.html.tmpl
+++ b/template/en/default/search/search-specific.html.tmpl
@@ -20,7 +20,7 @@
[% PROCESS global/variables.none.tmpl %]
-[% PROCESS global/header.html.tmpl
+[% PROCESS global/header.html.tmpl
title = "Simple Search"
style_urls = [ "skins/standard/search_form.css" ]
%]
@@ -28,7 +28,7 @@
[% WRAPPER search/tabs.html.tmpl %]
<p>
-Find a specific [% terms.bug %] by entering words that describe it.
+Find a specific [% terms.bug %] by entering words that describe it.
[% terms.Bugzilla %] will search [% terms.bug %] descriptions and comments
for those words and return a list of matching [% terms.bugs %] sorted
by relevance.
@@ -54,7 +54,7 @@ for "crash secure SSL flash".
{ name = 'closed', label = "Closed" },
{ name = 'all', label = "All" } ] %]
[% FOREACH status = statuses %]
- <option value="__[% status.name %]__"
+ <option value="__[% status.name %]__"
[% " selected" IF default.bug_status.0 == "__${status.name}__" %]>
[% status.label FILTER html %]
</option>
@@ -114,7 +114,7 @@ for "crash secure SSL flash".
<tr>
<td></td>
<td>
-
+
[% IF Param('search_allow_no_criteria') %]
<input type="submit" id="search" value="Search">
[% ELSE %]
diff --git a/template/en/default/search/tabs.html.tmpl b/template/en/default/search/tabs.html.tmpl
index 26ad4f39b..74ab0ca5b 100644
--- a/template/en/default/search/tabs.html.tmpl
+++ b/template/en/default/search/tabs.html.tmpl
@@ -29,8 +29,8 @@
{ name => 'specific', label => "Simple Search",
link => "query.cgi?format=specific" },
{ name => 'advanced', label => "Advanced Search",
- link => "query.cgi?format=advanced" },
- { name => 'google', label => 'Google Search',
+ link => "query.cgi?format=advanced" },
+ { name => 'google', label => 'Google Search',
link => "query.cgi?format=google" } ]
current_tab_name = query_format || format || "advanced"
%]
diff --git a/template/en/default/search/type-select.html.tmpl b/template/en/default/search/type-select.html.tmpl
index 6da88202e..dc261565e 100644
--- a/template/en/default/search/type-select.html.tmpl
+++ b/template/en/default/search/type-select.html.tmpl
@@ -14,12 +14,12 @@
# University Foundation. Portions created by the Initial Developer are
# Copyright (C) 2008 the Initial Developer. All Rights Reserved.
#
- # Contributor(s):
+ # Contributor(s):
# Max Kanat-Alexander <mkanat@bugzilla.org>
#%]
[% PROCESS "global/field-descs.none.tmpl" %]
-
+
<select name="[% name FILTER html %]" title="Search type"
class="[% class FILTER css_class_quote %]">
[% FOREACH type = types %]
diff --git a/template/en/default/whine/mail.html.tmpl b/template/en/default/whine/mail.html.tmpl
index a7bff5038..7f9e608ed 100644
--- a/template/en/default/whine/mail.html.tmpl
+++ b/template/en/default/whine/mail.html.tmpl
@@ -62,7 +62,7 @@
<tr>
<th align="left">ID</th>
<th align="left">Sev</th>
- <th align="left">Pri</th>
+ <th align="left">Pri</th>
<th align="left">Plt</th>
<th align="left">Assignee</th>
<th align="left">Status</th>
diff --git a/template/en/default/whine/schedule.html.tmpl b/template/en/default/whine/schedule.html.tmpl
index 245a3e4a9..c991ddfa1 100644
--- a/template/en/default/whine/schedule.html.tmpl
+++ b/template/en/default/whine/schedule.html.tmpl
@@ -391,7 +391,7 @@
%]
[% FOREACH option = options %]
- <option value="[% option.0 %]"
+ <option value="[% option.0 %]"
[%- IF val == option.0 +%] selected[% END %]>
[%- option.1 -%]
</option>
@@ -436,7 +436,7 @@
%]
[% FOREACH option = options %]
- <option value="[% option.0 %]"
+ <option value="[% option.0 %]"
[%- IF val == option.0 +%] selected[% END %]>
[%- option.1 -%]
</option>
diff --git a/testagent.cgi b/testagent.cgi
deleted file mode 100755
index a1c200e10..000000000
--- a/testagent.cgi
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/usr/bin/perl -T
-# -*- 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.
-#
-# Contributor(s): Joel Peshkin <bugreport@peshkin.net>
-
-# This script is used by servertest.pl to confirm that cgi scripts
-# are being run instead of shown. This script does not rely on database access
-# or correct params.
-
-use 5.10.1;
-use strict;
-use warnings;
-print "content-type:text/plain\n\n";
-print "OK " . ($::ENV{MOD_PERL} || "mod_cgi") . "\n";
-exit;
-
diff --git a/vagrant_support/bugzilla-push b/vagrant_support/bugzilla-push
index 995b0d44c..353a8be75 100755
--- a/vagrant_support/bugzilla-push
+++ b/vagrant_support/bugzilla-push
@@ -1,5 +1,5 @@
#!/bin/bash
-#
+#
# bugzilla-push This starts, stops, and restarts the Bugzilla push
# daemon, which manages syncronising bugzilla.mozilla.org and
# third party bugzilla installs.
@@ -35,9 +35,9 @@ USER=root
# specify it here.
OPTIONS=""
-# You can also override the configuration by creating a
+# You can also override the configuration by creating a
# /etc/sysconfig/bugzilla-queue file so that you don't
-# have to edit this script.
+# have to edit this script.
if [ -r /etc/sysconfig/$NAME ]; then
. /etc/sysconfig/$NAME
fi
diff --git a/vagrant_support/postfix/main.cf b/vagrant_support/postfix/main.cf
index 025a1d502..3abb279c4 100644
--- a/vagrant_support/postfix/main.cf
+++ b/vagrant_support/postfix/main.cf
@@ -66,7 +66,7 @@ mail_owner = postfix
#default_privs = nobody
# INTERNET HOST AND DOMAIN NAMES
-#
+#
# The myhostname parameter specifies the internet hostname of this
# mail system. The default is to use the fully-qualified domain name
# from gethostname(). $myhostname is used as a default value for many
@@ -83,7 +83,7 @@ mail_owner = postfix
#mydomain = domain.tld
# SENDING MAIL
-#
+#
# The myorigin parameter specifies the domain that locally-posted
# mail appears to come from. The default is to append $myhostname,
# which is fine for small sites. If you run a domain with multiple
@@ -184,7 +184,7 @@ mydestination = $myhostname, localhost.$mydomain, localhost
#
# - You define $mydestination domain recipients in files other than
# /etc/passwd, /etc/aliases, or the $virtual_alias_maps files.
-# For example, you define $mydestination domain recipients in
+# For example, you define $mydestination domain recipients in
# the $virtual_mailbox_maps files.
#
# - You redefine the local delivery agent in master.cf.
@@ -204,7 +204,7 @@ mydestination = $myhostname, localhost.$mydomain, localhost
# The right-hand side of the lookup tables is conveniently ignored.
# In the left-hand side, specify a bare username, an @domain.tld
# wild-card, or specify a user@domain.tld address.
-#
+#
#local_recipient_maps = unix:passwd.byname $alias_maps
#local_recipient_maps = proxy:unix:passwd.byname $alias_maps
#local_recipient_maps =
@@ -236,16 +236,16 @@ unknown_local_recipient_reject_code = 550
# clients in the same IP subnetworks as the local machine.
# On Linux, this does works correctly only with interfaces specified
# with the "ifconfig" command.
-#
+#
# Specify "mynetworks_style = class" when Postfix should "trust" SMTP
# clients in the same IP class A/B/C networks as the local machine.
# Don't do this with a dialup site - it would cause Postfix to "trust"
# your entire provider's network. Instead, specify an explicit
# mynetworks list by hand, as described below.
-#
+#
# Specify "mynetworks_style = host" when Postfix should "trust"
# only the local machine.
-#
+#
#mynetworks_style = class
#mynetworks_style = subnet
#mynetworks_style = host
@@ -274,7 +274,7 @@ unknown_local_recipient_reject_code = 550
# - from "untrusted" clients to destinations that match $relay_domains or
# subdomains thereof, except addresses with sender-specified routing.
# The default relay_domains value is $mydestination.
-#
+#
# In addition to the above, the Postfix SMTP server by default accepts mail
# that Postfix is final destination for:
# - destinations that match $inet_interfaces or $proxy_interfaces,
@@ -282,7 +282,7 @@ unknown_local_recipient_reject_code = 550
# - destinations that match $virtual_alias_domains,
# - destinations that match $virtual_mailbox_domains.
# These destinations do not need to be listed in $relay_domains.
-#
+#
# Specify a list of hosts or domains, /file/name patterns or type:name
# lookup tables, separated by commas and/or whitespace. Continue
# long lines by starting the next line with whitespace. A file name
@@ -327,7 +327,7 @@ unknown_local_recipient_reject_code = 550
# The right-hand side of the lookup tables is conveniently ignored.
# In the left-hand side, specify an @domain.tld wild-card, or specify
# a user@domain.tld address.
-#
+#
#relay_recipient_maps = hash:/etc/postfix/relay_recipients
# INPUT RATE CONTROL
@@ -336,15 +336,15 @@ unknown_local_recipient_reject_code = 550
# flow control. This feature is turned on by default, although it
# still needs further development (it's disabled on SCO UNIX due
# to an SCO bug).
-#
+#
# A Postfix process will pause for $in_flow_delay seconds before
# accepting a new message, when the message arrival rate exceeds the
# message delivery rate. With the default 100 SMTP server process
# limit, this limits the mail inflow to 100 messages a second more
# than the number of messages delivered per second.
-#
+#
# Specify 0 to disable the feature. Valid delays are 0..10.
-#
+#
#in_flow_delay = 1s
# ADDRESS REWRITING
@@ -374,7 +374,7 @@ unknown_local_recipient_reject_code = 550
# On systems with NIS, the default is to search the local alias
# database, then the NIS alias database. See aliases(5) for syntax
# details.
-#
+#
# If you change the alias database, run "postalias /etc/aliases" (or
# wherever your system stores the mail alias file), or simply run
# "newaliases" to build the necessary DBM or DB file.
@@ -417,7 +417,7 @@ alias_database = hash:/etc/aliases
#
#home_mailbox = Mailbox
#home_mailbox = Maildir/
-
+
# The mail_spool_directory parameter specifies the directory where
# UNIX-style mailboxes are kept. The default setting depends on the
# system type.
@@ -459,7 +459,7 @@ alias_database = hash:/etc/aliases
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
-# the main.cf file, otherwise the SMTP server will reject mail for
+# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#mailbox_transport = lmtp:unix:/var/lib/imap/socket/lmtp
@@ -482,7 +482,7 @@ alias_database = hash:/etc/aliases
# can be used to take advantage of the single instance message store
# capability of Cyrus. The concurrency limit can be used to control
# how many simultaneous LMTP sessions will be permitted to the Cyrus
-# message store.
+# message store.
#
# To use the old cyrus deliver program you have to set:
#mailbox_transport = cyrus
@@ -498,7 +498,7 @@ alias_database = hash:/etc/aliases
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must update the "local_recipient_maps" setting in
-# the main.cf file, otherwise the SMTP server will reject mail for
+# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#fallback_transport = lmtp:unix:/var/lib/imap/socket/lmtp
@@ -520,15 +520,15 @@ alias_database = hash:/etc/aliases
#
# NOTE: if you use this feature for accounts not in the UNIX password
# file, then you must specify "local_recipient_maps =" (i.e. empty) in
-# the main.cf file, otherwise the SMTP server will reject mail for
+# the main.cf file, otherwise the SMTP server will reject mail for
# non-UNIX accounts with "User unknown in local recipient table".
#
#luser_relay = $user@other.host
#luser_relay = $local@other.host
#luser_relay = admin+$local
-
+
# JUNK MAIL CONTROLS
-#
+#
# The controls listed here are only a very small subset. The file
# SMTPD_ACCESS_README provides an overview.
@@ -550,11 +550,11 @@ alias_database = hash:/etc/aliases
# deferred mail, so that mail can be flushed quickly with the SMTP
# "ETRN domain.tld" command, or by executing "sendmail -qRdomain.tld".
# See the ETRN_README document for a detailed description.
-#
+#
# The fast_flush_domains parameter controls what destinations are
# eligible for this service. By default, they are all domains that
# this server is willing to relay mail to.
-#
+#
#fast_flush_domains = $relay_domains
# SHOW SOFTWARE VERSION OR NOT
@@ -578,7 +578,7 @@ alias_database = hash:/etc/aliases
# too many are run at the same time. With SMTP deliveries, 10
# simultaneous connections to the same domain could be sufficient to
# raise eyebrows.
-#
+#
# Each message delivery transport has its XXX_destination_concurrency_limit
# parameter. The default is $default_destination_concurrency_limit for
# most delivery transports. For the local delivery agent the default is 2.
@@ -636,10 +636,10 @@ debugger_command =
# INSTALL-TIME CONFIGURATION INFORMATION
#
# The following parameters are used when installing a new Postfix version.
-#
+#
# sendmail_path: The full pathname of the Postfix sendmail command.
# This is the Sendmail-compatible mail posting interface.
-#
+#
sendmail_path = /usr/sbin/sendmail.postfix
# newaliases_path: The full pathname of the Postfix newaliases command.
@@ -649,7 +649,7 @@ newaliases_path = /usr/bin/newaliases.postfix
# mailq_path: The full pathname of the Postfix mailq command. This
# is the Sendmail-compatible mail queue listing command.
-#
+#
mailq_path = /usr/bin/mailq.postfix
# setgid_group: The group for mail submission and queue management
diff --git a/xmlrpc.cgi b/xmlrpc.cgi
index 07c1020aa..620187e5a 100755
--- a/xmlrpc.cgi
+++ b/xmlrpc.cgi
@@ -16,27 +16,43 @@ use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::WebService::Constants;
+use Capture::Tiny qw(capture_stdout);
+
BEGIN {
- if (!Bugzilla->feature('xmlrpc')) {
- ThrowCodeError('feature_disabled', { feature => 'xmlrpc' });
- }
+ if (!Bugzilla->feature('xmlrpc')) {
+ ThrowCodeError('feature_disabled', {feature => 'xmlrpc'});
+ }
}
use Bugzilla::WebService::Server::XMLRPC;
-Bugzilla->usage_mode(USAGE_MODE_XMLRPC);
+my $stdout = capture_stdout {
+ Bugzilla->usage_mode(USAGE_MODE_XMLRPC);
# Fix the error code that SOAP::Lite uses for Perl errors.
-local $SOAP::Constants::FAULT_SERVER;
-$SOAP::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL;
+ local $SOAP::Constants::FAULT_SERVER;
+ $SOAP::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL;
+
# The line above is used, this one is ignored, but SOAP::Lite
# might start using this constant (the correct one) for XML-RPC someday.
-local $XMLRPC::Constants::FAULT_SERVER;
-$XMLRPC::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL;
+ local $XMLRPC::Constants::FAULT_SERVER;
+ $XMLRPC::Constants::FAULT_SERVER = ERROR_UNKNOWN_FATAL;
+
+ local @INC = (bz_locations()->{extensionsdir}, @INC);
+ my $server = new Bugzilla::WebService::Server::XMLRPC;
-local @INC = (bz_locations()->{extensionsdir}, @INC);
-my $server = new Bugzilla::WebService::Server::XMLRPC;
# We use a sub for on_action because that gets us the info about what
# class is being called. Note that this is a hack--this is technically
# for setting SOAPAction, which isn't used by XML-RPC.
-$server->on_action(sub { $server->handle_login(WS_DISPATCH, @_) })
- ->handle();
+ $server->on_action(sub { $server->handle_login(WS_DISPATCH, @_) })->handle();
+};
+my $C = $Bugzilla::Quantum::CGI::C;
+my ($header_str, $body) = split(/(?:\r\n\r\n|\n\n)/, $stdout, 2);
+my $headers = Mojo::Headers->new;
+$headers->parse("$header_str\r\n\r\n");
+foreach my $name (@{$headers->names}) {
+ $C->res->headers->header($name => $headers->header($name));
+}
+my ($code) = $headers->header('Status') =~ /^(\d+)/;
+$C->res->code($code) if $code;
+$C->write($body);
+exit;