summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2018-09-11 16:12:26 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2018-09-11 16:12:39 +0000
commit7f9a0af2d4a4e9c952a4a0aa8c1a4e1066262642 (patch)
tree517c6778884253231e69e612a62df73418fe60c3
parentReleasing progress-linux version 4.4.2-2~dschinn1. (diff)
downloadrequest-tracker4-7f9a0af2d4a4e9c952a4a0aa8c1a4e1066262642.zip
request-tracker4-7f9a0af2d4a4e9c952a4a0aa8c1a4e1066262642.tar.xz
Merging upstream version 4.4.3.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.tag2
-rw-r--r--Makefile13
-rw-r--r--Makefile.in3
-rw-r--r--README3
-rwxr-xr-xbin/rt2
-rwxr-xr-xbin/rt-crontool2
-rw-r--r--bin/rt-crontool.in2
-rwxr-xr-xbin/rt-mailgate4
-rw-r--r--bin/rt-mailgate.in2
-rw-r--r--bin/rt.in2
-rwxr-xr-xconfigure25
-rwxr-xr-xconfigure.ac1
-rwxr-xr-xdevel/tools/change-loc-msgstr2
-rwxr-xr-xdevel/tools/cmd-boilerplate2
-rwxr-xr-xdevel/tools/css_tidy2
-rwxr-xr-xdevel/tools/extract-message-catalog258
-rwxr-xr-xdevel/tools/license_tag4
-rwxr-xr-xdevel/tools/rt-apache2
-rwxr-xr-xdevel/tools/rt-attributes-editor2
-rwxr-xr-xdevel/tools/rt-message-catalog2
-rwxr-xr-xdevel/tools/rt-parse-mail-log2
-rwxr-xr-xdevel/tools/rt-static-docs5
-rwxr-xr-xdevel/tools/tweak-template-locstring2
-rw-r--r--docs/UPGRADING-4.420
-rw-r--r--docs/backups.pod47
-rw-r--r--docs/charts.pod7
-rw-r--r--docs/customizing/templates.pod28
-rw-r--r--docs/customizing/timezones_in_charts.pod25
-rw-r--r--docs/full_text_indexing.pod16
-rw-r--r--docs/hacking.pod14
-rw-r--r--docs/network-diagram.svg2
-rw-r--r--docs/query_builder.pod12
-rw-r--r--docs/security.pod8
-rw-r--r--docs/writing_portlets.pod2
-rw-r--r--etc/RT_Config.pm61
-rw-r--r--etc/RT_Config.pm.in61
-rwxr-xr-xetc/upgrade/3.8-ical-extension2
-rw-r--r--etc/upgrade/3.8-ical-extension.in2
-rwxr-xr-xetc/upgrade/4.0-customfield-checkbox-extension2
-rw-r--r--etc/upgrade/4.0-customfield-checkbox-extension.in2
-rwxr-xr-xetc/upgrade/generate-rtaddressregexp2
-rw-r--r--etc/upgrade/generate-rtaddressregexp.in2
-rwxr-xr-xetc/upgrade/sanity-check-stylesheets2
-rw-r--r--etc/upgrade/sanity-check-stylesheets.in2
-rwxr-xr-xetc/upgrade/shrink-cgm-table2
-rw-r--r--etc/upgrade/shrink-cgm-table.in2
-rwxr-xr-xetc/upgrade/shrink-transactions-table2
-rw-r--r--etc/upgrade/shrink-transactions-table.in2
-rwxr-xr-xetc/upgrade/switch-templates-to2
-rw-r--r--etc/upgrade/switch-templates-to.in2
-rwxr-xr-xetc/upgrade/time-worked-history2
-rw-r--r--etc/upgrade/time-worked-history.in2
-rwxr-xr-xetc/upgrade/upgrade-articles2
-rw-r--r--etc/upgrade/upgrade-articles.in2
-rwxr-xr-xetc/upgrade/upgrade-assets2
-rw-r--r--etc/upgrade/upgrade-assets.in2
-rwxr-xr-xetc/upgrade/upgrade-mysql-schema.pl2
-rwxr-xr-xetc/upgrade/upgrade-sla2
-rw-r--r--etc/upgrade/upgrade-sla.in2
-rwxr-xr-xetc/upgrade/vulnerable-passwords2
-rw-r--r--etc/upgrade/vulnerable-passwords.in2
-rw-r--r--lib/RT.pm20
-rw-r--r--lib/RT/ACE.pm2
-rw-r--r--lib/RT/ACL.pm2
-rw-r--r--lib/RT/Action.pm2
-rw-r--r--lib/RT/Action/AddPriority.pm2
-rw-r--r--lib/RT/Action/AutoOpen.pm2
-rw-r--r--lib/RT/Action/AutoOpenInactive.pm2
-rw-r--r--lib/RT/Action/Autoreply.pm2
-rw-r--r--lib/RT/Action/CreateTickets.pm2
-rw-r--r--lib/RT/Action/EscalatePriority.pm2
-rw-r--r--lib/RT/Action/ExtractSubjectTag.pm2
-rw-r--r--lib/RT/Action/LinearEscalate.pm10
-rw-r--r--lib/RT/Action/Notify.pm16
-rw-r--r--lib/RT/Action/NotifyAsComment.pm2
-rw-r--r--lib/RT/Action/NotifyGroup.pm19
-rw-r--r--lib/RT/Action/NotifyGroupAsComment.pm8
-rw-r--r--lib/RT/Action/NotifyOwnerOrAdminCc.pm2
-rw-r--r--lib/RT/Action/OpenOnStarted.pm2
-rw-r--r--lib/RT/Action/RecordComment.pm2
-rw-r--r--lib/RT/Action/RecordCorrespondence.pm2
-rw-r--r--lib/RT/Action/SLA.pm2
-rw-r--r--lib/RT/Action/SLA_SetDue.pm2
-rw-r--r--lib/RT/Action/SLA_SetStarts.pm2
-rw-r--r--lib/RT/Action/SendEmail.pm2
-rw-r--r--lib/RT/Action/SendForward.pm2
-rw-r--r--lib/RT/Action/SetCustomFieldToNow.pm2
-rw-r--r--lib/RT/Action/SetPriority.pm2
-rw-r--r--lib/RT/Action/SetStatus.pm2
-rw-r--r--lib/RT/Action/UpdateParentTimeWorked.pm8
-rw-r--r--lib/RT/Action/UserDefined.pm2
-rw-r--r--lib/RT/Approval.pm2
-rw-r--r--lib/RT/Approval/Rule.pm2
-rw-r--r--lib/RT/Approval/Rule/Created.pm2
-rw-r--r--lib/RT/Approval/Rule/NewPending.pm2
-rw-r--r--lib/RT/Approval/Rule/Passed.pm2
-rw-r--r--lib/RT/Approval/Rule/Rejected.pm2
-rw-r--r--lib/RT/Article.pm2
-rw-r--r--lib/RT/Articles.pm2
-rw-r--r--lib/RT/Asset.pm28
-rw-r--r--lib/RT/Assets.pm2
-rw-r--r--lib/RT/Attachment.pm2
-rw-r--r--lib/RT/Attachments.pm2
-rw-r--r--lib/RT/Attribute.pm4
-rw-r--r--lib/RT/Attributes.pm2
-rw-r--r--lib/RT/Authen/ExternalAuth.pm2
-rw-r--r--lib/RT/Authen/ExternalAuth/DBI.pm2
-rw-r--r--lib/RT/Authen/ExternalAuth/DBI/Cookie.pm2
-rw-r--r--lib/RT/Authen/ExternalAuth/LDAP.pm2
-rw-r--r--lib/RT/Base.pm2
-rw-r--r--lib/RT/CachedGroupMember.pm2
-rw-r--r--lib/RT/CachedGroupMembers.pm2
-rw-r--r--lib/RT/Catalog.pm55
-rw-r--r--lib/RT/Catalogs.pm2
-rw-r--r--lib/RT/Class.pm2
-rw-r--r--lib/RT/Classes.pm2
-rw-r--r--lib/RT/Condition.pm2
-rw-r--r--lib/RT/Condition/AnyTransaction.pm2
-rw-r--r--lib/RT/Condition/BeforeDue.pm2
-rw-r--r--lib/RT/Condition/CloseTicket.pm2
-rw-r--r--lib/RT/Condition/Overdue.pm2
-rw-r--r--lib/RT/Condition/OwnerChange.pm2
-rw-r--r--lib/RT/Condition/PriorityChange.pm2
-rw-r--r--lib/RT/Condition/PriorityExceeds.pm2
-rw-r--r--lib/RT/Condition/QueueChange.pm2
-rw-r--r--lib/RT/Condition/ReopenTicket.pm2
-rw-r--r--lib/RT/Condition/SLA.pm2
-rw-r--r--lib/RT/Condition/SLA_RequireDueSet.pm2
-rw-r--r--lib/RT/Condition/SLA_RequireStartsSet.pm2
-rw-r--r--lib/RT/Condition/StatusChange.pm2
-rw-r--r--lib/RT/Condition/TimeWorkedChange.pm8
-rw-r--r--lib/RT/Condition/UserDefined.pm2
-rw-r--r--lib/RT/Config.pm44
-rw-r--r--lib/RT/Crypt.pm2
-rw-r--r--lib/RT/Crypt/GnuPG.pm2
-rw-r--r--lib/RT/Crypt/GnuPG/CRLFHandle.pm2
-rw-r--r--lib/RT/Crypt/Role.pm2
-rw-r--r--lib/RT/Crypt/SMIME.pm2
-rw-r--r--lib/RT/CurrentUser.pm2
-rw-r--r--lib/RT/CustomField.pm2
-rw-r--r--lib/RT/CustomFieldValue.pm2
-rw-r--r--lib/RT/CustomFieldValues.pm2
-rw-r--r--lib/RT/CustomFieldValues/Canonicalizer.pm2
-rw-r--r--lib/RT/CustomFieldValues/Canonicalizer/Lowercase.pm2
-rw-r--r--lib/RT/CustomFieldValues/Canonicalizer/Uppercase.pm2
-rw-r--r--lib/RT/CustomFieldValues/External.pm2
-rw-r--r--lib/RT/CustomFieldValues/Groups.pm2
-rw-r--r--lib/RT/CustomFields.pm2
-rw-r--r--lib/RT/CustomRole.pm2
-rw-r--r--lib/RT/CustomRoles.pm2
-rw-r--r--lib/RT/Dashboard.pm2
-rw-r--r--lib/RT/Dashboard/Mailer.pm2
-rw-r--r--lib/RT/Dashboards.pm2
-rw-r--r--lib/RT/Date.pm2
-rw-r--r--lib/RT/DependencyWalker.pm2
-rw-r--r--lib/RT/DependencyWalker/FindDependencies.pm2
-rw-r--r--lib/RT/EmailParser.pm72
-rw-r--r--lib/RT/ExternalStorage.pm2
-rw-r--r--lib/RT/ExternalStorage/AmazonS3.pm2
-rw-r--r--lib/RT/ExternalStorage/Backend.pm2
-rw-r--r--lib/RT/ExternalStorage/Disk.pm2
-rw-r--r--lib/RT/ExternalStorage/Dropbox.pm2
-rw-r--r--lib/RT/Generated.pm4
-rw-r--r--lib/RT/Generated.pm.in2
-rw-r--r--lib/RT/Graph/Tickets.pm2
-rw-r--r--lib/RT/Group.pm58
-rw-r--r--lib/RT/GroupMember.pm2
-rw-r--r--lib/RT/GroupMembers.pm8
-rw-r--r--lib/RT/Groups.pm2
-rw-r--r--lib/RT/Handle.pm2
-rw-r--r--lib/RT/I18N.pm3
-rw-r--r--lib/RT/I18N/Extract.pm280
-rw-r--r--lib/RT/I18N/cs.pm2
-rw-r--r--lib/RT/I18N/de.pm2
-rw-r--r--lib/RT/I18N/fr.pm2
-rw-r--r--lib/RT/I18N/i_default.pm2
-rw-r--r--lib/RT/I18N/ru.pm2
-rw-r--r--lib/RT/Installer.pm2
-rw-r--r--lib/RT/Interface/CLI.pm2
-rw-r--r--lib/RT/Interface/Email.pm10
-rw-r--r--lib/RT/Interface/Email/Action/Defaults.pm2
-rw-r--r--lib/RT/Interface/Email/Action/Resolve.pm2
-rw-r--r--lib/RT/Interface/Email/Action/Take.pm2
-rw-r--r--lib/RT/Interface/Email/Auth/MailFrom.pm2
-rw-r--r--lib/RT/Interface/Email/Authz/Default.pm2
-rw-r--r--lib/RT/Interface/Email/Authz/RequireEncrypted.pm2
-rw-r--r--lib/RT/Interface/Email/Crypt.pm2
-rw-r--r--lib/RT/Interface/Email/Role.pm2
-rw-r--r--lib/RT/Interface/REST.pm2
-rw-r--r--lib/RT/Interface/Web.pm21
-rw-r--r--lib/RT/Interface/Web/Handler.pm4
-rw-r--r--lib/RT/Interface/Web/Menu.pm2
-rw-r--r--lib/RT/Interface/Web/Middleware/StaticHeaders.pm2
-rw-r--r--lib/RT/Interface/Web/QueryBuilder.pm2
-rw-r--r--lib/RT/Interface/Web/QueryBuilder/Tree.pm11
-rw-r--r--lib/RT/Interface/Web/Request.pm2
-rw-r--r--lib/RT/Interface/Web/Session.pm2
-rw-r--r--lib/RT/LDAPImport.pm26
-rw-r--r--lib/RT/Lifecycle.pm2
-rw-r--r--lib/RT/Lifecycle/Asset.pm2
-rw-r--r--lib/RT/Lifecycle/Ticket.pm2
-rw-r--r--lib/RT/Link.pm2
-rw-r--r--lib/RT/Links.pm2
-rw-r--r--lib/RT/Migrate.pm4
-rw-r--r--lib/RT/Migrate/Importer.pm2
-rw-r--r--lib/RT/Migrate/Importer/File.pm2
-rw-r--r--lib/RT/Migrate/Incremental.pm2
-rw-r--r--lib/RT/Migrate/Serializer.pm17
-rw-r--r--lib/RT/Migrate/Serializer/File.pm2
-rw-r--r--lib/RT/Migrate/Serializer/IncrementalRecord.pm2
-rw-r--r--lib/RT/Migrate/Serializer/IncrementalRecords.pm2
-rw-r--r--lib/RT/ObjectClass.pm2
-rw-r--r--lib/RT/ObjectClasses.pm2
-rw-r--r--lib/RT/ObjectCustomField.pm2
-rw-r--r--lib/RT/ObjectCustomFieldValue.pm49
-rw-r--r--lib/RT/ObjectCustomFieldValues.pm78
-rw-r--r--lib/RT/ObjectCustomFields.pm2
-rw-r--r--lib/RT/ObjectCustomRole.pm24
-rw-r--r--lib/RT/ObjectCustomRoles.pm2
-rw-r--r--lib/RT/ObjectScrip.pm2
-rw-r--r--lib/RT/ObjectScrips.pm2
-rw-r--r--lib/RT/ObjectTopic.pm2
-rw-r--r--lib/RT/ObjectTopics.pm2
-rw-r--r--lib/RT/PlackRunner.pm2
-rw-r--r--lib/RT/Plugin.pm5
-rw-r--r--lib/RT/Pod/HTML.pm38
-rw-r--r--lib/RT/Pod/HTMLBatch.pm2
-rw-r--r--lib/RT/Pod/Search.pm2
-rw-r--r--lib/RT/Principal.pm2
-rw-r--r--lib/RT/Principals.pm2
-rw-r--r--lib/RT/Queue.pm2
-rw-r--r--lib/RT/Queues.pm2
-rw-r--r--lib/RT/Record.pm6
-rw-r--r--lib/RT/Record/AddAndSort.pm2
-rw-r--r--lib/RT/Record/Role.pm2
-rw-r--r--lib/RT/Record/Role/Lifecycle.pm2
-rw-r--r--lib/RT/Record/Role/Links.pm2
-rw-r--r--lib/RT/Record/Role/Rights.pm2
-rw-r--r--lib/RT/Record/Role/Roles.pm2
-rw-r--r--lib/RT/Record/Role/Status.pm2
-rw-r--r--lib/RT/Reminders.pm2
-rw-r--r--lib/RT/Report/Tickets.pm2
-rw-r--r--lib/RT/Report/Tickets/Entry.pm2
-rw-r--r--lib/RT/Rule.pm2
-rw-r--r--lib/RT/Ruleset.pm2
-rw-r--r--lib/RT/SLA.pm2
-rw-r--r--lib/RT/SQL.pm2
-rw-r--r--lib/RT/SavedSearch.pm2
-rw-r--r--lib/RT/SavedSearches.pm2
-rw-r--r--lib/RT/Scrip.pm2
-rw-r--r--lib/RT/ScripAction.pm2
-rw-r--r--lib/RT/ScripActions.pm2
-rw-r--r--lib/RT/ScripCondition.pm2
-rw-r--r--lib/RT/ScripConditions.pm2
-rw-r--r--lib/RT/Scrips.pm2
-rw-r--r--lib/RT/Search.pm2
-rw-r--r--lib/RT/Search/ActiveTicketsInQueue.pm2
-rw-r--r--lib/RT/Search/FromSQL.pm2
-rw-r--r--lib/RT/Search/Simple.pm2
-rw-r--r--lib/RT/SearchBuilder.pm2
-rw-r--r--lib/RT/SearchBuilder/AddAndSort.pm2
-rw-r--r--lib/RT/SearchBuilder/Role.pm2
-rw-r--r--lib/RT/SearchBuilder/Role/Roles.pm2
-rw-r--r--lib/RT/SharedSetting.pm2
-rw-r--r--lib/RT/SharedSettings.pm2
-rw-r--r--lib/RT/Shredder.pm78
-rw-r--r--lib/RT/Shredder/Constants.pm2
-rw-r--r--lib/RT/Shredder/Dependencies.pm2
-rw-r--r--lib/RT/Shredder/Dependency.pm2
-rw-r--r--lib/RT/Shredder/Exceptions.pm2
-rw-r--r--lib/RT/Shredder/POD.pm2
-rw-r--r--lib/RT/Shredder/Plugin.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Attachments.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Base.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Base/Dump.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Base/Search.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Objects.pm2
-rw-r--r--lib/RT/Shredder/Plugin/SQLDump.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Summary.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Tickets.pm2
-rw-r--r--lib/RT/Shredder/Plugin/Users.pm2
-rw-r--r--lib/RT/Squish.pm2
-rw-r--r--lib/RT/Squish/CSS.pm2
-rw-r--r--lib/RT/Squish/JS.pm2
-rw-r--r--lib/RT/System.pm2
-rw-r--r--lib/RT/Template.pm2
-rw-r--r--lib/RT/Templates.pm2
-rw-r--r--lib/RT/Test.pm20
-rw-r--r--lib/RT/Test/Apache.pm2
-rw-r--r--lib/RT/Test/Assets.pm2
-rw-r--r--lib/RT/Test/Email.pm2
-rw-r--r--lib/RT/Test/ExternalStorage.pm2
-rw-r--r--lib/RT/Test/GnuPG.pm2
-rw-r--r--lib/RT/Test/SMIME.pm2
-rw-r--r--lib/RT/Test/Shredder.pm2
-rw-r--r--lib/RT/Test/Web.pm57
-rw-r--r--lib/RT/Ticket.pm54
-rw-r--r--lib/RT/Tickets.pm5
-rw-r--r--lib/RT/Topic.pm2
-rw-r--r--lib/RT/Topics.pm2
-rw-r--r--lib/RT/Transaction.pm2
-rw-r--r--lib/RT/Transactions.pm2
-rw-r--r--lib/RT/URI.pm2
-rw-r--r--lib/RT/URI/a.pm2
-rw-r--r--lib/RT/URI/asset.pm20
-rw-r--r--lib/RT/URI/base.pm2
-rw-r--r--lib/RT/URI/fsck_com_article.pm2
-rw-r--r--lib/RT/URI/fsck_com_rt.pm2
-rw-r--r--lib/RT/URI/t.pm2
-rw-r--r--lib/RT/User.pm2
-rw-r--r--lib/RT/Users.pm2
-rw-r--r--lib/RT/Util.pm28
-rwxr-xr-xsbin/rt-attributes-viewer2
-rw-r--r--sbin/rt-attributes-viewer.in2
-rwxr-xr-xsbin/rt-clean-sessions2
-rw-r--r--sbin/rt-clean-sessions.in2
-rwxr-xr-xsbin/rt-dump-metadata2
-rw-r--r--sbin/rt-dump-metadata.in2
-rwxr-xr-xsbin/rt-email-dashboards2
-rw-r--r--sbin/rt-email-dashboards.in2
-rwxr-xr-xsbin/rt-email-digest2
-rw-r--r--sbin/rt-email-digest.in2
-rwxr-xr-xsbin/rt-email-group-admin2
-rw-r--r--sbin/rt-email-group-admin.in2
-rwxr-xr-xsbin/rt-externalize-attachments111
-rw-r--r--sbin/rt-externalize-attachments.in111
-rwxr-xr-xsbin/rt-fulltext-indexer2
-rw-r--r--sbin/rt-fulltext-indexer.in2
-rwxr-xr-xsbin/rt-importer2
-rw-r--r--sbin/rt-importer.in2
-rwxr-xr-xsbin/rt-ldapimport2
-rw-r--r--sbin/rt-ldapimport.in2
-rwxr-xr-xsbin/rt-passwd131
-rw-r--r--sbin/rt-passwd.in131
-rwxr-xr-xsbin/rt-preferences-viewer2
-rw-r--r--sbin/rt-preferences-viewer.in2
-rwxr-xr-xsbin/rt-search-attributes2
-rwxr-xr-xsbin/rt-serializer21
-rw-r--r--sbin/rt-serializer.in21
-rwxr-xr-xsbin/rt-server4
-rwxr-xr-xsbin/rt-server.fcgi4
-rw-r--r--sbin/rt-server.in2
-rwxr-xr-xsbin/rt-session-viewer2
-rw-r--r--sbin/rt-session-viewer.in2
-rwxr-xr-xsbin/rt-setup-database2
-rw-r--r--sbin/rt-setup-database.in2
-rwxr-xr-xsbin/rt-setup-fulltext-index12
-rw-r--r--sbin/rt-setup-fulltext-index.in12
-rwxr-xr-xsbin/rt-shredder2
-rw-r--r--sbin/rt-shredder.in2
-rwxr-xr-xsbin/rt-test-dependencies17
-rw-r--r--sbin/rt-test-dependencies.in9
-rwxr-xr-xsbin/rt-validate-aliases2
-rw-r--r--sbin/rt-validate-aliases.in2
-rwxr-xr-xsbin/rt-validator4
-rw-r--r--sbin/rt-validator.in4
-rwxr-xr-xsbin/standalone_httpd4
-rw-r--r--share/html/Admin/Actions/Create.html2
-rw-r--r--share/html/Admin/Actions/Display.html2
-rw-r--r--share/html/Admin/Actions/Elements/EditBasics2
-rw-r--r--share/html/Admin/Actions/Elements/ShowBasics2
-rw-r--r--share/html/Admin/Actions/Modify.html2
-rw-r--r--share/html/Admin/Actions/autohandler2
-rw-r--r--share/html/Admin/Articles/Classes/CustomFields.html2
-rw-r--r--share/html/Admin/Articles/Classes/GroupRights.html2
-rw-r--r--share/html/Admin/Articles/Classes/Modify.html2
-rw-r--r--share/html/Admin/Articles/Classes/Objects.html2
-rw-r--r--share/html/Admin/Articles/Classes/Topics.html2
-rw-r--r--share/html/Admin/Articles/Classes/UserRights.html2
-rw-r--r--share/html/Admin/Articles/Classes/index.html2
-rw-r--r--share/html/Admin/Articles/Elements/Topics2
-rw-r--r--share/html/Admin/Articles/index.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/Create.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/CustomFields.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/DefaultValues.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/Elements/EditBasics2
-rw-r--r--share/html/Admin/Assets/Catalogs/GroupRights.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/Modify.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/Roles.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/UserRights.html2
-rw-r--r--share/html/Admin/Assets/Catalogs/index.html2
-rw-r--r--share/html/Admin/Assets/index.html2
-rw-r--r--share/html/Admin/Conditions/Create.html2
-rw-r--r--share/html/Admin/Conditions/Display.html2
-rw-r--r--share/html/Admin/Conditions/Elements/EditBasics2
-rw-r--r--share/html/Admin/Conditions/Elements/ShowBasics2
-rw-r--r--share/html/Admin/Conditions/Modify.html2
-rw-r--r--share/html/Admin/Conditions/autohandler2
-rw-r--r--share/html/Admin/CustomFields/GroupRights.html2
-rw-r--r--share/html/Admin/CustomFields/Modify.html2
-rw-r--r--share/html/Admin/CustomFields/Objects.html2
-rw-r--r--share/html/Admin/CustomFields/UserRights.html6
-rw-r--r--share/html/Admin/CustomFields/index.html2
-rw-r--r--share/html/Admin/CustomRoles/Modify.html2
-rw-r--r--share/html/Admin/CustomRoles/Objects.html2
-rw-r--r--share/html/Admin/CustomRoles/index.html2
-rw-r--r--share/html/Admin/Elements/AddCustomFieldValue2
-rw-r--r--share/html/Admin/Elements/ConfigureDashboardsInMenu2
-rw-r--r--share/html/Admin/Elements/ConfigureMyRT2
-rw-r--r--share/html/Admin/Elements/EditActions2
-rw-r--r--share/html/Admin/Elements/EditConditions2
-rw-r--r--share/html/Admin/Elements/EditCustomField2
-rw-r--r--share/html/Admin/Elements/EditCustomFieldValues2
-rw-r--r--share/html/Admin/Elements/EditCustomFieldValuesCanonicalizer2
-rw-r--r--share/html/Admin/Elements/EditCustomFieldValuesSource2
-rw-r--r--share/html/Admin/Elements/EditCustomFields2
-rw-r--r--share/html/Admin/Elements/EditQueueWatcherGroup2
-rw-r--r--share/html/Admin/Elements/EditQueueWatchers2
-rw-r--r--share/html/Admin/Elements/EditRights2
-rw-r--r--share/html/Admin/Elements/EditRightsCategoryTabs2
-rw-r--r--share/html/Admin/Elements/EditScrips2
-rw-r--r--share/html/Admin/Elements/EditTemplates2
-rw-r--r--share/html/Admin/Elements/Header2
-rw-r--r--share/html/Admin/Elements/LoggingSummary2
-rw-r--r--share/html/Admin/Elements/MembershipsPage2
-rw-r--r--share/html/Admin/Elements/ModifyTemplate2
-rw-r--r--share/html/Admin/Elements/Portal2
-rw-r--r--share/html/Admin/Elements/SelectCustomField2
-rw-r--r--share/html/Admin/Elements/SelectCustomFieldLookupType2
-rw-r--r--share/html/Admin/Elements/SelectCustomFieldRenderType2
-rw-r--r--share/html/Admin/Elements/SelectCustomFieldType2
-rw-r--r--share/html/Admin/Elements/SelectGroups2
-rw-r--r--share/html/Admin/Elements/SelectNewGroupMembers2
-rw-r--r--share/html/Admin/Elements/SelectScripAction2
-rw-r--r--share/html/Admin/Elements/SelectScripCondition2
-rw-r--r--share/html/Admin/Elements/SelectStage2
-rw-r--r--share/html/Admin/Elements/SelectStageForAdded2
-rw-r--r--share/html/Admin/Elements/SelectUsers2
-rw-r--r--share/html/Admin/Elements/ShowKeyInfo2
-rw-r--r--share/html/Admin/Elements/UpgradeHistory2
-rw-r--r--share/html/Admin/Elements/UpgradeHistoryRow2
-rw-r--r--share/html/Admin/Global/Actions.html2
-rw-r--r--share/html/Admin/Global/Conditions.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Catalog-Assets.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Class-Article.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Groups.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Queue-Tickets.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Queue-Transactions.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Queues.html2
-rw-r--r--share/html/Admin/Global/CustomFields/Users.html2
-rw-r--r--share/html/Admin/Global/CustomFields/index.html2
-rw-r--r--share/html/Admin/Global/DashboardsInMenu.html2
-rw-r--r--share/html/Admin/Global/GroupRights.html2
-rw-r--r--share/html/Admin/Global/MyRT.html2
-rw-r--r--share/html/Admin/Global/Scrips.html2
-rw-r--r--share/html/Admin/Global/Template.html2
-rw-r--r--share/html/Admin/Global/Templates.html2
-rw-r--r--share/html/Admin/Global/Topics.html2
-rw-r--r--share/html/Admin/Global/UserRights.html2
-rw-r--r--share/html/Admin/Global/index.html2
-rw-r--r--share/html/Admin/Groups/GroupRights.html2
-rw-r--r--share/html/Admin/Groups/History.html2
-rw-r--r--share/html/Admin/Groups/Members.html12
-rw-r--r--share/html/Admin/Groups/Memberships.html2
-rw-r--r--share/html/Admin/Groups/Modify.html2
-rw-r--r--share/html/Admin/Groups/UserRights.html2
-rw-r--r--share/html/Admin/Groups/index.html3
-rw-r--r--share/html/Admin/Queues/CustomField.html2
-rw-r--r--share/html/Admin/Queues/CustomFields.html2
-rw-r--r--share/html/Admin/Queues/DefaultValues.html2
-rw-r--r--share/html/Admin/Queues/GroupRights.html2
-rw-r--r--share/html/Admin/Queues/History.html2
-rw-r--r--share/html/Admin/Queues/Modify.html2
-rw-r--r--share/html/Admin/Queues/People.html2
-rw-r--r--share/html/Admin/Queues/Scrips.html2
-rw-r--r--share/html/Admin/Queues/Template.html2
-rw-r--r--share/html/Admin/Queues/Templates.html2
-rw-r--r--share/html/Admin/Queues/UserRights.html2
-rw-r--r--share/html/Admin/Queues/index.html3
-rw-r--r--share/html/Admin/Scrips/Create.html2
-rw-r--r--share/html/Admin/Scrips/Elements/EditBasics2
-rw-r--r--share/html/Admin/Scrips/Elements/EditCustomCode2
-rw-r--r--share/html/Admin/Scrips/Elements/SelectTemplate2
-rw-r--r--share/html/Admin/Scrips/Modify.html2
-rw-r--r--share/html/Admin/Scrips/Objects.html2
-rw-r--r--share/html/Admin/Scrips/index.html7
-rw-r--r--share/html/Admin/Tools/Configuration.html2
-rw-r--r--share/html/Admin/Tools/Queries.html2
-rw-r--r--share/html/Admin/Tools/Shredder/Dumps/dhandler2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/DumpFileLink2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/Error/NoRights2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/Error/NoStorage2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/Object/RT--Attachment2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/Object/RT--Ticket2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/Object/RT--User2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/ObjectCheckBox2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/PluginArguments2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/PluginHelp2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/SelectObjects2
-rw-r--r--share/html/Admin/Tools/Shredder/Elements/SelectPlugin2
-rw-r--r--share/html/Admin/Tools/Shredder/autohandler2
-rw-r--r--share/html/Admin/Tools/Shredder/index.html2
-rw-r--r--share/html/Admin/Tools/Theme.html2
-rw-r--r--share/html/Admin/Tools/index.html2
-rw-r--r--share/html/Admin/Users/CustomFields.html2
-rw-r--r--share/html/Admin/Users/DashboardsInMenu.html2
-rw-r--r--share/html/Admin/Users/History.html2
-rw-r--r--share/html/Admin/Users/Keys.html2
-rw-r--r--share/html/Admin/Users/Memberships.html2
-rw-r--r--share/html/Admin/Users/Modify.html2
-rw-r--r--share/html/Admin/Users/MyRT.html2
-rw-r--r--share/html/Admin/Users/index.html2
-rw-r--r--share/html/Admin/autohandler2
-rw-r--r--share/html/Admin/index.html2
-rw-r--r--share/html/Approvals/Display.html2
-rw-r--r--share/html/Approvals/Elements/Approve2
-rw-r--r--share/html/Approvals/Elements/PendingMyApproval2
-rw-r--r--share/html/Approvals/Elements/ShowDependency2
-rw-r--r--share/html/Approvals/autohandler2
-rw-r--r--share/html/Approvals/index.html2
-rw-r--r--share/html/Articles/Article/Display.html2
-rw-r--r--share/html/Articles/Article/Edit.html2
-rw-r--r--share/html/Articles/Article/Elements/EditBasics2
-rw-r--r--share/html/Articles/Article/Elements/EditCustomFields2
-rw-r--r--share/html/Articles/Article/Elements/EditLinks2
-rw-r--r--share/html/Articles/Article/Elements/EditTopics2
-rw-r--r--share/html/Articles/Article/Elements/LinkEntryInstructions2
-rw-r--r--share/html/Articles/Article/Elements/Preformatted2
-rw-r--r--share/html/Articles/Article/Elements/SearchByCustomField2
-rw-r--r--share/html/Articles/Article/Elements/SelectSavedSearches2
-rw-r--r--share/html/Articles/Article/Elements/SelectSearchPrivacy2
-rw-r--r--share/html/Articles/Article/Elements/ShowLinks2
-rw-r--r--share/html/Articles/Article/Elements/ShowSavedSearches2
-rw-r--r--share/html/Articles/Article/Elements/ShowSearchCriteria2
-rw-r--r--share/html/Articles/Article/Elements/ShowTopics2
-rw-r--r--share/html/Articles/Article/ExtractFromTicket.html2
-rw-r--r--share/html/Articles/Article/ExtractIntoClass.html2
-rw-r--r--share/html/Articles/Article/ExtractIntoTopic.html2
-rw-r--r--share/html/Articles/Article/History.html2
-rw-r--r--share/html/Articles/Article/PreCreate.html2
-rw-r--r--share/html/Articles/Article/Search.html2
-rw-r--r--share/html/Articles/Elements/BeforeMessageBox2
-rw-r--r--share/html/Articles/Elements/CheckSkipCreate2
-rw-r--r--share/html/Articles/Elements/CreateArticle2
-rw-r--r--share/html/Articles/Elements/GotoArticle2
-rw-r--r--share/html/Articles/Elements/IncludeArticle2
-rw-r--r--share/html/Articles/Elements/MaybeNeedsSetup2
-rw-r--r--share/html/Articles/Elements/NeedsSetup2
-rw-r--r--share/html/Articles/Elements/NewestArticles2
-rw-r--r--share/html/Articles/Elements/QuickSearch2
-rw-r--r--share/html/Articles/Elements/SelectClass2
-rw-r--r--share/html/Articles/Elements/ShowTopic2
-rw-r--r--share/html/Articles/Elements/ShowTopicLink2
-rw-r--r--share/html/Articles/Elements/SubjectOverride2
-rw-r--r--share/html/Articles/Elements/UpdatedArticles2
-rw-r--r--share/html/Articles/Topics.html2
-rw-r--r--share/html/Articles/index.html2
-rw-r--r--share/html/Asset/Create.html2
-rw-r--r--share/html/Asset/CreateInCatalog.html2
-rw-r--r--share/html/Asset/CreateLinkedTicket.html2
-rw-r--r--share/html/Asset/Display.html2
-rw-r--r--share/html/Asset/Elements/AddCatalogPeople2
-rw-r--r--share/html/Asset/Elements/AssetSearchBasics2
-rw-r--r--share/html/Asset/Elements/AssetSearchCFs2
-rw-r--r--share/html/Asset/Elements/AssetSearchPeople2
-rw-r--r--share/html/Asset/Elements/CreateInCatalog2
-rw-r--r--share/html/Asset/Elements/CreateLinkedTicket2
-rw-r--r--share/html/Asset/Elements/EditBasics2
-rw-r--r--share/html/Asset/Elements/EditCatalogPeople2
-rw-r--r--share/html/Asset/Elements/EditDates2
-rw-r--r--share/html/Asset/Elements/EditPeople2
-rw-r--r--share/html/Asset/Elements/EditRoleMembers2
-rw-r--r--share/html/Asset/Elements/Search2
-rw-r--r--share/html/Asset/Elements/SelectCatalog2
-rw-r--r--share/html/Asset/Elements/SelectRoleType2
-rw-r--r--share/html/Asset/Elements/SelectStatus2
-rw-r--r--share/html/Asset/Elements/ShowBasics2
-rw-r--r--share/html/Asset/Elements/ShowCatalog2
-rw-r--r--share/html/Asset/Elements/ShowDates2
-rw-r--r--share/html/Asset/Elements/ShowLinks2
-rw-r--r--share/html/Asset/Elements/ShowPeople2
-rw-r--r--share/html/Asset/Elements/ShowRoleMembers2
-rw-r--r--share/html/Asset/Elements/ShowSummary2
-rw-r--r--share/html/Asset/Elements/TSVExport2
-rw-r--r--share/html/Asset/Helpers/CreateInCatalog2
-rw-r--r--share/html/Asset/Helpers/CreateLinkedTicket2
-rw-r--r--share/html/Asset/History.html2
-rw-r--r--share/html/Asset/Modify.html2
-rw-r--r--share/html/Asset/ModifyCFs.html2
-rw-r--r--share/html/Asset/ModifyDates.html2
-rw-r--r--share/html/Asset/ModifyLinks.html2
-rw-r--r--share/html/Asset/ModifyPeople.html2
-rw-r--r--share/html/Asset/Search/Bulk.html2
-rw-r--r--share/html/Asset/Search/Results.tsv4
-rw-r--r--share/html/Asset/Search/index.html2
-rw-r--r--share/html/Asset/index.html2
-rw-r--r--share/html/Dashboards/Elements/DashboardsForObject2
-rw-r--r--share/html/Dashboards/Elements/Deleted2
-rw-r--r--share/html/Dashboards/Elements/HiddenSearches2
-rw-r--r--share/html/Dashboards/Elements/ListOfDashboards2
-rw-r--r--share/html/Dashboards/Elements/SelectPrivacy2
-rw-r--r--share/html/Dashboards/Elements/ShowDashboards2
-rw-r--r--share/html/Dashboards/Elements/ShowPortlet/component2
-rw-r--r--share/html/Dashboards/Elements/ShowPortlet/dashboard2
-rw-r--r--share/html/Dashboards/Elements/ShowPortlet/search2
-rw-r--r--share/html/Dashboards/Elements/SubscriptionRecipients2
-rw-r--r--share/html/Dashboards/Modify.html11
-rw-r--r--share/html/Dashboards/Queries.html2
-rw-r--r--share/html/Dashboards/Render.html2
-rw-r--r--share/html/Dashboards/Subscription.html4
-rw-r--r--share/html/Dashboards/dhandler2
-rw-r--r--share/html/Dashboards/index.html2
-rw-r--r--share/html/Download/CustomFieldValue/dhandler2
-rw-r--r--share/html/Elements/AddLinks2
-rw-r--r--share/html/Elements/AttachmentWarning2
-rw-r--r--share/html/Elements/BulkCustomFields2
-rw-r--r--share/html/Elements/BulkLinks2
-rw-r--r--share/html/Elements/CSRF2
-rw-r--r--share/html/Elements/Checkbox2
-rw-r--r--share/html/Elements/CollectionAsTable/Header4
-rw-r--r--share/html/Elements/CollectionAsTable/ParseFormat2
-rw-r--r--share/html/Elements/CollectionAsTable/Row2
-rw-r--r--share/html/Elements/CollectionList2
-rw-r--r--share/html/Elements/CollectionListPaging2
-rw-r--r--share/html/Elements/ColumnMap3
-rw-r--r--share/html/Elements/CreateTicket2
-rw-r--r--share/html/Elements/Crypt/KeyIssues4
-rw-r--r--share/html/Elements/Crypt/SelectKeyForEncryption2
-rw-r--r--share/html/Elements/Crypt/SelectKeyForSigning2
-rw-r--r--share/html/Elements/Crypt/SignEncryptWidget2
-rw-r--r--share/html/Elements/CryptStatus2
-rw-r--r--share/html/Elements/Dashboards2
-rw-r--r--share/html/Elements/DoAuth2
-rw-r--r--share/html/Elements/EditCustomField2
-rw-r--r--share/html/Elements/EditCustomFieldAutocomplete2
-rw-r--r--share/html/Elements/EditCustomFieldBinary2
-rw-r--r--share/html/Elements/EditCustomFieldCombobox2
-rw-r--r--share/html/Elements/EditCustomFieldCustomGroupings2
-rw-r--r--share/html/Elements/EditCustomFieldDate2
-rw-r--r--share/html/Elements/EditCustomFieldDateTime2
-rw-r--r--share/html/Elements/EditCustomFieldFreeform2
-rw-r--r--share/html/Elements/EditCustomFieldIPAddress2
-rw-r--r--share/html/Elements/EditCustomFieldIPAddressRange2
-rw-r--r--share/html/Elements/EditCustomFieldImage2
-rw-r--r--share/html/Elements/EditCustomFieldSelect2
-rw-r--r--share/html/Elements/EditCustomFieldText2
-rw-r--r--share/html/Elements/EditCustomFieldWikitext2
-rw-r--r--share/html/Elements/EditCustomFields2
-rw-r--r--share/html/Elements/EditLink2
-rw-r--r--share/html/Elements/EditLinks2
-rw-r--r--share/html/Elements/EditPassword2
-rw-r--r--share/html/Elements/EditTimeValue2
-rw-r--r--share/html/Elements/EmailInput4
-rw-r--r--share/html/Elements/Error2
-rw-r--r--share/html/Elements/FindAsset2
-rw-r--r--share/html/Elements/FindUser2
-rw-r--r--share/html/Elements/FoldStanzaJS2
-rw-r--r--share/html/Elements/Footer4
-rw-r--r--share/html/Elements/Framekiller2
-rw-r--r--share/html/Elements/GotoTicket2
-rw-r--r--share/html/Elements/GotoUser2
-rw-r--r--share/html/Elements/Header2
-rw-r--r--share/html/Elements/HeaderJavascript2
-rw-r--r--share/html/Elements/JavascriptConfig4
-rw-r--r--share/html/Elements/ListActions2
-rw-r--r--share/html/Elements/ListMenu2
-rw-r--r--share/html/Elements/Login2
-rw-r--r--share/html/Elements/LoginHelp2
-rw-r--r--share/html/Elements/LoginRedirectWarning2
-rw-r--r--share/html/Elements/Logo2
-rw-r--r--share/html/Elements/MakeClicky2
-rw-r--r--share/html/Elements/Menu2
-rw-r--r--share/html/Elements/MessageBox4
-rw-r--r--share/html/Elements/MyAdminQueues2
-rw-r--r--share/html/Elements/MyAssets2
-rw-r--r--share/html/Elements/MyRT2
-rw-r--r--share/html/Elements/MyReminders2
-rw-r--r--share/html/Elements/MySupportQueues2
-rw-r--r--share/html/Elements/PageLayout2
-rw-r--r--share/html/Elements/PersonalQuickbar2
-rw-r--r--share/html/Elements/QueriesAsComment2
-rw-r--r--share/html/Elements/QueryString2
-rw-r--r--share/html/Elements/QueueList2
-rw-r--r--share/html/Elements/QueueSummaryByLifecycle2
-rw-r--r--share/html/Elements/QueueSummaryByStatus2
-rw-r--r--share/html/Elements/QuickCreate2
-rw-r--r--share/html/Elements/Quicksearch2
-rw-r--r--share/html/Elements/RT__Article/ColumnMap2
-rw-r--r--share/html/Elements/RT__Asset/ColumnMap2
-rw-r--r--share/html/Elements/RT__Catalog/ColumnMap2
-rw-r--r--share/html/Elements/RT__Class/ColumnMap2
-rw-r--r--share/html/Elements/RT__CustomField/ColumnMap2
-rw-r--r--share/html/Elements/RT__CustomRole/ColumnMap2
-rw-r--r--share/html/Elements/RT__Dashboard/ColumnMap2
-rw-r--r--share/html/Elements/RT__Group/ColumnMap2
-rw-r--r--share/html/Elements/RT__Queue/ColumnMap2
-rw-r--r--share/html/Elements/RT__SavedSearch/ColumnMap2
-rw-r--r--share/html/Elements/RT__Scrip/ColumnMap2
-rw-r--r--share/html/Elements/RT__ScripAction/ColumnMap2
-rw-r--r--share/html/Elements/RT__ScripCondition/ColumnMap2
-rw-r--r--share/html/Elements/RT__Template/ColumnMap2
-rw-r--r--share/html/Elements/RT__Ticket/ColumnMap2
-rw-r--r--share/html/Elements/RT__Transaction/ColumnMap2
-rw-r--r--share/html/Elements/RT__User/ColumnMap2
-rw-r--r--share/html/Elements/Refresh2
-rw-r--r--share/html/Elements/RefreshHomepage2
-rw-r--r--share/html/Elements/SavedSearches2
-rw-r--r--share/html/Elements/ScrubHTML2
-rw-r--r--share/html/Elements/Section2
-rw-r--r--share/html/Elements/SelectAttachmentField2
-rw-r--r--share/html/Elements/SelectBoolean2
-rw-r--r--share/html/Elements/SelectCustomFieldOperator2
-rw-r--r--share/html/Elements/SelectCustomFieldValue2
-rw-r--r--share/html/Elements/SelectDate2
-rw-r--r--share/html/Elements/SelectDateRelation2
-rw-r--r--share/html/Elements/SelectDateType2
-rw-r--r--share/html/Elements/SelectEqualityOperator2
-rw-r--r--share/html/Elements/SelectGroups2
-rw-r--r--share/html/Elements/SelectIPRelation2
-rw-r--r--share/html/Elements/SelectLang2
-rw-r--r--share/html/Elements/SelectMatch2
-rw-r--r--share/html/Elements/SelectNewTicketQueue2
-rw-r--r--share/html/Elements/SelectObject40
-rw-r--r--share/html/Elements/SelectOwner2
-rw-r--r--share/html/Elements/SelectOwnerAutocomplete2
-rw-r--r--share/html/Elements/SelectOwnerDropdown4
-rw-r--r--share/html/Elements/SelectPriority2
-rw-r--r--share/html/Elements/SelectQueue2
-rw-r--r--share/html/Elements/SelectQueueAutocomplete2
-rw-r--r--share/html/Elements/SelectResultsPerPage2
-rw-r--r--share/html/Elements/SelectSLA2
-rw-r--r--share/html/Elements/SelectStatus7
-rw-r--r--share/html/Elements/SelectTimeUnits2
-rw-r--r--share/html/Elements/SelectTimezone2
-rw-r--r--share/html/Elements/SelectUsers2
-rw-r--r--share/html/Elements/SelectWatcherType2
-rw-r--r--share/html/Elements/SetupSessionCookie2
-rw-r--r--share/html/Elements/ShortcutHelp2
-rw-r--r--share/html/Elements/ShowCustomFieldBinary2
-rw-r--r--share/html/Elements/ShowCustomFieldCustomGroupings2
-rw-r--r--share/html/Elements/ShowCustomFieldDate2
-rw-r--r--share/html/Elements/ShowCustomFieldDateTime2
-rw-r--r--share/html/Elements/ShowCustomFieldImage2
-rw-r--r--share/html/Elements/ShowCustomFieldText2
-rw-r--r--share/html/Elements/ShowCustomFieldWikitext2
-rw-r--r--share/html/Elements/ShowCustomFields2
-rw-r--r--share/html/Elements/ShowHistory2
-rw-r--r--share/html/Elements/ShowHistoryHeader4
-rw-r--r--share/html/Elements/ShowHistoryPage11
-rw-r--r--share/html/Elements/ShowLink2
-rw-r--r--share/html/Elements/ShowLinks4
-rw-r--r--share/html/Elements/ShowLinksOfType2
-rw-r--r--share/html/Elements/ShowMemberships2
-rw-r--r--share/html/Elements/ShowMessageHeaders2
-rw-r--r--share/html/Elements/ShowMessageStanza2
-rw-r--r--share/html/Elements/ShowPrincipal2
-rw-r--r--share/html/Elements/ShowRecord2
-rw-r--r--share/html/Elements/ShowRelationLabel2
-rw-r--r--share/html/Elements/ShowReminders2
-rw-r--r--share/html/Elements/ShowSearch2
-rw-r--r--share/html/Elements/ShowTransaction2
-rw-r--r--share/html/Elements/ShowTransactionAttachments2
-rw-r--r--share/html/Elements/ShowUser2
-rw-r--r--share/html/Elements/ShowUserEmailFrequency2
-rw-r--r--share/html/Elements/SimpleSearch2
-rw-r--r--share/html/Elements/SingleUserRoleInput9
-rw-r--r--share/html/Elements/Submit2
-rw-r--r--share/html/Elements/TSVExport2
-rw-r--r--share/html/Elements/Tabs6
-rw-r--r--share/html/Elements/ValidateCustomFields2
-rw-r--r--share/html/Elements/WidgetBar2
-rw-r--r--share/html/Errors/WebRemoteUser/Deauthorized2
-rw-r--r--share/html/Errors/WebRemoteUser/NoInternalUser2
-rw-r--r--share/html/Errors/WebRemoteUser/NoRemoteUser2
-rw-r--r--share/html/Errors/WebRemoteUser/UserAutocreateDefaultsOnLogin2
-rw-r--r--share/html/Errors/WebRemoteUser/Wrapper2
-rw-r--r--share/html/Helpers/AddTimeWorked2
-rw-r--r--share/html/Helpers/Autocomplete/CustomFieldValues2
-rw-r--r--share/html/Helpers/Autocomplete/Groups2
-rw-r--r--share/html/Helpers/Autocomplete/Owners2
-rw-r--r--share/html/Helpers/Autocomplete/Queues2
-rw-r--r--share/html/Helpers/Autocomplete/Tickets2
-rw-r--r--share/html/Helpers/Autocomplete/Users2
-rw-r--r--share/html/Helpers/Autocomplete/autohandler2
-rw-r--r--share/html/Helpers/BuildFormatString2
-rw-r--r--share/html/Helpers/PreviewScrips2
-rw-r--r--share/html/Helpers/ShortcutHelp2
-rw-r--r--share/html/Helpers/ShowSimplifiedRecipients2
-rw-r--r--share/html/Helpers/SpawnLinkedTicket2
-rw-r--r--share/html/Helpers/TicketAttachments2
-rw-r--r--share/html/Helpers/TicketHistory2
-rw-r--r--share/html/Helpers/TicketHistoryPage2
-rw-r--r--share/html/Helpers/TicketTimer2
-rw-r--r--share/html/Helpers/Toggle/ShowRequestor2
-rw-r--r--share/html/Helpers/Toggle/TicketBookmark2
-rw-r--r--share/html/Helpers/Upload/Add2
-rw-r--r--share/html/Helpers/Upload/Delete2
-rw-r--r--share/html/Helpers/UserInfo2
-rw-r--r--share/html/Helpers/autohandler2
-rw-r--r--share/html/Install/Basics.html2
-rw-r--r--share/html/Install/DatabaseDetails.html2
-rw-r--r--share/html/Install/DatabaseType.html2
-rw-r--r--share/html/Install/Elements/Errors2
-rw-r--r--share/html/Install/Elements/Wrapper2
-rw-r--r--share/html/Install/Finish.html2
-rw-r--r--share/html/Install/Global.html2
-rw-r--r--share/html/Install/Initialize.html2
-rw-r--r--share/html/Install/Sendmail.html2
-rw-r--r--share/html/Install/autohandler2
-rw-r--r--share/html/Install/index.html2
-rw-r--r--share/html/NoAuth/Helpers/CustomLogo/dhandler2
-rw-r--r--share/html/NoAuth/Login.html2
-rw-r--r--share/html/NoAuth/Logout.html2
-rw-r--r--share/html/NoAuth/RichText/autohandler2
-rw-r--r--share/html/NoAuth/css/aileron/AfterMenus2
-rw-r--r--share/html/NoAuth/css/aileron/InHeader2
-rw-r--r--share/html/NoAuth/css/autohandler2
-rw-r--r--share/html/NoAuth/css/ballard/InHeader2
-rw-r--r--share/html/NoAuth/css/dhandler2
-rw-r--r--share/html/NoAuth/css/rudder/AfterMenus2
-rw-r--r--share/html/NoAuth/css/rudder/InHeader2
-rw-r--r--share/html/NoAuth/css/web2/AfterMenus2
-rw-r--r--share/html/NoAuth/css/web2/InHeader2
-rw-r--r--share/html/NoAuth/iCal/dhandler2
-rw-r--r--share/html/NoAuth/js/autohandler2
-rw-r--r--share/html/NoAuth/js/dhandler2
-rw-r--r--share/html/NoAuth/rss/dhandler2
-rw-r--r--share/html/Prefs/AboutMe.html2
-rw-r--r--share/html/Prefs/DashboardsInMenu.html2
-rw-r--r--share/html/Prefs/MyRT.html2
-rw-r--r--share/html/Prefs/Other.html2
-rw-r--r--share/html/Prefs/QueueList.html2
-rw-r--r--share/html/Prefs/Search.html2
-rw-r--r--share/html/Prefs/SearchOptions.html17
-rw-r--r--share/html/REST/1.0/Forms/attachment/default2
-rw-r--r--share/html/REST/1.0/Forms/group/customfields2
-rw-r--r--share/html/REST/1.0/Forms/group/default2
-rw-r--r--share/html/REST/1.0/Forms/group/ns2
-rw-r--r--share/html/REST/1.0/Forms/queue/customfields2
-rw-r--r--share/html/REST/1.0/Forms/queue/default5
-rw-r--r--share/html/REST/1.0/Forms/queue/ns2
-rw-r--r--share/html/REST/1.0/Forms/queue/ticketcustomfields2
-rw-r--r--share/html/REST/1.0/Forms/ticket/attachments2
-rw-r--r--share/html/REST/1.0/Forms/ticket/comment2
-rw-r--r--share/html/REST/1.0/Forms/ticket/default17
-rw-r--r--share/html/REST/1.0/Forms/ticket/history2
-rw-r--r--share/html/REST/1.0/Forms/ticket/links4
-rw-r--r--share/html/REST/1.0/Forms/ticket/merge2
-rw-r--r--share/html/REST/1.0/Forms/ticket/take2
-rw-r--r--share/html/REST/1.0/Forms/transaction/default2
-rw-r--r--share/html/REST/1.0/Forms/user/default2
-rw-r--r--share/html/REST/1.0/Forms/user/ns2
-rw-r--r--share/html/REST/1.0/NoAuth/mail-gateway2
-rw-r--r--share/html/REST/1.0/autohandler2
-rw-r--r--share/html/REST/1.0/dhandler2
-rw-r--r--share/html/REST/1.0/logout2
-rw-r--r--share/html/REST/1.0/search/dhandler2
-rw-r--r--share/html/REST/1.0/ticket/comment2
-rw-r--r--share/html/REST/1.0/ticket/link2
-rw-r--r--share/html/REST/1.0/ticket/merge2
-rw-r--r--share/html/Reports/CreatedByDates.html2
-rw-r--r--share/html/Reports/ResolvedByDates.html2
-rw-r--r--share/html/Reports/ResolvedByOwner.html2
-rw-r--r--share/html/Reports/index.html2
-rw-r--r--share/html/Search/Article.html2
-rw-r--r--share/html/Search/Build.html2
-rw-r--r--share/html/Search/Bulk.html8
-rw-r--r--share/html/Search/Chart2
-rw-r--r--share/html/Search/Chart.html2
-rw-r--r--share/html/Search/Edit.html2
-rw-r--r--share/html/Search/Elements/Article2
-rw-r--r--share/html/Search/Elements/BuildFormatString2
-rw-r--r--share/html/Search/Elements/Chart2
-rw-r--r--share/html/Search/Elements/ChartTable2
-rw-r--r--share/html/Search/Elements/ConditionRow2
-rw-r--r--share/html/Search/Elements/DisplayOptions2
-rw-r--r--share/html/Search/Elements/EditFormat2
-rw-r--r--share/html/Search/Elements/EditQuery2
-rw-r--r--share/html/Search/Elements/EditSearches2
-rw-r--r--share/html/Search/Elements/EditSort6
-rw-r--r--share/html/Search/Elements/Graph2
-rw-r--r--share/html/Search/Elements/NewListActions2
-rw-r--r--share/html/Search/Elements/PickBasics4
-rw-r--r--share/html/Search/Elements/PickCFs2
-rw-r--r--share/html/Search/Elements/PickCriteria2
-rw-r--r--share/html/Search/Elements/PickCustomRoles2
-rw-r--r--share/html/Search/Elements/PickObjectCFs2
-rw-r--r--share/html/Search/Elements/PickTicketCFs2
-rw-r--r--share/html/Search/Elements/ResultsRSSView2
-rw-r--r--share/html/Search/Elements/SearchPrivacy2
-rw-r--r--share/html/Search/Elements/SearchesForObject2
-rw-r--r--share/html/Search/Elements/SelectAndOr2
-rw-r--r--share/html/Search/Elements/SelectChartFunction2
-rw-r--r--share/html/Search/Elements/SelectChartType2
-rw-r--r--share/html/Search/Elements/SelectGroup2
-rw-r--r--share/html/Search/Elements/SelectGroupBy2
-rw-r--r--share/html/Search/Elements/SelectLinks2
-rw-r--r--share/html/Search/Elements/SelectPersonType2
-rw-r--r--share/html/Search/Elements/SelectSearchObject2
-rw-r--r--share/html/Search/Elements/SelectSearchesForObjects4
-rw-r--r--share/html/Search/Results.html2
-rw-r--r--share/html/Search/Results.tsv2
-rw-r--r--share/html/Search/Simple.html2
-rw-r--r--share/html/Search/index.html2
-rw-r--r--share/html/SelfService/Article/Display.html2
-rw-r--r--share/html/SelfService/Article/Search.html2
-rw-r--r--share/html/SelfService/Article/autohandler2
-rw-r--r--share/html/SelfService/Asset/CreateLinkedTicket.html2
-rw-r--r--share/html/SelfService/Asset/Display.html2
-rw-r--r--share/html/SelfService/Asset/Helpers/CreateLinkedTicket2
-rw-r--r--share/html/SelfService/Asset/History.html2
-rw-r--r--share/html/SelfService/Asset/index.html2
-rw-r--r--share/html/SelfService/Attachment/dhandler2
-rw-r--r--share/html/SelfService/Closed.html2
-rw-r--r--share/html/SelfService/Create.html2
-rw-r--r--share/html/SelfService/CreateTicketInQueue.html2
-rw-r--r--share/html/SelfService/Display.html2
-rw-r--r--share/html/SelfService/Elements/GotoTicket2
-rw-r--r--share/html/SelfService/Elements/Header2
-rw-r--r--share/html/SelfService/Elements/MyRequests2
-rw-r--r--share/html/SelfService/Elements/SearchArticle2
-rw-r--r--share/html/SelfService/Helpers/Autocomplete/CustomFieldValues2
-rw-r--r--share/html/SelfService/Helpers/Autocomplete/Users2
-rw-r--r--share/html/SelfService/Helpers/ShortcutHelp2
-rw-r--r--share/html/SelfService/Helpers/Upload/Add2
-rw-r--r--share/html/SelfService/Helpers/Upload/Delete58
-rw-r--r--share/html/SelfService/Prefs.html2
-rw-r--r--share/html/SelfService/Update.html2
-rw-r--r--share/html/SelfService/index.html2
-rw-r--r--share/html/Ticket/Attachment/WithHeaders/dhandler6
-rw-r--r--share/html/Ticket/Attachment/dhandler10
-rw-r--r--share/html/Ticket/Create.html10
-rw-r--r--share/html/Ticket/Crypt.html4
-rw-r--r--share/html/Ticket/Display.html26
-rw-r--r--share/html/Ticket/Elements/AddAttachments10
-rw-r--r--share/html/Ticket/Elements/AddWatchers2
-rw-r--r--share/html/Ticket/Elements/Bookmark2
-rw-r--r--share/html/Ticket/Elements/ClickToShowHistory2
-rw-r--r--share/html/Ticket/Elements/DelayShowHistory2
-rw-r--r--share/html/Ticket/Elements/EditBasics2
-rw-r--r--share/html/Ticket/Elements/EditDates2
-rw-r--r--share/html/Ticket/Elements/EditMerge2
-rw-r--r--share/html/Ticket/Elements/EditPeople2
-rw-r--r--share/html/Ticket/Elements/EditTransactionCustomFields2
-rw-r--r--share/html/Ticket/Elements/EditWatchers10
-rw-r--r--share/html/Ticket/Elements/PopupTimerLink2
-rw-r--r--share/html/Ticket/Elements/Reminders2
-rw-r--r--share/html/Ticket/Elements/ScrollShowHistory24
-rw-r--r--share/html/Ticket/Elements/SelectStatus2
-rw-r--r--share/html/Ticket/Elements/ShowAssets2
-rw-r--r--share/html/Ticket/Elements/ShowAssetsOnCreate2
-rw-r--r--share/html/Ticket/Elements/ShowAttachments2
-rw-r--r--share/html/Ticket/Elements/ShowBasics2
-rw-r--r--share/html/Ticket/Elements/ShowCustomFields2
-rw-r--r--share/html/Ticket/Elements/ShowDates2
-rw-r--r--share/html/Ticket/Elements/ShowDependencyStatus2
-rw-r--r--share/html/Ticket/Elements/ShowGroupMembers2
-rw-r--r--share/html/Ticket/Elements/ShowPeople3
-rw-r--r--share/html/Ticket/Elements/ShowPriority2
-rw-r--r--share/html/Ticket/Elements/ShowQueue2
-rw-r--r--share/html/Ticket/Elements/ShowRequestor2
-rw-r--r--share/html/Ticket/Elements/ShowRequestorExtraInfo2
-rw-r--r--share/html/Ticket/Elements/ShowRequestorTickets2
-rw-r--r--share/html/Ticket/Elements/ShowRequestorTicketsActive2
-rw-r--r--share/html/Ticket/Elements/ShowRequestorTicketsAll2
-rw-r--r--share/html/Ticket/Elements/ShowRequestorTicketsInactive2
-rw-r--r--share/html/Ticket/Elements/ShowSummary2
-rw-r--r--share/html/Ticket/Elements/ShowTime2
-rw-r--r--share/html/Ticket/Elements/ShowUpdateStatus2
-rw-r--r--share/html/Ticket/Elements/UpdateCc2
-rw-r--r--share/html/Ticket/Forward.html6
-rw-r--r--share/html/Ticket/Graphs/Elements/EditGraphProperties2
-rw-r--r--share/html/Ticket/Graphs/Elements/ShowGraph2
-rw-r--r--share/html/Ticket/Graphs/Elements/ShowLegends2
-rw-r--r--share/html/Ticket/Graphs/dhandler2
-rw-r--r--share/html/Ticket/Graphs/index.html2
-rw-r--r--share/html/Ticket/History.html4
-rw-r--r--share/html/Ticket/Modify.html4
-rw-r--r--share/html/Ticket/ModifyAll.html2
-rw-r--r--share/html/Ticket/ModifyDates.html4
-rw-r--r--share/html/Ticket/ModifyLinks.html4
-rw-r--r--share/html/Ticket/ModifyPeople.html4
-rw-r--r--share/html/Ticket/Reminders.html4
-rw-r--r--share/html/Ticket/ShowEmailRecord.html2
-rw-r--r--share/html/Ticket/Update.html18
-rw-r--r--share/html/Ticket/autohandler2
-rw-r--r--share/html/Tools/MyDay.html2
-rw-r--r--share/html/Tools/MyReminders.html2
-rw-r--r--share/html/Tools/index.html2
-rw-r--r--share/html/User/Elements/AssetList2
-rw-r--r--share/html/User/Elements/Portlets/ActiveTickets2
-rw-r--r--share/html/User/Elements/Portlets/CreateAsset2
-rw-r--r--share/html/User/Elements/Portlets/CreateTicket2
-rw-r--r--share/html/User/Elements/Portlets/ExtraInfo2
-rw-r--r--share/html/User/Elements/Portlets/InactiveTickets2
-rw-r--r--share/html/User/Elements/Portlets/UserAssets2
-rw-r--r--share/html/User/Elements/TicketList2
-rw-r--r--share/html/User/Elements/UserInfo2
-rw-r--r--share/html/User/History.html2
-rw-r--r--share/html/User/Search.html2
-rw-r--r--share/html/User/Summary.html2
-rw-r--r--share/html/Widgets/BulkEdit2
-rw-r--r--share/html/Widgets/BulkProcess2
-rw-r--r--share/html/Widgets/ComboBox2
-rw-r--r--share/html/Widgets/FinalizeWidgetArguments2
-rw-r--r--share/html/Widgets/Form/Boolean2
-rw-r--r--share/html/Widgets/Form/Integer2
-rw-r--r--share/html/Widgets/Form/Select2
-rw-r--r--share/html/Widgets/Form/String2
-rw-r--r--share/html/Widgets/SavedSearch2
-rw-r--r--share/html/Widgets/SelectionBox2
-rw-r--r--share/html/Widgets/TitleBox2
-rw-r--r--share/html/Widgets/TitleBoxEnd2
-rw-r--r--share/html/Widgets/TitleBoxStart2
-rw-r--r--share/html/autohandler2
-rw-r--r--share/html/dhandler2
-rw-r--r--share/html/index.html2
-rw-r--r--share/html/l2
-rw-r--r--share/html/l_unsafe2
-rw-r--r--share/html/m/_elements/footer4
-rw-r--r--share/html/m/_elements/full_site_link2
-rw-r--r--share/html/m/_elements/header2
-rw-r--r--share/html/m/_elements/login2
-rw-r--r--share/html/m/_elements/menu2
-rw-r--r--share/html/m/_elements/ticket_list2
-rw-r--r--share/html/m/_elements/ticket_menu2
-rw-r--r--share/html/m/_elements/wrapper2
-rw-r--r--share/html/m/dhandler2
-rw-r--r--share/html/m/index.html2
-rw-r--r--share/html/m/logout2
-rw-r--r--share/html/m/ticket/autohandler2
-rw-r--r--share/html/m/ticket/create2
-rw-r--r--share/html/m/ticket/history2
-rw-r--r--share/html/m/ticket/reply2
-rw-r--r--share/html/m/ticket/select_create_queue2
-rw-r--r--share/html/m/ticket/show2
-rw-r--r--share/html/m/tickets/search2
-rw-r--r--share/po/ar.po762
-rw-r--r--share/po/bg.po770
-rw-r--r--share/po/ca.po770
-rw-r--r--share/po/cs.po1726
-rw-r--r--share/po/da.po954
-rw-r--r--share/po/de.po780
-rw-r--r--share/po/el.po776
-rw-r--r--share/po/en.po6
-rw-r--r--share/po/en_GB.po50
-rw-r--r--share/po/es.po950
-rw-r--r--share/po/et.po768
-rw-r--r--share/po/eu.po773
-rw-r--r--share/po/fa.po770
-rw-r--r--share/po/fi.po772
-rw-r--r--share/po/fr.po774
-rw-r--r--share/po/hr.po832
-rw-r--r--share/po/hu.po796
-rw-r--r--share/po/id.po762
-rw-r--r--share/po/is.po768
-rw-r--r--share/po/it.po770
-rw-r--r--share/po/ja.po764
-rw-r--r--share/po/lt.po962
-rw-r--r--share/po/lv.po770
-rw-r--r--share/po/nb.po1002
-rw-r--r--share/po/nl.po766
-rw-r--r--share/po/nn.po770
-rw-r--r--share/po/pl.po772
-rw-r--r--share/po/pt.po770
-rw-r--r--share/po/pt_BR.po776
-rw-r--r--share/po/pt_PT.po766
-rw-r--r--share/po/rt.pot752
-rw-r--r--share/po/ru.po774
-rw-r--r--share/po/sk.po768
-rw-r--r--share/po/sl.po776
-rw-r--r--share/po/sr.po770
-rw-r--r--share/po/sv.po770
-rw-r--r--share/po/tr.po766
-rw-r--r--share/po/zh_CN.po770
-rw-r--r--share/po/zh_TW.po770
-rw-r--r--share/static/js/dropzone.min.js2
-rw-r--r--share/static/js/util.js2
-rw-r--r--t/api/config.t23
-rw-r--r--t/api/tickets.t17
-rw-r--r--t/approval/admincc.t4
-rw-r--r--t/articles/class.t1
-rw-r--r--t/articles/search-interface.t1
-rw-r--r--t/articles/set-subject.t2
-rw-r--r--t/assets/links.t19
-rw-r--r--t/assets/web.t1
-rw-r--r--t/charts/compound-sql-function.t2
-rw-r--r--t/customfields/api.t29
-rw-r--r--t/customfields/ip.t1
-rw-r--r--t/customfields/ipv6.t1
-rw-r--r--t/customroles/tickets.t10
-rw-r--r--t/data/configs/apache2.2+fastcgi.conf4
-rw-r--r--t/data/configs/apache2.2+mod_perl.conf4
-rw-r--r--t/data/configs/apache2.4+fastcgi.conf4
-rw-r--r--t/data/configs/apache2.4+mod_perl.conf4
-rw-r--r--t/data/emails/email-file-attachment.eml67
-rw-r--r--t/externalauth/auth_config.t75
-rw-r--r--t/externalauth/ldap.t15
-rw-r--r--t/externalauth/ldap_escaping.t3
-rw-r--r--t/externalauth/ldap_group.t3
-rw-r--r--t/externalauth/ldap_privileged.t14
-rw-r--r--t/externalauth/obfuscate-password.t1
-rw-r--r--t/externalauth/sessions.t1
-rw-r--r--t/externalauth/sqlite.t14
-rw-r--r--t/i18n/caching.t2
-rw-r--r--t/i18n/default.t2
-rw-r--r--t/i18n/extract.t18
-rw-r--r--t/i18n/footer.t1
-rw-r--r--t/ldapimport/group-callbacks.t2
-rw-r--r--t/ldapimport/group-import.t2
-rw-r--r--t/ldapimport/group-member-import.t2
-rw-r--r--t/ldapimport/group-rename.t2
-rw-r--r--t/ldapimport/user-import-cfs.t2
-rw-r--r--t/ldapimport/user-import-privileged.t2
-rw-r--r--t/ldapimport/user-import.t3
-rw-r--r--t/lifecycles/basics.t1
-rw-r--r--t/lifecycles/unresolved-deps.t1
-rw-r--r--t/mail/dashboard-chart-with-utf8.t1
-rw-r--r--t/mail/dashboard-empty.t1
-rw-r--r--t/mail/dashboards.t1
-rw-r--r--t/mail/email-file-attachments.t58
-rw-r--r--t/mail/gateway.t3
-rw-r--r--t/mail/gnupg-outgoing-encrypted-plaintext.t1
-rw-r--r--t/mail/gnupg-outgoing-encrypted.t1
-rw-r--r--t/mail/gnupg-outgoing-plain-plaintext.t1
-rw-r--r--t/mail/gnupg-outgoing-plain.t1
-rw-r--r--t/mail/gnupg-outgoing-signed-plaintext.t1
-rw-r--r--t/mail/gnupg-outgoing-signed.t1
-rw-r--r--t/mail/gnupg-outgoing-signed_encrypted-plaintext.t1
-rw-r--r--t/mail/gnupg-outgoing-signed_encrypted.t1
-rw-r--r--t/mail/gnupg-reverification.t1
-rw-r--r--t/mail/rfc2231-attachment.t1
-rw-r--r--t/mail/smime/incoming.t1
-rw-r--r--t/mail/smime/outgoing.t1
-rw-r--r--t/mail/smime/realmail.t1
-rw-r--r--t/mail/smime/reject_on_unencrypted.t1
-rw-r--r--t/security/CVE-2011-2083-cf-urls.t1
-rw-r--r--t/security/CVE-2011-2083-clickable-xss.t1
-rw-r--r--t/security/CVE-2011-2084-attach-tickets.t5
-rw-r--r--t/security/CVE-2011-2084-cf-values.t1
-rw-r--r--t/security/CVE-2011-2084-transactions.t1
-rw-r--r--t/security/CVE-2011-4460-rows-per-page.t1
-rw-r--r--t/security/CVE-2011-5092-datetimeformat.t1
-rw-r--r--t/security/CVE-2011-5092-graph-links.t1
-rw-r--r--t/security/CVE-2011-5092-installmode.t1
-rw-r--r--t/security/CVE-2011-5092-prefs.t1
-rw-r--r--t/security/CVE-2012-4732-csrf-blacklist.t1
-rw-r--r--t/security/CVE-2012-4733-status.t1
-rw-r--r--t/security/CVE-2012-4734-login-warning.t1
-rw-r--r--t/security/CVE-2012-4735-sign-any-key.t1
-rw-r--r--t/shredder/03plugin_users.t56
-rw-r--r--t/sla/web.t3
-rw-r--r--t/ticket/clicky.t3
-rw-r--r--t/ticket/merge.t40
-rw-r--r--t/ticket/requestor-order.t2
-rw-r--r--t/ticket/search.t2
-rw-r--r--t/ticket/search_long_cf_values.t2
-rw-r--r--t/web/action-results.t1
-rw-r--r--t/web/admin_user.t1
-rw-r--r--t/web/attachment_dropping.t1
-rw-r--r--t/web/attachment_truncation.t1
-rw-r--r--t/web/attachments.t4
-rw-r--r--t/web/cf_date.t1
-rw-r--r--t/web/cf_datetime.t3
-rw-r--r--t/web/cf_groupings.t1
-rw-r--r--t/web/cf_groupings_user.t1
-rw-r--r--t/web/cf_image.t1
-rw-r--r--t/web/cf_pattern.t1
-rw-r--r--t/web/cf_select_one.t1
-rw-r--r--t/web/cf_set_initial.t1
-rw-r--r--t/web/cf_textarea.t1
-rw-r--r--t/web/charting.t1
-rw-r--r--t/web/command_line.t1
-rw-r--r--t/web/compilation_errors.t13
-rw-r--r--t/web/crypt-gnupg.t1
-rw-r--r--t/web/csrf-rest.t1
-rw-r--r--t/web/csrf.t3
-rw-r--r--t/web/dashboards-basics.t10
-rw-r--r--t/web/dashboards-in-menu.t1
-rw-r--r--t/web/dashboards-subscription.t1
-rw-r--r--t/web/gnupg-select-keys-on-create.t1
-rw-r--r--t/web/gnupg-select-keys-on-update.t5
-rw-r--r--t/web/helpers-http-cache-headers.t1
-rw-r--r--t/web/html_template.t1
-rw-r--r--t/web/install.t1
-rw-r--r--t/web/installer.t1
-rw-r--r--t/web/language_update.t4
-rw-r--r--t/web/make-clicky.t1
-rw-r--r--t/web/owner_disabled_group_19221.t1
-rw-r--r--t/web/path-traversal.t24
-rw-r--r--t/web/plugin-overlays.t1
-rw-r--r--t/web/psgi-wrap.t1
-rw-r--r--t/web/query_builder.t134
-rw-r--r--t/web/query_builder_queue_limits.t14
-rw-r--r--t/web/queue_caching.t132
-rw-r--r--t/web/reminder-permissions.t4
-rw-r--r--t/web/reminders.t6
-rw-r--r--t/web/rest-search-group.t3
-rw-r--r--t/web/rest-search-queue.t3
-rw-r--r--t/web/rest-search-user.t3
-rw-r--r--t/web/rest-sort.t4
-rw-r--r--t/web/rest.t92
-rw-r--r--t/web/rest_user_cf.t1
-rw-r--r--t/web/rights.t1
-rw-r--r--t/web/saved_search_chart.t1
-rw-r--r--t/web/scrips.t1
-rw-r--r--t/web/search_ical.t4
-rw-r--r--t/web/search_linkdisplay.t1
-rw-r--r--t/web/shredder.t88
-rw-r--r--t/web/signatures.t1
-rw-r--r--t/web/simple_search.t1
-rw-r--r--t/web/smime/outgoing.t1
-rw-r--r--t/web/squish.t1
-rw-r--r--t/web/ticket_display.t4
-rw-r--r--t/web/ticket_display_unset_fields.t41
-rw-r--r--t/web/ticket_forward.t1
-rw-r--r--t/web/ticket_links.t32
-rw-r--r--t/web/ticket_modify_all.t1
-rw-r--r--t/web/ticket_modify_people.t35
-rw-r--r--t/web/ticket_owner.t4
-rw-r--r--t/web/ticket_preserve_basics.t1
-rw-r--r--t/web/ticket_seen.t3
-rw-r--r--t/web/ticket_timeworked.t7
-rw-r--r--t/web/ticket_txn_cf.t1
-rw-r--r--t/web/ticket_txn_subject.t1
-rw-r--r--t/web/user_update.t1
-rwxr-xr-xthird-party-source/devel/third-party/dropzone-4.0.1/dropzone.js2
1217 files changed, 20255 insertions, 16060 deletions
diff --git a/.tag b/.tag
index c639b6e..d16cd3f 100644
--- a/.tag
+++ b/.tag
@@ -1 +1 @@
-rt-4.4.2
+rt-4.4.3
diff --git a/Makefile b/Makefile
index 9373299..d2e6b2d 100644
--- a/Makefile
+++ b/Makefile
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -64,14 +64,14 @@ SITE_CONFIG_FILE = $(CONFIG_FILE_PATH)/RT_SiteConfig.pm
RT_VERSION_MAJOR = 4
RT_VERSION_MINOR = 4
-RT_VERSION_PATCH = 2
+RT_VERSION_PATCH = 3
RT_VERSION = $(RT_VERSION_MAJOR).$(RT_VERSION_MINOR).$(RT_VERSION_PATCH)
TAG = rt-$(RT_VERSION_MAJOR)-$(RT_VERSION_MINOR)-$(RT_VERSION_PATCH)
# This is the group that all of the installed files will be chgrp'ed to.
-RTGROUP = www-data
+RTGROUP = www
# User which should own rt binaries.
@@ -83,8 +83,8 @@ LIBS_OWNER = root
# Group that should own all of RT's libraries, generally root.
LIBS_GROUP = bin
-WEB_USER = www-data
-WEB_GROUP = www-data
+WEB_USER = www
+WEB_GROUP = www
# DESTDIR allows you to specify that RT be installed somewhere other than
# where it will eventually reside. DESTDIR _must_ have a trailing slash
@@ -148,6 +148,7 @@ SYSTEM_BINARIES = rt-attributes-viewer \
rt-fulltext-indexer \
rt-importer \
rt-ldapimport \
+ rt-passwd \
rt-preferences-viewer \
rt-serializer \
rt-server \
@@ -304,7 +305,7 @@ fixperms:
# Make upgrade scripts executable if they are in the source.
#
- ( cd etc/upgrade && find . -type f -not -name '*.in' -perm /0111 -print ) | while read file ; do \
+ ( cd etc/upgrade && find . -type f -not -name '*.in' -perm +0111 -print ) | while read file ; do \
chmod a+x "$(DESTDIR)$(RT_ETC_PATH)/upgrade/$$file" ; \
done
diff --git a/Makefile.in b/Makefile.in
index 464bda0..cc41824 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -148,6 +148,7 @@ SYSTEM_BINARIES = rt-attributes-viewer \
rt-fulltext-indexer \
rt-importer \
rt-ldapimport \
+ rt-passwd \
rt-preferences-viewer \
rt-serializer \
rt-server \
diff --git a/README b/README
index 89842ae..dbbb3c4 100644
--- a/README
+++ b/README
@@ -21,6 +21,7 @@ o Perl 5.10.1 or later (http://www.perl.org).
o A supported SQL database
Currently supported: MySQL 5.1 or later with InnoDB support.
+ MariaDB 10.0 or later with InnoDB support.
Postgres 8.4 or later; 9.0 or later suggested
Oracle 9iR2 or later.
SQLite 3.0 or later; for testing only, no
@@ -285,7 +286,7 @@ fix them. To report a bug, send email to <rt-bugs@bestpractical.com>.
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/bin/rt b/bin/rt
index 09b02d0..da321ee 100755
--- a/bin/rt
+++ b/bin/rt
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/bin/rt-crontool b/bin/rt-crontool
index d107a46..336e6d5 100755
--- a/bin/rt-crontool
+++ b/bin/rt-crontool
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/bin/rt-crontool.in b/bin/rt-crontool.in
index e258400..770bfdb 100644
--- a/bin/rt-crontool.in
+++ b/bin/rt-crontool.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/bin/rt-mailgate b/bin/rt-mailgate
index 7e7da57..23fecac 100755
--- a/bin/rt-mailgate
+++ b/bin/rt-mailgate
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -151,7 +151,7 @@ sub get_useragent {
my $self = shift;
my $opts = shift;
my $ua = LWP::UserAgent->new();
- $ua->agent("rt-mailgate/4.4.2 ");
+ $ua->agent("rt-mailgate/4.4.3 ");
$ua->cookie_jar( { file => $opts->{'jar'} } ) if $opts->{'jar'};
$ua->ssl_opts( verify_hostname => $opts->{'verify-ssl'} );
diff --git a/bin/rt-mailgate.in b/bin/rt-mailgate.in
index 09e911f..0ba96ed 100644
--- a/bin/rt-mailgate.in
+++ b/bin/rt-mailgate.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/bin/rt.in b/bin/rt.in
index 7acbdc7..fcdc622 100644
--- a/bin/rt.in
+++ b/bin/rt.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/configure b/configure
index bfc3101..a958976 100755
--- a/configure
+++ b/configure
@@ -1,7 +1,7 @@
#! /bin/sh
# From configure.ac Revision.
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for RT rt-4.4.2.
+# Generated by GNU Autoconf 2.69 for RT rt-4.4.3.
#
# Report bugs to <rt-bugs@bestpractical.com>.
#
@@ -580,8 +580,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='RT'
PACKAGE_TARNAME='rt'
-PACKAGE_VERSION='rt-4.4.2'
-PACKAGE_STRING='RT rt-4.4.2'
+PACKAGE_VERSION='rt-4.4.3'
+PACKAGE_STRING='RT rt-4.4.3'
PACKAGE_BUGREPORT='rt-bugs@bestpractical.com'
PACKAGE_URL=''
@@ -1330,7 +1330,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures RT rt-4.4.2 to adapt to many kinds of systems.
+\`configure' configures RT rt-4.4.3 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1391,7 +1391,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of RT rt-4.4.2:";;
+ short | recursive ) echo "Configuration of RT rt-4.4.3:";;
esac
cat <<\_ACEOF
@@ -1512,7 +1512,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-RT configure rt-4.4.2
+RT configure rt-4.4.3
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1529,7 +1529,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by RT $as_me rt-4.4.2, which was
+It was created by RT $as_me rt-4.4.3, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -1886,7 +1886,7 @@ rt_version_major=4
rt_version_minor=4
-rt_version_patch=2
+rt_version_patch=3
test "x$rt_version_major" = 'x' && rt_version_major=0
test "x$rt_version_minor" = 'x' && rt_version_minor=0
@@ -3173,7 +3173,7 @@ RT_LOG_PATH_R=${exp_logfiledir}
fi
-ac_config_files="$ac_config_files etc/upgrade/3.8-ical-extension etc/upgrade/4.0-customfield-checkbox-extension etc/upgrade/generate-rtaddressregexp etc/upgrade/sanity-check-stylesheets etc/upgrade/shrink-cgm-table etc/upgrade/shrink-transactions-table etc/upgrade/switch-templates-to etc/upgrade/time-worked-history etc/upgrade/upgrade-articles etc/upgrade/upgrade-assets etc/upgrade/vulnerable-passwords etc/upgrade/upgrade-sla sbin/rt-ldapimport sbin/rt-attributes-viewer sbin/rt-preferences-viewer sbin/rt-session-viewer sbin/rt-dump-metadata sbin/rt-setup-database sbin/rt-test-dependencies sbin/rt-email-digest sbin/rt-email-dashboards sbin/rt-externalize-attachments sbin/rt-clean-sessions sbin/rt-shredder sbin/rt-validator sbin/rt-validate-aliases sbin/rt-email-group-admin sbin/rt-server sbin/rt-server.fcgi sbin/standalone_httpd sbin/rt-setup-fulltext-index sbin/rt-fulltext-indexer sbin/rt-serializer sbin/rt-importer bin/rt-crontool bin/rt-mailgate bin/rt"
+ac_config_files="$ac_config_files etc/upgrade/3.8-ical-extension etc/upgrade/4.0-customfield-checkbox-extension etc/upgrade/generate-rtaddressregexp etc/upgrade/sanity-check-stylesheets etc/upgrade/shrink-cgm-table etc/upgrade/shrink-transactions-table etc/upgrade/switch-templates-to etc/upgrade/time-worked-history etc/upgrade/upgrade-articles etc/upgrade/upgrade-assets etc/upgrade/vulnerable-passwords etc/upgrade/upgrade-sla sbin/rt-ldapimport sbin/rt-attributes-viewer sbin/rt-preferences-viewer sbin/rt-session-viewer sbin/rt-dump-metadata sbin/rt-setup-database sbin/rt-test-dependencies sbin/rt-email-digest sbin/rt-email-dashboards sbin/rt-externalize-attachments sbin/rt-clean-sessions sbin/rt-shredder sbin/rt-validator sbin/rt-validate-aliases sbin/rt-email-group-admin sbin/rt-server sbin/rt-server.fcgi sbin/standalone_httpd sbin/rt-setup-fulltext-index sbin/rt-fulltext-indexer sbin/rt-serializer sbin/rt-importer sbin/rt-passwd bin/rt-crontool bin/rt-mailgate bin/rt"
ac_config_files="$ac_config_files Makefile etc/RT_Config.pm lib/RT/Generated.pm t/data/configs/apache2.2+mod_perl.conf t/data/configs/apache2.2+fastcgi.conf t/data/configs/apache2.4+mod_perl.conf t/data/configs/apache2.4+fastcgi.conf"
@@ -3720,7 +3720,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by RT $as_me rt-4.4.2, which was
+This file was extended by RT $as_me rt-4.4.3, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -3773,7 +3773,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-RT config.status rt-4.4.2
+RT config.status rt-4.4.3
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -3918,6 +3918,7 @@ do
"sbin/rt-fulltext-indexer") CONFIG_FILES="$CONFIG_FILES sbin/rt-fulltext-indexer" ;;
"sbin/rt-serializer") CONFIG_FILES="$CONFIG_FILES sbin/rt-serializer" ;;
"sbin/rt-importer") CONFIG_FILES="$CONFIG_FILES sbin/rt-importer" ;;
+ "sbin/rt-passwd") CONFIG_FILES="$CONFIG_FILES sbin/rt-passwd" ;;
"bin/rt-crontool") CONFIG_FILES="$CONFIG_FILES bin/rt-crontool" ;;
"bin/rt-mailgate") CONFIG_FILES="$CONFIG_FILES bin/rt-mailgate" ;;
"bin/rt") CONFIG_FILES="$CONFIG_FILES bin/rt" ;;
@@ -4416,6 +4417,8 @@ which seems to be undefined. Please make sure it is defined" >&2;}
;;
"sbin/rt-importer":F) chmod ug+x $ac_file
;;
+ "sbin/rt-passwd":F) chmod ug+x $ac_file
+ ;;
"bin/rt-crontool":F) chmod ug+x $ac_file
;;
"bin/rt-mailgate":F) chmod ug+x $ac_file
diff --git a/configure.ac b/configure.ac
index 6b9e88c..d7685d8 100755
--- a/configure.ac
+++ b/configure.ac
@@ -485,6 +485,7 @@ AC_CONFIG_FILES([
sbin/rt-fulltext-indexer
sbin/rt-serializer
sbin/rt-importer
+ sbin/rt-passwd
bin/rt-crontool
bin/rt-mailgate
bin/rt],
diff --git a/devel/tools/change-loc-msgstr b/devel/tools/change-loc-msgstr
index ba8fdfc..5f15174 100755
--- a/devel/tools/change-loc-msgstr
+++ b/devel/tools/change-loc-msgstr
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/cmd-boilerplate b/devel/tools/cmd-boilerplate
index 6ea0105..551e14d 100755
--- a/devel/tools/cmd-boilerplate
+++ b/devel/tools/cmd-boilerplate
@@ -5,7 +5,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/css_tidy b/devel/tools/css_tidy
index 94fc6ef..dd34ed2 100755
--- a/devel/tools/css_tidy
+++ b/devel/tools/css_tidy
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/extract-message-catalog b/devel/tools/extract-message-catalog
index e1766af..26640b1 100755
--- a/devel/tools/extract-message-catalog
+++ b/devel/tools/extract-message-catalog
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -53,56 +53,22 @@ use warnings;
use open qw/ :std :encoding(UTF-8) /;
-use File::Find;
-use File::Copy;
-use Regexp::Common;
-use Carp;
use Locale::PO;
+
+use lib 'lib';
+use RT::I18N::Extract;
+
$| = 1;
# po dir is for extensions
@ARGV = (<share/po/*.po>, <share/po/*.pot>, <po/*.po>, <po/*.pot>) unless @ARGV;
-our %FILECAT;
-
-# extract all strings and stuff them into %FILECAT
+# extract all strings and stuff them into %POT
# scan html dir for extensions
-File::Find::find( { wanted => \&extract_strings_from_code, follow => 1 }, qw(bin sbin lib share html etc) );
-
-# ensure proper escaping and [_1] => %1 transformation
-foreach my $str ( sort keys %FILECAT ) {
- my $entry = delete $FILECAT{$str};
- next unless @{$entry};
-
- my ($filename, $line) = @{ $entry->[0] };
- my $location = "$filename line $line" . (@{$entry} > 1 ? " (and ".(@{$entry}-1)." other places)" : "");
-
- if ($str =~ /^\s/m || $str =~ /\s$/m || $str =~ /\\n$/m) {
- warn "Extraneous whitespace in '$str' at $location\n";
- }
- if (grep {$_->[3]} @{$entry} and $str =~ /([\$\@]\w+)/) {
- warn "Interpolated variable '$1' in '$str' at $location\n";
- }
+my $extract = RT::I18N::Extract->new;
+our %POT = $extract->all;
- my $escape = sub { $_ = shift; s/\b_(\d+)/%$1/; $_ };
- $str =~ s/((?<!~)(?:~~)*)\[_(\d+)\]/$1%$2/g;
- $str =~ s/((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]/"$1%$2(".$escape->($3).")"/eg;
- $str =~ s/~([\[\]])/$1/g;
-
- my $po = Locale::PO->new(-msgid => $str, -msgstr => "");
- $po->reference( join ( ' ', sort map $_->[0].":".$_->[1], @{ $entry } ) );
- my %seen;
- my @vars;
- foreach my $find ( sort { $a->[2] cmp $b->[2] } grep { $_->[2] } @{ $entry } ) {
- my ( $file, $line, $var ) = @{$find};
- $var =~ s/^\s*,\s*//;
- $var =~ s/\s*$//;
- push @vars, "($var)" unless $seen{$var}++;
- }
- $po->automatic( join( "\n", @vars) );
-
- $FILECAT{$po->msgid} = $po;
-}
+print "$_\n" for $extract->errors;
# update all language dictionaries
foreach my $dict (@ARGV) {
@@ -117,208 +83,6 @@ foreach my $dict (@ARGV) {
update($lang, $dict);
}
-sub extract_strings_from_code {
- my $file = $_;
-
- local $/;
- return if ( -d $_ || !-e _ );
- return
- if ( $File::Find::dir =~
- qr!lib/blib|lib/t/autogen|var|m4|local|share/fonts! );
- return if ( /\.(?:pot|po|bak|gif|png|psd|jpe?g|svg|css|js)$/ );
- return if ( /~|,D|,B$|extract-message-catalog$|tweak-template-locstring$/ );
- return if ( /StyleGuide.pod/ );
- return if ( /^[\.#]/ );
- return if ( -f "$_.in" );
-
- print "Looking at $File::Find::name";
- my $filename = $File::Find::name;
- $filename =~ s'^\./'';
- $filename =~ s'\.in$'';
-
- unless (open _, '<', $file) {
- print "\n Cannot open $file for reading ($!), skipping.\n\n";
- return;
- }
-
- my $errors = 0;
-
- my $re_space_wo_nl = qr{(?!\n)\s};
- my $re_loc_suffix = qr{$re_space_wo_nl* \# $re_space_wo_nl* loc $re_space_wo_nl* $}mx;
- my $re_loc_qw_suffix = qr{$re_space_wo_nl* \# $re_space_wo_nl* loc_qw $re_space_wo_nl* $}mx;
- my $re_loc_paren_suffix = qr{$re_space_wo_nl* \# $re_space_wo_nl* loc \(\) $re_space_wo_nl* $}mx;
- my $re_loc_pair_suffix = qr{$re_space_wo_nl* \# $re_space_wo_nl* loc_pair $re_space_wo_nl* $}mx;
- my $re_loc_left_pair_suffix = qr{$re_space_wo_nl* \# $re_space_wo_nl* loc_left_pair $re_space_wo_nl* $}mx;
- my $re_delim = $RE{delimited}{-delim=>q{'"}}{-keep};
-
- $_ = <_>;
-
- # Mason filter: <&|/l>...</&> and <&|/l_unsafe>...</&>
- my $line = 1;
- while (m!\G(.*?<&\|/l(?:_unsafe)?(.*?)&>(.*?)</&>)!sg) {
- my ( $all, $vars, $str ) = ( $1, $2, $3 );
- $vars =~ s/[\n\r]//g;
- $line += ( $all =~ tr/\n/\n/ );
- $str =~ s/\\(['"\\])/$1/g;
- push @{ $FILECAT{$str} }, [ $filename, $line, $vars ];
- }
-
- # Localization function: loc(...)
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?\bloc$RE{balanced}{-parens=>'()'}{-keep})/sg) {
- my ( $all, $match ) = ( $1, $2 );
- $line += ( $all =~ tr/\n/\n/ );
-
- my ( $vars, $str );
- next unless ( $match =~ /\(\s*($re_delim)(.*?)\s*\)$/so );
-
- my $interp = (substr($1,0,1) eq '"' ? 1 : 0);
- $str = substr( $1, 1, -1 ); # $str comes before $vars now
- $vars = $9;
-
- $vars =~ s/[\n\r]//g;
- $str =~ s/\\(['"\\])/$1/g;
-
- push @{ $FILECAT{$str} }, [ $filename, $line, $vars, $interp ];
- }
-
- my %seen;
- # Comment-based mark: "..." # loc
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?($re_delim)[ \{\}\)\],;]*$re_loc_suffix)/smgo) {
- my ( $all, $str ) = ( $1, $2 );
- $line += ( $all =~ tr/\n/\n/ );
- $seen{$line}++;
- unless ( defined $str ) {
- print "\n" unless $errors++;
- print " Couldn't process loc at $filename:$line:\n $str\n";
- next;
- }
- my $interp = (substr($str,0,1) eq '"' ? 1 : 0);
- $str = substr($str, 1, -1);
- $str =~ s/\\(['"\\])/$1/g;
- push @{ $FILECAT{$str} }, [ $filename, $line, '', $interp ];
- }
-
- # Comment-based mark for list to loc(): ("...", $foo, $bar) # loc()
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*? $RE{balanced}{-parens=>'()'}{-keep} [ \{\}\)\],;]* $re_loc_paren_suffix)/sgx) {
- my ( $all, $match ) = ( $1, $2 );
- $line += ( $all =~ tr/\n/\n/ );
-
- my ( $vars, $str );
- unless ( $match =~
- /\(\s*($re_delim)(.*?)\s*\)$/so ) {
- print "\n" unless $errors++;
- print " Failed to match delimited against $match, line $line";
- next;
- }
-
- my $interp = (substr($1,0,1) eq '"' ? 1 : 0);
- $str = substr( $1, 1, -1 ); # $str comes before $vars now
- $vars = $9;
- $seen{$line}++;
-
- $vars =~ s/[\n\r]//g;
- $str =~ s/\\(['"\\])/$1/g;
-
- push @{ $FILECAT{$str} }, [ $filename, $line, $vars, $interp ];
- }
-
- # Comment-based qw mark: "qw(...)" # loc_qw
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?(?:qw\(([^)]+)\)[ \{\}\)\],;]*)?$re_loc_qw_suffix)/smgo) {
- my ( $all, $str ) = ( $1, $2 );
- $line += ( $all =~ tr/\n/\n/ );
- $seen{$line}++;
- unless ( defined $str ) {
- print "\n" unless $errors++;
- print " Couldn't process loc_qw at $filename:$line:\n $str\n";
- next;
- }
- foreach my $value (split ' ', $str) {
- push @{ $FILECAT{$value} }, [ $filename, $line, '' ];
- }
- }
-
- # Comment-based left pair mark: "..." => ... # loc_left_pair
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?(?:(\w+|$re_delim)\s*=>[^#\n]+?)?$re_loc_left_pair_suffix)/smgo) {
- my ( $all, $key ) = ( $1, $2 );
- $line += ( $all =~ tr/\n/\n/ );
- $seen{$line}++;
- unless ( defined $key ) {
- print "\n" unless $errors++;
- print " Couldn't process loc_left_pair at $filename:$line:\n $key\n";
- next;
- }
- my $interp = (substr($key,0,1) eq '"' ? 1 : 0);
- $key =~ s/\\(['"\\])/$1/g if $key =~ s/^(['"])(.*)\1$/$2/g; # dequote potentially quoted string
- push @{ $FILECAT{$key} }, [ $filename, $line, '', $interp ];
- }
-
- # Comment-based pair mark: "..." => "..." # loc_pair
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?(?:(\w+|$re_delim)\s*=>\s*($re_delim)[ \{\}\)\],;]*)?$re_loc_pair_suffix)/smgo) {
- my ( $all, $key, $val ) = ( $1, $2, $10 );
- $line += ( $all =~ tr/\n/\n/ );
- $seen{$line}++;
- unless ( defined $key && defined $val ) {
- print "\n" unless $errors++;
- print " Couldn't process loc_pair at $filename:$line:\n $key\n $val\n";
- next;
- }
- my $interp_key = (substr($key,0,1) eq '"' ? 1 : 0);
- $key =~ s/\\(['"\\])/$1/g if $key =~ s/^(['"])(.*)\1$/$2/g; # dequote potentially quoted string
- push @{ $FILECAT{$key} }, [ $filename, $line, '', $interp_key ];
-
- my $interp_val = (substr($val,0,1) eq '"' ? 1 : 0);
- $val = substr($val, 1, -1); # dequote always quoted string
- $val =~ s/\\(['"\\])/$1/g;
- push @{ $FILECAT{$val} }, [ $filename, $line, '', $interp_val ];
- }
-
- # Specific key foo => "...", #loc{foo}
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*?(\w+|$re_delim)\s*=>\s*($re_delim)(?-s:.*?)\#$re_space_wo_nl*loc\{\2\}$re_space_wo_nl*)$/smgo) {
- my ( $all, $key, $val ) = ( $1, $2, $10 );
- $line += ( $all =~ tr/\n/\n/ );
- $seen{$line}++;
- unless ( defined $key && defined $val ) {
- warn "Couldn't process loc_pair at $filename:$line:\n $key\n $val\n";
- next;
- }
- $val = substr($val, 1, -1); # dequote always quoted string
- $val =~ s/\\(['"])/$1/g;
- push @{ $FILECAT{$val} }, [ $filename, $line, '' ];
- }
-
- # Check for ones we missed
- $line = 1;
- pos($_) = 0;
- while (m/\G(.*? \# $re_space_wo_nl* (loc (_\w+|\(\)|{$re_delim})?) $re_space_wo_nl* $)/smgox) {
- my ($all, $loc_type) = ($1, $2);
- $line += ( $all =~ tr/\n/\n/ );
- next if $seen{$line};
- print "\n" unless $errors++;
- print " $loc_type that did not match, line $line of $filename\n";
- }
-
- if ($errors) {
- print "\n"
- } else {
- print "\r", " " x 100, "\r";
- }
-
- close (_);
-}
sub uniq {
my %seen;
@@ -341,7 +105,7 @@ sub update {
# Default to the empty string for new ones
$lexicon->{$_->msgid} ||= $_
- for values %FILECAT;
+ for values %POT;
my $errors = 0;
for my $msgid ( keys %{$lexicon} ) {
@@ -357,7 +121,7 @@ sub update {
next if not length $entry->dequote($msgid);
# Not found in source? Drop it
- my $source = $FILECAT{$msgid};
+ my $source = $POT{$msgid};
if (not $source) {
delete $lexicon->{$msgid};
next;
diff --git a/devel/tools/license_tag b/devel/tools/license_tag
index a399c11..fdaade2 100755
--- a/devel/tools/license_tag
+++ b/devel/tools/license_tag
@@ -5,7 +5,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -54,7 +54,7 @@ my $LICENSE = <<'EOL';
COPYRIGHT:
-This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
<sales@bestpractical.com>
(Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/rt-apache b/devel/tools/rt-apache
index 7305b2e..d5778a6 100755
--- a/devel/tools/rt-apache
+++ b/devel/tools/rt-apache
@@ -4,7 +4,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/rt-attributes-editor b/devel/tools/rt-attributes-editor
index fc7a2cf..1a6d852 100755
--- a/devel/tools/rt-attributes-editor
+++ b/devel/tools/rt-attributes-editor
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/rt-message-catalog b/devel/tools/rt-message-catalog
index e163867..80947ae 100755
--- a/devel/tools/rt-message-catalog
+++ b/devel/tools/rt-message-catalog
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/rt-parse-mail-log b/devel/tools/rt-parse-mail-log
index 080c52c..fc9ab78 100755
--- a/devel/tools/rt-parse-mail-log
+++ b/devel/tools/rt-parse-mail-log
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/devel/tools/rt-static-docs b/devel/tools/rt-static-docs
index 47842d9..e5b26d7 100755
--- a/devel/tools/rt-static-docs
+++ b/devel/tools/rt-static-docs
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -185,6 +185,9 @@ system_chmod("+x", $_) for <docs/UPGRADING*>;
# Convert each POD file to HTML
$converter->batch_convert( \@dirs, $opts{to} );
+# Run it again to make sure local links are linked correctly
+$converter->batch_convert( \@dirs, $opts{to} );
+
# Remove execution bit from workaround above
system_chmod("-x", $_) for <docs/UPGRADING*>;
diff --git a/devel/tools/tweak-template-locstring b/devel/tools/tweak-template-locstring
index 9421c05..e6a61be 100755
--- a/devel/tools/tweak-template-locstring
+++ b/devel/tools/tweak-template-locstring
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/docs/UPGRADING-4.4 b/docs/UPGRADING-4.4
index 3d8c3ba..1fc0fe1 100644
--- a/docs/UPGRADING-4.4
+++ b/docs/UPGRADING-4.4
@@ -593,6 +593,26 @@ of your database before making updates.
=back
+=item *
+
+RT now has the functionality from
+L<RT::Extension::AdminConditionsAndActions> built in. Users who are
+currently using this extension should remove it from the plugin list.
+Please also remove
+F<local/plugins/RT-Extension-AdminConditionsAndActions> from your RT
+installation.
+
+=back
+
+=head1 UPGRADING FROM 4.4.2 AND EARLIER
+
+=over 4
+
+=item *
+
+The C<MessageRef> parameter of the default callback of C</Elements/MessageBox>
+now contains the reference to the message content as the name implies.
+
=back
=cut
diff --git a/docs/backups.pod b/docs/backups.pod
index 768e7d5..0f9507e 100644
--- a/docs/backups.pod
+++ b/docs/backups.pod
@@ -5,9 +5,17 @@ absolutely necessary to ensure you can recover quickly from an incident.
Make sure you take backups. Make sure they I<work>.
-There are many issues that can cause broken backups, such as a
-C<max_allowed_packet> too low for MySQL (in either the client or server), or
-encoding issues, or running out of disk space.
+There are many issues that can cause broken backups, such as...
+
+=over 4
+
+=item * a C<max_allowed_packet> too low for MySQL or MariaDB in either the client or server
+
+=item * encoding issues
+
+=item * running out of disk space
+
+=back
Make sure your backup cronjobs notify someone if they fail instead of failing
silently until you need them.
@@ -29,22 +37,25 @@ You should put the example commands into a shell script for backup and setup a
cronjob. Make sure output from cron goes to someone who reads mail! (Or into
RT. :)
-=head3 MySQL
+=head3 MySQL and MariaDB
( mysqldump rt4 --tables sessions --no-data --single-transaction; \
mysqldump rt4 --ignore-table rt4.sessions --single-transaction ) \
| gzip > rt-`date +%Y%m%d`.sql.gz
-The dump will be much faster if you can connect to the MySQL server over
-localhost. This will use a local socket instead of the network.
+The dump will be much faster if you can connect to the MySQL or
+MariaDB server over localhost. This will use a local socket instead
+of the network.
-If you find your backups taking far far too long to complete (this point should
-take quite a long time to get to on an RT database), there are some alternate
-solutions. Percona maintains a highly regarded hot-backup tool for MySQL
-called L<XtraBackup|http://www.percona.com/software/percona-xtrabackup/>. If
-you have more resources, you can also setup replication to a slave using binary
-logs and backup from there as necessary. This not only duplicates the data,
-but lets you take backups without putting load on your production server.
+If you find your backups taking far far too long to complete (this
+point should take quite a long time to get to on an RT database),
+there are some alternate solutions. Percona maintains a highly
+regarded hot-backup tool for MySQL and MariaDB called
+L<XtraBackup|http://www.percona.com/software/percona-xtrabackup/>. If
+you have more resources, you can also setup replication to a slave
+using binary logs and backup from there as necessary. This not only
+duplicates the data, but lets you take backups without putting load on
+your production server.
=head4 Restoring from backups
@@ -73,14 +84,14 @@ enough rights to handle creating tables.
If something terrible happened this morning and you want to roll back to
your backups, or if you want to update a dev server using your backups,
-this is straightforward on MySQL.
+this is straightforward on MySQL and MariaDB.
gunzip -c rt-20141014.sql.gz | mysql -uroot -p rt4
-MySQL will drop any existing tables before recreating and repopulating
-them. It will leave the database and the rt_user untouched. This is
-not suitable for restoring on a fresh database install since there will
-be no rt4 database or rt_user user.
+MySQL and MariaDB will drop any existing tables before recreating and
+repopulating them. It will leave the database and the rt_user
+untouched. This is not suitable for restoring on a fresh database
+install since there will be no rt4 database or rt_user user.
=back
diff --git a/docs/charts.pod b/docs/charts.pod
index 52db66f..7e2bb0f 100644
--- a/docs/charts.pod
+++ b/docs/charts.pod
@@ -61,9 +61,10 @@ across English, many western european languages, Chinese (Traditional and
Simplified), and Japanese. If you prefer to use a different font, you can
change the L<< "C<%ChartFont>"|RT_Config/ChartFont >> option.
-There is also an option to use database timezone conversion for PostgreSQL
-and MySQL to enable timezone conversion for time-based reports. See
-F<docs/customizing/timezones_in_charts.pod> for details.
+There is also an option to use database timezone conversion for
+PostgreSQL, MySQL, and MariaDB to enable timezone conversion for
+time-based reports. See F<docs/customizing/timezones_in_charts.pod>
+for details.
Search for "Chart" entries in L<< C<RT_Config> >> for more information on these
options.
diff --git a/docs/customizing/templates.pod b/docs/customizing/templates.pod
index 331534c..fdd2838 100644
--- a/docs/customizing/templates.pod
+++ b/docs/customizing/templates.pod
@@ -26,6 +26,11 @@ colon, then a value. So, for example, to specify a subject, you can use:
=over
+=item RT-Attach-Message: yes
+
+This special header tells RT that any attachments that were added in the
+original message should also be included in the email notification going out.
+
=item Content-Type: text/html
The special header "Content-Type: text/html" tells RT that the template should
@@ -170,5 +175,28 @@ HTML" template is the same template formatted in HTML. The 4.2 upgrade provides
a C<switch-templates-to> script to switch all default templates from plain text
to HTML or the reverse. See the L<UPGRADING-4.2> notes for details.
+=head2 Queue-specific template overrides
+
+Each scrip in RT has a template associated with it. When a scrip goes to send
+email (or use its template for some other purpose), it first tries to load a
+queue-level template with that name. If there is no queue-level template, then
+the scrip will continue by loading the global template with that name.
+
+You can take advantage of this to customize your templates for a specific queue
+by creating a queue-level template with the exact same name as a global
+template. For example, you can make an "Autoreply" template for your Security
+queue which has a completely different message. Other queues will continue to
+use the global "Autoreply" template, but for the Security queue, its special
+"Autoreply" override will be used.
+
+One common pattern is to create a I<blank> template, which the "send email"
+action takes as a hint to avoid sending its email. So by creating a blank queue
+template you can "disable" a specific notification, such as Ticket Taken, for
+an individual queue, while still keeping the scrip globally applied to all
+queues.
+
+You can manage queue-specific templates by visiting
+Admin -> Queues -> Select -> ... -> Templates.
+
=cut
diff --git a/docs/customizing/timezones_in_charts.pod b/docs/customizing/timezones_in_charts.pod
index 47c3a09..39f8de0 100644
--- a/docs/customizing/timezones_in_charts.pod
+++ b/docs/customizing/timezones_in_charts.pod
@@ -13,21 +13,25 @@ C<$ChartsTimezonesInDB> configuration option.
=head1 DATABASE SPECIFIC NOTES
-=head2 mysql
+=head2 MySQL and MariaDB
The time adjustment cannot simply be converted using a numeric time
shift, as this shift value depends on the daylight saving time
properties of the time zone.
-mysql since 4.1.3 supports named timezones, but you have to fill special
-tables with up-to-date timezone data. On modern systems, this is usually
-a simple case of:
+MariaDB and MySQL 4.1.3 and later support timezones. The database
+administrator must fill special tables with up-to-date timezone
+data. On modern systems, this is usually a simple case of:
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
-mysql's doc recommends you restart server after running this; you can
-read more about mysql's timezone support at
-L<http://dev.mysql.com/doc/refman/5.0/en/time-zone-support.html>
+MySQL's documentation recommends restarting the server after running this.
+
+You can read more about MySQL's timezone support at:
+L<https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html>
+
+You can read more about MariaDB's timezone support at:
+L<https://mariadb.com/kb/en/mariadb/time-zones>
=head2 PostgreSQL
@@ -68,14 +72,15 @@ L<http://www.postgresql.org/docs/7.4/static/functions-datetime.html#FUNCTIONS-DA
and
L<http://www.postgresql.org/docs/7.4/static/datatype-datetime.html#DATATYPE-TIMEZONES>
-=head2 mysql
+=head2 MySQL and MariaDB
Once timezone information is loaded into tables on the server,
we have all the same set of named timezones in the system
and DateTime (DateTime project has copy of the TZ data in a module).
-CONVERT_TZ(TS, from, to) exists since mysql 4.1.3. Note that it takes a
-timestamp, so it only supports limitted date range (usuall 1970-2038).
+MariaDB and MySQL 4.1.3 and later support CONVERT_TZ(TS, from,
+to). Note that it takes a timestamp, so it only supports limited date
+range (usually 1970-2038).
=head2 Oracle
diff --git a/docs/full_text_indexing.pod b/docs/full_text_indexing.pod
index 189c346..5b94399 100644
--- a/docs/full_text_indexing.pod
+++ b/docs/full_text_indexing.pod
@@ -56,17 +56,21 @@ C<cron>:
/opt/rt4/sbin/rt-fulltext-indexer --quiet
-=head1 MYSQL
+=head1 MYSQL and MariaDB
On MySQL, full-text search can either be done using native support
(which may use MyISAM tables on pre-5.6 versions of MySQL), or RT can
integrate with the external Sphinx full-text search engine.
-=head2 Native MySQL
+RT supports native full-text search on MariaDB versions 10.0 and
+greater. It does not support Sphinx integration on MariaDB.
-As RT marks attachment data as C<BINARY>, MySQL cannot index this
-content without creating an additional table. To create the required
-table (which is InnoDB on versions of MySQL which support it), run:
+=head2 Native MySQL and MariaDB
+
+As RT marks attachment data as C<BINARY>, MySQL and MariaDB cannot
+index this content without creating an additional table. To create
+the required table (which is InnoDB on versions of MySQL and MariaDB
+which support it), run:
/opt/rt4/sbin/rt-setup-fulltext-index
@@ -126,6 +130,8 @@ distribution-provided packages for MySQL do not include SphinxSE
integration, merely the external Sphinx tools; these are not sufficient
for RT's needs.
+RT does not support MariaDB with Sphinx.
+
=head3 Compiling MySQL and SphinxSE
MySQL 5.1 supports adding pluggable storage engines; after compiling
diff --git a/docs/hacking.pod b/docs/hacking.pod
index e254665..c8c3fb1 100644
--- a/docs/hacking.pod
+++ b/docs/hacking.pod
@@ -183,7 +183,7 @@ before running tests. To do this in place without installing:
make fixdeps
Adjust the relevant database options as necessary if you want to test on
-Postgres, Oracle, or SQLite. The default is MySQL.
+Postgres, Oracle, or SQLite. The default is MySQL/MariaDB.
To run the test suite:
@@ -194,6 +194,18 @@ which will be significantly faster:
make test-parallel
+If you want to run only a subset of the tests, you can use Perl's standard
+C<prove> utility.
+
+ prove -l t/api/ticket.t t/web/ticket_display.t
+
+If you want to run a subset of the tests in parallel, you can pass the C<-j>
+flag to C<prove> with the number of processes to use. Make sure to also set the
+C<RT_TEST_PARALLEL> environment variable to a true value to tell RT you're
+running the tests in parallel.
+
+ RT_TEST_PARALLEL=1 prove -l -j4 t/customfields/*.t
+
The C<*-trunk> and C<master> branches are expected to always be passing
all tests. While it is acceptable to break tests in an intermediate
commit, a branch which does not pass tests will not be merged. Ideally,
diff --git a/docs/network-diagram.svg b/docs/network-diagram.svg
index cbd3fe1..f85a015 100644
--- a/docs/network-diagram.svg
+++ b/docs/network-diagram.svg
@@ -4621,7 +4621,7 @@
style="font-size:14.93165874px"
y="384.14932"
x="548.99976"
- sodipodi:role="line">PostgreSQL, MySQL, Oracle</tspan></text>
+ sodipodi:role="line">PostgreSQL, MySQL, MariaDB, Oracle</tspan></text>
<text
sodipodi:linespacing="125%"
id="text14938-2"
diff --git a/docs/query_builder.pod b/docs/query_builder.pod
index c84b40e..da08d93 100644
--- a/docs/query_builder.pod
+++ b/docs/query_builder.pod
@@ -27,6 +27,18 @@ src="images/search-criteria.png">
=for :man [Search Criteria F<docs/images/search-criteria.png>]
+RT also has two meta-statuses, 'active' and 'inactive'. By selecting either of
+these from the status dropdown of the query builder, you will no longer need
+to explicitly list all of the active or inactive statuses or manually enter
+the queries: "Status = '__Active__'" or "Status = '__Inactive__'".
+
+The sets of active and inactive statuses for a queue are defined by the
+associated lifecycle. Active tickets are those listed for the 'active' and
+'initial' configurations. Inactive tickets are those defined as 'inactive'.
+For the default RT lifecycle, for example, the active statuses are new, open,
+and stalled, and the inactive statuses are resolved, rejected and deleted. See
+F<docs/customizing/lifecycles.pod> for more information.
+
Now that I've selected some criteria, I can click either Add These Terms or
Add These Terms and Search. I'll click the former:
diff --git a/docs/security.pod b/docs/security.pod
index 7120e38..5187d0a 100644
--- a/docs/security.pod
+++ b/docs/security.pod
@@ -62,10 +62,10 @@ CGIs or access the server where RT is running.
=item *
Be sure to protect your database. If it does not need to talk to the
-world, then don't allow it to listen for remote connections. With MySQL
-this can be accomplished via C<skip-networking>. If you use your
-database for other things and must allow remote connections, be sure to
-use a strong, hard to guess password for RT.
+world, then don't allow it to listen for remote connections. With
+MySQL and MariaDB, this can be accomplished via C<skip-networking>.
+If you use your database for other things and must allow remote
+connections, be sure to use a strong, hard to guess password for RT.
=item *
diff --git a/docs/writing_portlets.pod b/docs/writing_portlets.pod
index 434b71e..d9ab82f 100644
--- a/docs/writing_portlets.pod
+++ b/docs/writing_portlets.pod
@@ -38,7 +38,7 @@ They can also appear on the Self-Service interface, but have to be
hard-coded, because Self-Service users don't have the same preferences
available to them. You will have to create your element in
C</opt/rt4/local/html/SelfService/Elements>, then exend the SelfService
-interface to call it. Copy C</opt/rt4/html/SelfService/index.html> to
+interface to call it. Copy C</opt/rt4/share/html/SelfService/index.html> to
C</opt/rt4/local/html/SelfService/index.html>, then edit it to add:
<& /SelfService/Elements/MyPortlet &>
diff --git a/etc/RT_Config.pm b/etc/RT_Config.pm
index af676f1..1b15c8a 100644
--- a/etc/RT_Config.pm
+++ b/etc/RT_Config.pm
@@ -503,6 +503,23 @@ clean up intentional double newlines as well.
Set( $CheckMoreMSMailHeaders, 0);
+=item C<$TreatAttachedEmailAsFiles>
+
+Email coming into RT can sometimes have another email attached, when
+an email is forwarded as an attachment, for example. By default, RT recognizes
+that the attached content is an email and does some processing, including
+some parsing the headers of the attached email. You can see this in suggested
+email addresses on the People page and One-time Cc on reply.
+
+If you want RT to treat attached email files as regular file attachments,
+set this option to true (1). With this option enabled, attached email will
+show up in the "Attachments" section like other types of file attachments
+and content like headers will not be processed.
+
+=cut
+
+Set( $TreatAttachedEmailAsFiles, 0);
+
=back
@@ -1558,8 +1575,11 @@ builder are replaced by text fields that autocomplete. This can
alleviate the sometimes huge owner list for installations where many
users have the OwnTicket right.
-Autocompleter is automatically turned on if list contains more than
-50 users, but penalty of executing potentially slow query is still paid.
+The Owner entry is automatically converted to an autocomplete box if the list
+of owners exceeds C<$DropdownMenuLimit> items. However, the query to generate
+the list of owners is still run and this can increase page load times. If
+your owner lists exceed the limit and you are using the autocomplete box, you
+can improve performance by explicitly setting C<$AutocompleteOwners>.
Drop down doesn't show unprivileged users. If your setup allows unprivileged
to own ticket then you have to enable autocompleting.
@@ -1568,6 +1588,22 @@ to own ticket then you have to enable autocompleting.
Set($AutocompleteOwners, 0);
+=item C<$DropdownMenuLimit>
+
+The Owner dropdown menu, used in various places in RT including the Query
+Builder and ticket edit pages, automatically changes from a dropdown menu to
+an autocomplete field once the menu holds more than the C<$DropdownMenuLimit>
+owners. Dropdown menus become more difficult to use when they contain a large
+number of values and the autocomplete textbox can be more usable.
+
+If you have very large numbers of users who can be owners, this can cause
+slow page loads on pages with an Owner selection. See L</$AutocompleteOwners>
+for a way to potentially speed up page loads.
+
+=cut
+
+Set($DropdownMenuLimit, 50);
+
=item C<$AutocompleteOwnersForSearch>
If set to 1, the owner drop-downs for the query builder are always
@@ -1990,6 +2026,20 @@ Set($MessageBoxIncludeSignatureOnComment, 1);
=back
+=head2 Attach Files
+
+=over 4
+
+=item C<$PreferDropzone>
+
+By default, RT uses Dropzone to attach files if possible. If
+C<$PreferDropzone> is set to 0, RT will always use plain file inputs.
+
+=cut
+
+Set($PreferDropzone, 1);
+
+=back
=head2 Transaction display
@@ -2199,12 +2249,15 @@ Set($QuoteFolding, 1);
If C<$ParseNewMessageForTicketCcs> is set to 1, RT will attempt to
divine Ticket 'Cc' watchers from the To and Cc lines of incoming
-messages that create new Tickets. This option does not apply to replies
-or comments on existing Tickets. Be forewarned that if you have I<any>
+messages that create new tickets. This option does not apply to replies
+or comments on existing tickets. Be forewarned that if you have I<any>
addresses which forward mail to RT automatically and you enable this
option without modifying C<$RTAddressRegexp> below, you will get
yourself into a heap of trouble.
+See also the L<RT::Action::AutoAddWatchers> extension which adds
+watchers from ticket replies on existing tickets.
+
=cut
Set($ParseNewMessageForTicketCcs, undef);
diff --git a/etc/RT_Config.pm.in b/etc/RT_Config.pm.in
index 64386eb..6fe7bc7 100644
--- a/etc/RT_Config.pm.in
+++ b/etc/RT_Config.pm.in
@@ -503,6 +503,23 @@ clean up intentional double newlines as well.
Set( $CheckMoreMSMailHeaders, 0);
+=item C<$TreatAttachedEmailAsFiles>
+
+Email coming into RT can sometimes have another email attached, when
+an email is forwarded as an attachment, for example. By default, RT recognizes
+that the attached content is an email and does some processing, including
+some parsing the headers of the attached email. You can see this in suggested
+email addresses on the People page and One-time Cc on reply.
+
+If you want RT to treat attached email files as regular file attachments,
+set this option to true (1). With this option enabled, attached email will
+show up in the "Attachments" section like other types of file attachments
+and content like headers will not be processed.
+
+=cut
+
+Set( $TreatAttachedEmailAsFiles, 0);
+
=back
@@ -1558,8 +1575,11 @@ builder are replaced by text fields that autocomplete. This can
alleviate the sometimes huge owner list for installations where many
users have the OwnTicket right.
-Autocompleter is automatically turned on if list contains more than
-50 users, but penalty of executing potentially slow query is still paid.
+The Owner entry is automatically converted to an autocomplete box if the list
+of owners exceeds C<$DropdownMenuLimit> items. However, the query to generate
+the list of owners is still run and this can increase page load times. If
+your owner lists exceed the limit and you are using the autocomplete box, you
+can improve performance by explicitly setting C<$AutocompleteOwners>.
Drop down doesn't show unprivileged users. If your setup allows unprivileged
to own ticket then you have to enable autocompleting.
@@ -1568,6 +1588,22 @@ to own ticket then you have to enable autocompleting.
Set($AutocompleteOwners, 0);
+=item C<$DropdownMenuLimit>
+
+The Owner dropdown menu, used in various places in RT including the Query
+Builder and ticket edit pages, automatically changes from a dropdown menu to
+an autocomplete field once the menu holds more than the C<$DropdownMenuLimit>
+owners. Dropdown menus become more difficult to use when they contain a large
+number of values and the autocomplete textbox can be more usable.
+
+If you have very large numbers of users who can be owners, this can cause
+slow page loads on pages with an Owner selection. See L</$AutocompleteOwners>
+for a way to potentially speed up page loads.
+
+=cut
+
+Set($DropdownMenuLimit, 50);
+
=item C<$AutocompleteOwnersForSearch>
If set to 1, the owner drop-downs for the query builder are always
@@ -1990,6 +2026,20 @@ Set($MessageBoxIncludeSignatureOnComment, 1);
=back
+=head2 Attach Files
+
+=over 4
+
+=item C<$PreferDropzone>
+
+By default, RT uses Dropzone to attach files if possible. If
+C<$PreferDropzone> is set to 0, RT will always use plain file inputs.
+
+=cut
+
+Set($PreferDropzone, 1);
+
+=back
=head2 Transaction display
@@ -2199,12 +2249,15 @@ Set($QuoteFolding, 1);
If C<$ParseNewMessageForTicketCcs> is set to 1, RT will attempt to
divine Ticket 'Cc' watchers from the To and Cc lines of incoming
-messages that create new Tickets. This option does not apply to replies
-or comments on existing Tickets. Be forewarned that if you have I<any>
+messages that create new tickets. This option does not apply to replies
+or comments on existing tickets. Be forewarned that if you have I<any>
addresses which forward mail to RT automatically and you enable this
option without modifying C<$RTAddressRegexp> below, you will get
yourself into a heap of trouble.
+See also the L<RT::Action::AutoAddWatchers> extension which adds
+watchers from ticket replies on existing tickets.
+
=cut
Set($ParseNewMessageForTicketCcs, undef);
diff --git a/etc/upgrade/3.8-ical-extension b/etc/upgrade/3.8-ical-extension
index e8f65b8..55cc55e 100755
--- a/etc/upgrade/3.8-ical-extension
+++ b/etc/upgrade/3.8-ical-extension
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/3.8-ical-extension.in b/etc/upgrade/3.8-ical-extension.in
index b328390..44a8820 100644
--- a/etc/upgrade/3.8-ical-extension.in
+++ b/etc/upgrade/3.8-ical-extension.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/4.0-customfield-checkbox-extension b/etc/upgrade/4.0-customfield-checkbox-extension
index 32ba0ea..16f8102 100755
--- a/etc/upgrade/4.0-customfield-checkbox-extension
+++ b/etc/upgrade/4.0-customfield-checkbox-extension
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/4.0-customfield-checkbox-extension.in b/etc/upgrade/4.0-customfield-checkbox-extension.in
index f289a0d..d61575d 100644
--- a/etc/upgrade/4.0-customfield-checkbox-extension.in
+++ b/etc/upgrade/4.0-customfield-checkbox-extension.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/generate-rtaddressregexp b/etc/upgrade/generate-rtaddressregexp
index 194c95c..22865af 100755
--- a/etc/upgrade/generate-rtaddressregexp
+++ b/etc/upgrade/generate-rtaddressregexp
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/generate-rtaddressregexp.in b/etc/upgrade/generate-rtaddressregexp.in
index 9a097e9..7f9edc0 100644
--- a/etc/upgrade/generate-rtaddressregexp.in
+++ b/etc/upgrade/generate-rtaddressregexp.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/sanity-check-stylesheets b/etc/upgrade/sanity-check-stylesheets
index 4649282..62c3333 100755
--- a/etc/upgrade/sanity-check-stylesheets
+++ b/etc/upgrade/sanity-check-stylesheets
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/sanity-check-stylesheets.in b/etc/upgrade/sanity-check-stylesheets.in
index ed6da65..491643f 100644
--- a/etc/upgrade/sanity-check-stylesheets.in
+++ b/etc/upgrade/sanity-check-stylesheets.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/shrink-cgm-table b/etc/upgrade/shrink-cgm-table
index ae0e02b..e55a451 100755
--- a/etc/upgrade/shrink-cgm-table
+++ b/etc/upgrade/shrink-cgm-table
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/shrink-cgm-table.in b/etc/upgrade/shrink-cgm-table.in
index 3dfe215..4d63050 100644
--- a/etc/upgrade/shrink-cgm-table.in
+++ b/etc/upgrade/shrink-cgm-table.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/shrink-transactions-table b/etc/upgrade/shrink-transactions-table
index 5fb57cb..065f8f4 100755
--- a/etc/upgrade/shrink-transactions-table
+++ b/etc/upgrade/shrink-transactions-table
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/shrink-transactions-table.in b/etc/upgrade/shrink-transactions-table.in
index d083b8c..96b44ff 100644
--- a/etc/upgrade/shrink-transactions-table.in
+++ b/etc/upgrade/shrink-transactions-table.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/switch-templates-to b/etc/upgrade/switch-templates-to
index e86ae30..f8d53d4 100755
--- a/etc/upgrade/switch-templates-to
+++ b/etc/upgrade/switch-templates-to
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/switch-templates-to.in b/etc/upgrade/switch-templates-to.in
index b96f9a1..20c97e0 100644
--- a/etc/upgrade/switch-templates-to.in
+++ b/etc/upgrade/switch-templates-to.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/time-worked-history b/etc/upgrade/time-worked-history
index b953675..9748bed 100755
--- a/etc/upgrade/time-worked-history
+++ b/etc/upgrade/time-worked-history
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/time-worked-history.in b/etc/upgrade/time-worked-history.in
index 6920dde..d20556b 100644
--- a/etc/upgrade/time-worked-history.in
+++ b/etc/upgrade/time-worked-history.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-articles b/etc/upgrade/upgrade-articles
index 39c08c4..a44dbf7 100755
--- a/etc/upgrade/upgrade-articles
+++ b/etc/upgrade/upgrade-articles
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-articles.in b/etc/upgrade/upgrade-articles.in
index 8eaf965..a490296 100644
--- a/etc/upgrade/upgrade-articles.in
+++ b/etc/upgrade/upgrade-articles.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-assets b/etc/upgrade/upgrade-assets
index b46f972..1d0a580 100755
--- a/etc/upgrade/upgrade-assets
+++ b/etc/upgrade/upgrade-assets
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-assets.in b/etc/upgrade/upgrade-assets.in
index bd97972..67cc176 100644
--- a/etc/upgrade/upgrade-assets.in
+++ b/etc/upgrade/upgrade-assets.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-mysql-schema.pl b/etc/upgrade/upgrade-mysql-schema.pl
index 2fcbebe..c88037a 100755
--- a/etc/upgrade/upgrade-mysql-schema.pl
+++ b/etc/upgrade/upgrade-mysql-schema.pl
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-sla b/etc/upgrade/upgrade-sla
index 84093c9..d9a581b 100755
--- a/etc/upgrade/upgrade-sla
+++ b/etc/upgrade/upgrade-sla
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/upgrade-sla.in b/etc/upgrade/upgrade-sla.in
index 1db4728..6dd5f4d 100644
--- a/etc/upgrade/upgrade-sla.in
+++ b/etc/upgrade/upgrade-sla.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/vulnerable-passwords b/etc/upgrade/vulnerable-passwords
index 893e176..9cb164a 100755
--- a/etc/upgrade/vulnerable-passwords
+++ b/etc/upgrade/vulnerable-passwords
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/etc/upgrade/vulnerable-passwords.in b/etc/upgrade/vulnerable-passwords.in
index 31cf14b..38eb139 100644
--- a/etc/upgrade/vulnerable-passwords.in
+++ b/etc/upgrade/vulnerable-passwords.in
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT.pm b/lib/RT.pm
index 5775bdf..af4a7bd 100644
--- a/lib/RT.pm
+++ b/lib/RT.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -200,6 +200,7 @@ sub Init {
InitSystemObjects();
InitClasses(%args);
InitLogging();
+ ProcessPreInitMessages();
InitPlugins();
_BuildTableAttributes();
RT::I18N->Init;
@@ -249,6 +250,10 @@ sub InitLogging {
unless ( $RT::Logger ) {
+ # preload UTF-8 encoding so that Encode:encode doesn't fail to load
+ # as part of throwing an exception
+ Encode::encode("UTF-8","");
+
$RT::Logger = Log::Dispatch->new;
my $stack_from_level;
@@ -370,6 +375,15 @@ sub InitLogging {
InitSignalHandlers();
}
+# Some messages may have been logged before the logger was available.
+# Output them here.
+
+sub ProcessPreInitMessages {
+ foreach my $message ( @RT::Config::PreInitLoggerMessages ){
+ RT->Logger->debug($message);
+ }
+}
+
sub InitSignalHandlers {
# Signal handlers
@@ -546,6 +560,10 @@ sub _BuildTableAttributes {
RT::ObjectClass
RT::ObjectTopic
RT::Topic
+ RT::Asset
+ RT::Catalog
+ RT::CustomRole
+ RT::ObjectCustomRole
);
}
diff --git a/lib/RT/ACE.pm b/lib/RT/ACE.pm
index a28c54b..04a6c50 100644
--- a/lib/RT/ACE.pm
+++ b/lib/RT/ACE.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ACL.pm b/lib/RT/ACL.pm
index 1a9a1cc..e66e52d 100644
--- a/lib/RT/ACL.pm
+++ b/lib/RT/ACL.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action.pm b/lib/RT/Action.pm
index 0f8002d..fc1ee94 100644
--- a/lib/RT/Action.pm
+++ b/lib/RT/Action.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/AddPriority.pm b/lib/RT/Action/AddPriority.pm
index 6341c68..b18ec6e 100644
--- a/lib/RT/Action/AddPriority.pm
+++ b/lib/RT/Action/AddPriority.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/AutoOpen.pm b/lib/RT/Action/AutoOpen.pm
index 72ee89c..1004cf2 100644
--- a/lib/RT/Action/AutoOpen.pm
+++ b/lib/RT/Action/AutoOpen.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/AutoOpenInactive.pm b/lib/RT/Action/AutoOpenInactive.pm
index 91f2065..fdf60c7 100644
--- a/lib/RT/Action/AutoOpenInactive.pm
+++ b/lib/RT/Action/AutoOpenInactive.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/Autoreply.pm b/lib/RT/Action/Autoreply.pm
index 905b86c..cb6ee9e 100644
--- a/lib/RT/Action/Autoreply.pm
+++ b/lib/RT/Action/Autoreply.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/CreateTickets.pm b/lib/RT/Action/CreateTickets.pm
index 51c6ca9..86e6ff2 100644
--- a/lib/RT/Action/CreateTickets.pm
+++ b/lib/RT/Action/CreateTickets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/EscalatePriority.pm b/lib/RT/Action/EscalatePriority.pm
index b43d00c..81df1b6 100644
--- a/lib/RT/Action/EscalatePriority.pm
+++ b/lib/RT/Action/EscalatePriority.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/ExtractSubjectTag.pm b/lib/RT/Action/ExtractSubjectTag.pm
index ce8628d..07758c0 100644
--- a/lib/RT/Action/ExtractSubjectTag.pm
+++ b/lib/RT/Action/ExtractSubjectTag.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/LinearEscalate.pm b/lib/RT/Action/LinearEscalate.pm
index b209177..ffed0d0 100644
--- a/lib/RT/Action/LinearEscalate.pm
+++ b/lib/RT/Action/LinearEscalate.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -263,11 +263,3 @@ sub Commit {
RT::Base->_ImportOverlays();
1;
-
-=head1 AUTHORS
-
-Kevin Riggle E<lt>kevinr@bestpractical.comE<gt>
-
-Ruslan Zakirov E<lt>ruz@bestpractical.comE<gt>
-
-=cut
diff --git a/lib/RT/Action/Notify.pm b/lib/RT/Action/Notify.pm
index 5ce594c..5a44a62 100644
--- a/lib/RT/Action/Notify.pm
+++ b/lib/RT/Action/Notify.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -139,7 +139,8 @@ sub SetRecipients {
|| $name eq 'AdminCc'
|| $name eq 'Cc'
|| $name eq 'OtherRecipients'
- || $name eq 'AlwaysNotifyActor';
+ || $name eq 'AlwaysNotifyActor'
+ || $name eq 'NeverNotifyActor';
my $roles = RT::CustomRoles->new( $self->CurrentUser );
$roles->Limit( FIELD => 'Name', VALUE => $name, CASESENSITIVE => 0 );
@@ -237,8 +238,10 @@ sub SetRecipients {
Remove transaction creator as appropriate for the NotifyActor setting.
-To send email to the selected receipients regardless of RT's NotifyActor
-configuration, include AlwaysNotifyActor in the list of arguments.
+To send email to the selected recipients regardless of RT's NotifyActor
+configuration, include AlwaysNotifyActor in the list of arguments. Or to
+always suppress email to the selected recipients regardless of RT's
+NotifyActor configuration, include NeverNotifyActor in the list of arguments.
=cut
@@ -255,8 +258,9 @@ sub RemoveInappropriateRecipients {
return unless lc $_[0] eq lc $creator;
return "not sending to $creator, creator of the transaction, due to NotifyActor setting";
},
- ) unless RT->Config->Get('NotifyActor',$TransactionCurrentUser)
- || $self->Argument =~ /\bAlwaysNotifyActor\b/;
+ ) if $self->Argument =~ /\bNeverNotifyActor\b/ ||
+ (!RT->Config->Get('NotifyActor',$TransactionCurrentUser)
+ && $self->Argument !~ /\bAlwaysNotifyActor\b/);
$self->SUPER::RemoveInappropriateRecipients();
}
diff --git a/lib/RT/Action/NotifyAsComment.pm b/lib/RT/Action/NotifyAsComment.pm
index 03fc391..f596c24 100644
--- a/lib/RT/Action/NotifyAsComment.pm
+++ b/lib/RT/Action/NotifyAsComment.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/NotifyGroup.pm b/lib/RT/Action/NotifyGroup.pm
index 41f2b78..3c18f6d 100644
--- a/lib/RT/Action/NotifyGroup.pm
+++ b/lib/RT/Action/NotifyGroup.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -75,8 +75,10 @@ require RT::Group;
Sets the recipients of this message to Groups and/or Users.
Respects RT's NotifyActor configuration.
-To send email to the selected receipients regardless of RT's NotifyActor
-configuration, include AlwaysNotifyActor in the list of arguments.
+To send email to the selected recipients regardless of RT's NotifyActor
+configuration, include AlwaysNotifyActor in the list of arguments. Or to
+always suppress email to the selected recipients regardless of RT's
+NotifyActor configuration, include NeverNotifyActor in the list of arguments.
=cut
@@ -97,7 +99,8 @@ sub _HandleArgument {
my $self = shift;
my $instance = shift;
- return if ( $instance eq 'AlwaysNotifyActor' );
+ return if $instance eq 'AlwaysNotifyActor'
+ || $instance eq 'NeverNotifyActor';
if ( $instance !~ /\D/ ) {
my $obj = RT::Principal->new( $self->CurrentUser );
@@ -189,14 +192,6 @@ sub __PushUserAddress {
}
-=head1 AUTHOR
-
-Ruslan U. Zakirov E<lt>ruz@bestpractical.comE<gt>
-
-L<RT::Action::NotifyGroupAsComment>, F<rt-email-group-admin>
-
-=cut
-
RT::Base->_ImportOverlays();
1;
diff --git a/lib/RT/Action/NotifyGroupAsComment.pm b/lib/RT/Action/NotifyGroupAsComment.pm
index 82841d5..6ca6e80 100644
--- a/lib/RT/Action/NotifyGroupAsComment.pm
+++ b/lib/RT/Action/NotifyGroupAsComment.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -70,12 +70,6 @@ sub SetReturnAddress {
return $self->SUPER::SetReturnAddress( @_, is_comment => 1 );
}
-=head1 AUTHOR
-
-Ruslan U. Zakirov E<lt>ruz@bestpractical.comE<gt>
-
-=cut
-
RT::Base->_ImportOverlays();
1;
diff --git a/lib/RT/Action/NotifyOwnerOrAdminCc.pm b/lib/RT/Action/NotifyOwnerOrAdminCc.pm
index b64f205..8d88e3f 100644
--- a/lib/RT/Action/NotifyOwnerOrAdminCc.pm
+++ b/lib/RT/Action/NotifyOwnerOrAdminCc.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/OpenOnStarted.pm b/lib/RT/Action/OpenOnStarted.pm
index 56382f7..6bc87b1 100644
--- a/lib/RT/Action/OpenOnStarted.pm
+++ b/lib/RT/Action/OpenOnStarted.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/RecordComment.pm b/lib/RT/Action/RecordComment.pm
index 999ca7b..2ae95df 100644
--- a/lib/RT/Action/RecordComment.pm
+++ b/lib/RT/Action/RecordComment.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/RecordCorrespondence.pm b/lib/RT/Action/RecordCorrespondence.pm
index ab656fd..1754889 100644
--- a/lib/RT/Action/RecordCorrespondence.pm
+++ b/lib/RT/Action/RecordCorrespondence.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SLA.pm b/lib/RT/Action/SLA.pm
index 0f70a5c..9b877a1 100644
--- a/lib/RT/Action/SLA.pm
+++ b/lib/RT/Action/SLA.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SLA_SetDue.pm b/lib/RT/Action/SLA_SetDue.pm
index 4e3acc6..1b4900e 100644
--- a/lib/RT/Action/SLA_SetDue.pm
+++ b/lib/RT/Action/SLA_SetDue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SLA_SetStarts.pm b/lib/RT/Action/SLA_SetStarts.pm
index 9871f83..8398777 100644
--- a/lib/RT/Action/SLA_SetStarts.pm
+++ b/lib/RT/Action/SLA_SetStarts.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SendEmail.pm b/lib/RT/Action/SendEmail.pm
index 1fa479b..ad5307e 100644
--- a/lib/RT/Action/SendEmail.pm
+++ b/lib/RT/Action/SendEmail.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SendForward.pm b/lib/RT/Action/SendForward.pm
index db51001..7b03270 100644
--- a/lib/RT/Action/SendForward.pm
+++ b/lib/RT/Action/SendForward.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SetCustomFieldToNow.pm b/lib/RT/Action/SetCustomFieldToNow.pm
index 9a76dde..61d07c8 100644
--- a/lib/RT/Action/SetCustomFieldToNow.pm
+++ b/lib/RT/Action/SetCustomFieldToNow.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SetPriority.pm b/lib/RT/Action/SetPriority.pm
index 54c152d..bd75a23 100644
--- a/lib/RT/Action/SetPriority.pm
+++ b/lib/RT/Action/SetPriority.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/SetStatus.pm b/lib/RT/Action/SetStatus.pm
index f6692c4..da15dc8 100644
--- a/lib/RT/Action/SetStatus.pm
+++ b/lib/RT/Action/SetStatus.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Action/UpdateParentTimeWorked.pm b/lib/RT/Action/UpdateParentTimeWorked.pm
index 1e1b543..35a0976 100644
--- a/lib/RT/Action/UpdateParentTimeWorked.pm
+++ b/lib/RT/Action/UpdateParentTimeWorked.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -136,10 +136,4 @@ sub Commit {
}
}
-=head1 AUTHOR
-
-Best Practical Solutions, LLC E<lt>modules@bestpractical.comE<gt>
-
-=cut
-
1;
diff --git a/lib/RT/Action/UserDefined.pm b/lib/RT/Action/UserDefined.pm
index f7dee10..9f23068 100644
--- a/lib/RT/Action/UserDefined.pm
+++ b/lib/RT/Action/UserDefined.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval.pm b/lib/RT/Approval.pm
index 1ce3077..ee4221e 100644
--- a/lib/RT/Approval.pm
+++ b/lib/RT/Approval.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval/Rule.pm b/lib/RT/Approval/Rule.pm
index 484ff8a..a764952 100644
--- a/lib/RT/Approval/Rule.pm
+++ b/lib/RT/Approval/Rule.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval/Rule/Created.pm b/lib/RT/Approval/Rule/Created.pm
index 262ecce..c5bc207 100644
--- a/lib/RT/Approval/Rule/Created.pm
+++ b/lib/RT/Approval/Rule/Created.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval/Rule/NewPending.pm b/lib/RT/Approval/Rule/NewPending.pm
index 6088d31..e192ddc 100644
--- a/lib/RT/Approval/Rule/NewPending.pm
+++ b/lib/RT/Approval/Rule/NewPending.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval/Rule/Passed.pm b/lib/RT/Approval/Rule/Passed.pm
index ae2aa68..06956ca 100644
--- a/lib/RT/Approval/Rule/Passed.pm
+++ b/lib/RT/Approval/Rule/Passed.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Approval/Rule/Rejected.pm b/lib/RT/Approval/Rule/Rejected.pm
index 1b6f9cb..91b8308 100644
--- a/lib/RT/Approval/Rule/Rejected.pm
+++ b/lib/RT/Approval/Rule/Rejected.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Article.pm b/lib/RT/Article.pm
index 0e223e5..70427b7 100644
--- a/lib/RT/Article.pm
+++ b/lib/RT/Article.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Articles.pm b/lib/RT/Articles.pm
index d06b26e..1e203a3 100644
--- a/lib/RT/Articles.pm
+++ b/lib/RT/Articles.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Asset.pm b/lib/RT/Asset.pm
index 33a46d3..7d6e93a 100644
--- a/lib/RT/Asset.pm
+++ b/lib/RT/Asset.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -647,6 +647,32 @@ sub _CoreAccessible {
}
}
+sub FindDependencies {
+ my $self = shift;
+ my ($walker, $deps) = @_;
+
+ $self->SUPER::FindDependencies($walker, $deps);
+
+ # Links
+ my $links = RT::Links->new( $self->CurrentUser );
+ $links->Limit(
+ SUBCLAUSE => "either",
+ FIELD => $_,
+ VALUE => $self->URI,
+ ENTRYAGGREGATOR => 'OR'
+ ) for qw/Base Target/;
+ $deps->Add( in => $links );
+
+ # Asset role groups( Owner, HeldBy, Contact )
+ my $objs = RT::Groups->new( $self->CurrentUser );
+ $objs->Limit( FIELD => 'Domain', VALUE => 'RT::Asset-Role', CASESENSITIVE => 0 );
+ $objs->Limit( FIELD => 'Instance', VALUE => $self->Id );
+ $deps->Add( in => $objs );
+
+ # Catalog
+ $deps->Add( out => $self->CatalogObj );
+}
+
RT::Base->_ImportOverlays();
1;
diff --git a/lib/RT/Assets.pm b/lib/RT/Assets.pm
index 5a5cc69..a77e2e0 100644
--- a/lib/RT/Assets.pm
+++ b/lib/RT/Assets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Attachment.pm b/lib/RT/Attachment.pm
index 196c803..4c54430 100644
--- a/lib/RT/Attachment.pm
+++ b/lib/RT/Attachment.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Attachments.pm b/lib/RT/Attachments.pm
index b1c133d..8b06088 100644
--- a/lib/RT/Attachments.pm
+++ b/lib/RT/Attachments.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Attribute.pm b/lib/RT/Attribute.pm
index aa965e0..0850894 100644
--- a/lib/RT/Attribute.pm
+++ b/lib/RT/Attribute.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -432,7 +432,7 @@ sub CurrentUserHasRight {
=head1 TODO
-We should be deserializing the content on load and then enver again, rather than at every access
+We should be deserializing the content on load and then never again, rather than at every access
=cut
diff --git a/lib/RT/Attributes.pm b/lib/RT/Attributes.pm
index 2a8869a..10b9f4b 100644
--- a/lib/RT/Attributes.pm
+++ b/lib/RT/Attributes.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Authen/ExternalAuth.pm b/lib/RT/Authen/ExternalAuth.pm
index 341c5f9..f3a2f82 100644
--- a/lib/RT/Authen/ExternalAuth.pm
+++ b/lib/RT/Authen/ExternalAuth.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Authen/ExternalAuth/DBI.pm b/lib/RT/Authen/ExternalAuth/DBI.pm
index 2138fec..e4dfbb2 100644
--- a/lib/RT/Authen/ExternalAuth/DBI.pm
+++ b/lib/RT/Authen/ExternalAuth/DBI.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Authen/ExternalAuth/DBI/Cookie.pm b/lib/RT/Authen/ExternalAuth/DBI/Cookie.pm
index 8866abb..bddbd0b 100644
--- a/lib/RT/Authen/ExternalAuth/DBI/Cookie.pm
+++ b/lib/RT/Authen/ExternalAuth/DBI/Cookie.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Authen/ExternalAuth/LDAP.pm b/lib/RT/Authen/ExternalAuth/LDAP.pm
index fd2b761..a1e3eef 100644
--- a/lib/RT/Authen/ExternalAuth/LDAP.pm
+++ b/lib/RT/Authen/ExternalAuth/LDAP.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Base.pm b/lib/RT/Base.pm
index be98480..7cec0df 100644
--- a/lib/RT/Base.pm
+++ b/lib/RT/Base.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CachedGroupMember.pm b/lib/RT/CachedGroupMember.pm
index eca6c68..ae72b5e 100644
--- a/lib/RT/CachedGroupMember.pm
+++ b/lib/RT/CachedGroupMember.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CachedGroupMembers.pm b/lib/RT/CachedGroupMembers.pm
index f3d0bf0..84d450b 100644
--- a/lib/RT/CachedGroupMembers.pm
+++ b/lib/RT/CachedGroupMembers.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Catalog.pm b/lib/RT/Catalog.pm
index ae4abf8..b34f196 100644
--- a/lib/RT/Catalog.pm
+++ b/lib/RT/Catalog.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -499,6 +499,59 @@ sub _CoreAccessible {
}
}
+sub FindDependencies {
+ my $self = shift;
+ my ($walker, $deps) = @_;
+
+ $self->SUPER::FindDependencies($walker, $deps);
+
+ # Role groups( HeldBy, Contact)
+ my $objs = RT::Groups->new( $self->CurrentUser );
+ $objs->Limit( FIELD => 'Domain', VALUE => 'RT::Catalog-Role', CASESENSITIVE => 0 );
+ $objs->Limit( FIELD => 'Instance', VALUE => $self->Id );
+ $deps->Add( in => $objs );
+
+ # Custom Fields on assets _in_ this catalog
+ $objs = RT::ObjectCustomFields->new( $self->CurrentUser );
+ $objs->Limit( FIELD => 'ObjectId',
+ OPERATOR => '=',
+ VALUE => $self->id,
+ ENTRYAGGREGATOR => 'OR' );
+ $objs->Limit( FIELD => 'ObjectId',
+ OPERATOR => '=',
+ VALUE => 0,
+ ENTRYAGGREGATOR => 'OR' );
+ my $cfs = $objs->Join(
+ ALIAS1 => 'main',
+ FIELD1 => 'CustomField',
+ TABLE2 => 'CustomFields',
+ FIELD2 => 'id',
+ );
+ $objs->Limit( ALIAS => $cfs,
+ FIELD => 'LookupType',
+ OPERATOR => 'STARTSWITH',
+ VALUE => 'RT::Catalog-' );
+ $deps->Add( in => $objs );
+
+ # Assets
+ $objs = RT::Assets->new( $self->CurrentUser );
+ $objs->Limit( FIELD => "Catalog", VALUE => $self->Id );
+ $objs->{allow_deleted_search} = 1;
+ $deps->Add( in => $objs );
+
+}
+
+sub PreInflate {
+ my $class = shift;
+ my ( $importer, $uid, $data ) = @_;
+
+ $class->SUPER::PreInflate( $importer, $uid, $data );
+ $data->{Name} = $importer->Qualify( $data->{Name} );
+
+ return if $importer->MergeBy( "Name", $class, $uid, $data );
+ return 1;
+}
+
RT::Base->_ImportOverlays();
1;
diff --git a/lib/RT/Catalogs.pm b/lib/RT/Catalogs.pm
index 7d70fb8..c105390 100644
--- a/lib/RT/Catalogs.pm
+++ b/lib/RT/Catalogs.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Class.pm b/lib/RT/Class.pm
index 4df51df..7784a3b 100644
--- a/lib/RT/Class.pm
+++ b/lib/RT/Class.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Classes.pm b/lib/RT/Classes.pm
index 91a5adf..76d592a 100644
--- a/lib/RT/Classes.pm
+++ b/lib/RT/Classes.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition.pm b/lib/RT/Condition.pm
index f371cd4..8fc3687 100644
--- a/lib/RT/Condition.pm
+++ b/lib/RT/Condition.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/AnyTransaction.pm b/lib/RT/Condition/AnyTransaction.pm
index 092162b..ceda875 100644
--- a/lib/RT/Condition/AnyTransaction.pm
+++ b/lib/RT/Condition/AnyTransaction.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/BeforeDue.pm b/lib/RT/Condition/BeforeDue.pm
index d72b2c3..5dc9561 100644
--- a/lib/RT/Condition/BeforeDue.pm
+++ b/lib/RT/Condition/BeforeDue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/CloseTicket.pm b/lib/RT/Condition/CloseTicket.pm
index 5e1224b..767cdf7 100644
--- a/lib/RT/Condition/CloseTicket.pm
+++ b/lib/RT/Condition/CloseTicket.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/Overdue.pm b/lib/RT/Condition/Overdue.pm
index 3196bd3..bc03a57 100644
--- a/lib/RT/Condition/Overdue.pm
+++ b/lib/RT/Condition/Overdue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/OwnerChange.pm b/lib/RT/Condition/OwnerChange.pm
index 3e4e3ce..5ed53e5 100644
--- a/lib/RT/Condition/OwnerChange.pm
+++ b/lib/RT/Condition/OwnerChange.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/PriorityChange.pm b/lib/RT/Condition/PriorityChange.pm
index 4e9dc05..f355d67 100644
--- a/lib/RT/Condition/PriorityChange.pm
+++ b/lib/RT/Condition/PriorityChange.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/PriorityExceeds.pm b/lib/RT/Condition/PriorityExceeds.pm
index 657d65f..0b95bbd 100644
--- a/lib/RT/Condition/PriorityExceeds.pm
+++ b/lib/RT/Condition/PriorityExceeds.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/QueueChange.pm b/lib/RT/Condition/QueueChange.pm
index 08b89cd..34b4837 100644
--- a/lib/RT/Condition/QueueChange.pm
+++ b/lib/RT/Condition/QueueChange.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/ReopenTicket.pm b/lib/RT/Condition/ReopenTicket.pm
index 0a7189d..7d3054d 100644
--- a/lib/RT/Condition/ReopenTicket.pm
+++ b/lib/RT/Condition/ReopenTicket.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/SLA.pm b/lib/RT/Condition/SLA.pm
index 947b819..87417a4 100644
--- a/lib/RT/Condition/SLA.pm
+++ b/lib/RT/Condition/SLA.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/SLA_RequireDueSet.pm b/lib/RT/Condition/SLA_RequireDueSet.pm
index cff8b82..17f146b 100644
--- a/lib/RT/Condition/SLA_RequireDueSet.pm
+++ b/lib/RT/Condition/SLA_RequireDueSet.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/SLA_RequireStartsSet.pm b/lib/RT/Condition/SLA_RequireStartsSet.pm
index 260455a..c9ba4ed 100644
--- a/lib/RT/Condition/SLA_RequireStartsSet.pm
+++ b/lib/RT/Condition/SLA_RequireStartsSet.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/StatusChange.pm b/lib/RT/Condition/StatusChange.pm
index 73bfb04..63c4b08 100644
--- a/lib/RT/Condition/StatusChange.pm
+++ b/lib/RT/Condition/StatusChange.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Condition/TimeWorkedChange.pm b/lib/RT/Condition/TimeWorkedChange.pm
index 0325526..0888aaf 100644
--- a/lib/RT/Condition/TimeWorkedChange.pm
+++ b/lib/RT/Condition/TimeWorkedChange.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -75,10 +75,4 @@ sub IsApplicable {
return 0;
}
-=head1 AUTHOR
-
-Best Practical Solutions, LLC E<lt>modules@bestpractical.comE<gt>
-
-=cut
-
1;
diff --git a/lib/RT/Condition/UserDefined.pm b/lib/RT/Condition/UserDefined.pm
index bbb90dc..0186d93 100644
--- a/lib/RT/Condition/UserDefined.pm
+++ b/lib/RT/Condition/UserDefined.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Config.pm b/lib/RT/Config.pm
index e732730..17d63b5 100644
--- a/lib/RT/Config.pm
+++ b/lib/RT/Config.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -55,7 +55,9 @@ use 5.010;
use File::Spec ();
use Symbol::Global::Name;
use List::MoreUtils 'uniq';
-use Storable ();
+
+# Store log messages generated before RT::Logger is available
+our @PreInitLoggerMessages;
=head1 NAME
@@ -348,6 +350,15 @@ our %META;
Description => 'Place signature above quote', #loc
},
},
+ PreferDropzone => {
+ Section => 'Ticket composition', #loc
+ Overridable => 1,
+ SortOrder => 11,
+ Widget => '/Widgets/Form/Boolean',
+ WidgetArguments => {
+ Description => 'Use dropzone if available', #loc
+ },
+ },
RefreshIntervals => {
Type => 'ARRAY',
PostLoadCheck => sub {
@@ -373,10 +384,16 @@ our %META;
for my $value (@values) {
if ($value % 60 == 0) {
- $labels{$value} = ['Refresh search results every [quant,_1,minute,minutes].', $value / 60]; # loc
+ $labels{$value} = [
+ 'Refresh search results every [quant,_1,minute,minutes].', #loc
+ $value / 60
+ ];
}
else {
- $labels{$value} = ['Refresh search results every [quant,_1,second,seconds].', $value]; # loc
+ $labels{$value} = [
+ 'Refresh search results every [quant,_1,second,seconds].', #loc
+ $value
+ ];
}
}
@@ -403,10 +420,16 @@ our %META;
for my $value (@values) {
if ($value % 60 == 0) {
- $labels{$value} = ['Refresh home page every [quant,_1,minute,minutes].', $value / 60]; # loc
+ $labels{$value} = [
+ 'Refresh home page every [quant,_1,minute,minutes].', #loc
+ $value / 60
+ ];
}
else {
- $labels{$value} = ['Refresh home page every [quant,_1,second,seconds].', $value]; # loc
+ $labels{$value} = [
+ 'Refresh home page every [quant,_1,second,seconds].', #loc
+ $value
+ ];
}
}
@@ -978,7 +1001,7 @@ our %META;
my $canonic = Encode::resolve_alias( $encoding );
unless ( $canonic ) {
- warn "Unknown encoding '$encoding' in \@EmailInputEncodings option";
+ $RT::Logger->warning("Unknown encoding '$encoding' in \@EmailInputEncodings option");
}
elsif ( $seen{ $canonic }++ ) {
next;
@@ -1518,7 +1541,8 @@ sub GetObfuscated {
return $self->Get(@_) unless $obfuscate;
- my $res = Storable::dclone($self->Get(@_));
+ require Clone;
+ my $res = Clone::clone( $self->Get( @_ ) );
$res = $obfuscate->( $self, $res, $user );
return $self->_ReturnValue( $res, $META{$name}->{'Type'} || 'SCALAR' );
}
@@ -1626,7 +1650,7 @@ sub SetFromConfig {
# override options that came from its main config
if ( $args{'Extension'} ne $META{$name}->{'Source'}{'Extension'} ) {
my %source = %{ $META{$name}->{'Source'} };
- warn
+ push @PreInitLoggerMessages,
"Change of config option '$name' at $args{'File'} line $args{'Line'} has been ignored."
." This option earlier has been set in $source{'File'} line $source{'Line'}."
." To overide this option use ". ($source{'Extension'}||'RT')
@@ -1643,7 +1667,7 @@ sub SetFromConfig {
# as a site config is loaded earlier then its base config
# then we warn only on different extensions, for example
# RTIR's options is set in main site config
- warn
+ push @PreInitLoggerMessages,
"Change of config option '$name' at $args{'File'} line $args{'Line'} has been ignored."
." It may be ok, but we want you to be aware."
." This option has been set earlier in $source{'File'} line $source{'Line'}."
diff --git a/lib/RT/Crypt.pm b/lib/RT/Crypt.pm
index 804d9ff..2578cfe 100644
--- a/lib/RT/Crypt.pm
+++ b/lib/RT/Crypt.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Crypt/GnuPG.pm b/lib/RT/Crypt/GnuPG.pm
index 035877e..540a248 100644
--- a/lib/RT/Crypt/GnuPG.pm
+++ b/lib/RT/Crypt/GnuPG.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Crypt/GnuPG/CRLFHandle.pm b/lib/RT/Crypt/GnuPG/CRLFHandle.pm
index f96f4ee..967c7e5 100644
--- a/lib/RT/Crypt/GnuPG/CRLFHandle.pm
+++ b/lib/RT/Crypt/GnuPG/CRLFHandle.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Crypt/Role.pm b/lib/RT/Crypt/Role.pm
index 8e39b95..1e526f3 100644
--- a/lib/RT/Crypt/Role.pm
+++ b/lib/RT/Crypt/Role.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Crypt/SMIME.pm b/lib/RT/Crypt/SMIME.pm
index 244f0aa..bcb792b 100644
--- a/lib/RT/Crypt/SMIME.pm
+++ b/lib/RT/Crypt/SMIME.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CurrentUser.pm b/lib/RT/CurrentUser.pm
index aa8bb2a..1bbcc67 100644
--- a/lib/RT/CurrentUser.pm
+++ b/lib/RT/CurrentUser.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomField.pm b/lib/RT/CustomField.pm
index 97010cb..6030214 100644
--- a/lib/RT/CustomField.pm
+++ b/lib/RT/CustomField.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValue.pm b/lib/RT/CustomFieldValue.pm
index d720459..b97c281 100644
--- a/lib/RT/CustomFieldValue.pm
+++ b/lib/RT/CustomFieldValue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues.pm b/lib/RT/CustomFieldValues.pm
index d8706f6..44b475d 100644
--- a/lib/RT/CustomFieldValues.pm
+++ b/lib/RT/CustomFieldValues.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues/Canonicalizer.pm b/lib/RT/CustomFieldValues/Canonicalizer.pm
index 6019142..366f36d 100644
--- a/lib/RT/CustomFieldValues/Canonicalizer.pm
+++ b/lib/RT/CustomFieldValues/Canonicalizer.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues/Canonicalizer/Lowercase.pm b/lib/RT/CustomFieldValues/Canonicalizer/Lowercase.pm
index ccd52a7..1ad1c38 100644
--- a/lib/RT/CustomFieldValues/Canonicalizer/Lowercase.pm
+++ b/lib/RT/CustomFieldValues/Canonicalizer/Lowercase.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues/Canonicalizer/Uppercase.pm b/lib/RT/CustomFieldValues/Canonicalizer/Uppercase.pm
index d1ccd74..64570f2 100644
--- a/lib/RT/CustomFieldValues/Canonicalizer/Uppercase.pm
+++ b/lib/RT/CustomFieldValues/Canonicalizer/Uppercase.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues/External.pm b/lib/RT/CustomFieldValues/External.pm
index 5d2617e..4995e1a 100644
--- a/lib/RT/CustomFieldValues/External.pm
+++ b/lib/RT/CustomFieldValues/External.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFieldValues/Groups.pm b/lib/RT/CustomFieldValues/Groups.pm
index d37f7a4..1ab40ad 100644
--- a/lib/RT/CustomFieldValues/Groups.pm
+++ b/lib/RT/CustomFieldValues/Groups.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomFields.pm b/lib/RT/CustomFields.pm
index 5bc8972..192f7cf 100644
--- a/lib/RT/CustomFields.pm
+++ b/lib/RT/CustomFields.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomRole.pm b/lib/RT/CustomRole.pm
index 2bab313..4b6c072 100644
--- a/lib/RT/CustomRole.pm
+++ b/lib/RT/CustomRole.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/CustomRoles.pm b/lib/RT/CustomRoles.pm
index 24149cd..67e71e9 100644
--- a/lib/RT/CustomRoles.pm
+++ b/lib/RT/CustomRoles.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Dashboard.pm b/lib/RT/Dashboard.pm
index 7f76853..6d383e1 100644
--- a/lib/RT/Dashboard.pm
+++ b/lib/RT/Dashboard.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Dashboard/Mailer.pm b/lib/RT/Dashboard/Mailer.pm
index 8b8e94a..20e2066 100644
--- a/lib/RT/Dashboard/Mailer.pm
+++ b/lib/RT/Dashboard/Mailer.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Dashboards.pm b/lib/RT/Dashboards.pm
index 301d232..71eaa04 100644
--- a/lib/RT/Dashboards.pm
+++ b/lib/RT/Dashboards.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Date.pm b/lib/RT/Date.pm
index 0ef6077..ab5a48c 100644
--- a/lib/RT/Date.pm
+++ b/lib/RT/Date.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/DependencyWalker.pm b/lib/RT/DependencyWalker.pm
index aad2f25..ea43ad8 100644
--- a/lib/RT/DependencyWalker.pm
+++ b/lib/RT/DependencyWalker.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/DependencyWalker/FindDependencies.pm b/lib/RT/DependencyWalker/FindDependencies.pm
index 78156d1..44402f0 100644
--- a/lib/RT/DependencyWalker/FindDependencies.pm
+++ b/lib/RT/DependencyWalker/FindDependencies.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/EmailParser.pm b/lib/RT/EmailParser.pm
index 61fcd13..ad26a29 100644
--- a/lib/RT/EmailParser.pm
+++ b/lib/RT/EmailParser.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -60,6 +60,7 @@ use MIME::Entity;
use MIME::Head;
use MIME::Parser;
use File::Temp qw/tempdir/;
+use RT::Util qw(mime_recommended_filename EntityLooksLikeEmailMessage);
=head1 NAME
@@ -270,6 +271,8 @@ sub _PostProcessNewEntity {
#Now we've got a parsed mime object.
+ _DetectAttachedEmailFiles($self->{'entity'});
+
# Unfold headers that are have embedded newlines
# Better do this before conversion or it will break
# with multiline encoded Subject (RFC2047) (fsck.com #5594)
@@ -279,6 +282,70 @@ sub _PostProcessNewEntity {
RT::I18N::SetMIMEEntityToEncoding($self->{'entity'}, 'utf-8');
}
+=head2 _DetectAttachedEmailFiles
+
+Email messages submitted as attachments will be processed as a nested email
+rather than an attached file. Users may prefer to treat attached emails
+as normal file attachments and not have them processed.
+
+If TreatAttachedEmailAsFiles is selected, treat attached email files
+as regular file attachments. We do this by checking MIME entities that
+have email (message/) content types and also have a defined filename,
+indicating they are attachments.
+
+See the extract_nested_messages documentation in in the L<MIME::Parser>
+module for details on how it deals with nested email messages.
+
+=cut
+
+sub _DetectAttachedEmailFiles {
+ my $entity = shift;
+
+ return unless RT->Config->Get('TreatAttachedEmailAsFiles');
+
+ my $filename = mime_recommended_filename($entity);
+
+ # This detection is based on the way MIME::Parser handles email with
+ # extract_nested_messages enabled.
+
+ if ( EntityLooksLikeEmailMessage($entity)
+ && not defined $entity->bodyhandle
+ && $filename ) {
+
+ # Fixup message
+ # TODO: Investigate proposing an option upstream in MIME::Parser to avoid the initial parse
+ if ( $entity->parts(0) ){
+ my $bodyhandle = $entity->parts(0)->bodyhandle;
+
+ # Get the headers from the part and write them back to the body.
+ # This will create a file attachment that looks like the file you get if
+ # you "Save As" and email message in your email client.
+ # If we don't save them here, the headers from the attached email will be lost.
+
+ my $headers = $entity->parts(0)->head->as_string;
+ my $body = $bodyhandle->as_string;
+
+ my $IO = $bodyhandle->open("w")
+ || RT::Logger->error("Unable to open email body: $!");
+ $IO->print($headers . "\n");
+ $IO->print($body);
+ $IO->close
+ || RT::Logger->error("Unable to close email body: $!");
+
+ $entity->parts([]);
+ $entity->bodyhandle($bodyhandle);
+ RT::Logger->debug("Manually setting bodyhandle for attached email file");
+ }
+ }
+ elsif ( $entity->parts ) {
+ foreach my $part ( $entity->parts ){
+ _DetectAttachedEmailFiles( $part );
+ }
+ }
+
+ return;
+}
+
=head2 IsRTaddress ADDRESS
Takes a single parameter, an email address.
@@ -333,9 +400,6 @@ sub CullRTAddresses {
}
-
-
-
# LookupExternalUserInfo is a site-definable method for synchronizing
# incoming users with an external data source.
#
diff --git a/lib/RT/ExternalStorage.pm b/lib/RT/ExternalStorage.pm
index d0418bf..d6ce527 100644
--- a/lib/RT/ExternalStorage.pm
+++ b/lib/RT/ExternalStorage.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ExternalStorage/AmazonS3.pm b/lib/RT/ExternalStorage/AmazonS3.pm
index 7964ef4..7b595ed 100644
--- a/lib/RT/ExternalStorage/AmazonS3.pm
+++ b/lib/RT/ExternalStorage/AmazonS3.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ExternalStorage/Backend.pm b/lib/RT/ExternalStorage/Backend.pm
index a1625a8..da7af5f 100644
--- a/lib/RT/ExternalStorage/Backend.pm
+++ b/lib/RT/ExternalStorage/Backend.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ExternalStorage/Disk.pm b/lib/RT/ExternalStorage/Disk.pm
index fa8754b..c602d3f 100644
--- a/lib/RT/ExternalStorage/Disk.pm
+++ b/lib/RT/ExternalStorage/Disk.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ExternalStorage/Dropbox.pm b/lib/RT/ExternalStorage/Dropbox.pm
index 15c31f7..f18908a 100644
--- a/lib/RT/ExternalStorage/Dropbox.pm
+++ b/lib/RT/ExternalStorage/Dropbox.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Generated.pm b/lib/RT/Generated.pm
index f1c1f15..5d7575d 100644
--- a/lib/RT/Generated.pm
+++ b/lib/RT/Generated.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -50,7 +50,7 @@ package RT;
use warnings;
use strict;
-our $VERSION = '4.4.2';
+our $VERSION = '4.4.3';
our ($MAJOR_VERSION, $MINOR_VERSION, $REVISION) = $VERSION =~ /^(\d)\.(\d)\.(\d+)/;
diff --git a/lib/RT/Generated.pm.in b/lib/RT/Generated.pm.in
index 77a49d9..e5af7de 100644
--- a/lib/RT/Generated.pm.in
+++ b/lib/RT/Generated.pm.in
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Graph/Tickets.pm b/lib/RT/Graph/Tickets.pm
index 2de6c8d..62610b1 100644
--- a/lib/RT/Graph/Tickets.pm
+++ b/lib/RT/Graph/Tickets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Group.pm b/lib/RT/Group.pm
index e6fe7dd..25823ab 100644
--- a/lib/RT/Group.pm
+++ b/lib/RT/Group.pm
@@ -3,7 +3,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -1308,6 +1308,8 @@ sub InstanceObj {
$class = "RT::Queue";
} elsif ($self->Domain eq 'RT::Ticket-Role') {
$class = "RT::Ticket";
+ } elsif ($self->Domain eq 'RT::Asset-Role') {
+ $class = "RT::Asset";
}
return unless $class;
@@ -1339,34 +1341,14 @@ sub Label {
return $self->Name;
}
- if ($self->Domain =~ /-Role$/) {
- my ($id) = $self->Name =~ /^RT::CustomRole-(\d+)$/;
- if ($id) {
- my $role = RT::CustomRole->new($self->CurrentUser);
- $role->Load($id);
-
- # don't loc user-defined role names
- return $role->Name;
- }
+ if (my $role = $self->_CustomRoleObj) {
+ # don't loc user-defined role names
+ return $role->Name;
}
return $self->loc($self->Name);
}
-=head1 AUTHOR
-
-Jesse Vincent, jesse@bestpractical.com
-
-=head1 SEE ALSO
-
-RT
-
-=cut
-
-
-
-
-
=head2 id
Returns the current value of id.
@@ -1518,6 +1500,9 @@ sub FindDependencies {
my $instance = $self->InstanceObj;
$deps->Add( out => $instance ) if $instance;
+ my $custom_role = $self->_CustomRoleObj;
+ $deps->Add( out => $custom_role ) if $custom_role;
+
# Group members records, unless we're a system group
if ($self->Domain ne "SystemInternal") {
my $objs = RT::GroupMembers->new( $self->CurrentUser );
@@ -1625,6 +1610,11 @@ sub Serialize {
$store{Disabled} = $self->PrincipalObj->Disabled;
$store{Principal} = $self->PrincipalObj->UID;
$store{PrincipalId} = $self->PrincipalObj->Id;
+
+ if (my $role = $self->_CustomRoleObj) {
+ $store{Name} = \($role->UID);
+ }
+
return %store;
}
@@ -1636,6 +1626,11 @@ sub PreInflate {
my $principal_id = delete $data->{PrincipalId};
my $disabled = delete $data->{Disabled};
+ if (ref($data->{Name})) {
+ my $role = $importer->LookupObj(${ $data->{Name} });
+ $data->{Name} = $role->GroupType;
+ }
+
# Inflate refs into their IDs
$class->SUPER::PreInflate( $importer, $uid, $data );
@@ -1702,6 +1697,21 @@ sub PostInflate {
);
}
+# If this group represents the members of a custom role, then return
+# the RT::CustomRole object. Otherwise, return undef
+sub _CustomRoleObj {
+ my $self = shift;
+ if ($self->Domain =~ /-Role$/) {
+ my ($id) = $self->Name =~ /^RT::CustomRole-(\d+)$/;
+ if ($id) {
+ my $role = RT::CustomRole->new($self->CurrentUser);
+ $role->Load($id);
+ return $role;
+ }
+ }
+ return;
+}
+
RT::Base->_ImportOverlays();
1;
diff --git a/lib/RT/GroupMember.pm b/lib/RT/GroupMember.pm
index 581666b..6e17875 100644
--- a/lib/RT/GroupMember.pm
+++ b/lib/RT/GroupMember.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/GroupMembers.pm b/lib/RT/GroupMembers.pm
index b6f252d..7fcd850 100644
--- a/lib/RT/GroupMembers.pm
+++ b/lib/RT/GroupMembers.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -75,6 +75,12 @@ use RT::GroupMember;
sub Table { 'GroupMembers'}
+sub _Init {
+ my $self = shift;
+
+ $self->OrderBy( FIELD => 'id', ORDER => 'ASC' );
+ return $self->SUPER::_Init( @_ );
+}
=head2 LimitToUsers
diff --git a/lib/RT/Groups.pm b/lib/RT/Groups.pm
index 971a124..b160899 100644
--- a/lib/RT/Groups.pm
+++ b/lib/RT/Groups.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Handle.pm b/lib/RT/Handle.pm
index 2e77e49..eaf3d76 100644
--- a/lib/RT/Handle.pm
+++ b/lib/RT/Handle.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/I18N.pm b/lib/RT/I18N.pm
index a1a0309..f2650a3 100644
--- a/lib/RT/I18N.pm
+++ b/lib/RT/I18N.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -103,6 +103,7 @@ sub Init {
# Load language-specific functions
foreach my $file ( File::Glob::bsd_glob(substr(Cwd::abs_path(__FILE__), 0, -3) . "/*.pm") ) {
my ($lang) = ($file =~ /([^\\\/]+?)\.pm$/);
+ next if $lang eq 'Extract'; # Avoid loading non-language utility module
next unless grep $_ eq '*' || $_ eq $lang, @lang;
require $file;
}
diff --git a/lib/RT/I18N/Extract.pm b/lib/RT/I18N/Extract.pm
new file mode 100644
index 0000000..691f255
--- /dev/null
+++ b/lib/RT/I18N/Extract.pm
@@ -0,0 +1,280 @@
+# BEGIN BPS TAGGED BLOCK {{{
+#
+# COPYRIGHT:
+#
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
+# <sales@bestpractical.com>
+#
+# (Except where explicitly superseded by other copyright notices)
+#
+#
+# LICENSE:
+#
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+#
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301 or visit their web page on the internet at
+# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
+#
+#
+# CONTRIBUTION SUBMISSION POLICY:
+#
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+#
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+#
+# END BPS TAGGED BLOCK }}}
+
+package RT::I18N::Extract;
+
+use strict;
+use warnings;
+
+use Regexp::Common;
+use File::Spec;
+use File::Find;
+use Locale::PO;
+
+sub new {
+ return bless {
+ results => {},
+ errors => [],
+ }, shift;
+}
+
+sub all {
+ my $self = shift;
+ my $merged = sub { $self->from($File::Find::name) };
+ File::Find::find(
+ { wanted => $merged, no_chdir => 1, follow => 1 },
+ grep {-d $_} qw(bin sbin lib share/html html etc),
+ );
+ return $self->results;
+}
+
+sub valid_to_extract {
+ my $self = shift;
+ my ($file) = @_;
+
+ return unless -f $file;
+ return if $file eq "lib/RT/StyleGuide.pod";
+ return if $file eq "lib/RT/I18N/Extract.pm";
+ return if $file =~ m{/[\.#][^/]*$} or $file =~ /\.bak$/;
+ return if -f "$file.in";
+ return 1;
+}
+
+sub from {
+ my $self = shift;
+ my ($file) = (@_);
+
+ return unless $self->valid_to_extract($file);
+
+ my $fh;
+ unless (open $fh, '<', $file) {
+ push @{$self->{errors}}, "$file:0: Cannot open for reading: $!";
+ return;
+ }
+ my $contents = do { local $/; <$fh> };
+ close $fh;
+
+ # Provide the non-.in filename for the rest of error reporting and
+ # POT file needs, as the .in file will not exist if looking in the
+ # installed tree.
+ $file =~ s/\.in$//;
+
+ my %seen;
+ my $line;
+
+ my $_add = sub {
+ my ($maybe_quoted, $key, $vars) = @_;
+ $vars = '' unless defined $vars;
+
+ $seen{$line}++;
+
+ if ($maybe_quoted and $key =~ s/^(['"])(.*)\1$/$2/) {
+ my $quote = $1;
+ $key =~ s/\\(['"\\])/$1/g;
+
+ if ($quote eq '"') {
+ if ($key =~ /([\$\@]\w+)/) {
+ push @{$self->{errors}}, "$file:$line: Interpolated variable '$1' in \"$key\"";
+ }
+ if ($key =~ /\\n/) {
+ push @{$self->{errors}}, "$file:$line: Embedded newline in \"$key\"";
+ }
+ }
+ }
+
+ if ($key =~ /^\s/m || $key =~ /\s$/m) {
+ push @{$self->{errors}}, "$file:$line: Extraneous whitespace in '$key'";
+ }
+
+ $vars =~ tr/\n\r//d;
+
+ push @{ $self->{results}{$key} }, [ $file, $line, $vars ];
+ };
+ my $add = sub {$_add->(1, @_)};
+ my $add_noquotes = sub {$_add->(0, @_)};
+
+ my $extract = sub {
+ my ($regex, $run) = @_;
+ $line = 1;
+ pos($contents) = 0;
+ while ($contents =~ m!\G.*?$regex!sg) {
+ my $match = substr($contents,$-[0],$+[0]-$-[0]);
+ $line += ( $match =~ tr/\n/\n/ );
+ $run->();
+ }
+ };
+
+ my $ws = qr{[ ]*};
+ my $punct = qr{[ \{\}\)\],;]*};
+ my $quoted = $RE{delimited}{-delim=>q{'"}};
+
+ # Mason filter: <&|/l&>...</&> and <&|/l_unsafe&>...</&>
+ $extract->(qr! <&\|/l(?:_unsafe)?(.*?)&> (.*?) </&> !sox, sub {
+ my ($key, $vars) = ($2, $1);
+ if ($key =~ m! (<([%&]) .*? \2>) !sox) {
+ push @{$self->{errors}}, "$file:$line: Mason content within loc: '$1'";
+ }
+ $add_noquotes->($key, $vars);
+ });
+
+ # Localization function: loc(...)
+ $extract->(qr! \b loc
+ ( $RE{balanced}{-parens=>'()'} )
+ !sox, sub {
+ # Re-parse what was in the parens for the string and optional arguments
+ return unless "$1" =~ m! \( \s* ($quoted) (.*?) \s* \) $ !sox;
+ $add->($1, $2);
+ });
+
+ # Comment-based mark: "..." # loc
+ $extract->(qr! ($quoted) # Quoted string
+ $punct
+ $ws \# $ws loc
+ $ws $
+ !smox, sub {
+ $add->($1);
+ });
+
+ # Comment-based mark for list to loc(): ("...", $foo, $bar) # loc()
+ $extract->(qr! ( $RE{balanced}{-parens=>'()'} )
+ $punct
+ $ws \# $ws loc \(\)
+ $ws $
+ !smox, sub {
+ # Re-parse what was in the parens for the string and optional arguments
+ return unless "$1" =~ m! \( \s* ($quoted) (.*?) \s* \) $ !sox;
+ $add->($1, $2);
+ });
+
+ # Comment-based qw mark: "qw(...)" # loc_qw
+ $extract->(qr! qw \( ([^)]+) \)
+ $punct
+ $ws \# $ws loc_qw
+ $ws $
+ !smox, sub {
+ $add_noquotes->($_) for split ' ', $1;
+ });
+
+ # Comment-based left pair mark: "..." => ... # loc_left_pair
+ $extract->(qr! (\w+|$quoted)
+ \s* => [^#\n]+?
+ $ws \# $ws loc_left_pair
+ $ws $
+ !smox, sub {
+ $add->($1);
+ });
+
+ # Comment-based pair mark: "..." => "..." # loc_pair
+ $extract->(qr! (\w+|$quoted)
+ \s* => \s* ($quoted)
+ $punct
+ $ws \# $ws loc_pair
+ $ws $
+ !smox, sub {
+ $add->($1);
+ $add->($2);
+ });
+
+ # Specific key foo => "...", #loc{foo}
+ $extract->(qr! (\w+|$quoted)
+ \s* => \s* ($quoted)
+ (?-s: .*? ) \# $ws loc\{\1\} # More lax about what matches before the #
+ $ws $
+ !smox, sub {
+ $add->($2);
+ });
+
+ # Check for ones we missed
+ $extract->(qr! \# $ws
+ (
+ loc
+ ( _\w+ | \(\) | {(\w+|$quoted)} )?
+ )
+ $ws $
+ !smox, sub {
+ return if $seen{$line};
+ push @{$self->{errors}}, "$file:$line: Localization comment '$1' did not match";
+ });
+}
+
+sub results {
+ my $self = shift;
+
+ my %PO;
+ for my $str ( sort keys %{$self->{results}} ) {
+ my $entry = $self->{results}{$str};
+
+ my $escape = sub { $_ = shift; s/\b_(\d+)/%$1/; $_ };
+ $str =~ s/((?<!~)(?:~~)*)\[_(\d+)\]/$1%$2/g;
+ $str =~ s/((?<!~)(?:~~)*)\[([A-Za-z#*]\w*),([^\]]+)\]/"$1%$2(".$escape->($3).")"/eg;
+ $str =~ s/~([\[\]])/$1/g;
+
+ my $po = Locale::PO->new(-msgid => $str, -msgstr => "");
+ $po->reference( join ( ' ', sort map $_->[0].":".$_->[1], @{ $entry } ) );
+ my %seen;
+ my @vars;
+ foreach my $find ( sort { $a->[2] cmp $b->[2] } grep { $_->[2] } @{ $entry } ) {
+ my ( $file, $line, $var ) = @{$find};
+ $var =~ s/^\s*,\s*//;
+ $var =~ s/\s*$//;
+ push @vars, "($var)" unless $seen{$var}++;
+ }
+ $po->automatic( join( "\n", @vars) );
+
+ $PO{$po->msgid} = $po;
+ }
+
+ return %PO;
+}
+
+sub errors {
+ my $self = shift;
+ return @{$self->{errors}};
+}
+
+1;
diff --git a/lib/RT/I18N/cs.pm b/lib/RT/I18N/cs.pm
index 618786f..767dc0f 100644
--- a/lib/RT/I18N/cs.pm
+++ b/lib/RT/I18N/cs.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/I18N/de.pm b/lib/RT/I18N/de.pm
index ed1de37..82352af 100644
--- a/lib/RT/I18N/de.pm
+++ b/lib/RT/I18N/de.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/I18N/fr.pm b/lib/RT/I18N/fr.pm
index f9eb747..e6ecb48 100644
--- a/lib/RT/I18N/fr.pm
+++ b/lib/RT/I18N/fr.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/I18N/i_default.pm b/lib/RT/I18N/i_default.pm
index 09fd357..3594645 100644
--- a/lib/RT/I18N/i_default.pm
+++ b/lib/RT/I18N/i_default.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/I18N/ru.pm b/lib/RT/I18N/ru.pm
index b3f8b5b..4fd49b0 100644
--- a/lib/RT/I18N/ru.pm
+++ b/lib/RT/I18N/ru.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Installer.pm b/lib/RT/Installer.pm
index 372c33d..38ec5cc 100644
--- a/lib/RT/Installer.pm
+++ b/lib/RT/Installer.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/CLI.pm b/lib/RT/Interface/CLI.pm
index bb1ed6b..ac3e483 100644
--- a/lib/RT/Interface/CLI.pm
+++ b/lib/RT/Interface/CLI.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email.pm b/lib/RT/Interface/Email.pm
index 7466c0f..557820c 100644
--- a/lib/RT/Interface/Email.pm
+++ b/lib/RT/Interface/Email.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -607,12 +607,15 @@ sub ExtractTicketId {
my $subject = Encode::decode( "UTF-8", $entity->head->get('Subject') || '' );
chomp $subject;
- return ParseTicketId( $subject );
+ return ParseTicketId( $subject, $entity );
}
=head3 ParseTicketId
-Takes a string and searches for [subjecttag #id]
+Takes a string (the email subject) and searches for [subjecttag #id]
+
+For customizations, the L<MIME::Entity> object is passed as the second
+argument.
Returns the id if a match is found. Otherwise returns undef.
@@ -620,6 +623,7 @@ Returns the id if a match is found. Otherwise returns undef.
sub ParseTicketId {
my $Subject = shift;
+ my $Entity = shift;
my $rtname = RT->Config->Get('rtname');
my $test_name = RT->Config->Get('EmailSubjectTagRegex') || qr/\Q$rtname\E/i;
diff --git a/lib/RT/Interface/Email/Action/Defaults.pm b/lib/RT/Interface/Email/Action/Defaults.pm
index 6911ebf..3ab0677 100644
--- a/lib/RT/Interface/Email/Action/Defaults.pm
+++ b/lib/RT/Interface/Email/Action/Defaults.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Action/Resolve.pm b/lib/RT/Interface/Email/Action/Resolve.pm
index d2352bc..fdab14b 100644
--- a/lib/RT/Interface/Email/Action/Resolve.pm
+++ b/lib/RT/Interface/Email/Action/Resolve.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Action/Take.pm b/lib/RT/Interface/Email/Action/Take.pm
index 7446988..4a49493 100644
--- a/lib/RT/Interface/Email/Action/Take.pm
+++ b/lib/RT/Interface/Email/Action/Take.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Auth/MailFrom.pm b/lib/RT/Interface/Email/Auth/MailFrom.pm
index add594e..1b80804 100644
--- a/lib/RT/Interface/Email/Auth/MailFrom.pm
+++ b/lib/RT/Interface/Email/Auth/MailFrom.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Authz/Default.pm b/lib/RT/Interface/Email/Authz/Default.pm
index 7cdd025..a8b7d5d 100644
--- a/lib/RT/Interface/Email/Authz/Default.pm
+++ b/lib/RT/Interface/Email/Authz/Default.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Authz/RequireEncrypted.pm b/lib/RT/Interface/Email/Authz/RequireEncrypted.pm
index 41326b4..349748d 100644
--- a/lib/RT/Interface/Email/Authz/RequireEncrypted.pm
+++ b/lib/RT/Interface/Email/Authz/RequireEncrypted.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Crypt.pm b/lib/RT/Interface/Email/Crypt.pm
index 58b5368..769ea12 100644
--- a/lib/RT/Interface/Email/Crypt.pm
+++ b/lib/RT/Interface/Email/Crypt.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Email/Role.pm b/lib/RT/Interface/Email/Role.pm
index 1d32cf3..76df2fa 100644
--- a/lib/RT/Interface/Email/Role.pm
+++ b/lib/RT/Interface/Email/Role.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/REST.pm b/lib/RT/Interface/REST.pm
index 040679d..3a46285 100644
--- a/lib/RT/Interface/REST.pm
+++ b/lib/RT/Interface/REST.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index 5d6b39e..a38b147 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -72,6 +72,7 @@ use Digest::MD5 ();
use List::MoreUtils qw();
use JSON qw();
use Plack::Util;
+use HTTP::Status qw();
=head2 SquishedCSS $style
@@ -306,7 +307,7 @@ sub HandleRequest {
# attempt external auth
$HTML::Mason::Commands::m->comp( '/Elements/DoAuth', %$ARGS )
- if RT->Config->Get('ExternalAuth');
+ if @{ RT->Config->Get( 'ExternalAuthPriority' ) || [] };
# Process session-related callbacks before any auth attempts
$HTML::Mason::Commands::m->callback( %$ARGS, CallbackName => 'Session', CallbackPage => '/autohandler' );
@@ -321,7 +322,7 @@ sub HandleRequest {
# attempt external auth
$HTML::Mason::Commands::m->comp( '/Elements/DoAuth', %$ARGS )
- if RT->Config->Get('ExternalAuth');
+ if @{ RT->Config->Get( 'ExternalAuthPriority' ) || [] };
# Process per-page authentication callbacks
$HTML::Mason::Commands::m->callback( %$ARGS, CallbackName => 'Auth', CallbackPage => '/autohandler' );
@@ -2038,6 +2039,10 @@ sub Abort {
my $why = shift;
my %args = @_;
+ $args{Code} //= HTTP::Status::HTTP_OK;
+
+ $r->headers_out->{'Status'} = $args{Code} . ' ' . HTTP::Status::status_message($args{Code});
+
if ( $session{'ErrorDocument'}
&& $session{'ErrorDocumentType'} )
{
@@ -2140,11 +2145,11 @@ sub CreateTicket {
my $Queue = RT::Queue->new( $current_user );
unless ( $Queue->Load( $ARGS{'Queue'} ) ) {
- Abort('Queue not found');
+ Abort('Queue not found', Code => HTTP::Status::HTTP_NOT_FOUND);
}
unless ( $Queue->CurrentUserHasRight('CreateTicket') ) {
- Abort('You have no permission to create tickets in that queue.');
+ Abort('You have no permission to create tickets in that queue.', Code => HTTP::Status::HTTP_FORBIDDEN);
}
my $due;
@@ -2257,7 +2262,7 @@ sub CreateTicket {
push( @Actions, split( "\n", $ErrMsg ) );
unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
- Abort( "No permission to view newly created ticket #" . $Ticket->id . "." );
+ Abort( "No permission to view newly created ticket #" . $Ticket->id . ".", Code => HTTP::Status::HTTP_FORBIDDEN );
}
return ( $Ticket, @Actions );
@@ -2282,13 +2287,13 @@ sub LoadTicket {
}
unless ($id) {
- Abort("No ticket specified");
+ Abort("No ticket specified", Code => HTTP::Status::HTTP_BAD_REQUEST);
}
my $Ticket = RT::Ticket->new( $session{'CurrentUser'} );
$Ticket->Load($id);
unless ( $Ticket->id ) {
- Abort("Could not load ticket $id");
+ Abort("Could not load ticket $id", Code => HTTP::Status::HTTP_NOT_FOUND);
}
return $Ticket;
}
diff --git a/lib/RT/Interface/Web/Handler.pm b/lib/RT/Interface/Web/Handler.pm
index 0d28c27..8f104fa 100644
--- a/lib/RT/Interface/Web/Handler.pm
+++ b/lib/RT/Interface/Web/Handler.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -199,7 +199,7 @@ sub CleanupRequest {
File::Temp::cleanup()
unless $INC{'Test/WWW/Mechanize/PSGI.pm'};
-
+ RT::ObjectCustomFieldValues::ClearOCFVCache();
}
diff --git a/lib/RT/Interface/Web/Menu.pm b/lib/RT/Interface/Web/Menu.pm
index 0c1683d..26cf44e 100644
--- a/lib/RT/Interface/Web/Menu.pm
+++ b/lib/RT/Interface/Web/Menu.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Web/Middleware/StaticHeaders.pm b/lib/RT/Interface/Web/Middleware/StaticHeaders.pm
index 8f4b00f..09e5971 100644
--- a/lib/RT/Interface/Web/Middleware/StaticHeaders.pm
+++ b/lib/RT/Interface/Web/Middleware/StaticHeaders.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Web/QueryBuilder.pm b/lib/RT/Interface/Web/QueryBuilder.pm
index eaa584b..761d655 100644
--- a/lib/RT/Interface/Web/QueryBuilder.pm
+++ b/lib/RT/Interface/Web/QueryBuilder.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Web/QueryBuilder/Tree.pm b/lib/RT/Interface/Web/QueryBuilder/Tree.pm
index d63a16d..a1e429c 100644
--- a/lib/RT/Interface/Web/QueryBuilder/Tree.pm
+++ b/lib/RT/Interface/Web/QueryBuilder/Tree.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -213,14 +213,19 @@ sub __LinearizeTree {
$key = "'$key'";
}
my $value = $clause->{Value};
- if ( $clause->{Op} =~ /^IS( NOT)?$/i ) {
+ my $op = $clause->{Op};
+ if ( $value =~ /^NULL$/i && $op =~ /^(!?)=$/ ) {
+ $op = $1 ? 'IS NOT' : 'IS';
+ }
+
+ if ( $op =~ /^IS( NOT)?$/i ) {
$value = 'NULL';
} elsif ( $value !~ /^[+-]?[0-9]+$/ ) {
$value =~ s/(['\\])/\\$1/g;
$value = "'$value'";
}
- $str .= $key ." ". $clause->{Op} . " " . $value;
+ $str .= $key ." ". $op . " " . $value;
}
$str =~ s/^\s+|\s+$//;
diff --git a/lib/RT/Interface/Web/Request.pm b/lib/RT/Interface/Web/Request.pm
index 1cfbfb9..d4e7d2d 100644
--- a/lib/RT/Interface/Web/Request.pm
+++ b/lib/RT/Interface/Web/Request.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Interface/Web/Session.pm b/lib/RT/Interface/Web/Session.pm
index 03cc325..5392fc8 100644
--- a/lib/RT/Interface/Web/Session.pm
+++ b/lib/RT/Interface/Web/Session.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/LDAPImport.pm b/lib/RT/LDAPImport.pm
index bd731db..f26eb80 100644
--- a/lib/RT/LDAPImport.pm
+++ b/lib/RT/LDAPImport.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -68,6 +68,12 @@ RT::LDAPImport - Import Users from an LDAP store
In C<RT_SiteConfig.pm>:
Set($LDAPHost,'my.ldap.host');
+ Set($LDAPOptions, [ port => 636,
+ scheme => 'ldaps',
+ raw => qr/(\;binary)/,
+ version => 3,
+ verify => 'required',
+ cafile => '/certificate-file/path' ]);
Set($LDAPUser,'me');
Set($LDAPPassword,'mypass');
Set($LDAPBase, 'ou=People,o=Our Place');
@@ -107,6 +113,11 @@ advanced options.
Hostname or ldap(s):// uri:
+=item C<< Set($LDAPOptions, [ port => 636 ]); >>
+
+This allows you to pass any options supported by the L<Net::LDAP>
+new method.
+
=item C<< Set($LDAPUser, 'uid=foo,ou=users,dc=example,dc=com'); >>
Your LDAP username or DN. If unset, we'll attempt an anonymous bind.
@@ -365,10 +376,11 @@ utility in openldap can be very helpful while refining your filters.
=head2 connect_ldap
-Relies on the config variables C<$LDAPHost>, C<$LDAPUser> and C<$LDAPPassword>
-being set in your RT Config files.
+Relies on the config variables C<$LDAPHost>, C<$LDAPOptions>, C<$LDAPUser>,
+and C<$LDAPPassword> being set in your RT Config files.
- Set($LDAPHost,'my.ldap.host')
+ Set($LDAPHost,'my.ldap.host');
+ Set($LDAPOptions, [ port => 636 ]);
Set($LDAPUSER,'me');
Set($LDAPPassword,'mypass');
@@ -382,10 +394,12 @@ LDAPHost can be a hostname or an ldap:// ldaps:// uri.
sub connect_ldap {
my $self = shift;
- my $ldap = Net::LDAP->new($RT::LDAPHost);
+ $RT::LDAPOptions = [] unless $RT::LDAPOptions;
+ my $ldap = Net::LDAP->new($RT::LDAPHost, @$RT::LDAPOptions);
+
$RT::Logger->debug("connecting to $RT::LDAPHost");
unless ($ldap) {
- $RT::Logger->error("Can't connect to $RT::LDAPHost");
+ $RT::Logger->error("Can't connect to $RT::LDAPHost $@");
return;
}
diff --git a/lib/RT/Lifecycle.pm b/lib/RT/Lifecycle.pm
index 97b82e1..36ab6f3 100644
--- a/lib/RT/Lifecycle.pm
+++ b/lib/RT/Lifecycle.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Lifecycle/Asset.pm b/lib/RT/Lifecycle/Asset.pm
index 9ca6a38..c323929 100644
--- a/lib/RT/Lifecycle/Asset.pm
+++ b/lib/RT/Lifecycle/Asset.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Lifecycle/Ticket.pm b/lib/RT/Lifecycle/Ticket.pm
index 7a85b7c..3cdcc59 100644
--- a/lib/RT/Lifecycle/Ticket.pm
+++ b/lib/RT/Lifecycle/Ticket.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Link.pm b/lib/RT/Link.pm
index 3160d24..27e9f0e 100644
--- a/lib/RT/Link.pm
+++ b/lib/RT/Link.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Links.pm b/lib/RT/Links.pm
index d2ecca2..bd9a939 100644
--- a/lib/RT/Links.pm
+++ b/lib/RT/Links.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate.pm b/lib/RT/Migrate.pm
index e00efbd..50251b0 100644
--- a/lib/RT/Migrate.pm
+++ b/lib/RT/Migrate.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -92,7 +92,7 @@ sub progress {
top => sub { print "\n\n" },
bottom => sub {},
every => 3,
- bars => [qw/Ticket Transaction Attachment User Group/],
+ bars => [qw/Ticket Asset Transaction Attachment User Group/],
counts => sub {},
max => {},
@_,
diff --git a/lib/RT/Migrate/Importer.pm b/lib/RT/Migrate/Importer.pm
index c0faade..6eef045 100644
--- a/lib/RT/Migrate/Importer.pm
+++ b/lib/RT/Migrate/Importer.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate/Importer/File.pm b/lib/RT/Migrate/Importer/File.pm
index cf3362b..de3fe84 100644
--- a/lib/RT/Migrate/Importer/File.pm
+++ b/lib/RT/Migrate/Importer/File.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate/Incremental.pm b/lib/RT/Migrate/Incremental.pm
index 8bbfcf2..758671f 100644
--- a/lib/RT/Migrate/Incremental.pm
+++ b/lib/RT/Migrate/Incremental.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate/Serializer.pm b/lib/RT/Migrate/Serializer.pm
index 769ef3b..fa30c63 100644
--- a/lib/RT/Migrate/Serializer.pm
+++ b/lib/RT/Migrate/Serializer.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -71,6 +71,7 @@ sub Init {
FollowScrips => 0,
FollowTickets => 1,
FollowACL => 0,
+ FollowAssets => 1,
Clone => 0,
Incremental => 0,
@@ -88,6 +89,7 @@ sub Init {
FollowDeleted
FollowScrips
FollowTickets
+ FollowAssets
FollowACL
Queues
CustomFields
@@ -165,6 +167,12 @@ sub PushAll {
# Articles
$self->PushCollections(qw(Articles), map { ($_, "Object$_") } qw(Classes Topics));
+ # Custom Roles
+ $self->PushCollections(qw(CustomRoles ObjectCustomRoles));
+
+ # Assets
+ $self->PushCollections(qw(Catalogs Assets));
+
# Custom Fields
if (RT::ObjectCustomFields->require) {
$self->PushCollections(map { ($_, "Object$_") } qw(CustomFields CustomFieldValues));
@@ -200,6 +208,9 @@ sub PushCollections {
$collection->{allow_deleted_search} = 1;
$collection->IgnoreType; # looking_at_type
}
+ elsif ($collection->isa('RT::Assets')) {
+ $collection->{allow_deleted_search} = 1;
+ }
elsif ($collection->isa('RT::ObjectCustomFieldValues')) {
# FindAllRows (find_disabled_rows) isn't used by OCFVs
$collection->{find_disabled_rows} = 1;
@@ -310,6 +321,7 @@ sub PushBasics {
else {
$self->PushCollections(qw(Queues));
}
+ $self->PushCollections(qw(Catalogs));
}
sub InitStream {
@@ -435,6 +447,9 @@ sub Observe {
my $id = $obj->CustomField;
return 0 if $self->{CustomFields} && none { $id == $_ } @{ $self->{CustomFields} };
return 1;
+ } elsif ($obj->isa("RT::Asset")) {
+ return 0 if $obj->Status eq "deleted" and not $self->{FollowDeleted};
+ return $self->{FollowAssets};
} elsif ($obj->isa("RT::ACE")) {
return $self->{FollowACL};
} elsif ($obj->isa("RT::Scrip") or $obj->isa("RT::Template") or $obj->isa("RT::ObjectScrip")) {
diff --git a/lib/RT/Migrate/Serializer/File.pm b/lib/RT/Migrate/Serializer/File.pm
index f5f503e..1afc6c6 100644
--- a/lib/RT/Migrate/Serializer/File.pm
+++ b/lib/RT/Migrate/Serializer/File.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate/Serializer/IncrementalRecord.pm b/lib/RT/Migrate/Serializer/IncrementalRecord.pm
index 111acf6..19cdaf1 100644
--- a/lib/RT/Migrate/Serializer/IncrementalRecord.pm
+++ b/lib/RT/Migrate/Serializer/IncrementalRecord.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Migrate/Serializer/IncrementalRecords.pm b/lib/RT/Migrate/Serializer/IncrementalRecords.pm
index e3f5300..65c34c3 100644
--- a/lib/RT/Migrate/Serializer/IncrementalRecords.pm
+++ b/lib/RT/Migrate/Serializer/IncrementalRecords.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectClass.pm b/lib/RT/ObjectClass.pm
index 3da8eaf..3146a4e 100644
--- a/lib/RT/ObjectClass.pm
+++ b/lib/RT/ObjectClass.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectClasses.pm b/lib/RT/ObjectClasses.pm
index 38f0216..ae7b6a9 100644
--- a/lib/RT/ObjectClasses.pm
+++ b/lib/RT/ObjectClasses.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectCustomField.pm b/lib/RT/ObjectCustomField.pm
index b2a8eef..a805a4f 100644
--- a/lib/RT/ObjectCustomField.pm
+++ b/lib/RT/ObjectCustomField.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectCustomFieldValue.pm b/lib/RT/ObjectCustomFieldValue.pm
index 859a870..fea2953 100644
--- a/lib/RT/ObjectCustomFieldValue.pm
+++ b/lib/RT/ObjectCustomFieldValue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -48,6 +48,7 @@
package RT::ObjectCustomFieldValue;
+use 5.010;
use strict;
use warnings;
use base 'RT::Record';
@@ -107,7 +108,7 @@ sub Create {
$self->_EncodeLOB( $args{'LargeContent'}, $args{'ContentType'} )
if defined $args{'LargeContent'};
- return $self->SUPER::Create(
+ ( my $id, $msg ) = $self->SUPER::Create(
CustomField => $args{'CustomField'},
ObjectType => $args{'ObjectType'},
ObjectId => $args{'ObjectId'},
@@ -117,6 +118,23 @@ sub Create {
ContentType => $args{'ContentType'},
ContentEncoding => $args{'ContentEncoding'},
);
+
+ if ( $id ) {
+ my $new_value = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
+ $new_value->Load( $id );
+ my $ocfv_key = $new_value->GetOCFVCacheKey();
+ if ( $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} ) {
+ push @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} },
+ {
+ 'ObjectId' => $new_value->Id,
+ 'CustomFieldObj' => $new_value->CustomFieldObj,
+ 'Content' => $new_value->_Value('Content'),
+ 'LargeContent' => $new_value->LargeContent,
+ };
+ }
+ }
+
+ return wantarray ? ( $id, $msg ) : $id;
}
@@ -295,7 +313,15 @@ Disable this value. Used to remove "current" values from records while leaving t
sub Delete {
my $self = shift;
- return $self->SetDisabled(1);
+ my ( $ret, $msg ) = $self->SetDisabled( 1 );
+ if ( $ret ) {
+ my $ocfv_key = $self->GetOCFVCacheKey();
+ if ( $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} ) {
+ @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} } =
+ grep { $_->{'ObjectId'} != $self->Id } @{ $RT::ObjectCustomFieldValues::_OCFV_CACHE->{$ocfv_key} };
+ }
+ }
+ return wantarray ? ( $ret, $msg ) : $ret;
}
=head2 _FillInTemplateURL URL
@@ -343,6 +369,7 @@ sub _FillInTemplateURL {
# special case, whole value should be an URL
if ( $url =~ /^__CustomField__/ ) {
my $value = $self->Content;
+ $value //= '';
# protect from potentially malicious URLs
if ( $value =~ /^\s*(?:javascript|data):/i ) {
my $object = $self->Object;
@@ -359,7 +386,7 @@ sub _FillInTemplateURL {
for my $key (keys %placeholders) {
$url =~ s{__${key}__}{
my $value = $placeholders{$key}{'value'}->( $self );
- $value = '' if !defined($value);
+ $value //= '';
RT::Interface::Web::EscapeURI(\$value) if $placeholders{$key}{'escape'};
$value
}gxe;
@@ -488,6 +515,20 @@ sub ParseIP {
}
+=head2 GetOCFVCacheKey
+
+Get the OCFV cache key for this object
+
+=cut
+
+sub GetOCFVCacheKey {
+ my $self = shift;
+ my $ocfv_key = "CustomField-" . $self->CustomField
+ . '-ObjectType-' . $self->ObjectType
+ . '-ObjectId-' . $self->ObjectId;
+ return $ocfv_key;
+}
+
=head2 id
Returns the current value of id.
diff --git a/lib/RT/ObjectCustomFieldValues.pm b/lib/RT/ObjectCustomFieldValues.pm
index 772d7a1..8df98c3 100644
--- a/lib/RT/ObjectCustomFieldValues.pm
+++ b/lib/RT/ObjectCustomFieldValues.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -56,6 +56,10 @@ use base 'RT::SearchBuilder';
use RT::ObjectCustomFieldValue;
+# Set up the OCFV cache for faster comparison on add/update
+our $_OCFV_CACHE;
+ClearOCFVCache();
+
sub Table { 'ObjectCustomFieldValues'}
sub _Init {
@@ -75,6 +79,15 @@ sub _Init {
return ( $self->SUPER::_Init(@_) );
}
+=head2 ClearOCFVCache
+
+Cleans out and reinitializes the OCFV cache
+
+=cut
+
+sub ClearOCFVCache {
+ $_OCFV_CACHE = {}
+}
# {{{ sub LimitToCustomField
@@ -130,10 +143,30 @@ sub HasEntry {
my $large_content = shift;
return undef unless defined $value && length $value;
+ my $first = $self->First;
+ return undef unless $first; # No entries to check
+
+ # Key should be the same for all values of the same ocfv
+ my $ocfv_key = $first->GetOCFVCacheKey;
+
+ # This cache relieves performance issues when adding large numbers of values
+ # to a CF since each add compares against the full list each time.
+
+ unless ( $_OCFV_CACHE->{$ocfv_key} ) {
+ # Load the cache with existing values
+ foreach my $item ( @{$self->ItemsArrayRef} ) {
+ push @{$_OCFV_CACHE->{$ocfv_key}}, {
+ 'ObjectId' => $item->Id,
+ 'CustomFieldObj' => $item->CustomFieldObj,
+ 'Content' => $item->_Value('Content'),
+ 'LargeContent' => $item->LargeContent };
+ }
+ }
+
my %canon_value;
- #TODO: this could cache and optimize a fair bit.
- foreach my $item ( @{$self->ItemsArrayRef} ) {
- my $cf = $item->CustomFieldObj;
+ my $item_id;
+ foreach my $item ( @{$_OCFV_CACHE->{$ocfv_key}} ) {
+ my $cf = $item->{'CustomFieldObj'};
my $args = $canon_value{ $cf->Type };
if ( !$args ) {
$args = { Content => $value, LargeContent => $large_content };
@@ -144,24 +177,35 @@ sub HasEntry {
if ( $cf->Type eq 'Select' ) {
# select is case insensitive
- return $item if lc $item->Content eq lc $args->{Content};
+ $item_id = $item->{'ObjectId'} if lc $item->{'Content'} eq lc $args->{Content};
}
else {
- if ( ($item->_Value('Content') // '') eq $args->{Content} ) {
- if ( defined $item->LargeContent ) {
- return $item
+ if ( ($item->{'Content'} // '') eq $args->{Content} ) {
+ if ( defined $item->{'LargeContent'} ) {
+ $item_id = $item->{'ObjectId'}
if defined $args->{LargeContent}
- && $item->LargeContent eq $args->{LargeContent};
+ && $item->{'LargeContent'} eq $args->{LargeContent};
}
else {
- return $item unless defined $args->{LargeContent};
+ $item_id = $item->{'ObjectId'} unless defined $args->{LargeContent};
}
- } elsif ( $item->LargeContent && $args->{Content} ) {
- return $item if ($item->LargeContent eq $args->{Content});
+ } elsif ( $item->{'LargeContent'} && $args->{Content} ) {
+ $item_id = $item->{'ObjectId'} if ($item->{'LargeContent'} eq $args->{Content});
}
}
+ last if $item_id;
+ }
+
+ if ( $item_id ) {
+ my $ocfv = RT::ObjectCustomFieldValue->new( $self->CurrentUser );
+ my ($ret, $msg) = $ocfv->Load($item_id);
+ RT::Logger->error("Unable to load object custom field value from id: $item_id $msg")
+ unless $ret;
+ return $ocfv;
+ }
+ else {
+ return undef;
}
- return undef;
}
sub _DoSearch {
@@ -188,4 +232,12 @@ sub _DoCount {
RT::Base->_ImportOverlays();
+# Clear the OCVF cache on exit to release connected RT::Ticket objects.
+#
+# Without this, there could be warnings generated like "Too late to safely run
+# transaction-batch scrips...". You can test this by commenting it out and running
+# some cf tests, e.g. perl -Ilib t/customfields/enter_one.t
+END { ClearOCFVCache(); }
+
+
1;
diff --git a/lib/RT/ObjectCustomFields.pm b/lib/RT/ObjectCustomFields.pm
index b563fe9..7407886 100644
--- a/lib/RT/ObjectCustomFields.pm
+++ b/lib/RT/ObjectCustomFields.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectCustomRole.pm b/lib/RT/ObjectCustomRole.pm
index 5523a08..edeaf32 100644
--- a/lib/RT/ObjectCustomRole.pm
+++ b/lib/RT/ObjectCustomRole.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -196,6 +196,28 @@ sub Delete {
return ($ok, $msg);
}
+sub FindDependencies {
+ my $self = shift;
+ my ($walker, $deps) = @_;
+
+ $self->SUPER::FindDependencies($walker, $deps);
+
+ $deps->Add( out => $self->CustomRoleObj );
+ $deps->Add( out => $self->QueueObj );
+}
+
+sub Serialize {
+ my $self = shift;
+ my %args = (@_);
+ my %store = $self->SUPER::Serialize(@_);
+
+ if ($store{ObjectId}) {
+ my $obj = RT::Queue->new( RT->SystemUser );
+ $obj->Load( $store{ObjectId} );
+ $store{ObjectId} = \($obj->UID);
+ }
+ return %store;
+}
=head2 id
diff --git a/lib/RT/ObjectCustomRoles.pm b/lib/RT/ObjectCustomRoles.pm
index b8acbdc..960f82f 100644
--- a/lib/RT/ObjectCustomRoles.pm
+++ b/lib/RT/ObjectCustomRoles.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectScrip.pm b/lib/RT/ObjectScrip.pm
index 495dcfd..bfb769a 100644
--- a/lib/RT/ObjectScrip.pm
+++ b/lib/RT/ObjectScrip.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectScrips.pm b/lib/RT/ObjectScrips.pm
index 960598c..4f5e6ef 100644
--- a/lib/RT/ObjectScrips.pm
+++ b/lib/RT/ObjectScrips.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectTopic.pm b/lib/RT/ObjectTopic.pm
index 732af3e..b985999 100644
--- a/lib/RT/ObjectTopic.pm
+++ b/lib/RT/ObjectTopic.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ObjectTopics.pm b/lib/RT/ObjectTopics.pm
index 058527b..5bc678a 100644
--- a/lib/RT/ObjectTopics.pm
+++ b/lib/RT/ObjectTopics.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/PlackRunner.pm b/lib/RT/PlackRunner.pm
index a3783c7..d9b97fe 100644
--- a/lib/RT/PlackRunner.pm
+++ b/lib/RT/PlackRunner.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Plugin.pm b/lib/RT/Plugin.pm
index 76af079..ef3ee95 100644
--- a/lib/RT/Plugin.pm
+++ b/lib/RT/Plugin.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -92,7 +92,8 @@ Returns the extension version.
sub Version {
my $self = shift;
- return $self->Name->VERSION;
+ no strict 'refs';
+ return ${$self->Name . '::VERSION'};
}
=head2 Path
diff --git a/lib/RT/Pod/HTML.pm b/lib/RT/Pod/HTML.pm
index 532c5ea..48d73e9 100644
--- a/lib/RT/Pod/HTML.pm
+++ b/lib/RT/Pod/HTML.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -102,6 +102,28 @@ sub _end_head {
return $self->SUPER::_end_head(@_);
}
+sub handle_text {
+ my ( $self, $text ) = @_;
+ if ( $self->{in_pod} && $self->{scratch} =~ /<a .*href=".+".*>/ && $text =~ /^"(.+)" in docs$/ ) {
+
+ # Tweak default text for local links under docs/, so
+ # q{"customizing/search_result_columns.pod/Column Map" in docs} becomes
+ # q{"Column Map Callback" in customizing/search_result_columns.pod}
+ #
+ # q{"customizing/search_result_columns.pod" in docs} becomes
+ # q{docs/customizing/search_result_columns.pod}
+
+ my $section = $1;
+ if ( $section =~ qr!(.+\.pod)/(.+)! ) {
+ $text = qq{"$2" in docs/$1};
+ }
+ else {
+ $text = "docs/$section";
+ }
+ }
+ $self->SUPER::handle_text( $text );
+}
+
sub resolve_pod_page_link {
my $self = shift;
my ($name, $section) = @_;
@@ -124,6 +146,20 @@ sub resolve_local_link {
$name .= ""; # stringify name, it may be an object
+ if ( $name eq 'docs' ) {
+ if ( $section =~ qr!(.+\.pod)/(.+)! ) {
+
+ # support L<docs/writing_extensions.pod/Callbacks>
+ $name .= '/' . $1;
+ $section = $2;
+ }
+ else {
+ # support L<docs/dashboards_reporting.pod>
+ $name .= '/' . $section;
+ undef $section;
+ }
+ }
+
$section = defined $section
? '#' . $self->idify($section, 1)
: '';
diff --git a/lib/RT/Pod/HTMLBatch.pm b/lib/RT/Pod/HTMLBatch.pm
index 231687d..9245315 100644
--- a/lib/RT/Pod/HTMLBatch.pm
+++ b/lib/RT/Pod/HTMLBatch.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Pod/Search.pm b/lib/RT/Pod/Search.pm
index 47af298..1220bfc 100644
--- a/lib/RT/Pod/Search.pm
+++ b/lib/RT/Pod/Search.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Principal.pm b/lib/RT/Principal.pm
index 86d600f..0d3a59a 100644
--- a/lib/RT/Principal.pm
+++ b/lib/RT/Principal.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Principals.pm b/lib/RT/Principals.pm
index 97f51f0..fa7ac20 100644
--- a/lib/RT/Principals.pm
+++ b/lib/RT/Principals.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Queue.pm b/lib/RT/Queue.pm
index 4c2f5fb..b9eaec3 100644
--- a/lib/RT/Queue.pm
+++ b/lib/RT/Queue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Queues.pm b/lib/RT/Queues.pm
index 4aaf3cb..3a2bb5e 100644
--- a/lib/RT/Queues.pm
+++ b/lib/RT/Queues.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record.pm b/lib/RT/Record.pm
index 076b193..908cde3 100644
--- a/lib/RT/Record.pm
+++ b/lib/RT/Record.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -2093,6 +2093,7 @@ sub _AddCustomFieldValue {
unless ( $new_value_id ) {
return ( 0, $self->loc( "Could not add new custom field value: [_1]", $msg ) );
}
+
if ( $args{'RecordTransaction'} ) {
my ( $tid, $msg ) = $self->_NewTransaction(
Type => 'CustomField',
@@ -2432,6 +2433,8 @@ sub FindDependencies {
or $self->isa("RT::User")
or $self->isa("RT::Group")
or $self->isa("RT::Article")
+ or $self->isa("RT::Asset")
+ or $self->isa("RT::Catalog")
or $self->isa("RT::Queue") )
{
$objs = RT::Transactions->new( $self->CurrentUser );
@@ -2445,6 +2448,7 @@ sub FindDependencies {
or $self->isa("RT::Ticket")
or $self->isa("RT::User")
or $self->isa("RT::Group")
+ or $self->isa("RT::Asset")
or $self->isa("RT::Queue")
or $self->isa("RT::Article") )
and $self->can("CustomFieldValues") )
diff --git a/lib/RT/Record/AddAndSort.pm b/lib/RT/Record/AddAndSort.pm
index cbacf27..0aea84f 100644
--- a/lib/RT/Record/AddAndSort.pm
+++ b/lib/RT/Record/AddAndSort.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role.pm b/lib/RT/Record/Role.pm
index eddc10e..a09579f 100644
--- a/lib/RT/Record/Role.pm
+++ b/lib/RT/Record/Role.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role/Lifecycle.pm b/lib/RT/Record/Role/Lifecycle.pm
index 631c01b..6ca07a6 100644
--- a/lib/RT/Record/Role/Lifecycle.pm
+++ b/lib/RT/Record/Role/Lifecycle.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role/Links.pm b/lib/RT/Record/Role/Links.pm
index 59ee737..4bc228b 100644
--- a/lib/RT/Record/Role/Links.pm
+++ b/lib/RT/Record/Role/Links.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role/Rights.pm b/lib/RT/Record/Role/Rights.pm
index 108cbf8..5079f51 100644
--- a/lib/RT/Record/Role/Rights.pm
+++ b/lib/RT/Record/Role/Rights.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role/Roles.pm b/lib/RT/Record/Role/Roles.pm
index a1d4910..1a88793 100644
--- a/lib/RT/Record/Role/Roles.pm
+++ b/lib/RT/Record/Role/Roles.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Record/Role/Status.pm b/lib/RT/Record/Role/Status.pm
index 6029038..7555b88 100644
--- a/lib/RT/Record/Role/Status.pm
+++ b/lib/RT/Record/Role/Status.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Reminders.pm b/lib/RT/Reminders.pm
index fed03bc..5db4dbb 100644
--- a/lib/RT/Reminders.pm
+++ b/lib/RT/Reminders.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Report/Tickets.pm b/lib/RT/Report/Tickets.pm
index fdd8890..251dda3 100644
--- a/lib/RT/Report/Tickets.pm
+++ b/lib/RT/Report/Tickets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Report/Tickets/Entry.pm b/lib/RT/Report/Tickets/Entry.pm
index 58db2d3..e0c91bd 100644
--- a/lib/RT/Report/Tickets/Entry.pm
+++ b/lib/RT/Report/Tickets/Entry.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Rule.pm b/lib/RT/Rule.pm
index 05a8fe9..de7245a 100644
--- a/lib/RT/Rule.pm
+++ b/lib/RT/Rule.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Ruleset.pm b/lib/RT/Ruleset.pm
index 3966eb7..9a530d5 100644
--- a/lib/RT/Ruleset.pm
+++ b/lib/RT/Ruleset.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SLA.pm b/lib/RT/SLA.pm
index 8d512e9..10524e7 100644
--- a/lib/RT/SLA.pm
+++ b/lib/RT/SLA.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SQL.pm b/lib/RT/SQL.pm
index 6b6bafd..895dd62 100644
--- a/lib/RT/SQL.pm
+++ b/lib/RT/SQL.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SavedSearch.pm b/lib/RT/SavedSearch.pm
index 8bb1452..68780c5 100644
--- a/lib/RT/SavedSearch.pm
+++ b/lib/RT/SavedSearch.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SavedSearches.pm b/lib/RT/SavedSearches.pm
index ba18c99..29fa7d5 100644
--- a/lib/RT/SavedSearches.pm
+++ b/lib/RT/SavedSearches.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Scrip.pm b/lib/RT/Scrip.pm
index 9d901ba..10f0605 100644
--- a/lib/RT/Scrip.pm
+++ b/lib/RT/Scrip.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ScripAction.pm b/lib/RT/ScripAction.pm
index 2ce1693..5e5999b 100644
--- a/lib/RT/ScripAction.pm
+++ b/lib/RT/ScripAction.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ScripActions.pm b/lib/RT/ScripActions.pm
index be0b55c..c7cc336 100644
--- a/lib/RT/ScripActions.pm
+++ b/lib/RT/ScripActions.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ScripCondition.pm b/lib/RT/ScripCondition.pm
index 7868264..a535516 100644
--- a/lib/RT/ScripCondition.pm
+++ b/lib/RT/ScripCondition.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/ScripConditions.pm b/lib/RT/ScripConditions.pm
index 9e6890c..5791179 100644
--- a/lib/RT/ScripConditions.pm
+++ b/lib/RT/ScripConditions.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Scrips.pm b/lib/RT/Scrips.pm
index 3ec563b..cf58025 100644
--- a/lib/RT/Scrips.pm
+++ b/lib/RT/Scrips.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Search.pm b/lib/RT/Search.pm
index 160f3f3..e886d46 100644
--- a/lib/RT/Search.pm
+++ b/lib/RT/Search.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Search/ActiveTicketsInQueue.pm b/lib/RT/Search/ActiveTicketsInQueue.pm
index 68c4249..d413521 100644
--- a/lib/RT/Search/ActiveTicketsInQueue.pm
+++ b/lib/RT/Search/ActiveTicketsInQueue.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Search/FromSQL.pm b/lib/RT/Search/FromSQL.pm
index a6284f5..bfa1f74 100644
--- a/lib/RT/Search/FromSQL.pm
+++ b/lib/RT/Search/FromSQL.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Search/Simple.pm b/lib/RT/Search/Simple.pm
index f0d7652..30d7f7e 100644
--- a/lib/RT/Search/Simple.pm
+++ b/lib/RT/Search/Simple.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SearchBuilder.pm b/lib/RT/SearchBuilder.pm
index 8f6e12b..01e2651 100644
--- a/lib/RT/SearchBuilder.pm
+++ b/lib/RT/SearchBuilder.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SearchBuilder/AddAndSort.pm b/lib/RT/SearchBuilder/AddAndSort.pm
index 6a170a2..c43625c 100644
--- a/lib/RT/SearchBuilder/AddAndSort.pm
+++ b/lib/RT/SearchBuilder/AddAndSort.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SearchBuilder/Role.pm b/lib/RT/SearchBuilder/Role.pm
index 231147b..94db438 100644
--- a/lib/RT/SearchBuilder/Role.pm
+++ b/lib/RT/SearchBuilder/Role.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SearchBuilder/Role/Roles.pm b/lib/RT/SearchBuilder/Role/Roles.pm
index 4de557b..76a9e52 100644
--- a/lib/RT/SearchBuilder/Role/Roles.pm
+++ b/lib/RT/SearchBuilder/Role/Roles.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SharedSetting.pm b/lib/RT/SharedSetting.pm
index 30f9e09..66400b5 100644
--- a/lib/RT/SharedSetting.pm
+++ b/lib/RT/SharedSetting.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/SharedSettings.pm b/lib/RT/SharedSettings.pm
index 1af114f..0952564 100644
--- a/lib/RT/SharedSettings.pm
+++ b/lib/RT/SharedSettings.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder.pm b/lib/RT/Shredder.pm
index 108164d..6f92204 100644
--- a/lib/RT/Shredder.pm
+++ b/lib/RT/Shredder.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -363,7 +363,17 @@ sub CastObjectsToRecords
$RT::Logger->error( "Couldn't load '$class' object with id '$id'" );
RT::Shredder::Exception::Info->throw( 'CouldntLoadObject' );
}
- die "Loaded object has different id" unless( $id eq $obj->id );
+
+ if ( $id =~ /^\d+$/ ) {
+ if ( $id ne $obj->Id ) {
+ die 'Loaded object id ' . $obj->Id . " is different from passed id $id";
+ }
+ }
+ else {
+ if ( $obj->_Accessible( 'Name', 'read' ) && $id ne $obj->Name ) {
+ die 'Loaded object name ' . $obj->Name . " is different from passed name $id";
+ }
+ }
push @res, $obj;
} else {
RT::Shredder::Exception->throw( "Unsupported type ". ref $targets );
@@ -799,70 +809,6 @@ sub RollbackDumpTo {
1;
__END__
-=head1 NOTES
-
-=head2 Database transactions support
-
-Since 0.03_01 RT::Shredder uses database transactions and should be
-much safer to run on production servers.
-
-=head2 Foreign keys
-
-Mainstream RT doesn't use FKs, but at least I posted DDL script that creates them
-in mysql DB, note that if you use FKs then this two valid keys don't allow delete
-Tickets because of bug in MySQL:
-
- ALTER TABLE Tickets ADD FOREIGN KEY (EffectiveId) REFERENCES Tickets(id);
- ALTER TABLE CachedGroupMembers ADD FOREIGN KEY (Via) REFERENCES CachedGroupMembers(id);
-
-L<http://bugs.mysql.com/bug.php?id=4042>
-
-=head1 BUGS AND HOW TO CONTRIBUTE
-
-We need your feedback in all cases: if you use it or not,
-is it works for you or not.
-
-=head2 Testing
-
-Don't skip C<make test> step while install and send me reports if it's fails.
-Add your own tests, it's easy enough if you've writen at list one perl script
-that works with RT. Read more about testing in F<t/utils.pl>.
-
-=head2 Reporting
-
-Send reports to L</AUTHOR> or to the RT mailing lists.
-
-=head2 Documentation
-
-Many bugs in the docs: insanity, spelling, gramar and so on.
-Patches are wellcome.
-
-=head2 Todo
-
-Please, see Todo file, it has some technical notes
-about what I plan to do, when I'll do it, also it
-describes some problems code has.
-
-=head2 Repository
-
-Since RT-3.7 shredder is a part of the RT distribution.
-Versions of the RTx::Shredder extension could
-be downloaded from the CPAN. Those work with older
-RT versions or you can find repository at
-L<https://opensvn.csie.org/rtx_shredder>
-
-=head1 AUTHOR
-
- Ruslan U. Zakirov <Ruslan.Zakirov@gmail.com>
-
-=head1 COPYRIGHT
-
-This program is free software; you can redistribute
-it and/or modify it under the same terms as Perl itself.
-
-The full text of the license can be found in the
-Perl distribution.
-
=head1 SEE ALSO
L<rt-shredder>, L<rt-validator>
diff --git a/lib/RT/Shredder/Constants.pm b/lib/RT/Shredder/Constants.pm
index 189787f..f806966 100644
--- a/lib/RT/Shredder/Constants.pm
+++ b/lib/RT/Shredder/Constants.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Dependencies.pm b/lib/RT/Shredder/Dependencies.pm
index f74e7ab..5e00541 100644
--- a/lib/RT/Shredder/Dependencies.pm
+++ b/lib/RT/Shredder/Dependencies.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Dependency.pm b/lib/RT/Shredder/Dependency.pm
index c0997e9..b6e77d2 100644
--- a/lib/RT/Shredder/Dependency.pm
+++ b/lib/RT/Shredder/Dependency.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Exceptions.pm b/lib/RT/Shredder/Exceptions.pm
index 3c1fbc7..8329623 100644
--- a/lib/RT/Shredder/Exceptions.pm
+++ b/lib/RT/Shredder/Exceptions.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/POD.pm b/lib/RT/Shredder/POD.pm
index 5435e26..d867d13 100644
--- a/lib/RT/Shredder/POD.pm
+++ b/lib/RT/Shredder/POD.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin.pm b/lib/RT/Shredder/Plugin.pm
index 78ea131..d612cc1 100644
--- a/lib/RT/Shredder/Plugin.pm
+++ b/lib/RT/Shredder/Plugin.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Attachments.pm b/lib/RT/Shredder/Plugin/Attachments.pm
index 7c63e12..397c8d7 100644
--- a/lib/RT/Shredder/Plugin/Attachments.pm
+++ b/lib/RT/Shredder/Plugin/Attachments.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Base.pm b/lib/RT/Shredder/Plugin/Base.pm
index c8bb4e0..d50d36e 100644
--- a/lib/RT/Shredder/Plugin/Base.pm
+++ b/lib/RT/Shredder/Plugin/Base.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Base/Dump.pm b/lib/RT/Shredder/Plugin/Base/Dump.pm
index bc0ba4c..7f56e55 100644
--- a/lib/RT/Shredder/Plugin/Base/Dump.pm
+++ b/lib/RT/Shredder/Plugin/Base/Dump.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Base/Search.pm b/lib/RT/Shredder/Plugin/Base/Search.pm
index 65a42d5..a40b12d 100644
--- a/lib/RT/Shredder/Plugin/Base/Search.pm
+++ b/lib/RT/Shredder/Plugin/Base/Search.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Objects.pm b/lib/RT/Shredder/Plugin/Objects.pm
index 8763617..d0b96f4 100644
--- a/lib/RT/Shredder/Plugin/Objects.pm
+++ b/lib/RT/Shredder/Plugin/Objects.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/SQLDump.pm b/lib/RT/Shredder/Plugin/SQLDump.pm
index 2d10115..ede0d6d 100644
--- a/lib/RT/Shredder/Plugin/SQLDump.pm
+++ b/lib/RT/Shredder/Plugin/SQLDump.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Summary.pm b/lib/RT/Shredder/Plugin/Summary.pm
index 33bff3d..18ef7f3 100644
--- a/lib/RT/Shredder/Plugin/Summary.pm
+++ b/lib/RT/Shredder/Plugin/Summary.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Tickets.pm b/lib/RT/Shredder/Plugin/Tickets.pm
index 9df85c5..a68d120 100644
--- a/lib/RT/Shredder/Plugin/Tickets.pm
+++ b/lib/RT/Shredder/Plugin/Tickets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Shredder/Plugin/Users.pm b/lib/RT/Shredder/Plugin/Users.pm
index 75f6a57..43bf624 100644
--- a/lib/RT/Shredder/Plugin/Users.pm
+++ b/lib/RT/Shredder/Plugin/Users.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Squish.pm b/lib/RT/Squish.pm
index a88e4ea..1312ba0 100644
--- a/lib/RT/Squish.pm
+++ b/lib/RT/Squish.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Squish/CSS.pm b/lib/RT/Squish/CSS.pm
index 69ca849..01411d7 100644
--- a/lib/RT/Squish/CSS.pm
+++ b/lib/RT/Squish/CSS.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Squish/JS.pm b/lib/RT/Squish/JS.pm
index 4091c83..ad4faa8 100644
--- a/lib/RT/Squish/JS.pm
+++ b/lib/RT/Squish/JS.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/System.pm b/lib/RT/System.pm
index 5599483..418cb48 100644
--- a/lib/RT/System.pm
+++ b/lib/RT/System.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Template.pm b/lib/RT/Template.pm
index 56e5f2f..0475bb2 100644
--- a/lib/RT/Template.pm
+++ b/lib/RT/Template.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Templates.pm b/lib/RT/Templates.pm
index c5a49fe..7d7d70a 100644
--- a/lib/RT/Templates.pm
+++ b/lib/RT/Templates.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test.pm b/lib/RT/Test.pm
index 2eabbac..de713d2 100644
--- a/lib/RT/Test.pm
+++ b/lib/RT/Test.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -109,6 +109,7 @@ problem in Perl that hides the top-level optree from L<Devel::Cover>.
our $port;
our @SERVERS;
+my @ports; # keep track of all the random ports we used
BEGIN {
delete $ENV{$_} for qw/LANGUAGE LC_ALL LC_MESSAGES LANG/;
@@ -146,7 +147,7 @@ sub import {
$class->bootstrap_tempdir;
- $class->bootstrap_port;
+ $port = $class->find_idle_port;
$class->bootstrap_plugins_paths( %args );
@@ -229,7 +230,7 @@ sub db_requires_no_dba {
return 1 if $db_type eq 'SQLite';
}
-sub bootstrap_port {
+sub find_idle_port {
my $class = shift;
my %ports;
@@ -245,6 +246,7 @@ sub bootstrap_port {
# Pick a random port, checking that the port isn't in our in-use
# list, and that something isn't already listening there.
+ my $port;
{
$port = 1024 + int rand(10_000) + $$ % 1024;
redo if $ports{$port};
@@ -271,6 +273,8 @@ sub bootstrap_port {
truncate(PORTS, 0);
print PORTS "$_\n" for sort {$a <=> $b} keys %ports;
close(PORTS) or die "Can't close ports file: $!";
+ push @ports, $port;
+ return $port;
}
sub bootstrap_tempdir {
@@ -1772,6 +1776,12 @@ sub done_testing {
Test::NoWarnings::had_no_warnings();
$check_warnings_in_end = 0;
+ if ($RT::Test::Web::INSTANCES) {
+ my $cleanup = RT::Test::Web->new;
+ undef $RT::Test::Web::INSTANCES;
+ $cleanup->no_warnings_ok;
+ }
+
$builder->done_testing(@_);
}
@@ -1803,7 +1813,7 @@ END {
# Drop our port from t/tmp/ports; do this after dropping the
# database, as our port lock is also a lock on the database name.
- if ($port) {
+ if (@ports) {
my %ports;
my $portfile = "$tmp{'directory'}/../ports";
sysopen(PORTS, $portfile, O_RDWR|O_CREAT)
@@ -1811,7 +1821,7 @@ END {
flock(PORTS, LOCK_EX)
or die "Can't write-lock ports file $portfile: $!";
$ports{$_}++ for split ' ', join("",<PORTS>);
- delete $ports{$port};
+ delete $ports{$_} for @ports;
seek(PORTS, 0, 0);
truncate(PORTS, 0);
print PORTS "$_\n" for sort {$a <=> $b} keys %ports;
diff --git a/lib/RT/Test/Apache.pm b/lib/RT/Test/Apache.pm
index 7dc3083..e7e0a3f 100644
--- a/lib/RT/Test/Apache.pm
+++ b/lib/RT/Test/Apache.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/Assets.pm b/lib/RT/Test/Assets.pm
index 5068bf8..6416459 100644
--- a/lib/RT/Test/Assets.pm
+++ b/lib/RT/Test/Assets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/Email.pm b/lib/RT/Test/Email.pm
index c407592..21df36a 100644
--- a/lib/RT/Test/Email.pm
+++ b/lib/RT/Test/Email.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/ExternalStorage.pm b/lib/RT/Test/ExternalStorage.pm
index d064c6b..6e204bc 100644
--- a/lib/RT/Test/ExternalStorage.pm
+++ b/lib/RT/Test/ExternalStorage.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/GnuPG.pm b/lib/RT/Test/GnuPG.pm
index 0887592..b4bbb71 100644
--- a/lib/RT/Test/GnuPG.pm
+++ b/lib/RT/Test/GnuPG.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/SMIME.pm b/lib/RT/Test/SMIME.pm
index 9679d4f..1f28877 100644
--- a/lib/RT/Test/SMIME.pm
+++ b/lib/RT/Test/SMIME.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/Shredder.pm b/lib/RT/Test/Shredder.pm
index 44a2fb3..660dbfc 100644
--- a/lib/RT/Test/Shredder.pm
+++ b/lib/RT/Test/Shredder.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Test/Web.pm b/lib/RT/Test/Web.pm
index 0f7d036..7975e86 100644
--- a/lib/RT/Test/Web.pm
+++ b/lib/RT/Test/Web.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -52,21 +52,21 @@ use strict;
use warnings;
use base qw(Test::WWW::Mechanize);
-use Scalar::Util qw(weaken);
use MIME::Base64 qw//;
use Encode 'encode_utf8';
+use Storable 'thaw';
+use HTTP::Status qw();
BEGIN { require RT::Test; }
require Test::More;
-my $instance;
+$RT::Test::Web::INSTANCES = undef;
sub new {
my ($class, @args) = @_;
push @args, app => $RT::Test::TEST_APP if $RT::Test::TEST_APP;
- my $self = $instance = $class->SUPER::new(@args);
- weaken $instance;
+ my $self = $class->SUPER::new(@args);
$self->cookie_jar(HTTP::Cookies->new);
# Clear our caches of anything that the server process may have done
$self->add_handler(
@@ -75,9 +75,16 @@ sub new {
},
) if RT::Record->can( "FlushCache" );
+ $RT::Test::Web::INSTANCES++;
return $self;
}
+sub clone {
+ my $self = shift;
+ $RT::Test::Web::INSTANCES++ if defined $RT::Test::Web::INSTANCES;
+ return $self->SUPER::clone();
+}
+
sub get_ok {
my $self = shift;
my $url = shift;
@@ -120,7 +127,7 @@ sub logged_in_as {
my $self = shift;
my $user = shift || '';
- unless ( $self->status == 200 ) {
+ unless ( $self->status == HTTP::Status::HTTP_OK ) {
Test::More::diag( "error: status is ". $self->status );
return 0;
}
@@ -138,12 +145,12 @@ sub logout {
my $url = $self->rt_base_url;
$self->get($url);
Test::More::diag( "error: status is ". $self->status )
- unless $self->status == 200;
+ unless $self->status == HTTP::Status::HTTP_OK;
if ( $self->content =~ /Logout/i ) {
$self->follow_link( text => 'Logout' );
Test::More::diag( "error: status is ". $self->status ." when tried to logout" )
- unless $self->status == 200;
+ unless $self->status == HTTP::Status::HTTP_OK;
}
else {
return 1;
@@ -161,6 +168,7 @@ sub goto_ticket {
my $self = shift;
my $id = shift;
my $view = shift || 'Display';
+ my $status = shift || HTTP::Status::HTTP_OK;
unless ( $id && int $id ) {
Test::More::diag( "error: wrong id ". defined $id? $id : '(undef)' );
return 0;
@@ -169,7 +177,7 @@ sub goto_ticket {
my $url = $self->rt_base_url;
$url .= "Ticket/${ view }.html?id=$id";
$self->get($url);
- unless ( $self->status == 200 ) {
+ unless ( $self->status == $status ) {
Test::More::diag( "error: status is ". $self->status );
return 0;
}
@@ -207,12 +215,9 @@ sub get_warnings {
# forms on XYZ. This is because the most recently fetched page has changed
# from XYZ to /__test_warnings, which has no form.
my $clone = $self->clone;
- return unless $clone->get_ok('/__test_warnings');
-
- use Storable 'thaw';
- my @warnings = @{ thaw $clone->content };
- return @warnings;
+ return unless $clone->get_ok('/__test_warnings');
+ return @{ thaw $clone->content };
}
sub warning_like {
@@ -468,19 +473,27 @@ for my $method_name (qw/
sub DESTROY {
my $self = shift;
- if ( RT::Test->builder->{Done_Testing} ) {
- die "RT::Test::Web object needs to be destroyed before done_testing is called";
- }
-
- if ( !$RT::Test::Web::DESTROY++ ) {
- $self->no_warnings_ok;
+ if (defined $RT::Test::Web::INSTANCES) {
+ $RT::Test::Web::INSTANCES--;
+ if ($RT::Test::Web::INSTANCES == 0 ) {
+ # Ordering matters -- clean out INSTANCES before we check
+ # warnings, so the clone therein sees that we've already begun
+ # cleanups.
+ undef $RT::Test::Web::INSTANCES;
+ $self->no_warnings_ok;
+ }
}
}
END {
- return unless $instance;
return if RT::Test->builder->{Original_Pid} != $$;
- $instance->no_warnings_ok if !$RT::Test::Web::DESTROY++;
+ if (defined $RT::Test::Web::INSTANCES and $RT::Test::Web::INSTANCES == 0 ) {
+ # Ordering matters -- clean out INSTANCES after the `new`
+ # bumps it up to 1.
+ my $cleanup = RT::Test::Web->new;
+ undef $RT::Test::Web::INSTANCES;
+ $cleanup->no_warnings_ok;
+ }
}
1;
diff --git a/lib/RT/Ticket.pm b/lib/RT/Ticket.pm
index 3a24100..3335a1c 100644
--- a/lib/RT/Ticket.pm
+++ b/lib/RT/Ticket.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -658,6 +658,7 @@ sub AddWatcher {
my $group = $self->RoleGroup( $args{Type} );
if ($group->id && $group->SingleMemberRoleGroup) {
my $users = $group->UserMembersObj( Recursively => 0 );
+ $users->{find_disabled_rows} = 1;
$original_user = $users->First;
if ($original_user->PrincipalId == $principal->Id) {
return 1;
@@ -1052,10 +1053,14 @@ sub TransactionAddresses {
$attachments->LimitByTicket( $self->id );
$attachments->Columns( qw( id Headers TransactionId));
- $attachments->Limit(
- FIELD => 'Parent',
- VALUE => 0,
- );
+ # If $TreatAttachedEmailAsFiles is set, don't parse child attachments
+ # for email addresses.
+ if ( RT->Config->Get('TreatAttachedEmailAsFiles') ){
+ $attachments->Limit(
+ FIELD => 'Parent',
+ VALUE => 0,
+ );
+ }
$attachments->Limit(
ALIAS => $attachments->TransactionAlias,
@@ -1177,6 +1182,23 @@ sub QueueObj {
return ($self->{_queue_obj});
}
+sub Subject {
+ my $self = shift;
+
+ my $subject = $self->_Value( 'Subject' );
+ return $subject if defined $subject;
+
+ if ( RT->Config->Get( 'DatabaseType' ) eq 'Oracle' && $self->CurrentUserHasRight( 'ShowTicket' ) ) {
+
+ # Oracle treats empty strings as NULL, so it returns undef for empty subjects.
+ # Since '' is the default Subject value, returning '' is more correct.
+ return '';
+ }
+ else {
+ return undef;
+ }
+}
+
sub SetSubject {
my $self = shift;
my $value = shift;
@@ -1878,6 +1900,11 @@ sub MergeInto {
return ( 0, $self->loc("Can't merge a ticket into itself") );
}
+ # Only tickets can be merged
+ unless ($MergeInto->Type eq 'ticket' && $self->Type eq 'ticket'){
+ return(0, $self->loc("Only tickets can be merged"));
+ }
+
# Make sure the current user can modify the new ticket.
unless ( $MergeInto->CurrentUserHasRight('ModifyTicket') ) {
return ( 0, $self->loc("Permission Denied") );
@@ -3201,25 +3228,8 @@ sub CurrentUserCanSeeTime {
!RT->Config->Get('HideTimeFieldsFromUnprivilegedUsers');
}
-1;
-
-=head1 AUTHOR
-
-Jesse Vincent, jesse@bestpractical.com
-
-=head1 SEE ALSO
-
-RT
-
-=cut
-
sub Table {'Tickets'}
-
-
-
-
-
=head2 id
Returns the current value of id.
diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index 73bf7f5..a2b27bf 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -3029,10 +3029,11 @@ sub _parser {
require RT::Interface::Web::QueryBuilder::Tree;
my $tree = RT::Interface::Web::QueryBuilder::Tree->new;
- $tree->ParseSQL(
+ my @results = $tree->ParseSQL(
Query => $string,
CurrentUser => $self->CurrentUser,
);
+ die join "; ", map { ref $_ eq 'ARRAY' ? $_->[ 0 ] : $_ } @results if @results;
state ( $active_status_node, $inactive_status_node );
diff --git a/lib/RT/Topic.pm b/lib/RT/Topic.pm
index 556cb78..c92aade 100644
--- a/lib/RT/Topic.pm
+++ b/lib/RT/Topic.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
# <sales@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
diff --git a/lib/RT/Topics.pm b/lib/RT/Topics.pm
index 0ae885a..d40585a 100644
--- a/lib/RT/Topics.pm
+++ b/lib/RT/Topics.pm
@@ -2,7 +2,7 @@
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2017 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC
#