From 910370faf573ae1235360a183d376a781ec91deb Mon Sep 17 00:00:00 2001 From: Steve Boyd Date: Wed, 26 Feb 2025 10:04:05 +1300 Subject: [PATCH] DOC 5.4.0-beta1 changelog --- en/08_Changelogs/beta/5.4.0-beta1.md | 497 ++++++++++++++++++++++++++- 1 file changed, 482 insertions(+), 15 deletions(-) diff --git a/en/08_Changelogs/beta/5.4.0-beta1.md b/en/08_Changelogs/beta/5.4.0-beta1.md index 9f71c7b8..2d9d184f 100644 --- a/en/08_Changelogs/beta/5.4.0-beta1.md +++ b/en/08_Changelogs/beta/5.4.0-beta1.md @@ -2,6 +2,20 @@ ## Overview +- [Security considerations](#security-considerations) +- [Features and enhancements](#features-and-enhancements) + - [Sudo mode for sensitive data](#form-sudo-mode) + - [Logged warning if allowed hosts have not been configured](#allowed-hosts-warning) + - [New `XssSanitiser` class](#new-xsssanitiser-class) + - [Option to change `ClassName` column from enum to varchar](#classname-varchar) + - [Reports quality of life updates](#reports-quality-of-life-updates) + - [New `class_description` configuration on `DataObject`](#class-description) + - [`oEmbed` sandboxing](#oembed-sandboxing) + - [UX improvement for unique indexes](#unique-indexes) + - [Other new features](#other-new-features) +- [API changes](#api-changes) +- [Bug fixes](#bug-fixes) + A full list of module versions included in CMS Recipe 5.4.0-beta1 is provided below. We recommend referencing recipes in your dependencies, rather than individual modules, to simplify version tracking. See [Recipes](/getting_started/).
@@ -9,24 +23,477 @@ A full list of module versions included in CMS Recipe 5.4.0-beta1 is provided be | Module | Version | | ------ | ------- | -| silverstripe/admin | x.x.x | -| silverstripe/asset-admin | x.x.x | -| silverstripe/assets | x.x.x | -| silverstripe/campaign-admin | x.x.x | -| silverstripe/cms | x.x.x | -| silverstripe/config | x.x.x | -| silverstripe/errorpage | x.x.x | -| silverstripe/framework | x.x.x | -| silverstripe/graphql | x.x.x | -| silverstripe/login-forms | x.x.x | -| silverstripe/mimevalidator | x.x.x | -| silverstripe/reports | x.x.x | -| silverstripe/siteconfig | x.x.x | -| silverstripe/versioned | x.x.x | -| silverstripe/versioned-admin | x.x.x | +| bringyourownideas/silverstripe-composer-update-checker | 4.1.2 | +| bringyourownideas/silverstripe-maintenance | 3.3.0-beta1 | +| colymba/gridfield-bulk-editing-tools | 4.1.2 | +| cwp/agency-extensions | 3.3.0 | +| cwp/starter-theme | 4.2.0 | +| cwp/watea-theme | 4.2.0 | +| dnadesign/silverstripe-elemental | 5.4.0-beta1 | +| dnadesign/silverstripe-elemental-userforms | 4.2.0-beta1 | +| silverstripe-themes/simple | 3.3.2 | +| silverstripe/admin | 2.4.0-beta1 | +| silverstripe/asset-admin | 2.4.0-beta1 | +| silverstripe/assets | 2.4.0-beta1 | +| silverstripe/auditor | 3.3.0-beta1 | +| silverstripe/blog | 4.4.0-beta1 | +| silverstripe/campaign-admin | 2.4.0-beta1 | +| silverstripe/cms | 5.4.0-beta1 | +| silverstripe/config | 2.2.0-beta1 | +| silverstripe/contentreview | 5.4.0-beta1 | +| silverstripe/crontask | 3.1.0-beta1 | +| silverstripe/documentconverter | 3.3.0 | +| silverstripe/dynamodb | 5.0.1 | +| silverstripe/elemental-bannerblock | 3.3.0 | +| silverstripe/elemental-fileblock | 3.1.0 | +| silverstripe/environmentcheck | 3.1.0-beta1 | +| silverstripe/errorpage | 2.4.0-beta1 | +| silverstripe/externallinks | 3.4.0-beta1 | +| silverstripe/framework | 5.4.0-beta1 | +| silverstripe/graphql | 5.3.0-beta1 | +| silverstripe/gridfieldqueuedexport | 3.3.0 | +| silverstripe/hybridsessions | 3.0.5 | +| silverstripe/iframe | 3.3.0-beta1 | +| silverstripe/installer | 5.4.0-beta1 | +| silverstripe/ldap | 2.3.0-beta1 | +| silverstripe/linkfield | 4.2.0-beta1 | +| silverstripe/login-forms | 5.3.0 | +| silverstripe/lumberjack | 3.3.0-beta1 | +| silverstripe/mfa | 5.4.0-beta1 | +| silverstripe/mimevalidator | 3.1.0 | +| silverstripe/realme | 5.5.0-beta1 | +| silverstripe/recipe-authoring-tools | 2.4.0-beta1 | +| silverstripe/recipe-blog | 2.4.0-beta1 | +| silverstripe/recipe-cms | 5.4.0-beta1 | +| silverstripe/recipe-collaboration | 2.4.0-beta1 | +| silverstripe/recipe-content-blocks | 3.4.0-beta1 | +| silverstripe/recipe-core | 5.4.0-beta1 | +| silverstripe/recipe-form-building | 2.4.0-beta1 | +| silverstripe/recipe-kitchen-sink | 5.4.0-beta1 | +| silverstripe/recipe-plugin | 2.1.0-beta1 | +| silverstripe/recipe-reporting-tools | 2.4.0-beta1 | +| silverstripe/recipe-services | 2.4.0-beta1 | +| silverstripe/registry | 3.3.0-beta1 | +| silverstripe/reports | 5.4.0-beta1 | +| silverstripe/restfulserver | 3.0.2 | +| silverstripe/securityreport | 3.1.1 | +| silverstripe/segment-field | 3.3.0 | +| silverstripe/session-manager | 2.3.0 | +| silverstripe/sharedraftcontent | 3.4.0-beta1 | +| silverstripe/siteconfig | 5.4.0-beta1 | +| silverstripe/sitewidecontent-report | 4.3.0 | +| silverstripe/spamprotection | 4.2.2 | +| silverstripe/staticpublishqueue | 6.3.0-beta1 | +| silverstripe/subsites | 3.4.0-beta1 | +| silverstripe/tagfield | 3.4.0-beta1 | +| silverstripe/taxonomy | 3.2.3 | +| silverstripe/textextraction | 4.1.1 | +| silverstripe/totp-authenticator | 5.3.0 | +| silverstripe/userforms | 6.4.0-beta1 | +| silverstripe/vendor-plugin | 2.1.0-beta1 | +| silverstripe/versioned | 2.4.0-beta1 | +| silverstripe/versioned-admin | 2.4.0-beta1 | +| silverstripe/versionfeed | 3.2.4 | +| silverstripe/webauthn-authenticator | 5.3.0 | +| symbiote/silverstripe-advancedworkflow | 6.4.0-beta1 | +| symbiote/silverstripe-gridfieldextensions | 4.1.0 | +| symbiote/silverstripe-multivaluefield | 6.1.0 | +| symbiote/silverstripe-queuedjobs | 5.3.0-beta1 | +| tractorcow/silverstripe-fluent | 7.3.0-beta1 |
+## Security considerations {#security-considerations} + +Three security fixes that were previously released in the January security release are mentioned in the [Silverstripe CMS security patches January 2025 blog post](https://www.silverstripe.org/blog/silverstripe-cms-security-patches-january-2025) are listed below. + +Review the individual vulnerability disclosure for more detailed descriptions of each security fix. We highly encourage upgrading your project to include the latest security patches. + +We have provided a severity rating of the vulnerabilities below based on the CVSS score. Note that the impact of each vulnerability could vary based on the specifics of each project. You can [read the severity rating definitions in the Silverstripe CMS release process](/contributing/release_process/#severity-rating). + +- [CVE-2024-47605 - XSS via insert media remote file oembed](https://www.silverstripe.org/download/security-releases/cve-2024-47605) Severity: Medium +- [CVE-2024-53277 - XSS in form messages](https://www.silverstripe.org/download/security-releases/cve-2024-53277) Severity: Medium +- [SS-2024-002 - Reflected Cross Site Scripting (XSS) in error message](https://www.silverstripe.org/download/security-releases/ss-2024-002) Severity: None + +## Features and enhancements + +### Sudo mode for sensitive data {#form-sudo-mode} + +Some data managed by the CMS is always considered sensitive from a security point of view, such as member data and permissions assigned to groups. Data of this nature is now protected by default by "sudo mode" in the CMS. When a user tries to edit sensitive data, they will be prompted to enter their password to confirm their identity. + +This change was made to provide an extra layer of protection against cross site scripting (XSS) attacks, as well as people maliciously using someone elses computer left unattended in a logged-in state. + +Users will still be able to view sensitive data without entering their password as they could before. Previously "sudo mode" only protected a member's MFA settings. Now the following [`DataObject`](api:SilverStripe\ORM\DataObject) subclasses are also protected by sudo mode: + +- [`Member`](api:SilverStripe\Security\Member) +- [`Group`](api:SilverStripe\Security\Group) +- [`PermissionRole`](api:SilverStripe\Security\PermissionRole) +- [`PermissionRoleCode`](api:SilverStripe\Security\PermissionRoleCode) + +You can also add sudo mode to your own `DataObject` subclass by setting the [`DataObject.require_sudo_mode`](api:SilverStripe\ORM\DataObject->require_sudo_mode) configuration property to `true`. For example: + +```yml +SomeModule\Model\Player: + require_sudo_mode: true +``` + +Previously sudo mode was automatically activated when a user logged in, which largely negated the value the feature provided. This has now been changed so that users will always have to enter their password to activate sudo mode the first time they reach a sensitive area of the CMS. + +There is still a configurable grace period where, after entering your password to activate sudo mode, it will remain active for a short time. + +If you run end-to-end tests on the CMS which involve editing sensitive data you may need to update your tests to account for this change. If you use behat there are [instructions](https://github.com/silverstripe/silverstripe-behat-extension/?tab=readme-ov-file#disabling-sudo-mode) for how to use an extension to automatically activate sudo mode in a feature file. + +[Learn more about sudo mode](/developer_guides/security/sudo_mode) in the developer docs. + +### Logged warning if allowed hosts have not been configured {#allowed-hosts-warning} + +If your site does not have one of the following configured, then a warning will now be logged on every request: + +- `SS_ALLOWED_HOSTS` environment variable +- [`AllowedHostsMiddleware.AllowedHosts`](api:SilverStripe\Control\Middleware\AllowedHostsMiddleware->AllowedHosts) property + +The "host" header is used by Silverstripe CMS to determine what the host name is for your project. This is useful when creating absolute URLs, e.g. for use in emails. + +Notably this is used in [`Director::host()`](api:SilverStripe\Control\Director::host()), which in turn is called by many methods including [`Director::hostName()`](api:SilverStripe\Control\Director::hostName()), [`Director::protocolAndHost()`](api:SilverStripe\Control\Director::protocolAndHost()), [`Director::is_site_url()`](api:SilverStripe\Control\Director::is_site_url()), and [`Director::absoluteURL()`](api:SilverStripe\Control\Director::absoluteURL()). + +Ideally your hosting will reject invalid host headers. For example Apache allows you to define valid hosts as part of the virtual host configuration, and a Web Application Firewall (WAF) can also be configured to validate the host header. However if your hosting is set to allow *any* host header, your project might be vulnerable to host header injection attacks. + +You should configure Silverstripe CMS to validate the host header, which is an extra layer of protection against this type of attack. While you should have appropriate validation at a hosting level, it is best practice to also configure this in your project. + +This configuration has existed since 2016, but we've been alerted that many projects still have not configured their hosting nor their project to adequately validate host headers. To help prompt developers, we've added a warning which will be logged if the configuration is not set. + +You can learn more about the relevant configuration in the [secure coding](/developer_guides/security/secure_coding/#request-hostname-forgery) documentation. + +### New `XssSanitiser` class + +By far the most common type of security vulnerability that gets reported to us is XSS vulnerabilities. In many cases we can remove the vulnerability vector by disallowing HTML altogether, or by removing HTML specifically from user-provided input. Sometimes we need to allow HTML content from the user, such as in the WYSIWYG editor in the CMS - and in those cases we can mitigate XSS vulnerabilities by removing specific XSS attack vectors from the HTML content. + +To help with this, we've added a new [`XssSanitiser`](api:SilverStripe\Core\XssSanitiser) class, which removes some known XSS attack vectors from HTML content. Note that this should be used only in scenarios where the HTML content can't be completely removed, and should not be considered a complete protection against all XSS attack vectors but rather as simply one of many tools in your security tool box. + +### Option to change `ClassName` column from enum to varchar {#classname-varchar} + +On websites with very large database tables it can take a long time to run `dev/build`, which can be a problem when deploying changes to production. This is because the `ClassName` column is an `enum` type which requires an a `ALTER TABLE` query to be run affecting every row whenever there is a new valid value for the column. For a very rough benchmark, running an `ALTER TABLE` query on a database table of 10 million records took 28.52 seconds on a mid-range 2023 laptop, though this time will vary depending on the database and hardware being used. + +This release introduces a new configuration option to change the `ClassName` column to a `varchar` type which removes the need to run `ALTER TABLE` whenever there is a new valid value. + +Enabling this will result in a trade-off where the size of the database will increase by approximately 7 MB per 100,000 rows. There will also be a very slow initial `dev/build` as all of the `ClassName` columns are switched to `varchar`. To enable this, add the following configuration: + +```yml +SilverStripe\ORM\DataObject: + fixed_fields: + ClassName: DBClassNameVarchar + +SilverStripe\ORM\FieldType\DBPolymorphicForeignKey: + composite_db: + Class: "DBClassNameVarchar('SilverStripe\\ORM\\DataObject', ['index' => false])" +``` + +### Reports quality of life updates + +Numerous slight adjustments have been made to the [`ReportAdmin`](api:SilverStripe\Reports\ReportAdmin) class for a better experience. + +The changes include: + +- Search capability added (making use of [`PartialMatchFilter`](api:SilverStripe\ORM\Filters\PartialMatchFilter)) +- Sorting by columns now posssible +- Default Sort is now `Title ASC` +- Reports list is now paginated +- [`Description`](api:SilverStripe\Reports\Report::description()) is now displayed in the list as a column + +### New `class_description` configuration on `DataObject` {#class-description} + +[`SiteTree`](api:SilverStripe\CMS\Model\SiteTree) and [`BaseElement`](api:DNADesign\Elemental\Models\BaseElement) both seperately implemented a `description` configuration property which was used to describe the purpose of a given subclass. For `SiteTree` this is used when creating a new page in the CMS. For `BaseElement` this is used in the elemental blocks report. In both cases the purpose is the same - it provides additional context about the intended use case for a given subclass. + +We've now implemented this concept in `DataObject` directly with the new [`DataObject.class_description`](api:SilverStripe\ORM\DataObject->class_description) configuration property. It is now considered best practice to add a description of `DataObject` subclasses using this configuration. You can use the new [`DataObject::classDescription()`](api:SilverStripe\ORM\DataObject::classDescription()) and [`DataObject::i18n_classDescription()`](api:SilverStripe\ORM\DataObject::i18n_classDescription()) methods if you need a description of any `DataObject` class. Those methods already existed on `SiteTree` but have been moved up the hierarchy so they can be called on any `DataObject` class. + +For now this is only used in the same places that used to use the deprecated configuration, but future minor releases are likely to broaden the scope of its usage. + +As a part of this change, the [`SiteTree.description`](api:SilverStripe\CMS\Model\SiteTree->description) and [`BaseElement.description`](api:DNADesign\Elemental\Models\BaseElement->description) configuration properties are now deprecated. Use `class_description` instead. + +The `SilverStripe\CMS\Model\SiteTree.DESCRIPTION` localisation key (along with the `.DESCRIPTION` suffix for any `SiteTree` subclass) will stop being used in a future major release. Use `SilverStripe\CMS\Model\SiteTree.CLASS_DESCRIPTION` instead. + +### `oEmbed` sandboxing + +As part of the fix for the security vulnerability `CVE-2024-47605` we have added a new feature to sandbox returned oEmbed HTML content in an `iframe` tag. + +You can explicitly declare domains which should be excluded from sandboxing if you find it is interfering with embeds from specific domains. For example if a YouTube embed was not rendering correctly as a result of the sandboxing you could use this YAML configuration: + +```yml +SilverStripe\View\Shortcodes\EmbedShortcodeProvider: + domains_excluded_from_sandboxing: + - 'youtube.com' +``` + +Do not include the protocol (i.e. don't include `https://` or `http://`). + +You can also change the attributes of the iframe itself with this YAML configuration: + +```yml +SilverStripe\View\Shortcodes\EmbedShortcodeProvider: + sandboxed_iframe_attributes: + allow: 'fullscreen' +``` + +### UX improvement for unique indexes {#unique-indexes} + +It has been possible to create unique indexes for `DataObject` models for a long time in Silverstripe CMS, but when these unique indexes were violated (i.e. a user tried to create a duplicate record), there was no UX feedback in the CMS. + +Violating a unique index will now throw a new [`DuplicateEntryException`](api:SilverStripe\ORM\Connect\DuplicateEntryException) exception which you can catch and handle to produce appropriate validation messages. + +If the violation happens when calling [`DataObject::write()`](api:SilverStripe\ORM\DataObject::write()), the exception will be caught and a [`ValidationException`](api:SilverStripe\ORM\ValidationException) will be thrown instead. The CMS catches any `ValidationException` and displays them as user friendly validation errors in edit forms. + +See [indexes](/developer_guides/model/indexes/) to learn about indexes in Silverstripe CMS. + +### Other new features + +- A new [`BaseKernel::getBooted()`](api:SilverStripe\Core\BaseKernel::getBooted()) method has been added for checking whether the kernel has been booted yet or not. +- A new [`CoreKernel::setBootDatabase()`](api:SilverStripe\Core\CoreKernel::setBootDatabase()) method has been added to replace the now deprecated [`DatabaselessKernel`](api:SilverStripe\Core\DatabaselessKernel) class. +- Two new methods have been added to [`ArrayLib`](api:SilverStripe\ORM\ArrayLib): + - [`ArrayLib::insertBefore()`](api:SilverStripe\ORM\ArrayLib::insertBefore()) for inserting a value before another value in an array + - [`ArrayLib::insertAfter()`](api:SilverStripe\ORM\ArrayLib::insertAfter()) for inserting a value after another value in an array +- A new [`DBDatetime::getTimeBetween()`](api:SilverStripe\ORM\FieldType\DBDatetime::getTimeBetween()) method has been added. This method returns the amount of time that has passed between two `DBDateTime` objects as a human-readable string. +- A new [`AbstractQueuedJob::getQueue()`](api:Symbiote\QueuedJobs\Services\AbstractQueuedJob::getQueue()) static method has been added to get the correct queue constant from a given string or int. +- New [`GridFieldFilterHeader::setPlaceHolderText()`](api:SilverStripe\Forms\GridField::GridFieldFilterHeader::setPlaceHolderText()) and [`GridFieldFilterHeader::getPlaceHolderText()`](api:SilverStripe\Forms\GridField::GridFieldFilterHeader::getPlaceHolderText()) methods have been added which provide a way to override the `GridFieldFilterHeader` search field placeholder text if the dynamically generated text doesn't suit your use case. +- [`RequiredFields`](api:SilverStripe\Forms\RequiredFields) can be to set to determine whether a whitespace only value, such as a single space character, is considered a valid value or not. This can be set globally via the [`RequiredFields.allow_whitespace_only`](api:SilverStripe\Forms\RequiredFields->allow_whitespace_only) config, which has a default value of `true` to retain backwards compatibility. This can also be set on a per-instance basis via [`RequiredFields::setAllowWhitespaceOnly()`](api:SilverStripe\Forms\RequiredFields::setAllowWhitespaceOnly()) which will override the global config. See [form validation docs](/developer_guides/forms/validation/#requiredfields-and-whitespace) for more details. + +## API changes + +### Return type changes in composer plugins + +We have made an exception to our [definition of public API](/project_governance/public_api/) by adding a return type to the `execute()` method in the symfony commands for `silverstripe/vendor-plugin` and `silverstripe/recipe-plugin`. + +The exception was made for the following reasons: + +- This change ensures CMS 5 can continue to be installed in scenarios where Composer is installed with Symfony 7. This can be done manually, and is also likely to be a future default. +- The likelihood of someone subclassing the relevant classes is very low. +- For installations of installer with earlier versions of Symfony this won't cause any problems, since PHP allows return types to be more specific in subclasses. This is known as [covariance](https://www.php.net/manual/en/language.oop5.variance.php#language.oop5.variance.covariance). + +### Deprecated API + +- The class names for the `TopPage` feature in [`dnadesign/silverstripe-elemental`](https://github.com/silverstripe/silverstripe-elemental) do not follow the correct naming convention for Silverstripe CMS. The existing classes have been deprecated and will be renamed to match the correct naming convention in a future major release. +- [`SilverStripe\ORM\ArrayLib`](api:SilverStripe\ORM\ArrayLib) has been deprecated. It will be renamed to `SilverStripe\Core\ArrayLib` +- [`SilverStripe\ORM\ArrayList`](api:SilverStripe\ORM\ArrayList) has been deprecated. It will be renamed to `SilverStripe\Model\List\ArrayList` +- [`SilverStripe\ORM\Filterable`](api:SilverStripe\ORM\Filterable) has been deprecated. It will be merged into [`SS_List`](api:SilverStripe\Model\List\SS_List). +- [`SilverStripe\ORM\GroupedList`](api:SilverStripe\ORM\GroupedList) has been deprecated. It will be renamed to `SilverStripe\Model\List\GroupedList` +- [`SilverStripe\ORM\Limitable`](api:SilverStripe\ORM\Limitable) has been deprecated. It will be merged into [`SS_List`](api:SilverStripe\Model\List\SS_List). +- [`SilverStripe\ORM\ListDecorator`](api:SilverStripe\ORM\ListDecorator) has been deprecated. It will be renamed to `SilverStripe\Model\List\ListDecorator` +- [`SilverStripe\ORM\Map`](api:SilverStripe\ORM\Map) has been deprecated. It will be renamed to `SilverStripe\Model\List\Map` +- [`SilverStripe\ORM\PaginatedList`](api:SilverStripe\ORM\PaginatedList) has been deprecated. It will be renamed to `SilverStripe\Model\List\PaginatedList` +- [`SilverStripe\ORM\Sortable`](api:SilverStripe\ORM\Sortable) has been deprecated. It will be merged into [`SS_List`](api:SilverStripe\Model\List\SS_List). +- [`SilverStripe\ORM\SS_List`](api:SilverStripe\ORM\SS_List) has been deprecated. It will be renamed to `SilverStripe\Model\List\SS_List` +- [`SilverStripe\ORM\ValidationException`](api:SilverStripe\ORM\ValidationException) has been deprecated. It will be renamed to `SilverStripe\Core\Validation\ValidationException` +- [`SilverStripe\ORM\ValidationResult`](api:SilverStripe\ORM\ValidationResult) has been deprecated. It will be renamed to `SilverStripe\Core\Validation\ValidationResult` +- [`SilverStripe\View\ArrayData`](api:SilverStripe\View\ArrayData) has been deprecated. It will be renamed to `SilverStripe\Model\ArrayData` +- [`SilverStripe\View\ViewableData`](api:SilverStripe\View\ViewableData) has been deprecated. It will be renamed to `SilverStripe\Model\ModelData` +- [`SilverStripe\View\ViewableData_Customised`](api:SilverStripe\View\ViewableData_Customised) has been deprecated. It will be renamed to `SilverStripe\Model\ModelDataCustomised` +- [`SilverStripe\View\ViewableData_Debugger`](api:SilverStripe\View\ViewableData_Debugger) has been deprecated. It will be renamed to `SilverStripe\Model\ModelDataDebugger` +- [`CliBypass`](api:SilverStripe\Control\Middleware\ConfirmationMiddleware\CliBypass) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CliController`](api:SilverStripe\Control\CliController) has been deprecated. It will be replaced with `symfony/console` commands. +- [`DatabaselessKernel`](api:SilverStripe\Core\DatabaselessKernel) has been deprecated. Use [`CoreKernel::setBootDatabase()`](api:SilverStripe\Core\CoreKernel::setBootDatabase()) instead. +- [`BuildTask.segment`](api:SilverStripe\Dev\BuildTask->segment) has been deprecated. It will be replaced with a new `$commandName` property. +- [`BuildTask->description`](api:SilverStripe\Dev\BuildTask->description) has been deprecated. It will be replaced with a new static property with the same name. +- [`BuildTask::getDescription()`](api:SilverStripe\Dev\BuildTask::getDescription()) has been deprecated. It will be replaced with a new static method with the same name. +- [`DevBuildController`](api:SilverStripe\Dev\DevBuildController) has been deprecated. It will be replaced with a new `SilverStripe\Dev\Command\DbBuild` class. +- [`DevConfigController`](api:SilverStripe\Dev\DevConfigController) has been deprecated. It will be replaced with a new `SilverStripe\Dev\Command\ConfigDump` class. +- [`DatabaseAdmin`](api:SilverStripe\ORM\DatabaseAdmin) has been deprecated. It will be replaced with a new `SilverStripe\Dev\Command\DbBuild` class. +- [`DevelopmentAdmin::buildDefaults()`](api:SilverStripe\Dev\DevelopmentAdmin::buildDefaults()) has been deprecated. It will be replaced with a new `SilverStripe\Dev\Command\DbDefaults` class. +- [`DevelopmentAdmin::generatesecuretoken()`](api:SilverStripe\Dev\DevelopmentAdmin::generatesecuretoken()) has been deprecated. It will be replaced with a new `SilverStripe\Dev\Command\GenerateSecureToken` class. +- [`DevelopmentAdmin::getRegisteredController()`](api:SilverStripe\Dev\DevelopmentAdmin::getRegisteredController()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`DevelopmentAdmin.registered_controllers`](api:SilverStripe\Dev\DevelopmentAdmin->registered_controllers) has been deprecated. It will be replaced with new `controllers` and `commands` configuration properties. +- [`CleanupTestDatabasesTask::canView()`](api:SilverStripe\Dev\Tasks\CleanupTestDatabasesTask::canView()) has been deprecated. It will be replaced with a new `canRunInBrowser()` method. +- [`HTTPOutputHandler`](api:SilverStripe\Logging\HTTPOutputHandler) has been deprecated. It will be renamed to `SilverStripe\Logging\ErrorOutputHandler` +- [`Build`](api:SilverStripe\GraphQL\Dev\Build) has been deprecated. It will be replaced with a new `SilverStripe\GraphQL\Dev\SchemaBuild` class. +- [`DevelopmentAdmin`](api:SilverStripe\GraphQL\Dev\DevelopmentAdmin) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`DevBuildExtension`](api:SilverStripe\GraphQL\Extensions\DevBuildExtension) has been deprecated. It will be renamed to `SilverStripe\GraphQL\Extensions\DbBuildExtension` +- [`LDAPGroupSyncTask::log()`](api:SilverStripe\LDAP\Tasks\LDAPGroupSyncTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`LDAPMemberSyncTask::log()`](api:SilverStripe\LDAP\Tasks\LDAPMemberSyncTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`LDAPMigrateExistingMembersTask::log()`](api:SilverStripe\LDAP\Tasks\LDAPMigrateExistingMembersTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SubsiteCopyPagesTask::log()`](api:SilverStripe\Subsites\Tasks\SubsiteCopyPagesTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CheckExternalLinksTask::log()`](api:SilverStripe\ExternalLinks\Tasks\CheckExternalLinksTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CheckExternalLinksTask::setSilent()`](api:SilverStripe\ExternalLinks\Tasks\CheckExternalLinksTask::setSilent()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CheckExternalLinksTask->silent`](api:SilverStripe\ExternalLinks\Tasks\CheckExternalLinksTask->silent) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`RealMeSetupTask::message()`](api:SilverStripe\RealMe\Task\RealMeSetupTask::message()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`StaticCacheFullBuildTask::log()`](api:SilverStripe\StaticPublishQueue\Task\StaticCacheFullBuildTask::log()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ContentReviewOwnerMigrationTask`](api:SilverStripe\ContentReview\Tasks\ContentReviewOwnerMigrationTask) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CronTaskController`](api:SilverStripe\CronTask\Controllers\CronTaskController) has been deprecated. It will be replaced with a new `SilverStripe\CronTask\Cli\CronTaskCommand` class. +- [`Clear`](api:SilverStripe\GraphQLDevTools\Clear) has been deprecated. It will be replaced with a new `SilverStripe\GraphQLDevTools\SchemaClear` class. +- [`ConvertTranslatableTask`](api:TractorCow\Fluent\Task\ConvertTranslatableTask) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`Exception`](api:TractorCow\Fluent\Task\ConvertTranslatableTask\Exception) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`UpdatePackageInfoTask->supportedAddonsLoader`](api:BringYourOwnIdeas\Maintenance\Tasks\UpdatePackageInfoTask->supportedAddonsLoader) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`UpdatePackageInfoTask::getSupportedAddonsLoader()`](api:BringYourOwnIdeas\Maintenance\Tasks\UpdatePackageInfoTask::getSupportedAddonsLoader()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`UpdatePackageInfoTask::setSupportedAddonsLoader()`](api:BringYourOwnIdeas\Maintenance\Tasks\UpdatePackageInfoTask::setSupportedAddonsLoader()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ProcessJobQueueChildTask`](api:Symbiote\QueuedJobs\Tasks\ProcessJobQueueChildTask) has been deprecated. It will be replaced with a new `Symbiote\QueuedJobs\Cli\ProcessJobQueueChildCommand` class. +- [`ProcessJobQueueTask::getQueue()`](api:Symbiote\QueuedJobs\Tasks\ProcessJobQueueTask::getQueue()) has been deprecated. Use [`AbstractQueuedJob::getQueue()`](api:Symbiote\QueuedJobs\Services\AbstractQueuedJob::getQueue()) instead. +- [`HTTPOutputHandler::isCli()`](api:SilverStripe\Logging\HTTPOutputHandler::isCli()) has been deprecated. Use [`Director::is_cli()`](api:SilverStripe\Control\Director::is_cli()) instead instead. +- [`PasswordValidator`](api:SilverStripe\Security\PasswordValidator) has been deprecated. It will be renamed to `SilverStripe\Security\Validation\RulesPasswordValidator`. +- [`ContentReviewEmails::isValidEmail()`](api:SilverStripe\ContentReview\Tasks\ContentReviewEmails::isValidEmail()) has been deprecated. Use [`Email::is_valid_address()`](api:SilverStripe\Control\Email\Email::is_valid_address()) instead. +- The [`DBField.defaultVal`](api:SilverStripe\ORM\FieldType\DBField->defaultVal) property has been deprecated. Use [`DBField::getDefaultValue()`](api:SilverStripe\ORM\FieldType\DBField::getDefaultValue()) and [`DBField::setDefaultValue()`](api:SilverStripe\ORM\FieldType\DBField::setDefaultValue()) instead. +- [`DBFile::validate()`](api:SilverStripe\Assets\Storage\DBFile::validate()) has been deprecated. Use [`DBFile::validateFilename()`](api:SilverStripe\Assets\Storage\DBFile::validateFilename()) instead. +- [`ContentController::Menu()`](api:SilverStripe\CMS\Controllers\ContentController::Menu()) has been deprecated. Use [`ContentController::getMenu()`](api:SilverStripe\CMS\Controllers\ContentController::getMenu()) instead if calling the method in PHP. You can continue to use `$Menu` in templates, including passing arguments to it. +- [`GridFieldDataColumns::getValueFromRelation()`](api:SilverStripe\Forms\GridField\GridFieldDataColumns::getValueFromRelation()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ViewableData::castingClass()`](api:SilverStripe\View\ViewableData::castingClass()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ViewableData::escapeTypeForField()`](api:SilverStripe\View\ViewableData::escapeTypeForField()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ViewableData::objCacheName()`](api:SilverStripe\View\ViewableData::objCacheName()) has been deprecated. It will be made private. The corresponding [`ViewableData::objCacheSet()`](api:SilverStripe\View\ViewableData::objCacheSet()) and [`ViewableData::objCacheGet()`](api:SilverStripe\View\ViewableData::objCacheGet()) methods will change method signature to not require passing in the cache key. +- The `$cacheName` parameter for the [`ViewableData::obj()`](api:SilverStripe\View\ViewableData::obj()) method has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ViewableData::cachedCall()`](api:SilverStripe\View\ViewableData::cachedCall()) has been deprecated. Use [`ViewableData::obj()`](api:SilverStripe\View\ViewableData::obj()) instead. +- [`ViewableData::XML_val()`](api:SilverStripe\View\ViewableData::XML_val()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ViewableData::getXMLValues()`](api:SilverStripe\View\ViewableData::getXMLValues()) has been deprecated. It will be removed without equivalent functionality to replace it. +- The `$parser` parameter for the [`SSViewer::__construct()`](api:SilverStripe\View\SSViewer::__construct()) method has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::flush()`](api:SilverStripe\View\SSViewer::flush()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::flush()`. +- [`SSViewer::fromString()`](api:SilverStripe\View\SSViewer::fromString()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::renderString()`. +- [`SSViewer::topLevel()`](api:SilverStripe\View\SSViewer::topLevel()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::chooseTemplate()`](api:SilverStripe\View\SSViewer::chooseTemplate()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::setTemplate()`](api:SilverStripe\View\SSViewer::setTemplate()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::setTemplate()`. +- [`SSViewer::setParser()`](api:SilverStripe\View\SSViewer::setParser()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::setParser()`. +- [`SSViewer::getParser()`](api:SilverStripe\View\SSViewer::getParser()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::getParser()`. +- [`SSViewer::hasTemplate()`](api:SilverStripe\View\SSViewer::hasTemplate()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::hasTemplate()`. +- [`SSViewer::exists()`](api:SilverStripe\View\SSViewer::exists()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::getTemplateFileByType()`](api:SilverStripe\View\SSViewer::getTemplateFileByType()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::flush_template_cache()`](api:SilverStripe\View\SSViewer::flush_template_cache()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::flushTemplateCache()`. +- [`SSViewer::flush_cacheblock_cache()`](api:SilverStripe\View\SSViewer::flush_cacheblock_cache()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::flushCacheBlockCache()`. +- [`SSViewer::setPartialCacheStore()`](api:SilverStripe\View\SSViewer::setPartialCacheStore()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::setPartialCacheStore()`. +- [`SSViewer::getPartialCacheStore()`](api:SilverStripe\View\SSViewer::getPartialCacheStore()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::getPartialCacheStore()`. +- [`SSViewer::includeGeneratedTemplate()`](api:SilverStripe\View\SSViewer::includeGeneratedTemplate()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::includeGeneratedTemplate()`. +- The `$inheritedScope` parameter for the [SSViewer::process()](api:SilverStripe\View\SSViewer::process()) method has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::getSubtemplateFor()`](api:SilverStripe\View\SSViewer::getSubtemplateFor()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::getSubtemplateFor()`. +- [`SSViewer::parseTemplateContent()`](api:SilverStripe\View\SSViewer::parseTemplateContent()) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::parseTemplateContent()`. +- [`SSViewer::templates()`](api:SilverStripe\View\SSViewer::templates()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::setTemplateFile()`](api:SilverStripe\View\SSViewer::setTemplateFile()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::get_base_tag()`](api:SilverStripe\View\SSViewer::get_base_tag()) has been deprecated. Use [`SSViewer::getBaseTag()`](api:SilverStripe\View\SSViewer::getBaseTag()) instead. +- [`SSViewer_DataPresenter`](api:SilverStripe\View\SSViewer_DataPresenter) has been deprecated. It will be merged into [`SSViewer_Scope`](api:SilverStripe\TemplateEngine\ScopeManager). +- [`SSViewer_FromString`](api:SilverStripe\View\SSViewer_FromString) has been deprecated. It will be replaced with `SilverStripe\TemplateEngine\SSTemplateEngine::renderString()`. +- [`SSViewer_Scope::getItem()`](api:SilverStripe\View\SSViewer_Scope::getItem()) has been deprecated. Use [`SSViewer_Scope::getCurrentItem()`](api:SilverStripe\View\SSViewer_Scope::getCurrentItem()) instead. +- [`SSViewer_Scope::obj()`](api:SilverStripe\View\SSViewer_Scope::obj()) has been deprecated. It will be renamed to `scopeToIntermediateValue()`. +- [`SSViewer_Scope`](api:SilverStripe\View\SSViewer_Scope) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\ScopeManager`. +- [`SSViewer::execute_template()`](api:SilverStripe\View\SSViewer::execute_template()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`SSViewer::execute_string()`](api:SilverStripe\View\SSViewer::execute_string()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ThemeResourceLoader::findTemplate()`](api:SilverStripe\View\ThemeResourceLoader::findTemplate()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`FlushMiddleware`](api:SilverStripe\Control\Middleware\FlushMiddleware) has been deprecated. It will be replaced with flushing inside the Kernel directly. +- The [`LeftAndMain.tree_class`](api:SilverStripe\Admin\LeftAndMain->tree_class) configuration property has been deprecated. It will be renamed to `model_class`. +- [`SiteConfigLeftAndMain::save_siteconfig()`](api:SilverStripe\SiteConfig\SiteConfigLeftAndMain::save_siteconfig()) has been deprecated. It will be replaced with [`save()`](api:SilverStripe\Admin\LeftAndMain::save()). +- [`SSViewer_BasicIteratorSupport`](api:SilverStripe\View\SSViewer_BasicIteratorSupport) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\BasicIteratorSupport`. +- [`SSTemplateParseException`](api:SilverStripe\View\SSTemplateParseException) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\Exception\SSTemplateParseException`. +- [`SSTemplateParser`](api:SilverStripe\View\SSTemplateParser) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\SSTemplateParser`. +- [`TemplateIteratorProvider`](api:SilverStripe\View\TemplateIteratorProvider) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\TemplateIteratorProvider`. +- [`TemplateParser`](api:SilverStripe\View\TemplateParser) has been deprecated. It will be renamed to `SilverStripe\TemplateEngine\TemplateParser`. +- [`ElementalAreaController::removeNamespacesFromFields()`](api:DNADesign\Elemental\Controllers\ElementalAreaController::removeNamespacesFromFields()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`BaseElement::updateFromFormData()`](api:DNADesign\Elemental\Models\BaseElement::updateFromFormData()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`DBEnum::flushCache()`](api:SilverStripe\ORM\FieldType\DBEnum::flushCache()) has been deprecated. Use [`DBEnum::reset()`](api:SilverStripe\ORM\FieldType\DBEnum::reset()) instead. +- The [`BaseElement.description`](api:DNADesign\Elemental\Models\BaseElement->description) configuration property has been deprecated. Use [`DataObject.class_description`](api:SilverStripe\ORM\DataObject->class_description) instead. +- The [`SiteTree.description`](api:SilverStripe\CMS\Model\SiteTree->description) configuration property has been deprecated. Use [`DataObject.class_description`](api:SilverStripe\ORM\DataObject->class_description) instead. +- [`FormField::extendValidationResult()`](api:SilverStripe\Forms\FormField::extendValidationResult()) has been deprecated. Use `extend()` directly instead. +- [`SubsiteXHRController::canAccess()`](api:SilverStripe\Subsites\Controller\SubsiteXHRController::canAccess()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`LeftAndMainSubsites::ListSubsites()`](api:SilverStripe\Subsites\Extensions\LeftAndMainSubsites::ListSubsites()) has been deprecated. Use [`SubsiteSwitchList()`](api:SilverStripe\Subsites\Extensions\LeftAndMainSubsites::SubsiteSwitchList()) instead. +- [`LeftAndMain::methodSchema()`](api:SilverStripe\Admin\LeftAndMain::methodSchema()) has been deprecated. It will be replaced with `SilverStripe\Admin\FormSchemaController::schema()`. +- [`LeftAndMain::Modals()`](api:SilverStripe\Admin\LeftAndMain::Modals()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ModalController::getController()`](api:SilverStripe\Admin\ModalController::getController()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ModalController::getName()`](api:SilverStripe\Admin\ModalController::getName()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CampaignAdminExtension`](api:SilverStripe\AssetAdmin\Extensions\CampaignAdminExtension) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CMSPageEditController::addtocampaign()`](api:SilverStripe\CMS\Controllers\CMSPageEditController::addtocampaign()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CMSPageEditController::AddToCampaignForm()`](api:SilverStripe\CMS\Controllers\CMSPageEditController::AddToCampaignForm()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CMSPageEditController::getAddToCampaignForm()`](api:SilverStripe\CMS\Controllers\CMSPageEditController::getAddToCampaignForm()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`AssetAdmin::addtocampaign()`](api:SilverStripe\AssetAdmin\Controller\AssetAdmin::addtocampaign()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`AssetAdmin::AddToCampaignForm()`](api:SilverStripe\AssetAdmin\Controller\AssetAdmin::AddToCampaignForm()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`AssetAdmin::getAddToCampaignForm()`](api:SilverStripe\AssetAdmin\Controller\AssetAdmin::getAddToCampaignForm()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`ModalController::EditorExternalLink()`](api:SilverStripe\Admin\ModalController::EditorExternalLink()) has been deprecated. It will be replaced with `SilverStripe\Admin\ModalController::linkModalForm()`. +- [`ModalController::EditorEmailLink()`](api:SilverStripe\Admin\ModalController::EditorEmailLink()) has been deprecated. It will be replaced with `SilverStripe\Admin\ModalController::linkModalForm()`. +- [`RemoteFileModalExtension::getRequest()`](api:SilverStripe\AssetAdmin\Extensions\RemoteFileModalExtension::getRequest()) has been deprecated. Use `RemoteFileModalExtension::getOwner()->getRequest()` instead. +- [`RemoteFileModalExtension::getFormSchema()`](api:SilverStripe\AssetAdmin\Extensions\RemoteFileModalExtension::getFormSchema()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`RemoteFileModalExtension::getSchemaResponse()`](api:SilverStripe\AssetAdmin\Extensions\RemoteFileModalExtension::getSchemaResponse()) has been deprecated. It will be replaced with `RemoteFileModalExtension::getOwner()->getSchemaResponse()`. +- [`InternalLinkModalExtension`](api:SilverStripe\CMS\Forms\InternalLinkModalExtension) has been deprecated. It will be replaced with configuration on [`ModalController`](api:SilverStripe\Admin\ModalController). +- [`FormField::validate()`](api:SilverStripe\Forms\FormField::validate()) will take zero arguments and return a ValidationResult object instead of a boolean in CMS 6.0.0. +- [`FieldsValidator`](api:SilverStripe\Forms\FieldsValidator) has been deprecated. It will be replaced with functionality inside [`Form::validate()`](api:Silverstripe\Forms\Form::validate()). +- [`Validator`](api:SilverStripe\Forms\Validator) has been deprecated. It will be renamed to `SilverStripe\Forms\Validation\Validator`. +- [`RequiredFields`](api:SilverStripe\Forms\RequiredFields) has been deprecated. It will be renamed to `SilverStripe\Forms\Validation\RequiredFieldsValidator`. +- [`CompositeValidator`](api:SilverStripe\Forms\CompositeValidator) has been deprecated. It will be renamed to `SilverStripe\Forms\Validation\CompositeValidator`. +- [`UserFormsRequiredFields`](api:SilverStripe\UserForms\Form\UserFormsRequiredFields) has been deprecated. It will be renamed to `SilverStripe\UserForms\Form\UserFormsRequiredFieldsValidator`. +- [`AWRequiredFields`](api:Symbiote\AdvancedWorkflow\Forms\AWRequiredFields) has been deprecated. It will be renamed to `Symbiote\AdvancedWorkflow\Forms\AWRequiredFieldsValidator`. +- [`CMSPreviewable::CMSEditLink()`](api:SilverStripe\ORM\CMSPreviewable::CMSEditLink()) has been deprecated. It will be renamed to `getCMSEditLink()`. +- [`CMSEditLinkExtension::CMSEditLink()`](api:SilverStripe\Admin\CMSEditLinkExtension::CMSEditLink()) has been deprecated. It will be replaced with `SilverStripe\ORM\DataObject::getCMSEditLink()` and `updateCMSEditLink()`. +- [`LeftAndMain::currentPageID()`](api:SilverStripe\Admin\LeftAndMain::currentPageID()) has been deprecated. Use [`LeftAndMain::currentRecordID()`](api:SilverStripe\Admin\LeftAndMain::currentRecordID()) instead. +- [`LeftAndMain::setCurrentPageID()`](api:SilverStripe\Admin\LeftAndMain::setCurrentPageID()) has been deprecated. Use [`LeftAndMain::setCurrentRecordID()`](api:SilverStripe\Admin\LeftAndMain::setCurrentRecordID()) instead. +- [`LeftAndMain::currentPage()`](api:SilverStripe\Admin\LeftAndMain::currentPage()) has been deprecated. Use [`LeftAndMain::currentRecord()`](api:SilverStripe\Admin\LeftAndMain::currentRecord()) instead. +- [`LeftAndMain::isCurrentPage()`](api:SilverStripe\Admin\LeftAndMain::isCurrentPage()) has been deprecated. Use [`LeftAndMain::isCurrentRecord()`](api:SilverStripe\Admin\LeftAndMain::isCurrentRecord()) instead. +- [`LeftAndMain_SearchFilter::isPageIncluded()`](api:SilverStripe\Admin\LeftAndMain_SearchFilter::isPageIncluded()) has been deprecated. It will be renamed to `isRecordIncluded()`. +- [`LeftAndMain_SearchFilter::getPageClasses()`](api:SilverStripe\Admin\LeftAndMain_SearchFilter::getPageClasses()) has been deprecated. It will be renamed to `getRecordClasses()`. +- The [`SiteTree.need_permission`](api:SilverStripe\CMS\Model\SiteTree->need_permission) configuration property has been deprecated. Use [`SiteTree::canCreate()`](api:SilverStripe\CMS\Model\SiteTree::canCreate()) instead. +- The [`SiteTree.icon`](api:SilverStripe\CMS\Model\SiteTree->icon) configuration property has been deprecated. It will be renamed to `cms_icon`. +- The [`SiteTree.icon_class`](api:SilverStripe\CMS\Model\SiteTree->icon_class) configuration property has been deprecated. It will be renamed to `cms_icon_class`. This applies to all subclasses of `SiteTree` as well. +- [`CMSMain::PageList()`](api:SilverStripe\CMS\Controllers\CMSMain::PageList()) has been deprecated. It will be renamed to `RecordList()`. +- [`CMSMain::PageListSidebar()`](api:SilverStripe\CMS\Controllers\CMSMain::PageListSidebar()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`CMSMain::LinkPages()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPages()) has been deprecated. Use [`CMSMain::LinkRecords()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecords()) instead. +- [`CMSMain::LinkPagesWithSearch()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPagesWithSearch()) has been deprecated. Use [`CMSMain::LinkRecordsWithSearch()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecordsWithSearch()) instead. +- [`CMSMain::LinkPageEdit()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPageEdit()) has been deprecated. Use [`CMSMain::LinkRecordEdit()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecordEdit()) instead. +- [`CMSMain::LinkPageSettings()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPageSettings()) has been deprecated. Use [`CMSMain::LinkRecordSettings()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecordSettings()) instead. +- [`CMSMain::LinkPageHistory()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPageHistory()) has been deprecated. Use [`CMSMain::LinkRecordHistory()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecordHistory()) instead. +- [`CMSMain::LinkPageAdd()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPageAdd()) has been deprecated. Use [`CMSMain::LinkRecordAdd()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkRecordAdd()) instead. +- [`CMSMain::LinkPreview()`](api:SilverStripe\CMS\Controllers\CMSMain::LinkPreview()) has been deprecated. Use [`SiteTree::CMSEditLink()`](api:SilverStripe\CMS\Model\SiteTree::CMSEditLink()) instead. +- [`CMSMain::SiteTreeAsUL()`](api:SilverStripe\CMS\Controllers\CMSMain::SiteTreeAsUL()) has been deprecated. Use [`CMSMain::TreeAsUL()`](api:SilverStripe\CMS\Controllers\CMSMain::TreeAsUL()) instead. +- [`CMSMain::getSiteTreeFor()`](api:SilverStripe\CMS\Controllers\CMSMain::getSiteTreeFor()) has been deprecated. Use [`CMSMain::getTreeFor()`](api:SilverStripe\CMS\Controllers\CMSMain::getTreeFor()) instead. +- [`CMSMain::CanOrganiseSitetree()`](api:SilverStripe\CMS\Controllers\CMSMain::CanOrganiseSitetree()) has been deprecated. Use [`CMSMain::canOrganiseTree()`](api:SilverStripe\CMS\Controllers\CMSMain::canOrganiseTree()) instead. +- [`CMSMain::getSearchContext()`](api:SilverStripe\CMS\Controllers\CMSMain::getSearchContext()) has been deprecated. It will be replaced with [`SiteTree::getDefaultSearchContext()`](api:SilverStripe\CMS\Model\SiteTree::getDefaultSearchContext()). +- [`CMSMain::getPageTypes()`](api:SilverStripe\CMS\Controllers\CMSMain::getPageTypes()) has been deprecated. Use [`CMSMain::getRecordTypes()`](api:SilverStripe\CMS\Controllers\CMSMain::getRecordTypes()) instead. +- [`CMSMain::PageTypes()`](api:SilverStripe\CMS\Controllers\CMSMain::PageTypes()) has been deprecated. Use [`CMSMain::RecordTypes()`](api:SilverStripe\CMS\Controllers\CMSMain::RecordTypes()) instead. +- [`CMSMain::SiteTreeHints()`](api:SilverStripe\CMS\Controllers\CMSMain::SiteTreeHints()) has been deprecated. Use [`CMSMain::TreeHints()`](api:SilverStripe\CMS\Controllers\CMSMain::TreeHints()) instead. +- [`CMSMain::performPublish()`](api:SilverStripe\CMS\Controllers\CMSMain::performPublish()) has been deprecated. Use [`RecursivePublishable::publishRecursive()`](api:SilverStripe\Versioned\RecursivePublishable::publishRecursive()) instead. +- [`CMSPageAddController`](api:SilverStripe\CMS\Controllers\CMSPageAddController) has been deprecated. It will be replaced with `SilverStripe\CMS\Forms\CMSMainAddForm`. +- [`CMSPagesController`](api:SilverStripe\CMS\Controllers\CMSPagesController) has been deprecated. It will be combined back into [`CMSMain`](api:SilverStripe\CMS\Controllers\CMSMain). +- [`CMSSiteTreeFilter::getPageClasses()`](api:SilverStripe\CMS\Controllers\CMSSiteTreeFilter::getPageClasses()) has been deprecated. It will be renamed to `getRecordClasses()`. +- [`CMSSiteTreeFilter::isPageIncluded()`](api:SilverStripe\CMS\Controllers\CMSSiteTreeFilter::isPageIncluded()) has been deprecated. It will be renamed to `isRecordIncluded()`. +- [`LeftAndMainPageIconsExtension`](api:SilverStripe\CMS\Controllers\LeftAndMainPageIconsExtension) has been deprecated. It will be renamed to `SilverStripe\CMS\Controllers\LeftAndMainRecordIconsExtension`. +- [`LeftAndMainPageIconsExtension::generatePageIconsCss()`](api:SilverStripe\CMS\Controllers\LeftAndMainPageIconsExtension::generatePageIconsCss()) has been deprecated. Use [`LeftAndMainPageIconsExtension::generateRecordIconsCss()`](api:SilverStripe\CMS\Controllers\LeftAndMainPageIconsExtension::generateRecordIconsCss()) instead. +- [`CurrentPageIdentifier`](api:SilverStripe\CMS\Model\CurrentPageIdentifier) has been deprecated. It will be renamed to `SilverStripe\CMS\Model\CurrentRecordIdentifier`. +- [`CurrentPageIdentifier::currentPageID()`](api:SilverStripe\CMS\Model\CurrentPageIdentifier::currentPageID()) has been deprecated. It will be renamed to `currentRecordID()`. +- [`CurrentPageIdentifier::isCurrentPage()`](api:SilverStripe\CMS\Model\CurrentPageIdentifier::isCurrentPage()) has been deprecated. It will be renamed to `isCurrentRecord()`. +- [`SiteTree::page_type_classes()`](api:SilverStripe\CMS\Model\SiteTree::page_type_classes()) has been deprecated. Will be replaced with `updateAllowedSubClasses()`. +- [`SiteTree::setCreatableChildrenCache()`](api:SilverStripe\CMS\Model\SiteTree::setCreatableChildrenCache()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::setCreatableChildrenCache()`. +- [`SiteTree::getCreatableChildrenCache()`](api:SilverStripe\CMS\Model\SiteTree::getCreatableChildrenCache()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::getCreatableChildrenCache()`. +- [`SiteTree::getPermissionChecker()`](api:SilverStripe\CMS\Model\SiteTree::getPermissionChecker()) has been deprecated. It will be replaced with a non-static method of the same name. +- [`SiteTree::flushMemberCache()`](api:SilverStripe\CMS\Model\SiteTree::flushMemberCache()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::clearCache()`. +- [`SiteTree::creatableChildPages()`](api:SilverStripe\CMS\Model\SiteTree::creatableChildPages()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::getCreatableSubClasses()`. +- [`SiteTree::getIconClass()`](api:SilverStripe\CMS\Model\SiteTree::getIconClass()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::getRecordIconCssClass()`. +- [`SiteTree::getPageIconURL()`](api:SilverStripe\CMS\Model\SiteTree::getPageIconURL()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::getRecordIconUrl()`. +- [`SiteTree::generateChildrenCacheKey()`](api:SilverStripe\CMS\Model\SiteTree::generateChildrenCacheKey()) has been deprecated. It will be replaced with `SilverStripe\CMS\Controllers\CMSMain::generateChildrenCacheKey()`. +- [`Form::validationResult()`](api:SilverStripe\Forms\Form::validationResult()) has been deprecated. Use [`Form::validate()`](api:SilverStripe\Forms\Form::validate()) instead. +- [`Director::get_session_environment_type()`](api:SilverStripe\Control\Director::get_session_environment_type()) has been deprecated. Use [`Director::get_environment_type()`](api:SilverStripe\Control\Director::get_environment_type()) instead. +- Use of the `CUSTOM_INCLUDE_PATH` constant to change the PHP include path has been deprecated and will not work in a future major release. +- [`SessionEnvTypeSwitcher`](api:SilverStripe\Control\Middleware\URLSpecialsMiddleware\SessionEnvTypeSwitcher) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`VersionProvider::getComposerLockPath()`](api:SilverStripe\Core\Manifest\VersionProvider::getComposerLockPath()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`FlushInvalidatedResource::getResource()`](api:SilverStripe\i18n\Messages\Symfony\FlushInvalidatedResource::getResource()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`Subsite::getMembersByPermission()`](api:SilverStripe\Subsites\Model\Subsite::getMembersByPermission()) has been deprecated. It will be removed without equivalent functionality to replace it. +- The `$join` parameter for the [`Subsite::get_from_all_subsites()`](api:SilverStripe\Subsites\Model\Subsite::get_from_all_subsites()) method has been deprecated. Use [leftJoin($table, $joinClause)](api:SilverStripe\ORM\DataList::leftJoin()) instead. +- Passing a boolean value to the `$mergeStrategy` argument in [`Form::loadDataFrom()`](api:Silverstripe\Forms\Form::loadDataFrom()) has been deprecated. Pass [`Form::MERGE_CLEAR_MISSING`](api:Silverstripe\Forms\Form::MERGE_CLEAR_MISSING) instead of `true` and `0` instead of `false`. +- The [`HTTP.ignoreDeprecatedCaching`](api:SilverStripe\Control\HTTP->ignoreDeprecatedCaching) configuration property has been deprecated. It will be removed without equivalent functionality to replace it. +- [`FormField::Value()`](api:SilverStripe\Forms\FormField::Value()) has been deprecated. It will be replaced by getFormattedValue() and getValue(). +- [`TextareaField::ValueEntities()`](api:SilverStripe\Forms\TextareaField::ValueEntities()) has been deprecated. It will be replaced by getFormattedValueEntities(). +- Passing `null` for the `$code` parameter in [`ValidationResult::addError()`](api:SilverStripe\ORM\ValidationResult::addError()) is deprecated. Pass a blank string instead. +- Passing `null` for the `$cast` parameter in [`ValidationResult::addError()`](api:SilverStripe\ORM\ValidationResult::addError()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$code` parameter in [`ValidationResult::addFieldError()`](api:SilverStripe\ORM\ValidationResult::addFieldError()) is deprecated. Pass a blank string instead. +- Passing `null` for the `$cast` parameter in [`ValidationResult::addFieldError()`](api:SilverStripe\ORM\ValidationResult::addFieldError()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$code` parameter in [`ValidationResult::addMessage()`](api:SilverStripe\ORM\ValidationResult::addMessage()) is deprecated. Pass a blank string instead. +- Passing `null` for the `$cast` parameter in [`ValidationResult::addMessage()`](api:SilverStripe\ORM\ValidationResult::addMessage()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$code` parameter in [`ValidationResult::addFieldMessage()`](api:SilverStripe\ORM\ValidationResult::addFieldMessage()) is deprecated. Pass a blank string instead. +- Passing `null` for the `$cast` parameter in [`ValidationResult::addFieldMessage()`](api:SilverStripe\ORM\ValidationResult::addFieldMessage()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$cast` parameter in [`Form::sessionMessage()`](api:SilverStripe\Forms\Form::sessionMessage()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$cast` parameter in [`Form::sessionError()`](api:SilverStripe\Forms\Form::sessionError()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- Passing `null` for the `$cast` parameter in [`Form::sessionFieldError()`](api:SilverStripe\Forms\Form::sessionFieldError()) is deprecated. Pass a ValidationResult::CAST_* constant instead. +- [`DBInt::Times()`](api:SilverStripe\ORM\FieldType\DBInt::Times()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`Controller::has_curr()`](api:SilverStripe\Control\Controller::has_curr()) has been deprecated. It will be removed without equivalent functionality to replace it. +- [`UserFormsColumnCleanTask`](api:SilverStripe\UserForms\Task\UserFormsColumnCleanTask) has been deprecated. It will be removed without equivalent functionality to replace it. + +## Bug fixes + +This release includes a number of bug fixes to improve a broad range of areas. Check the change logs for full details of these fixes split by module. Thank you to the community members that helped contribute these fixes as part of the release! + +### Change to error logging + +Some errors were incorrectly being logged using the error handler service, which resulted in displaying the error in the browser and CLI and, in live mode, not displaying the rest of the response to users. + +This was the result of a misunderstanding about the difference between the `Psr\Log\LoggerInterface.errorhandler` error handler service and the `Psr\Log\LoggerInterface` logging service. + +The `Psr\Log\LoggerInterface.errorhandler` error handler service should *not* be used for logging - its purpose is to handle the display of uncaught exceptions and PHP errors. + +Errors that were being logged to the error handler service are now being logged using the logging service instead. If you have connected a logging handler to that service, we recommend instead following the instructions in [configuring error logging](/developer_guides/debugging/error_handling/#configuring-error-logging) to attach your logging handler *only* to the logging service, which will also allow you to handle logging for the uncaught exceptions and errors the error handler displays.