From 7a3c711add9d4deed6e5cf08a1769e8e582743fb Mon Sep 17 00:00:00 2001 From: Laura Neto <12862535+lauraneto@users.noreply.github.com> Date: Wed, 24 Sep 2025 12:01:40 +0200 Subject: [PATCH 01/19] Bump @umbraco-cms/backoffice to 16.2.0 in Umbraco.Web.UI.Login --- src/Umbraco.Web.UI.Login/package-lock.json | 12 ++++++------ src/Umbraco.Web.UI.Login/package.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Login/package-lock.json b/src/Umbraco.Web.UI.Login/package-lock.json index 0c752d9313..f15395b3ae 100644 --- a/src/Umbraco.Web.UI.Login/package-lock.json +++ b/src/Umbraco.Web.UI.Login/package-lock.json @@ -7,7 +7,7 @@ "name": "login", "devDependencies": { "@hey-api/openapi-ts": "0.81.1", - "@umbraco-cms/backoffice": "16.2.0-rc", + "@umbraco-cms/backoffice": "16.2.0", "msw": "^2.7.0", "typescript": "^5.9.2", "vite": "^7.1.5" @@ -1622,9 +1622,9 @@ "peer": true }, "node_modules/@umbraco-cms/backoffice": { - "version": "16.2.0-rc", - "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-16.2.0-rc.tgz", - "integrity": "sha512-DAimNYu3ZGy1my0BikVXW0iKxH6nmkUTCA2Lw1wjhHG93T8+KCyHCJSxpXBdLdxmgUdKjp6lWjlqKsZ3wQ6/gQ==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/@umbraco-cms/backoffice/-/backoffice-16.2.0.tgz", + "integrity": "sha512-+B2jrrOz1IT9N1ObSsq/vBOZbuU1cz37/7l8Jedq5C39HKbvRJDt4QvTwHt2E/KgzB2HfU9MRuI7pUfL23OErA==", "dev": true, "license": "MIT", "engines": { @@ -1650,8 +1650,8 @@ "@tiptap/pm": "2.26.1", "@tiptap/starter-kit": "2.26.1", "@types/diff": "^7.0.2", - "@umbraco-ui/uui": "^1.15.0-rc.0", - "@umbraco-ui/uui-css": "^1.15.0-rc.0", + "@umbraco-ui/uui": "^1.15.0", + "@umbraco-ui/uui-css": "^1.15.0", "diff": "^7.0.0", "dompurify": "^3.2.5", "element-internals-polyfill": "^3.0.2", diff --git a/src/Umbraco.Web.UI.Login/package.json b/src/Umbraco.Web.UI.Login/package.json index 684b8b2892..cd6d5d9c19 100644 --- a/src/Umbraco.Web.UI.Login/package.json +++ b/src/Umbraco.Web.UI.Login/package.json @@ -15,7 +15,7 @@ }, "devDependencies": { "@hey-api/openapi-ts": "0.81.1", - "@umbraco-cms/backoffice": "16.2.0-rc", + "@umbraco-cms/backoffice": "16.2.0", "msw": "^2.7.0", "typescript": "^5.9.2", "vite": "^7.1.5" @@ -25,4 +25,4 @@ "public" ] } -} \ No newline at end of file +} From 6714050f4b0b0f909550052db73551858d995b87 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:07:08 +0200 Subject: [PATCH 02/19] Installer: Improves user accessibility by adding missing
elements and setting the right focus (#20265) * fix: adds a element around the consent/telemetry step to ensure proper form handling also adds a submit action so that you can continue with click of ENTER * fix: adds umbFocus to select inputs to allow the user to proceed with tabbing too much around, i.e. they will start within the form --- .../consent/installer-consent.element.ts | 20 ++++++++++++------- .../database/installer-database.element.ts | 4 +++- .../installer/user/installer-user.element.ts | 9 +++++---- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts index e2df224c94..f8ac5ad7fd 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/consent/installer-consent.element.ts @@ -8,7 +8,7 @@ import type { TelemetryResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { TelemetryLevelModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { umbFocus, UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-installer-consent') export class UmbInstallerConsentElement extends UmbLitElement { @@ -54,7 +54,8 @@ export class UmbInstallerConsentElement extends UmbLitElement { this._installerContext?.appendData(value); } - private _onNext() { + private _onNext(evt: SubmitEvent) { + evt.preventDefault(); this._installerContext?.nextStep(); } @@ -75,6 +76,7 @@ export class UmbInstallerConsentElement extends UmbLitElement { return html`

Consent for telemetry data

- ${this._renderSlider()} -
- - -
+ + + ${this._renderSlider()} +
+ + +
+ +
`; } diff --git a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts index 446de24478..428d172940 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/installer/database/installer-database.element.ts @@ -9,7 +9,7 @@ import type { DatabaseSettingsPresentationModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { InstallService } from '@umbraco-cms/backoffice/external/backend-api'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { umbFocus, UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecute, UmbApiError } from '@umbraco-cms/backoffice/resources'; @customElement('umb-installer-database') @@ -238,6 +238,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { Server address Database Name Name From 54b49f90bdb6b0119a4c0f702fee3154dafb5f63 Mon Sep 17 00:00:00 2001 From: Owain Williams Date: Thu, 25 Sep 2025 09:33:53 +0100 Subject: [PATCH 03/19] Update Readme to signpost the Forum (#20268) Update README.md with information about the forum Making a small change to the Readme to signpost the Forum now that it's the place to go for help/questions --- .github/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 63b908daed..195d4f9a36 100644 --- a/.github/README.md +++ b/.github/README.md @@ -40,7 +40,7 @@ Some important documentation links to get you started: ## Get help -If you need a bit of feedback while building your Umbraco projects, we are [chatty on Discord](https://discord.umbraco.com). Our Discord server serves both a social space but also has channels for questions and answers. Feel free to lurk or join in with your own questions. Or just post your daily Wordle score, up to you! +If you need a bit of feedback while building your Umbraco projects, we are [chatty on Discord](https://discord.umbraco.com). Our Discord server serves as a social space for all Umbracians. If you have any questions or need some help with a problem, head over to our [dedicated forum](https://forum.umbraco.com/) where the Umbraco Community will be happy to help. ## Looking to contribute back to Umbraco? @@ -52,3 +52,4 @@ You came to the right place! Our GitHub repository is available for all kinds of Umbraco is contribution-focused and community-driven. If you want to contribute back to the Umbraco source code, please check out our [guide to contributing](CONTRIBUTING.md). ### Tip: You should not run Umbraco from source code found here. Umbraco is extremely extensible and can do whatever you need. Instead, [install Umbraco as noted above](#looking-to-install-umbraco) and then [extend it any way you want to](https://docs.umbraco.com/umbraco-cms/extending/). + From 9e3b27cfdda4e2f73b9276aeb0acb05851fc4f4e Mon Sep 17 00:00:00 2001 From: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:31:05 +0700 Subject: [PATCH 04/19] QA Skip the known failing smoke test to avoid blocking other PRs (#20269) Added skip for the failing smoke test --- .../DataType/BlockGrid/Block/BlockGridBlockAdvanced.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/BlockGrid/Block/BlockGridBlockAdvanced.spec.ts b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/BlockGrid/Block/BlockGridBlockAdvanced.spec.ts index 7803ce7e83..ffa32b7330 100644 --- a/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/BlockGrid/Block/BlockGridBlockAdvanced.spec.ts +++ b/tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/DataType/BlockGrid/Block/BlockGridBlockAdvanced.spec.ts @@ -240,7 +240,9 @@ test('can remove a icon color from a block', async ({umbracoApi, umbracoUi}) => expect(await umbracoApi.dataType.doesBlockEditorBlockContainIconColor(blockGridEditorName, contentElementTypeId, '')).toBeTruthy(); }); -test('can add a thumbnail to a block', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { +// Remove skip when the front-end is ready. Currently it is not possible to add a thumbnail to a block +// Issue link: https://github.com/umbraco/Umbraco-CMS/issues/20264 +test.skip('can add a thumbnail to a block', {tag: '@smoke'}, async ({umbracoApi, umbracoUi}) => { // Arrange const mediaName = 'TestMedia'; await umbracoApi.media.ensureNameNotExists(mediaName); From 149b191cf41aa5a6b457147d7d60125ccadc6c7f Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Thu, 25 Sep 2025 13:54:01 +0200 Subject: [PATCH 05/19] Add slightly more padding at top so user card outline is not cutoff (#20258) --- .../packages/core/components/body-layout/body-layout.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts index 14a5caa954..b87eb42fcd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts @@ -189,7 +189,7 @@ export class UmbBodyLayoutElement extends LitElement { :host([header-transparent]:not([main-no-padding])) #main:not(*[style='display: none'] + *) { /* The following styling is only applied if the clear-header IS present, the main-no-padding attribute is NOT present, and the header is NOT hidden */ - padding-top: var(--uui-size-space-1); + padding-top: var(--uui-size-space-2); } :host([main-no-padding]) #main { padding: 0; From cf10a59a4c23e6c3e2d16c02679d4dcc18beed48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 20:17:25 +0000 Subject: [PATCH 06/19] Bump tar-fs from 3.1.0 to 3.1.1 in /src/Umbraco.Web.UI.Client Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 3.1.0 to 3.1.1. - [Commits](https://github.com/mafintosh/tar-fs/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: tar-fs dependency-version: 3.1.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- src/Umbraco.Web.UI.Client/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 14a2f517ea..b5a6a14241 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -15370,9 +15370,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz", - "integrity": "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", + "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", "dev": true, "license": "MIT", "dependencies": { From 61f1c4abd061817b5a9af9f95fdec57382602e96 Mon Sep 17 00:00:00 2001 From: Andy Butland Date: Thu, 25 Sep 2025 15:13:02 +0200 Subject: [PATCH 07/19] Fixes issue with service registration for file system tree service (#20273) * Display the latest update date in document collection view * Fix issue with service registration of physical file system tree service. * Apply suggestions from code review Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --------- Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .../Tree/PartialViewTreeControllerBase.cs | 8 ++++---- .../Script/Tree/ScriptTreeControllerBase.cs | 8 ++++---- .../Tree/AncestorsStaticFileTreeController.cs | 11 ++++++++++- .../Tree/ChildrenStaticFileTreeController.cs | 13 +++++++++++-- .../Tree/RootStaticFileTreeController.cs | 13 +++++++++++-- .../Tree/StaticFileTreeControllerBase.cs | 18 ++++++++++-------- .../Tree/StylesheetTreeControllerBase.cs | 8 ++++---- .../Tree/FileSystemTreeControllerBase.cs | 17 ++++++++--------- .../TreeBuilderExtensions.cs | 5 ++++- .../UmbracoBuilder.BackOffice.cs | 2 -- .../FileSystem/IFileSystemTreeService.cs | 6 ++---- .../IPhysicalFileSystemTreeService.cs | 5 +++++ .../PhysicalFileSystemTreeService.cs | 13 +++++++++++++ 13 files changed, 86 insertions(+), 41 deletions(-) create mode 100644 src/Umbraco.Cms.Api.Management/Services/FileSystem/IPhysicalFileSystemTreeService.cs create mode 100644 src/Umbraco.Cms.Api.Management/Services/FileSystem/PhysicalFileSystemTreeService.cs diff --git a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Tree/PartialViewTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Tree/PartialViewTreeControllerBase.cs index b45aff4616..6875e395f6 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Tree/PartialViewTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/PartialView/Tree/PartialViewTreeControllerBase.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; @@ -25,7 +25,7 @@ public class PartialViewTreeControllerBase : FileSystemTreeControllerBase // FileSystem is required therefore, we can't remove it without some wizadry. When obsoletion is due, remove this. [ActivatorUtilitiesConstructor] - [Obsolete("Scheduled for removal in Umbraco 19")] + [Obsolete("Scheduled for removal in Umbraco 18.")] public PartialViewTreeControllerBase(IPartialViewTreeService partialViewTreeService, FileSystems fileSystems) : base(partialViewTreeService) { @@ -34,12 +34,12 @@ public class PartialViewTreeControllerBase : FileSystemTreeControllerBase throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); } - [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 19")] + [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 18.")] public PartialViewTreeControllerBase(FileSystems fileSystems) : this(StaticServiceProvider.Instance.GetRequiredService()) => FileSystem = fileSystems.PartialViewsFileSystem ?? throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); - [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 19")] + [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 18.")] protected override IFileSystem FileSystem { get; } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Script/Tree/ScriptTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Script/Tree/ScriptTreeControllerBase.cs index ba302fc920..d79740d845 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Script/Tree/ScriptTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Script/Tree/ScriptTreeControllerBase.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; @@ -25,7 +25,7 @@ public class ScriptTreeControllerBase : FileSystemTreeControllerBase // FileSystem is required therefore, we can't remove it without some wizadry. When obsoletion is due, remove this. [ActivatorUtilitiesConstructor] - [Obsolete("Scheduled for removal in Umbraco 19")] + [Obsolete("Scheduled for removal in Umbraco 18.")] public ScriptTreeControllerBase(IScriptTreeService scriptTreeService, FileSystems fileSystems) : base(scriptTreeService) { @@ -34,12 +34,12 @@ public class ScriptTreeControllerBase : FileSystemTreeControllerBase throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); } - [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 19")] + [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 18.")] public ScriptTreeControllerBase(FileSystems fileSystems) : this(StaticServiceProvider.Instance.GetRequiredService()) => FileSystem = fileSystems.ScriptsFileSystem ?? throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); - [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 19")] + [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 18.")] protected override IFileSystem FileSystem { get; } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/AncestorsStaticFileTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/AncestorsStaticFileTreeController.cs index cba287af2d..83c9e9f371 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/AncestorsStaticFileTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/AncestorsStaticFileTreeController.cs @@ -1,6 +1,8 @@ -using Asp.Versioning; +using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Umbraco.Cms.Api.Management.Services.FileSystem; using Umbraco.Cms.Api.Management.ViewModels.Tree; using Umbraco.Cms.Core.IO; @@ -9,11 +11,18 @@ namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Tree; [ApiVersion("1.0")] public class AncestorsStaticFileTreeController : StaticFileTreeControllerBase { + [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] public AncestorsStaticFileTreeController(IPhysicalFileSystem physicalFileSystem) : base(physicalFileSystem) { } + [ActivatorUtilitiesConstructor] + public AncestorsStaticFileTreeController(IPhysicalFileSystem physicalFileSystem, IPhysicalFileSystemTreeService fileSystemTreeService) + : base(physicalFileSystem, fileSystemTreeService) + { + } + [HttpGet("ancestors")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/ChildrenStaticFileTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/ChildrenStaticFileTreeController.cs index a68780a8e1..b99cd783fe 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/ChildrenStaticFileTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/ChildrenStaticFileTreeController.cs @@ -1,20 +1,29 @@ -using Asp.Versioning; +using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Umbraco.Cms.Core.IO; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; +using Umbraco.Cms.Api.Management.Services.FileSystem; using Umbraco.Cms.Api.Management.ViewModels.Tree; +using Umbraco.Cms.Core.IO; namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Tree; [ApiVersion("1.0")] public class ChildrenStaticFileTreeController : StaticFileTreeControllerBase { + [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] public ChildrenStaticFileTreeController(IPhysicalFileSystem physicalFileSystem) : base(physicalFileSystem) { } + [ActivatorUtilitiesConstructor] + public ChildrenStaticFileTreeController(IPhysicalFileSystem physicalFileSystem, IPhysicalFileSystemTreeService fileSystemTreeService) + : base(physicalFileSystem, fileSystemTreeService) + { + } + [HttpGet("children")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/RootStaticFileTreeController.cs b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/RootStaticFileTreeController.cs index b709aae4ef..bbb7f6c9c4 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/RootStaticFileTreeController.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/RootStaticFileTreeController.cs @@ -1,20 +1,29 @@ -using Asp.Versioning; +using Asp.Versioning; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; -using Umbraco.Cms.Core.IO; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Common.ViewModels.Pagination; +using Umbraco.Cms.Api.Management.Services.FileSystem; using Umbraco.Cms.Api.Management.ViewModels.Tree; +using Umbraco.Cms.Core.IO; namespace Umbraco.Cms.Api.Management.Controllers.StaticFile.Tree; [ApiVersion("1.0")] public class RootStaticFileTreeController : StaticFileTreeControllerBase { + [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] public RootStaticFileTreeController(IPhysicalFileSystem physicalFileSystem) : base(physicalFileSystem) { } + [ActivatorUtilitiesConstructor] + public RootStaticFileTreeController(IPhysicalFileSystem physicalFileSystem, IPhysicalFileSystemTreeService fileSystemTreeService) + : base(physicalFileSystem, fileSystemTreeService) + { + } + [HttpGet("root")] [MapToApiVersion("1.0")] [ProducesResponseType(typeof(PagedViewModel), StatusCodes.Status200OK)] diff --git a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/StaticFileTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/StaticFileTreeControllerBase.cs index 0695f0b0ed..f7f291a663 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/StaticFileTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/StaticFile/Tree/StaticFileTreeControllerBase.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; using Umbraco.Cms.Api.Management.Routing; @@ -17,19 +17,21 @@ public class StaticFileTreeControllerBase : FileSystemTreeControllerBase private readonly IFileSystemTreeService _fileSystemTreeService; private static readonly string[] _allowedRootFolders = { $"{Path.DirectorySeparatorChar}App_Plugins", $"{Path.DirectorySeparatorChar}wwwroot" }; - public StaticFileTreeControllerBase(IPhysicalFileSystem physicalFileSystem, IFileSystemTreeService fileSystemTreeService) + [Obsolete("Please use the constructor taking all parameters. Scheduled for removal in Umbraco 18.")] + public StaticFileTreeControllerBase(IPhysicalFileSystem physicalFileSystem) + : base(StaticServiceProvider.Instance.GetRequiredService()) + { + FileSystem = physicalFileSystem; + _fileSystemTreeService = StaticServiceProvider.Instance.GetRequiredService(); + } + + public StaticFileTreeControllerBase(IPhysicalFileSystem physicalFileSystem, IPhysicalFileSystemTreeService fileSystemTreeService) : base (fileSystemTreeService) { FileSystem = physicalFileSystem; _fileSystemTreeService = fileSystemTreeService; } - [Obsolete("Please use the other constructor. Scheduled for removal in Umbraco 19")] - public StaticFileTreeControllerBase(IPhysicalFileSystem physicalFileSystem) - : this(physicalFileSystem, StaticServiceProvider.Instance.GetRequiredService()) - { - } - protected override IFileSystem FileSystem { get; } protected string[] GetDirectories(string path) => diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Tree/StylesheetTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Tree/StylesheetTreeControllerBase.cs index dd15a02d73..501293f11f 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Tree/StylesheetTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Stylesheet/Tree/StylesheetTreeControllerBase.cs @@ -1,4 +1,4 @@ -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Controllers.Tree; @@ -25,7 +25,7 @@ public class StylesheetTreeControllerBase : FileSystemTreeControllerBase // FileSystem is required therefore, we can't remove it without some wizadry. When obsoletion is due, remove this. [ActivatorUtilitiesConstructor] - [Obsolete("Scheduled for removal in Umbraco 19")] + [Obsolete("Scheduled for removal in Umbraco 18.")] public StylesheetTreeControllerBase(IStyleSheetTreeService styleSheetTreeService, FileSystems fileSystems) : base(styleSheetTreeService) { @@ -34,12 +34,12 @@ public class StylesheetTreeControllerBase : FileSystemTreeControllerBase throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); } - [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 19")] + [Obsolete("Please use the other constructor. Scheduled to be removed in Umbraco 18.")] public StylesheetTreeControllerBase(FileSystems fileSystems) : this(StaticServiceProvider.Instance.GetRequiredService()) => FileSystem = fileSystems.ScriptsFileSystem ?? throw new ArgumentException("Missing scripts file system", nameof(fileSystems)); - [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 19")] + [Obsolete("Included in the service class. Scheduled to be removed in Umbraco 18.")] protected override IFileSystem FileSystem { get; } } diff --git a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FileSystemTreeControllerBase.cs b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FileSystemTreeControllerBase.cs index 933986e2f3..68d1414788 100644 --- a/src/Umbraco.Cms.Api.Management/Controllers/Tree/FileSystemTreeControllerBase.cs +++ b/src/Umbraco.Cms.Api.Management/Controllers/Tree/FileSystemTreeControllerBase.cs @@ -15,19 +15,18 @@ public abstract class FileSystemTreeControllerBase : ManagementApiControllerBase { private readonly IFileSystemTreeService _fileSystemTreeService; - [Obsolete("Has been moved to the individual services. Scheduled to be removed in Umbraco 19")] + [Obsolete("Has been moved to the individual services. Scheduled to be removed in Umbraco 18.")] protected abstract IFileSystem FileSystem { get; } [ActivatorUtilitiesConstructor] protected FileSystemTreeControllerBase(IFileSystemTreeService fileSystemTreeService) => _fileSystemTreeService = fileSystemTreeService; - [Obsolete("Use the other constructor. Scheduled for removal in Umbraco 19")] + [Obsolete("Use the other constructor. Scheduled for removal in Umbraco 18.")] protected FileSystemTreeControllerBase() : this(StaticServiceProvider.Instance.GetRequiredService()) { } - protected Task>> GetRoot(int skip, int take) { FileSystemTreeItemPresentationModel[] viewModels = _fileSystemTreeService.GetPathViewModels(string.Empty, skip, take, out var totalItems); @@ -70,7 +69,7 @@ public abstract class FileSystemTreeControllerBase : ManagementApiControllerBase private PagedViewModel PagedViewModel(IEnumerable viewModels, long totalItems) => new() { Total = totalItems, Items = viewModels }; - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] protected virtual FileSystemTreeItemPresentationModel[] GetAncestorModels(string path, bool includeSelf) { var directories = path.Split(Path.DirectorySeparatorChar).Take(Range.EndAt(Index.FromEnd(1))).ToArray(); @@ -87,28 +86,28 @@ public abstract class FileSystemTreeControllerBase : ManagementApiControllerBase return result.ToArray(); } - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] protected virtual string[] GetDirectories(string path) => FileSystem .GetDirectories(path) .OrderBy(directory => directory) .ToArray(); - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] protected virtual string[] GetFiles(string path) => FileSystem .GetFiles(path) .OrderBy(file => file) .ToArray(); - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] protected virtual bool DirectoryHasChildren(string path) => FileSystem.GetFiles(path).Any() || FileSystem.GetDirectories(path).Any(); - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] private string GetFileSystemItemName(bool isFolder, string itemPath) => isFolder ? Path.GetFileName(itemPath) : FileSystem.GetFileName(itemPath); - [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 19")] + [Obsolete("Has been moved to FileSystemTreeServiceBase. Scheduled for removal in Umbraco 18.")] private FileSystemTreeItemPresentationModel MapViewModel(string path, string name, bool isFolder) { var parentPath = Path.GetDirectoryName(path); diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/TreeBuilderExtensions.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/TreeBuilderExtensions.cs index 733223efa0..a598a3dabd 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/TreeBuilderExtensions.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/TreeBuilderExtensions.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Umbraco.Cms.Api.Management.Services.Entities; using Umbraco.Cms.Api.Management.Services.FileSystem; using Umbraco.Cms.Core.DependencyInjection; @@ -11,10 +11,13 @@ internal static class TreeBuilderExtensions internal static IUmbracoBuilder AddTrees(this IUmbracoBuilder builder) { builder.Services.AddTransient(); + builder.Services.AddUnique(); builder.Services.AddUnique(); builder.Services.AddUnique(); + builder.Services.AddUnique(); + return builder; } } diff --git a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.BackOffice.cs b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.BackOffice.cs index 2b3e4e06e6..b97edf5188 100644 --- a/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.BackOffice.cs +++ b/src/Umbraco.Cms.Api.Management/DependencyInjection/UmbracoBuilder.BackOffice.cs @@ -1,12 +1,10 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Umbraco.Cms.Api.Management.DependencyInjection; -using Umbraco.Cms.Api.Management.Security; using Umbraco.Cms.Core.DependencyInjection; using Umbraco.Cms.Core.Hosting; using Umbraco.Cms.Core.IO; using Umbraco.Cms.Infrastructure.DependencyInjection; -using Umbraco.Cms.Infrastructure.Examine.DependencyInjection; using Umbraco.Cms.Web.Common.Hosting; namespace Umbraco.Extensions; diff --git a/src/Umbraco.Cms.Api.Management/Services/FileSystem/IFileSystemTreeService.cs b/src/Umbraco.Cms.Api.Management/Services/FileSystem/IFileSystemTreeService.cs index cdf96a4910..edcfd84532 100644 --- a/src/Umbraco.Cms.Api.Management/Services/FileSystem/IFileSystemTreeService.cs +++ b/src/Umbraco.Cms.Api.Management/Services/FileSystem/IFileSystemTreeService.cs @@ -1,5 +1,4 @@ -using Umbraco.Cms.Api.Management.ViewModels.Tree; -using Umbraco.Cms.Core.IO; +using Umbraco.Cms.Api.Management.ViewModels.Tree; namespace Umbraco.Cms.Api.Management.Services.FileSystem; @@ -9,8 +8,7 @@ public interface IFileSystemTreeService FileSystemTreeItemPresentationModel[] GetPathViewModels(string path, int skip, int take, out long totalItems); - FileSystemTreeItemPresentationModel[] GetSiblingsViewModels(string path, int before, int after, out long totalBefore, - out long totalAfter); + FileSystemTreeItemPresentationModel[] GetSiblingsViewModels(string path, int before, int after, out long totalBefore, out long totalAfter); string[] GetDirectories(string path); diff --git a/src/Umbraco.Cms.Api.Management/Services/FileSystem/IPhysicalFileSystemTreeService.cs b/src/Umbraco.Cms.Api.Management/Services/FileSystem/IPhysicalFileSystemTreeService.cs new file mode 100644 index 0000000000..77977fbcd6 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Services/FileSystem/IPhysicalFileSystemTreeService.cs @@ -0,0 +1,5 @@ +namespace Umbraco.Cms.Api.Management.Services.FileSystem; + +public interface IPhysicalFileSystemTreeService : IFileSystemTreeService +{ +} diff --git a/src/Umbraco.Cms.Api.Management/Services/FileSystem/PhysicalFileSystemTreeService.cs b/src/Umbraco.Cms.Api.Management/Services/FileSystem/PhysicalFileSystemTreeService.cs new file mode 100644 index 0000000000..3ee03e4927 --- /dev/null +++ b/src/Umbraco.Cms.Api.Management/Services/FileSystem/PhysicalFileSystemTreeService.cs @@ -0,0 +1,13 @@ +using Umbraco.Cms.Core.IO; + +namespace Umbraco.Cms.Api.Management.Services.FileSystem; + +public class PhysicalFileSystemTreeService : FileSystemTreeServiceBase, IPhysicalFileSystemTreeService +{ + private readonly IFileSystem _physicalFileSystem; + + protected override IFileSystem FileSystem => _physicalFileSystem; + + public PhysicalFileSystemTreeService(IPhysicalFileSystem physicalFileSystem) => + _physicalFileSystem = physicalFileSystem; +} From 7572ef5fffb4e61aae7a96736541f0777f2f40dc Mon Sep 17 00:00:00 2001 From: Emma L Garland Date: Thu, 25 Sep 2025 14:31:36 +0100 Subject: [PATCH 08/19] NuGet vulnerability warnings: Warn in non-Release mode, Error in non-Release mode (#17244) * Initial adjustment of the projects with package vulnerabilities that errored, to change to ignore the four specific Nuget vulnerability warnings in Debug mode (but not Release) as per https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu1901-nu1904 (NU1901,NU1902,NU1903,NU1904) * Fixed formatting errors with tests * No trailing whitespace * Move NuGet vulnerability warnings error suppression to Directory.Build.props, combine WarningsNotAsErrors and fix minor issues * Update Umbraco.JsonSchema.csproj Removed unwanted change * Update Umbraco.JsonSchema.csproj Removed unwanted change * Revert unecessary changes since merge * Tweak more unecessary changes * Small tweaks * Remove space * Reverted spacing changes * Remove no longer required warning exclusions * Reverted unwanted change * Reversed order * A few tweaks to reduce warnings in Umbraco.TestData * More warnings removed as no longer an issue --------- Co-authored-by: Ronald Barendse Co-authored-by: Emma Garland Co-authored-by: Jason Elkin --- .../Umbraco.Cms.Api.Delivery.csproj | 4 +-- .../Umbraco.Cms.Persistence.SqlServer.csproj | 2 +- .../Umbraco.Cms.Persistence.Sqlite.csproj | 3 +- .../Umbraco.Cms.Targets.csproj | 1 - src/Umbraco.Core/Umbraco.Core.csproj | 2 +- .../Umbraco.Examine.Lucene.csproj | 3 +- .../Umbraco.Web.Common.csproj | 1 - .../Umbraco.Web.Website.csproj | 6 ++-- tests/Umbraco.TestData/LoadTestController.cs | 32 +++++++++---------- .../Umbraco.TestData/Umbraco.TestData.csproj | 4 +-- .../Umbraco.Tests.Benchmarks.csproj | 6 ++-- .../Builders/Extensions/BuilderExtensions.cs | 6 +++- .../Builders/MediaTypeEditingBuilder.cs | 4 ++- .../Umbraco.Tests.Common.csproj | 2 +- 14 files changed, 36 insertions(+), 40 deletions(-) diff --git a/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj b/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj index b275c6ad14..ee7db5f384 100644 --- a/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj +++ b/src/Umbraco.Cms.Api.Delivery/Umbraco.Cms.Api.Delivery.csproj @@ -1,9 +1,8 @@ - + Umbraco CMS - Delivery API Contains the presentation layer for the Umbraco CMS Delivery API. - $(WarningsNotAsErrors),ASP0019,CS0618,CS0612 - diff --git a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj index aeaedc4098..65ec7d93d0 100644 --- a/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj +++ b/src/Umbraco.Cms.Persistence.SqlServer/Umbraco.Cms.Persistence.SqlServer.csproj @@ -7,7 +7,7 @@ $(WarningsNotAsErrors),CS0114 - diff --git a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj index edda7db873..66e6595ed3 100644 --- a/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj +++ b/src/Umbraco.Cms.Targets/Umbraco.Cms.Targets.csproj @@ -5,7 +5,6 @@ false false - - diff --git a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj index 0274d838f8..f811139ad7 100644 --- a/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj +++ b/src/Umbraco.Web.Common/Umbraco.Web.Common.csproj @@ -5,7 +5,6 @@ Contains the web assembly needed to run Umbraco CMS. Umbraco.Cms.Web.Common - $(WarningsNotAsErrors),ASP0019,CS0618,SA1401,SA1649,IDE1006 - + diff --git a/tests/Umbraco.TestData/LoadTestController.cs b/tests/Umbraco.TestData/LoadTestController.cs index 121af67f5d..897c5ff117 100644 --- a/tests/Umbraco.TestData/LoadTestController.cs +++ b/tests/Umbraco.TestData/LoadTestController.cs @@ -27,12 +27,12 @@ public class LoadTestController : Controller private const string FootHtml = @" "; - private static readonly Random s_random = new(); - private static readonly Lock s_locko = new(); + private static readonly Random _random = new(); + private static readonly Lock _locko = new(); - private static volatile int s_containerId = -1; + private static volatile int _containerId = -1; - private static readonly string s_headHtml = @" + private static readonly string _headHtml = @" LoadTest