Compare commits

...
Author SHA1 Message Date
Andreas ZerbstandGitHub 9ab0abca99 E2E: Stop running version 14 on nightly test pipeline (#20558)
Stops 14 from running on our nightly test pipeline
2025-10-20 12:05:42 +02:00
Andy Butland 009a999e22 Merge branch 'release/14.3.4' into v14/dev 2025-04-08 07:15:06 +02:00
Andy ButlandandGitHub d3c1443b14 Merge commit from fork
* Prevent path traveral vulnerability with upload of temporary files.

* Used BadRequest instead of NotFound for invalid file name response.
2025-04-08 05:03:40 +02:00
Andy Butland 8a9db11422 Merge branch 'release/14.3.3' into v14/dev
# Conflicts:
#	Directory.Packages.props
#	version.json
2025-03-11 09:28:52 +01:00
Andy ButlandandGitHub d9fb6df16e Merge commit from fork
* Bumped version to 15.2.1.

# Conflicts:
#	version.json

* Tighten management API endpoint access rules.
2025-03-11 05:11:35 +01:00
Andy Butland 14ed3348bf bumped imagesharp to prevent CVE-2025-27598 (#18602)
# Conflicts:
#	Directory.Packages.props
2025-03-09 08:54:03 +01:00
Sven Geusens 9e7a36865a Merge branch 'v13/dev' into v14/dev
Revert #18249 as it is reimplemented for v15
Revert #18320 as the new architecture explictly throws an error

# Conflicts:
#	build/azure-pipelines.yml
#	src/Umbraco.Core/EmbeddedResources/Lang/en.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml
#	src/Umbraco.Core/Models/ContentEditing/ContentSaveAction.cs
#	src/Umbraco.Core/Services/ContentService.cs
#	src/Umbraco.Core/Services/IContentService.cs
#	src/Umbraco.Core/Services/MemberService.cs
#	src/Umbraco.Infrastructure/PropertyEditors/RichTextEditorPastedImages.cs
#	src/Umbraco.Infrastructure/Security/BackOfficeUserStore.cs
#	src/Umbraco.Infrastructure/Security/MemberUserStore.cs
#	src/Umbraco.Web.BackOffice/Controllers/ContentController.cs
#	src/Umbraco.Web.BackOffice/Controllers/EntityController.cs
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
#	src/Umbraco.Web.BackOffice/Controllers/MemberController.cs
#	src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs
#	src/Umbraco.Web.BackOffice/Controllers/UsersController.cs
#	src/Umbraco.Web.BackOffice/DependencyInjection/UmbracoBuilder.BackOfficeAuth.cs
#	src/Umbraco.Web.BackOffice/Filters/ContentSaveValidationAttribute.cs
#	src/Umbraco.Web.BackOffice/Filters/MemberSaveModelValidator.cs
#	src/Umbraco.Web.BackOffice/Filters/MemberSaveValidationAttribute.cs
#	src/Umbraco.Web.BackOffice/Trees/ContentTreeController.cs
#	src/Umbraco.Web.Common/RuntimeMinification/SmidgeOptionsSetup.cs
#	src/Umbraco.Web.Common/RuntimeMinification/SmidgeRuntimeMinifier.cs
#	src/Umbraco.Web.Common/Views/UmbracoViewPage.cs
#	src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbuttongroup.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/property/umbproperty.directive.js
#	src/Umbraco.Web.UI.Client/src/common/resources/content.resource.js
#	src/Umbraco.Web.UI.Client/src/common/resources/publicaccess.resource.js
#	src/Umbraco.Web.UI.Client/src/common/resources/users.resource.js
#	src/Umbraco.Web.UI.Client/src/common/services/assets.service.js
#	src/Umbraco.Web.UI.Client/src/views/common/drawers/help/help.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/linkpicker/linkpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.controller.js
#	src/Umbraco.Web.UI.Client/src/views/components/content/umb-tabbed-content.html
#	src/Umbraco.Web.UI.Client/src/views/components/property/umb-property.html
#	src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js
#	src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.controller.js
#	src/Umbraco.Web.UI.Client/src/views/content/overlays/publishdescendants.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/listview/listview.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js
#	src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html
#	src/Umbraco.Web.UI.Client/src/views/webhooks/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/views/webhooks/edit.html
#	src/Umbraco.Web.UI.Client/test/unit/app/content/create-content-controller.spec.js
#	src/Umbraco.Web.UI.Client~HEAD
#	src/Umbraco.Web.UI.Login/src/auth.element.ts
#	tests/Umbraco.TestData/UmbracoTestDataController.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Core/Services/ContentServiceTests.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentEventsTests.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServicePublishBranchTests.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceTagsTests.cs
#	tests/Umbraco.Tests.UnitTests/Umbraco.Infrastructure/Security/MemberUserStoreTests.cs
#	tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/MemberControllerUnitTests.cs
#	version.json
2025-02-17 19:25:45 +01:00
Andy ButlandandGitHub db1d999721 Avoid exception when attempting to find member by Id when Id is not an expected Guid or integer, as can be the case with external member providers. (#18320) 2025-02-17 12:47:52 +01:00
Andy ButlandandGitHub 18047a7cfb Only filter post retrieval of entities for start nodes if working with entities that support start nodes. (#18287) 2025-02-17 12:45:51 +01:00
Andy ButlandandGitHub def7ebd48c Html encodes the user's name in the invite email. (#18343) 2025-02-17 12:25:12 +01:00
8c2b1ebdc5 V13: Introduce publishNotifications method on IMembershipMemberService (#18207)
* Introduce publishNotifications method on IMembershipMemberService.cs

* Fix test

* Add PublishNotificationSaveOptions

* Fix up according to comments

* Use numeric values for flag enum

* Update src/Umbraco.Core/Services/MemberService.cs

Co-authored-by: Andy Butland <abutland73@gmail.com>

* Update src/Umbraco.Core/Services/MemberService.cs

Co-authored-by: Andy Butland <abutland73@gmail.com>

---------

Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-02-12 13:30:41 +01:00
Andy ButlandandGitHub 9227517a50 Split force for publish descendants into separate options for publish unpublish and re-publish unedited (13) (#18249)
* Split force for publish descendents into separate options for publish unpublish and re-publish unedited.

* Added integration task verifying updated behaviour.

* Variant integration test.

* Update test data controller.

* Remove usued function parameters.

* Refactor to enum.

* Fixed flags enum.

* Variable name refactor.

* Applied changes from code review.

* Refactored method name.

* Aligned js boolean checks.
2025-02-12 11:30:27 +00:00
Andy Butland 5322d0f7b5 Bumped version to 13.8.0-rc. 2025-02-12 08:13:58 +01:00
Andy ButlandandGitHub a282cc5691 Backport use of thread delay over sleep and handle dispose in FileSystemMainDomLock (#18151)
* Backport use of thread delay over sleep and handle dispose in FileSystemMainDomLock (from PRs #18119 and #18147)

* Applied suggestion from code review.
2025-02-12 08:06:50 +01:00
Andy ButlandandGitHub 048f8bcdf9 Fixed userResource request to get all users. (#18105) 2025-02-11 17:06:18 +01:00
Andy ButlandandGitHub 7bcbc748d4 URL encodes member user names when passing information for public access setting such that those with user names as emails containing a plus will be included in the rule. (#18142) 2025-02-11 13:36:19 +01:00
Andy ButlandandGitHub f30e6cfe7f Prevents folder selection in media picker when used from the multi URL picker. (#18288) 2025-02-11 09:18:01 +01:00
Andy ButlandandGitHub 026e80e026 Avoid an exception on sign out when the principal is populated from an incomplete external login (#18078)
* Avoid an exception on signout when the principal is populated from an incomplete external login.

* Tidied up comment.
2025-02-10 12:51:35 +01:00
Andy ButlandandGitHub a3b77cff63 Add validation to prevent update of a user or member to an invalid username (13) (#18261)
* Add validation to prevent update of a user or member to an invalid username.

* Avoid password manager updates of user name field on user details screen.
2025-02-10 10:40:53 +01:00
Niels LyngsøandGitHub 4ca68d6995 Add client-side validation for RTE (#18257) 2025-02-07 11:43:04 +00:00
Sven GeusensandGitHub 280cb7f2b1 Fix issues in newly added buttongroup localization (#18254)
* Fix #18253 nullref exception

* Fix #18239 by listening to broader scope changes
2025-02-07 07:00:34 +01:00
095a73132c Review: Allow Duplicate Email for Members (#16202)
* init

* Aligned default values on security settings.

* Added validator for security settings.

* Provide default implementation for get members by email.

* Refactored constructor of MemberController.

* Validate on unique member email only when configured to do so.

* Further code tidy and use of DI in constructor.

* Used new constructor in tests.

* Add unit test for modified behaviour.

* Removed validator for security settings (it's not necessary, I got confused with users and members).

* Spelling.

---------

Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-02-05 12:38:40 +01:00
Andy Butland cfb0fc23ac Merge branch 'v13/dev' into v13/contrib 2025-02-04 12:35:49 +01:00
6620aca9fe Cache null dictionary values by key (#15576)
* Add CacheNullValues option to RepositoryCachePolicy

* Cache null values in DictionaryByKeyRepository

* Fixed issue with nullable reference.

* Updated logic for caching of null values.

* Update src/Umbraco.Infrastructure/Cache/DefaultRepositoryCachePolicy.cs

Co-authored-by: Sven Geusens <geusens@gmail.com>

* Made the NullValueRepresentation overwritable in a generic manner

* Improve generic NullValueCachePolicyResolver

* Revert Commits and clarify logic with comment

This reverts commit 8befb43792 "Improve generic NullValueCachePolicyResolver"
Also reverts 8adf0a2 - Made the NullValueRepresentation overwritable in a generic manner
And 8adf0a2 - Made the NullValueRepresentation overwritable in a generic manner

* Update src/Umbraco.Infrastructure/Cache/DefaultRepositoryCachePolicy.cs

---------

Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Sven Geusens <geusens@gmail.com>
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2025-02-04 12:29:21 +01:00
2422a02b23 Set Smidge cachebuster type (#18198)
* Set Smidge cachebuster type

* Amend exception and fix typo

* Minor tweak to comment and exception message.

---------

Co-authored-by: Simon Hartfield <simon.hartfield@googlemail.com>
Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-02-04 11:00:44 +00:00
b4a9dc0770 V13: Fix members while using basic auth. (#18206)
* Flow additional identities to new principal

* Add extension to more easily get member identity

* Ensure the member is used instead of the backoffice user in `MemberManager`

* Update snippet

* Fix the comment that I broke

* Update src/Umbraco.Web.Common/Extensions/MemberClaimsPrincipalExtensions.cs

Co-authored-by: Andy Butland <abutland73@gmail.com>

---------

Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-02-03 19:48:08 +01:00
Andy ButlandandGitHub e7411244fd Show notifications menu only to users with permission for the feature. (#18184) 2025-02-03 13:24:58 +01:00
Kenn JacobsenandGitHub 9f357173c3 Enforce user start nodes for media uploads through the RTE (#18204) 2025-02-03 12:50:23 +01:00
Andy Butland 7dc6e3ed5b Merge branch 'v13/dev' into v13/contrib 2025-01-31 16:16:22 +01:00
Gareth WrightandGitHub 5dfff212d0 Update auth.element.ts (#18192)
auth_username => general_username
2025-01-31 14:59:25 +01:00
17615f966b Fix out of memory of 2gb+ (max 4gb) error introduced by #14657 SVG xss security fix (#17421)
Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-01-31 13:46:56 +00:00
Kenn JacobsenandGitHub 7a2d6b6c63 More robust resolving of Delivery API redirects (#18160) 2025-01-31 14:26:07 +01:00
Sven Geusens 343867f6ee Merge branch 'release/13.6' into v13/dev and version bump
# Conflicts:
#	src/Umbraco.Web.BackOffice/Controllers/PreviewController.cs
#	version.json
2025-01-30 16:27:49 +01:00
Bjarke BergandSven Geusens b9837ac77c Optimize Azure pipeline (#17674)
* Only fetch single commit

* Hopefully fixes Nerdbank.GitVersioning.GitException: Shallow clone lacks the objects required to calculate version height. Use full clones or clones with a history at least as deep as the last version height resetting change.

* Do not checkout again

* More test pipeline

* Another attempt

* yet another attempt

* more attempts

* Revert "more attempts"

This reverts commit 5694d97ba6.

* Test without building backoffice and login explicitly

* Fix mem leak in integration tests

* Fixes sqlserver lock test
# Conflicts:
#	build/azure-pipelines.yml
2025-01-30 14:10:05 +01:00
Sven Geusens bb73ec6c68 Set release version 2025-01-30 09:52:50 +01:00
Andy ButlandandGitHub ee2d7bbb1b Excluded tags from trashed content (#18164) 2025-01-29 21:10:11 +01:00
Andy ButlandandGitHub 5d48bc7371 Provides an option to remove the inessential version number from the generated models (#18081)
* Provides an option to remove the inessential version number from the generated models.

* Clarified comment.
2025-01-29 13:33:49 +01:00
Kenn JacobsenandGitHub 59a4649528 Do not allow editing read-only properties by clicking their labels (#18152)
* Do not allow editing read-only properties by clicking their labels

* Simplify the fix :)

* Fix linting issue
2025-01-29 10:29:58 +01:00
Andy ButlandandGitHub f54b6033ab Added Resharper test assemblies to exclude list on TypeFinder. (#18145) 2025-01-29 10:27:17 +01:00
Jacob OvergaardandGitHub bf340cd7d4 fix: remove unused parameters and documentation (#18095)
this fixes an issue where unused parameters were published as supported, but they were in fact never supported.
2025-01-28 10:53:00 +00:00
Andy Butland 313417cb91 Tidied up XML header comment in ITagQuery. 2025-01-28 10:52:21 +01:00
7850078623 Redirect to the published URL when exiting preview (#18114)
Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-01-24 18:46:28 +00:00
44bf3b77b3 Make it possible to reset media picker crops (#18110)
Co-authored-by: Andy Butland <abutland73@gmail.com>
2025-01-24 13:41:30 +00:00
Kenn JacobsenandGitHub 8485458896 Add clientside validation to webhook events (#18089) 2025-01-23 17:01:55 +01:00
Nikolaj Geisle 3d253f5f06 bump version 2025-01-23 11:15:26 +01:00
Nikolaj Geisle 64287d7e1a Merge branch 'release/13.5.3' into release/13.6
# Conflicts:
#	version.json
2025-01-23 11:14:47 +01:00
Andy ButlandandGitHub edc78a5a4c Handles migration case where an expected constraint is renamed but the constraint does not exist. (#18063) 2025-01-22 12:26:06 +01:00
Andy Butland 8056a59a10 Fix schema defined in JSON schema tool definition after merge from 13. 2025-01-21 15:52:31 +01:00
1a18d6c035 Replaced deprecated navigator.platform with navigator.userAgent for platform detection. (#17373)
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
2025-01-21 13:56:40 +01:00
Andy Butland 3e877182b5 Merge branch 'v13/contrib' into v13/dev 2025-01-21 09:47:20 +01:00
Martin VennevoldandGitHub 0e4f883bc1 Fix create child issue in list view with infinite editor (#13355). (#17637) 2025-01-21 09:44:22 +01:00
Andy Butland 265cc62ab8 Merge branch 'release/13.6' into v13/dev 2025-01-21 09:21:36 +01:00
Andy Butland 800c16970e Merge branch 'release/13.6' of https://github.com/umbraco/Umbraco-CMS into release/13.6 2025-01-21 09:20:11 +01:00
Andy Butland 6bd11bf233 Fixes failing front-end unit test to align with new behaviour from PR #17818 (
Allow skipSelect blueprints only when one blueprint exists).
2025-01-21 09:19:31 +01:00
Kenn Jacobsen a2fd82a3f3 Add NoopCurrentMemberClaimsProvider so Umbraco can boot without the Delivery API enabled (#18049) 2025-01-21 09:13:31 +01:00
Kenn JacobsenandSven Geusens 56c0aebd76 Add NoopCurrentMemberClaimsProvider so Umbraco can boot without the Delivery API enabled (#18049) 2025-01-21 09:12:20 +01:00
Kenn JacobsenandGitHub 7567990da1 Add NoopCurrentMemberClaimsProvider so Umbraco can boot without the Delivery API enabled (#18049) 2025-01-21 09:10:43 +01:00
Zeegaan c7d157bbfd build on ubuntu 2025-01-21 09:02:00 +01:00
Sven Geusens 4b9771c0eb Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	Directory.Packages.props
#	build/azure-pipelines.yml
#	src/Umbraco.Cms.Api.Common/DependencyInjection/UmbracoBuilderAuthExtensions.cs
#	src/Umbraco.Cms.Persistence.EFCore/Locking/SqlServerEFCoreDistributedLockingMechanism.cs
#	src/Umbraco.Core/Configuration/Models/RichTextEditorSettings.cs
#	src/Umbraco.Core/EmbeddedResources/Lang/da.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/en.xml
#	src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml
#	src/Umbraco.Core/Services/ContentService.cs
#	src/Umbraco.Web.BackOffice/Authorization/ContentPermissionsQueryStringHandler.cs
#	src/Umbraco.Web.BackOffice/Authorization/ContentPermissionsResourceHandler.cs
#	src/Umbraco.Web.BackOffice/Controllers/ContentController.cs
#	src/Umbraco.Web.BackOffice/Controllers/ExamineManagementController.cs
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
#	src/Umbraco.Web.BackOffice/Trees/StaticFilesTreeController.cs
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/package.json
#	src/Umbraco.Web.UI.Client/src/common/directives/components/buttons/umbbuttongroup.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/common/filters/simpleMarkdown.filter.js
#	src/Umbraco.Web.UI.Client/src/common/filters/simpleMarkdown.filter.js.js
#	src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
#	src/Umbraco.Web.UI.Client/src/less/components/umb-group-builder.less
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/mediaentryeditor/mediaentryeditor.less
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/propertysettings/propertysettings.html
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/ysod/ysod.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/overlays/ysod/ysod.html
#	src/Umbraco.Web.UI.Client/src/views/components/buttons/umb-button-group.html
#	src/Umbraco.Web.UI.Client/src/views/content/overlays/sendtopublish.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/prevalue/blockgrid.blockconfiguration.overlay.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.overlay.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/blocklist/prevalue/blocklist.blockconfiguration.overlay.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js
#	src/Umbraco.Web.UI.Client~HEAD
#	src/Umbraco.Web.UI.Login/package-lock.json
#	src/Umbraco.Web.UI.Login/package.json
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/BlockGridEditor/Content/blockGridEditorContent.spec.ts
#	tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Services/ContentServiceNotificationTests.cs
#	tests/Umbraco.Tests.UnitTests/Umbraco.Web.BackOffice/Controllers/ContentControllerTests.cs
#	tools/Umbraco.JsonSchema/UmbracoCmsSchema.cs
#	version.json
2025-01-21 08:47:38 +01:00
Jacob Overgaard abc312c9b4 update backoffice submodule to 14.3.2 2025-01-21 08:44:10 +01:00
Nikolaj Geisle 2161edb871 Bump version 2025-01-21 07:41:06 +01:00
Nikolaj Geisle e77e9c5691 Format sql statement (#17354)
(cherry picked from commit aa9f194d76)
2025-01-20 18:27:54 +01:00
Nikolaj Geisle e934a943b5 build on windows 2025-01-20 17:37:04 +01:00
Ronald BarendseandNikolaj Geisle 65bb2801b0 Merge commit from fork
* Add TimedScope

* Use TimedScope in login endpoint

* Use seperate default duration and only calculate average of actual successful responses

* Only return detailed error responses if credentials are valid

* Cancel timed scope when credentials are valid

* Add UserDefaultFailedLoginDuration and UserMinimumFailedLoginDuration settings
2025-01-20 16:44:28 +01:00
Andy ButlandandGitHub a0a4af6a0c Merge commit from fork 2025-01-20 14:54:14 +01:00
Jacob Overgaard e8d6cded2b update backoffice submodule to 14.3.2 2025-01-20 14:42:17 +01:00
Bjarke BergandJacob Overgaard c65204a146 update backoffice submodule to 14.3.2 2025-01-20 14:34:03 +01:00
Andy ButlandandGitHub 95eb58587b Merge commit from fork 2025-01-20 14:14:28 +01:00
Andy ButlandandGitHub 86f3033334 Merge commit from fork 2025-01-20 14:14:28 +01:00
25628a8b76 Lucene Package Update to Address CVE-2024-43383 (#17942)
* Update Lucene Package to 4.8.0-beta00017

* Add Package Reference

---------

Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2025-01-20 11:45:35 +01:00
Callum WhyteandAndy Butland 7552e315fb Allow skipSelect blueprints only when one blueprint exists (#17818) 2025-01-20 11:45:26 +01:00
Callum WhyteandGitHub d15b5b221e Allow skipSelect blueprints only when one blueprint exists (#17818) 2025-01-20 10:27:54 +01:00
60e3fa97a9 Lucene Package Update to Address CVE-2024-43383 (#17942)
* Update Lucene Package to 4.8.0-beta00017

* Add Package Reference

---------

Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2025-01-20 10:04:02 +01:00
Sven Geusens fd1bd51aff bump version 2025-01-16 10:10:04 +01:00
Sven Geusens b12620af9c Merge branch 'release/13.6' into v13/dev 2025-01-16 10:08:43 +01:00
Sven Geusens d1af59fdf0 Merge branch 'v13/dev' into release/13.6 2025-01-15 22:13:42 +01:00
Andreas ZerbstandGitHub 1b050ebc47 V13 QA added parallelization for E2E tests (#17995)
* Added script for running tests

* Added parallelization for our E2E tests

* Removed line

* Removed condition
2025-01-15 22:12:45 +01:00
Sven Geusens ff3e457c58 Merge branch 'v13/dev' into release/13.6 2025-01-15 20:55:41 +01:00
Andy ButlandandGitHub 2ffaede07b Added a maxlength setting to the regular expression pattern field. (#17982) 2025-01-15 20:54:54 +01:00
Sven GeusensandGitHub 2a83f57262 Do not re-map schedule modal on error as it leads to broken bindings (#17990) 2025-01-15 17:35:23 +01:00
Kenn JacobsenandGitHub 5be9193978 Do not show "Save and preview" by default (#17986) 2025-01-15 15:42:37 +01:00
Niels LyngsøandSven Geusens d3f264fc54 Fix: only fire event when instance is available (issue 17847) (#17987)
* only fire event when instance is available

* avoid js issue when no markup
2025-01-15 14:01:33 +01:00
Niels LyngsøandGitHub 04ea002bf3 Fix: only fire event when instance is available (issue 17847) (#17987)
* only fire event when instance is available

* avoid js issue when no markup
2025-01-15 13:56:53 +01:00
Kenn JacobsenandGitHub 8f42a3a0ea Make the RTE handle inline elements gracefully for JSON (#17983) 2025-01-15 11:26:03 +01:00
Kenn JacobsenandGitHub 4dd8fbe25d Enforce the "Save and preview" button after when switching content app (#17985) 2025-01-15 09:55:00 +01:00
Sven GeusensandGitHub ee727c43e1 Added localizations for composite key of missing New (media) Audit item (#17981) 2025-01-14 21:08:47 +01:00
Jacob OvergaardandGitHub 395213946b build(deps): update @microsoft/signalr from 7.0.12 to 8.0.7 (#17973) 2025-01-14 15:44:52 +00:00
Andy ButlandandGitHub ed0b236208 Resets send to approval dialog on close such that when re-opening the selection and operation can still be triggered. (#17956) 2025-01-14 16:25:26 +01:00
Kenn JacobsenandGitHub 8d56e75257 Add Vary header to all content API operations (#17962)
* Add Vary header to all content API operations

* Make attribute sealed
2025-01-14 15:54:19 +01:00
Jacob OvergaardandGitHub b3c27415d1 build(deps): bump @umbraco-ui/uui from 1.11.0 to 1.12.2 (#17972) 2025-01-14 15:48:34 +01:00
Justin NevilleandNikolaj Geisle 9839b0ee66 Fixes issue with the IVirtualPageController not setting PublishedRequest content via FindContent (#15121)
* Fixes issue https://github.com/umbraco/Umbraco-CMS/issues/12834

* Re-worked based on feedback

* Use dependency injection

* Only call new constructor

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
(cherry picked from commit fd9c1a0e9c)
2025-01-14 13:57:00 +01:00
f3f57f9748 Improve YSOD rendering in the client (#17940)
* Conditionally render error details and make sure something is rendered

* V13 QA updated locator for failing E2E test (#17825)

* Added timeouts

* Nullcheck user in Content permission handlers (#17846)

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>

---------

Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
2025-01-14 13:38:07 +01:00
Nikolaj GeisleandGitHub 85d16a4354 V13: Show validation error, when saving invalid media (#17961)
* Don't save invalid media

* Revert "Don't save invalid media"

This reverts commit c4b6acf542.

* Still allow save, but show validation error, not popup error

* Add clarifying comment
2025-01-14 11:18:36 +01:00
Kenn JacobsenandGitHub c0517c3562 Allow filtering for multiple content types (#17960) 2025-01-14 10:40:45 +01:00
92e535a1c9 V13 QA updated locator for failing E2E test (#17825)
* Added timeouts

* Nullcheck user in Content permission handlers (#17846)

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Niels Lyngsø <nsl@umbraco.dk>
2025-01-14 09:12:41 +01:00
Kenn JacobsenandGitHub 7411c2552b Added integration test to verify the Delivery API contract (#17949) 2025-01-13 15:15:37 +01:00
Andy ButlandandGitHub f2410f376e Corrected property names and structure used in JSON schema generation for configuration of default data to install. (#17946) 2025-01-13 11:05:51 +01:00
Kenn JacobsenandGitHub a9313c1367 Make the Delivery API "ancestors" selector work with preview (#17938) 2025-01-13 07:47:14 +01:00
Nikolaj GeisleandGitHub 58d6404ec8 V14: Reintroduce BackOfficeUserManagerAuditer (#17349)
* Reintroduce BackOfficeUserManagerAuditer

* Cleanup legacy code

* Notify user logout on logout
2025-01-09 21:14:24 +01:00
Nikolaj GeisleandJacob Overgaard 53a5813189 V15: Dont create invalid media (#17534)
* Don't allow create when there is validation errors

* Fix tests

* Add tests

* Fix last test

* Fix more tests

---------

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2025-01-09 12:21:54 +01:00
Nikolaj Geisleandkjac 5b3b9d770a V13: Add rcl files to static files tree (#17671)
* Refactor to use IWebhostEnvironment for wwwroot files.

* Obsolete ctor

* Add ActivatorUtiiliesConstructor

* Refactor logic to include folders

* Fix so we can see files in wwwroot/App_Plugins

* Cosmetic: Use invariant comparison for the "umbraco" folder".

---------

Co-authored-by: kjac <kja@umbraco.dk>
2025-01-09 10:02:34 +01:00
4a54215fa1 V13: Add rcl files to static files tree (#17671)
* Refactor to use IWebhostEnvironment for wwwroot files.

* Obsolete ctor

* Add ActivatorUtiiliesConstructor

* Refactor logic to include folders

* Fix so we can see files in wwwroot/App_Plugins

* Cosmetic: Use invariant comparison for the "umbraco" folder".

---------

Co-authored-by: kjac <kja@umbraco.dk>
2025-01-09 09:36:32 +01:00
Sven Geusensandnikolajlauridsen 52fbb34ddd Nullcheck user in Content permission handlers (#17846) 2025-01-07 15:07:42 +01:00
Sven GeusensandGitHub c96dc7eaa1 Nullcheck user in Content permission handlers (#17846) 2025-01-07 14:52:40 +01:00
Andy Butland 0166727eee Bumped version to 14.3.2. 2025-01-07 10:13:02 +01:00
Jacob Overgaard f19409ba5b Revert "bump version"
This reverts commit 679c42ef90.
2025-01-06 12:51:10 +01:00
Jacob Overgaard 679c42ef90 bump version 2025-01-06 12:46:03 +01:00
Nikolaj GeisleandGitHub 77b6e6e6d9 override PerformGetAll (#17822) 2024-12-16 13:35:02 +01:00
Elitsa MarinovskaandGitHub 32d0cb477e V14: Adding the ability to conditionally serialize version bound properties for the Delivery API (#16731)
* Property level versioning for the Delivery API using a custom System.Text.Json resolver

* Adding a converter base class that custom converters can implement

* Revert resolver

* Use IHttpContextAccessor for the API version

* Fix attribute and checks in ShouldIncludeProperty

* Fix enumeration

* Fix comment

* Unit tests

* Refactoring

* Remove Assert.Multiple where no needed
2024-12-16 11:34:55 +01:00
Nikolaj GeisleandElitsa d451390d78 V13: Clear username cache (#17815)
* Clear member username cache on delete

* Also refresh cache on update
2024-12-16 09:56:54 +02:00
Elitsa MarinovskaandGitHub 3304c6f472 Enable anonymous calls to HandleLogout action (#17807) 2024-12-16 07:26:12 +01:00
Nikolaj GeisleandGitHub 34f09fa260 V13: Clear username cache (#17815)
* Clear member username cache on delete

* Also refresh cache on update
2024-12-16 08:18:30 +02:00
Jacob Overgaard fd4efd38cd Merge branch 'v13/dev' into release/13.6 2024-12-13 10:07:46 +01:00
Jacob Overgaard e4e9bfc3e9 bump version to 13.6.0-rc2 2024-12-13 09:58:13 +01:00
Jacob Overgaard 3774dbe38c Merge remote-tracking branch 'origin/v13/contrib' into v13/dev 2024-12-13 09:56:46 +01:00
Dan ListerandJacob Overgaard 4ef50642ad Fixed an issue where bold markdown would not work inside a property description 2024-12-13 09:53:36 +01:00
Bjarke BergandGitHub cb88cbba43 Merge pull request #17761 from umbraco/v14/task/media-picker-min-max-validation
V14 min/max validator for mediapicker
2024-12-13 08:28:13 +01:00
Bjarke BergandGitHub f95fb78022 Merge pull request #17800 from umbraco/v13/bugfix/corrupt-examine-dashboard
Make sure Examine dashboard still functions when an index is corrupt
2024-12-12 12:07:06 +01:00
Sven Geusens 0f9a8bde61 Broadend the error catching when building the examine dashboard 2024-12-12 09:38:35 +01:00
Sven Geusens 129d369c1a Version bump to release 2024-12-11 13:46:38 +01:00
Sven Geusens dd2c591a5b Merge branch 'release/13.6' into v13/dev 2024-12-11 13:45:35 +01:00
Nhu DinhandGitHub e9758321ce V14 Added Content tests with Approved Color (#16725)
* Added Content tests with Approved Color

* Bumped version of test helper

* Make Content tests run in the pipeline

* Using custom datatype builder instead of changing the default approved color data type

* Updated variables

* Fixed comment

* Make all Content tests run in the pipeline

* Reverted
2024-12-10 14:52:46 +07:00
Nikolaj GeisleandGitHub 82e58eae3e V14: cherry pick #17656 (#17763)
* V15: Fix webhook RTE serialization (#17656)

* Make base type resolver class

* Add new webhook serializer

* fix comment

* Update src/Umbraco.Infrastructure/Serialization/ContentJsonTypeResolverBase.cs

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>

* Update src/Umbraco.Core/Services/WebhookRequestService.cs

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
(cherry picked from commit 6f081785e6)

* Add back missing usings
2024-12-09 16:09:54 +01:00
Sven Geusens de78560343 Fix unit test mocks 2024-12-09 15:08:22 +01:00
Sven Geusens f569553d79 Added min/max validator for mediapicker3 2024-12-09 14:26:14 +01:00
Kenn JacobsenandNikolaj Geisle 16749a724d Add (un)publishing details to TreeChange notifications (#17757)
(cherry picked from commit 404a62aa0b)
2024-12-09 11:42:53 +01:00
Kenn JacobsenandNikolaj Geisle a627930b58 Warn about un-routable content at publish time (#17705)
(cherry picked from commit 2d9cfc880b)
2024-12-09 11:42:46 +01:00
Kenn JacobsenandGitHub 404a62aa0b Add (un)publishing details to TreeChange notifications (#17757) 2024-12-09 11:36:48 +01:00
Kenn JacobsenandGitHub 2d9cfc880b Warn about un-routable content at publish time (#17705) 2024-12-09 11:07:32 +01:00
Kenn JacobsenandGitHub ee8bdfc4ac Add "user info" endpoint for the Delivery API (#17719)
* Add "user info" endpoint for the Delivery API

* Add comment about public and unsealed class
2024-12-09 09:57:21 +01:00
f048cfe62d v14: DecimalConverter - add check for integer (#17679)
* Add check for integer

* Fix typo

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-12-04 15:18:12 +01:00
Nikolaj GeisleandElitsa 9cab0e8bb1 Add content to TreeAccessTemplate (#17694) 2024-12-04 11:08:57 +01:00
Bjarke BergandGitHub b55d484863 Updated NuGet Packages for v13 (#17704)
* Update nuget packages

* Cherry pick fixes from v15

* Fixed: Projects that use central package version management should not define the version on the PackageReference items but on the PackageVersion items

* rollback update in tool
2024-12-03 08:51:23 +01:00
Ronald BarendseandGitHub ed0058a503 Fix PanicException: failed to get child with id= after updating content types (#17702)
* Remove tree node from hierarchy after clearing branch

* Refactor ClearBranchLocked to split clearing child and siblings
2024-12-03 08:00:18 +01:00
21e3518a69 Fix copy document with descendants onto self (#17661)
* Filter self out of descedants for self onto self copy

* Optimized code

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-12-01 13:02:47 +01:00
Jacob OvergaardandGitHub b0aed393d6 fix: keep the lead char when editing an existing link (#17667) 2024-11-28 14:04:59 +00:00
Sven Geusens 28756d449b Rectify v13 in v14 merge 2024-11-27 14:35:22 +01:00
Sven Geusens 38a96db369 Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Cms.Imaging.ImageSharp/ConfigureImageSharpMiddlewareOptions.cs
#	src/Umbraco.Core/Models/AuditItem.cs
#	src/Umbraco.Core/Routing/UmbracoRequestPaths.cs
#	src/Umbraco.Core/Services/ContentService.cs
#	src/Umbraco.Infrastructure/Persistence/Repositories/Implement/AuditRepository.cs
#	src/Umbraco.Infrastructure/Persistence/Repositories/Implement/MediaRepository.cs
#	src/Umbraco.Web.BackOffice/Controllers/ContentController.cs
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/package.json
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/edit.controller.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/content/umbtabbedcontent.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/media/umbmedianodeinfo.directive.js
#	src/Umbraco.Web.UI.Client/src/common/directives/components/upload/umbfiledropzone.directive.js
#	src/Umbraco.Web.UI.Client/src/common/services/mediahelper.service.js
#	src/Umbraco.Web.UI.Client/src/common/services/rte-blockeditor-clipboard.service.js
#	src/Umbraco.Web.UI.Client/src/common/services/tinymce.service.js
#	src/Umbraco.Web.UI.Client/src/common/services/user.service.js
#	src/Umbraco.Web.UI.Client/src/less/components/umb-media-grid.less
#	src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umb-image-preview.html
#	src/Umbraco.Web.UI.Client/src/views/components/media/umbimagepreview/umbimagepreview.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/contentpicker/contentpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/rte/rte.component.js
#	src/Umbraco.Web.UI.Client/src/views/templates/edit.html
#	src/Umbraco.Web.UI.Client~HEAD
#	src/Umbraco.Web.UI.Login/package-lock.json
#	src/Umbraco.Web.UI.Login/package.json
#	src/Umbraco.Web.UI.Login/src/auth.element.ts
#	src/Umbraco.Web.UI.Login/src/components/pages/login.page.element.ts
#	src/Umbraco.Web.UI.Login/src/index.ts
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts
#	tests/Umbraco.Tests.UnitTests/Umbraco.Core/Routing/UmbracoRequestPathsTests.cs
2024-11-27 14:04:41 +01:00
Sven Geusens a1ea203281 Merge branch 'v10/dev' into v13/dev
# Conflicts:
#	src/Directory.Packages.props
#	src/Umbraco.Infrastructure/Manifest/ManifestParser.cs
2024-11-26 21:08:22 +01:00
Kenn JacobsenandGitHub 4590739fa5 Add ASCII file name conversion (#17580) 2024-11-26 11:26:44 +01:00
7c617f2976 Revert #14234 add update error message for DB connection failures (#17612)
* Revert #14234

* Make the boot failure message more descriptive when unable to connect to DB

* Update src/Umbraco.Infrastructure/Runtime/RuntimeState.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

* Revert changes

* Obsolete InstallMissingDatabase from V16

---------

Co-authored-by: Ronald Barendse <ronald@barend.se>
2024-11-26 11:06:40 +01:00
Lee KelleherandGitHub 9141f61708 V13: Dropzone, upload complete callback with processed file array (#17631)
* Dropzone, upload complete callback with processed file array

* Media card: cosmetic fix for image border-radius

The image's square corners were poking out.
2024-11-25 15:51:16 +01:00
ba4120050f Add cache key to GetByUserName (#17350)
* Add cache key to GetByUserName

* Remove constants

* create new cache policy for member repository

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-11-25 15:27:22 +01:00
Nikolaj Geisle 772c523a23 Validate email for member models (#17532)
* Validate email for member models

* Add null check or more test cases

* return invalid when not a valid email

* Cleanup

* remove private method in favor of extension

* Remove non used, using statement

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
(cherry picked from commit 6b0f8e7b7c)
2024-11-25 13:56:45 +01:00
Kenn JacobsenandGitHub cbd4dc6e0d Handle "all slashes" routes (#17596) 2024-11-22 09:06:10 +01:00
c7014e159b Sort manifest file paths alphabetically (#14466)
* Sort manifest file paths alphabetically

* Update src/Umbraco.Infrastructure/Manifest/ManifestParser.cs

Co-authored-by: Ronald Barendse <ronald@barend.se>

---------

Co-authored-by: Ronald Barendse <ronald@barend.se>
2024-11-21 16:19:48 +01:00
Sven Geusensandnikolajlauridsen 9febbc7db1 Distinguish between default zero and intentional zero sort order for new documents (#17517)
* Distinguish between default value and initial zero

* Update special value comment documentation

* Redid solution with dirty/new entity tracking

* rework copy branch sortorder fix

* Change == false to is false

---------

Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
2024-11-21 09:09:25 +01:00
Kenn JacobsenandGitHub ec8e10f406 Fix RTE console error when blocks are not available (#17582) 2024-11-21 08:53:59 +01:00
EalseandJacob Overgaard 3233b24a4e fix: infinite editor stuck in create action (#15945) 2024-11-20 10:00:50 +01:00
Anders BjernerandJacob Overgaard 5775e9cb18 Added fix for <umb-button-group /> label issues 2024-11-20 09:59:27 +01:00
MoleandGitHub 570005f5e1 Run both cms and package migrations in upgrader (#17575)
* Run both cms and package migrations in upgrader

* Use correct setting
2024-11-20 08:38:33 +01:00
1e9182cfa4 V14: Use decimal in slider property editor (#17568)
* Allow SliderPropertyEditor to use decimals

* Add tests

* Boyscout unittest update

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-11-19 11:14:53 +01:00
Bjarne FyrstenborgandLaura Neto fbaa3440f2 Don't shrink crops container on right side 2024-11-18 20:11:48 +01:00
Bjarne FyrstenborgandJacob Overgaard e662468ecc Set TinyMCE to readonly 2024-11-18 08:51:04 +01:00
Andreas ZerbstandGitHub 33eb4dd5a4 V14 QA updated playwright config (#17544)
* Only run windows SQL Server

* Updated timeout and retry count

* Updated condition

* Fixed indentation

* Skipped
2024-11-18 08:30:50 +01:00
Bjarne FyrstenborgandMatthew-Wise c8efc30654 Fallback value when setttings element type doesn't exists as it can have reference, but no available element type 2024-11-17 17:05:28 +00:00
Bjarke Berg d7b98a2f00 Use catch all for urls what ends with a path (#17468)
(cherry picked from commit 3c0f7a03ba)
2024-11-14 12:29:40 +01:00
Sven Geusensandnikolajlauridsen 9edd21a3b0 Made some membertype endpoints available for member related actions (#17440)
Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-11-13 13:47:37 +01:00
Andreas ZerbstandGitHub 7010ff1d26 V14 QA added rich text editor with stylesheet test (#17449)
* Rte tests

* Cleaned up

* Bumped version

* Added ensure not exists
2024-11-11 10:47:41 +01:00
Andreas ZerbstandGitHub 6acdf21eab V14 QA user groups permissions tests (#17429)
* Added tests for userGroup

* Clean up

* Updated userGroup tests

* Updated tests

* Updated tests

* Cleane up

* Cleaned up

* Bumped versions

* Run user tests

* Cleaned up

* Added permission tests

* Added tests, not done

* Updated tests

* Fixed tests

* Cleaned up

* Bumped version

* More cleanup

* Run user tests

* Added wait

* Added tests and cleaned up naming

* Bumped versions

* Reverted smokeTest command
2024-11-11 09:45:22 +01:00
Andreas ZerbstandGitHub a5479bc96e V14 QA members section user tests (#17448)
* Added tests for the members

* Cleaned up tests

* Bumped version

* Removed skip
2024-11-11 09:43:57 +01:00
marwaldvandJacob Overgaard 79d117026f Add swiss languages as backoffice languages
Add missing backoffice languages as properties etc. are translated via translation section (e.g. with "#Backoffice Settings"). At the moment the swiss languages always need to be added via the umbraco/Config folder.
2024-11-09 12:29:44 +01:00
Casper LundgreenandGitHub 2709054bdb Fix NameIdentifier is not an integer. (TryParse implemented) (#17414)
Issue: 17383
2024-11-08 13:27:53 +01:00
Sven Geusensandnikolajlauridsen 0acdd26850 Made some stylesheet endpoints available for document/media/member related actions (#17442) 2024-11-08 12:19:10 +01:00
MoleandGitHub 2d4230c001 Include create date in audit item (#17447) 2024-11-08 08:58:38 +01:00
Nhu DinhandGitHub 2d027ce9a1 V14 QA Added acceptance tests for rendering content with content picker (#17378)
* Added tests for rendering content with content picker

* Bumped version

* Make all the tests for rendering content run in the pipeline

* Reverted
2024-11-06 16:09:37 +07:00
Andreas ZerbstandGitHub b1d9085c83 V14 QA Added user groups acceptance tests (#17344)
* Added tests for userGroup

* Clean up

* Updated userGroup tests

* Updated tests

* Updated tests

* Cleane up

* Cleaned up

* Bumped versions

* Run user tests

* Cleaned up

* Added method for checking if the document tree is empty

* Bumped version

* Reverted
2024-10-28 11:11:28 +01:00
Nhu DinhandGitHub 41da2e2cf3 V14 Added acceptance tests for the List View Media and custom data type in Content section (#17025)
* Added Content tests with custom data type

* Added tests for List View Media data type in Media section

* Updated method name due to api helper changes

* Updated the assertion of Content tests with custom data type

* Bumped version of test helper

* Make all Content tests run in the pipeline

* Skipped test for code editor as it is removed

* Fixed comment

* Make Media tests running in the pipeline

* Bumped version

* Updated code due to ui helper changes

* Bumped version of test helper

* Updated tests for bulk trash in the media section

* Fixed notification message

* Make Content tests and Media tests run in the pipeline

* Added more waits

* Reverted
2024-10-28 10:53:33 +07:00
Nhu DinhandGitHub 76fcf19b15 V14 QA Added acceptance tests for rendering content with Dropdown, Radiobutton and ImageCropper (#17357)
* Added tests for rendering content with numeric

* Added tests for rendering content with textarea

* Added tests for rendering content with approved color

* Added tests for rendering content with numeric

* Added tests for rendering content with tags

* Added tests for rendering content with textarea

* Updated tests for rendering content with textstring due to test helper changes

* Added tests for rendering content with truefalse

* Bumped version of test helper

* Make all tests for rendering content run in the pipeline

* Fixed comments

* Removed blank lines

* Fixed name

* Make all smoke tests run in the pipeline

* Added tests for rendering content with dropdown

* Added tests for rendering content with Image Cropper - not done

* Updated tests for rendering content due to ui helper changes

* Updated tests for rendering content with image cropper

* Updated tests due to the api helper changes

* Bumped version of test helper

* Make all the tests for rendering content run in the pipeline

* Removed blank lines

* Format code

* Fixed test name

* Reverted
2024-10-25 18:19:53 +07:00
Nhu DinhandGitHub 11ccafeb97 V14 QA Added tests for rendering content with checkboxlist and date picker (#17332)
* Added tests for rendering content with numeric

* Added tests for rendering content with textarea

* Added tests for rendering content with approved color

* Added tests for rendering content with numeric

* Added tests for rendering content with tags

* Added tests for rendering content with textarea

* Updated tests for rendering content with textstring due to test helper changes

* Added tests for rendering content with truefalse

* Added tests for rendering content with checkbox list

* Added tests for rendering content with date picker - not done

* Updated tests for rendering content with date picker

* Updated tests for rendering content due to ui helper changes

* Bumped version

* Removed blank lines

* Make Rendering Content tests run in the pipeline

* Changed method name due to test helper changes

* Reverted
2024-10-25 15:16:28 +07:00
Nikolaj GeisleandGitHub aa9f194d76 Format sql statement (#17354) 2024-10-24 14:45:23 +02:00
Nikolaj GeisleandZeegaan 73d70ba9fc Swap to windows vm for build (#17348)
(cherry picked from commit 199a2f4619)
2024-10-24 09:47:59 +02:00
Zeegaan 6435ff0bb3 Merge remote-tracking branch 'origin/release/14.3' into v14/dev
# Conflicts:
#	version.json
2024-10-23 09:03:05 +02:00
Zeegaan f7729508cf Merge branch 'release/13.5' into v13/dev
# Conflicts:
#	version.json
2024-10-23 08:57:30 +02:00
Zeegaan 31e1acce67 Merge remote-tracking branch 'origin/release/10.8.7' into v10/dev
# Conflicts:
#	version.json
2024-10-23 08:48:08 +02:00
Andreas ZerbstandGitHub aa1f3df76b Updated to match locator (#17334) 2024-10-23 08:37:24 +02:00
Andreas ZerbstandGitHub 728dc89909 V14 QA Skip Users tests on Sqlite (#17330)
* Split sqlite test because we run into db locks

* Uses the new command
2024-10-22 13:12:42 +02:00
Nhu DinhandGitHub e36dc1f554 V14 QA Added the acceptance tests for rendering content with different value (#17293)
* Added tests for rendering content with numeric

* Added tests for rendering content with textarea

* Added tests for rendering content with approved color

* Added tests for rendering content with numeric

* Added tests for rendering content with tags

* Added tests for rendering content with textarea

* Updated tests for rendering content with textstring due to test helper changes

* Added tests for rendering content with truefalse

* Bumped version of test helper

* Make all tests for rendering content run in the pipeline

* Fixed comments

* Removed blank lines

* Fixed name

* Make all smoke tests run in the pipeline
2024-10-22 10:26:59 +07:00
Sven GeusensandNikolaj Geisle 3431f76320 Prevents XSS when viewing an uploaded SVG
from the media-info and image-preview components.
2024-10-21 12:50:12 +02:00
ElitsaandNikolaj Geisle 1bc5466a8d Update the HttpContext's user with the authenticated user's principal 2024-10-21 12:45:38 +02:00
ElitsaandNikolaj Geisle d83daf44d3 Reduce the time when getRemainingTimeoutSeconds request is made from 30s to 20s, so fewer calls are made 2024-10-21 12:44:40 +02:00
ElitsaandNikolaj Geisle 2ad5ecd5d5 Make sure that the client shows the login screen as close to the server's timout time as possible 2024-10-21 12:44:39 +02:00
Sven GeusensandNikolaj Geisle 35c51a029a Prevents XSS when viewing an uploaded SVG
from the media-info and image-preview components.
2024-10-21 12:42:06 +02:00
ElitsaandNikolaj Geisle 8c1128c85b Update the HttpContext's user with the authenticated user's principal 2024-10-21 12:41:42 +02:00
ElitsaandNikolaj Geisle c9021ab2d2 Reduce the time when getRemainingTimeoutSeconds request is made from 30s to 20s, so fewer calls are made 2024-10-21 12:41:18 +02:00
ElitsaandNikolaj Geisle 67a71f8f82 Make sure that the client shows the login screen as close to the server's timout time as possible 2024-10-21 12:41:17 +02:00
Andreas ZerbstandAndreas Zerbst 6caf53ed2e Updated version of messagepack (#17321)
(cherry picked from commit 8a22672c7f)
(cherry picked from commit 6399f235f2)
2024-10-21 11:54:26 +02:00
Andreas ZerbstandAndreas Zerbst 97d74f39e7 Updated version of messagepack (#17321)
(cherry picked from commit 8a22672c7f)
2024-10-21 11:49:13 +02:00
Andreas ZerbstandAndreas Zerbst edd0a4a4a9 Updated message pack (#17320)
(cherry picked from commit 11270eaaf5)
2024-10-21 11:46:43 +02:00
Andreas ZerbstandAndreas Zerbst 6399f235f2 Updated version of messagepack (#17321)
(cherry picked from commit 8a22672c7f)
2024-10-21 11:17:50 +02:00
Andreas ZerbstandGitHub 8a22672c7f Updated version of messagepack (#17321) 2024-10-21 11:15:59 +02:00
Andreas ZerbstandGitHub 11270eaaf5 Updated message pack (#17320) 2024-10-21 11:00:47 +02:00
Justin NevilleandGitHub 1e32d59ecb Query for media using the full file path as well as the original file path for files that contain the sizes in the file name (i.e. image_200x200.jpg) (#17314) 2024-10-21 09:53:17 +02:00
Bjarke BergandGitHub 4be183a20d Do not rely on NuCache to do key/id lookups (#17291)
* Fixes #17182

* Ensure wait-on is installed
2024-10-21 09:49:34 +02:00
Kenn JacobsenandGitHub eab27123dd MNTP: Re-initialize contextual dialog options upon content creation (#17301) 2024-10-18 09:39:29 +02:00
Kenn JacobsenandGitHub a6253957c8 MNTP: Improve site and root context for dynamic root (#17303) 2024-10-18 09:17:17 +02:00
Jacob OvergaardandGitHub a8f5631144 V13: Update @umbraco-ui/uui to 1.11.0 (#17281)
* build(deps): update @umbraco-ui/uui from 1.7.1 to 1.11.0

* fix: umb-login-element no attributes

Cherry-picked a fix from V14 where the custom login input component was no longer needed, which was fixed because it errors out. This simplifies the login form.

* cherry-pick code to handle 'enter' click from v14
2024-10-17 10:25:02 +01:00
Andreas ZerbstandGitHub ba1080541b Updated to string.empty (#17294) 2024-10-17 09:59:41 +02:00
Jacob Overgaard 1581eb61d3 V15: Rich Text Editor links do not work with query strings and anchors (#17288)
* fix: anchors and query strings do not work

Since the change from UDIs to localLinks in href, the pattern matched a little too much in the href section completely ignoring any "extras" such as querystrings and anchors after the locallink, which meant that the locallink did not get replaced at all if they were present. This is fixed by limiting the regexp a bit.

* fix: legacy links do not follow the same regexp as new links

Because we are no longer matching the whole `href` attribute but only some of its contents, we need to fix up the old pattern. It has been extended with matching groups that follow the same pattern as the new links.

* feat: allow a-tags to be multiline

example:

```html
<a
  type="document"
  href="/{localLink:<GUID>}">
Test
</a>
```

* fix: split regex into two parts: first a tokenizer for a-tags and then a type-finder

* fix: ensure only "document" and "media" are matching to speed up the pattern

* feat: allow a-tags to be multiline

(cherry picked from commit 35e8f2e460)
2024-10-17 09:06:48 +02:00
Jason ElkinandNikolaj Geisle 6d98162e19 Unlock form after unsuccessful save and publish. (#17285)
(cherry picked from commit ee37ad0f4b)
2024-10-16 15:09:31 +02:00
Jason ElkinandGitHub ee37ad0f4b Unlock form after unsuccessful save and publish. (#17285) 2024-10-16 15:08:37 +02:00
Andreas ZerbstandGitHub 2b3a91757d V14 QA added user permission tests (#17226)
* Added test

* Small changes

* Added content start node tests

* Added media start node tests

* Cleaned up

* More updates

* Cleaned up

* Added wait

* Cleaned up

* Bumped helpers

* Updated to run user tests

* Fixed user tests

* Bumped helpers

* Added missing semicolon

* Fixes based on comments

* Run smoke tests
2024-10-16 13:26:36 +02:00
Andreas ZerbstandGitHub 00563013b6 V14 QA Updated package E2E tests (#17236)
* Updated tests

* Cleaned package tests

* Updated package test file

* Bumped version

* Added missing semicolons

* Run all smoke tests

* Run smoke tests
2024-10-16 12:46:24 +02:00
Ronald BarendseandBjarke Berg 378d4ecfef Fix ContentStore locking exceptions in async code (#17246)
* Add ContentCache test

* Use SemaphoreSlim as write lock

* Apply lock imrpovements to SnapDictionary

* Obsolete unused MonitorLock

(cherry picked from commit c3db3457e7)
2024-10-16 12:34:44 +02:00
Andreas ZerbstandBjarke Berg a497f3f4dd Updated nuget package (#17286)
(cherry picked from commit 5183391a86)
2024-10-16 12:24:31 +02:00
Bjarke BergandGitHub 2d71b5a63b Updated image sharp to a non vulnerable version (#17290) 2024-10-16 12:16:38 +02:00
Bjarke BergandGitHub f4f83bccbe Added an explicit dependency to Microsoft.Extensions.Caching.Memory to force it to use a non-vulnerable version (#17287) 2024-10-16 10:25:17 +02:00
Andreas ZerbstandGitHub 5183391a86 Updated nuget package (#17286) 2024-10-16 10:07:25 +02:00
Nhu DinhandGitHub 0551976126 V14 QA Added acceptance tests for notification message (#17195)
* Updated step to verify the notification message

* Added tests for notification message

* Bumped version

* Updated expected notification message

* Bumped version
2024-10-14 13:26:55 +07:00
Nhu DinhandGitHub da2a4d1713 V14 QA Added the acceptance tests for rendering content with textstring (#17247)
* Added tests for textstring in the rendered content

* Updated tests for rendering content with textstring

* Added tests for rendering content with numeric

* Added tests for rendering content with textarea

* Removed tests

* Bumped version

* Make all tests for rendering content run in the pipeline

* Make all smoke tests run in the pipeline
2024-10-14 11:57:52 +07:00
Nhu DinhandGitHub 9f5867bdf8 V14 QA Fixing the failing acceptance tests in the pipeline v14 (#17214)
* Added more waits

* Updated assert steps

* Fixed api method name

* Added more waits to avoid the failing test in window

* Updated tests due to business changes

* Added more waits to avoid the failing tests in window

* Updated test due to Ui changes

* Bumped version

* Bumped version of test helper

* Bumped version
2024-10-11 12:15:49 +02:00
Ronald BarendseandBjarke Berg 30b114d538 Fix ContentStore locking exceptions in async code (#17246)
* Add ContentCache test

* Use SemaphoreSlim as write lock

* Apply lock imrpovements to SnapDictionary

* Obsolete unused MonitorLock

(cherry picked from commit c3db3457e7)
2024-10-11 09:47:31 +02:00
Ronald BarendseandGitHub c3db3457e7 Fix ContentStore locking exceptions in async code (#17246)
* Add ContentCache test

* Use SemaphoreSlim as write lock

* Apply lock imrpovements to SnapDictionary

* Obsolete unused MonitorLock
2024-10-11 09:45:01 +02:00
Sven GeusensandGitHub 7787af2df1 Fix install url detection (#17241) 2024-10-10 18:09:11 +02:00
Wojciech WróbelandJacob Overgaard 3730109cce Fixed issue #17225. The 'code' html element added as valid to RTE configuration 2024-10-09 14:19:38 +02:00
Nikolaj Geisle b814608c06 Bump version 2024-10-08 12:34:23 +02:00
Jacob Overgaard ed63b51e46 update backoffice submodule 2024-10-07 15:46:21 +02:00
Jacob Overgaard ea608cc630 update backoffice submodule 2024-10-07 15:46:06 +02:00
Jacob Overgaard 4cfe498628 update backoffice submodule 2024-10-07 13:45:04 +02:00
Jacob Overgaard 42912dd5c9 update backoffice submodule 2024-10-07 13:44:18 +02:00
Nikolaj Geisle 9bab74d30e Bump version.json 2024-10-07 11:55:34 +02:00
Nikolaj Geisle 865787db1d Bump version.json 2024-10-07 11:48:41 +02:00
Bjarke Berg c58a7b7b23 Merge remote-tracking branch 'origin/release/14.3' into v14/dev 2024-10-03 07:50:18 +02:00
Bjarke Berg 32c00f9a09 Merge remote-tracking branch 'origin/release/14.3' into release/14.3 2024-10-01 17:40:35 +02:00
Bjarke Berg 348f1f2bae Change webhook permissions to require webhook tree access for all endpoints 2024-10-01 07:58:41 +02:00
Jacob Overgaard 73c8d8e0f9 Merge remote-tracking branch 'origin/release/14.3' into release/14.3 2024-09-30 10:24:17 +02:00
Jacob Overgaard 2d7c00f27f update backoffice submodule 2024-09-30 10:24:03 +02:00
Andreas ZerbstandGitHub 4fae91d55c V14 QA added content tests with list view content (#17115)
* Added tests for List view

* More tests

* Added rest of test

* Bumped version

* Fixed failing tests

* Added tests and fixed comments

* Cleaned up tests

* Bumped testhelpers

* Bumped again

* Set condition to only run sql server when enabled

* Run all content test

* Reverted changes
2024-09-27 17:32:44 +02:00
Sebastiaan Janssen 6c08f69801 Merge branch 'contrib' into v14/dev 2024-09-27 09:04:32 +02:00
Sebastiaan Janssen 910fb4062b Merge branch 'v14/dev' into contrib 2024-09-27 08:54:49 +02:00
Bjarke Berg f2e4e44db1 Merge remote-tracking branch 'origin/release/14.3' into v14/dev 2024-09-27 07:47:59 +02:00
Bjarke Berg d57d12d54d Fixed imagesharp 2 also 2024-09-27 07:43:12 +02:00
NguyenThuyLanandBjarke Berg 46604909be Fix error format code (#17146)
* update ImageSharpMiddlewareOption for fixing invalid width and height (#17126)

Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>

* Fix issue format parameters

---------

Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>

(cherry picked from commit 9a12eea495)
2024-09-27 07:42:30 +02:00
9a12eea495 Fix error format code (#17146)
* update ImageSharpMiddlewareOption for fixing invalid width and height (#17126)

Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>

* Fix issue format parameters

---------

Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
2024-09-27 07:41:55 +02:00
NguyenThuyLanandBjarke Berg 762d72b018 update ImageSharpMiddlewareOption for fixing invalid width and height (#17126)
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
(cherry picked from commit 9b19d63a6a)
2024-09-27 07:40:42 +02:00
Nhu DinhandGitHub 45f43a6b7a V14 Added Content tests with different document types properties (#17131)
* Added tests for Allow At Root property

* Added Content tests for Allowed Child Nodes property

* Added Content tests for the Allow at root property

* Added Content tests for the Allowed child node property

* Added Content tests for the Collection property

* Added Content tests with allow vary by culture

* Added more waits

* Updated tests due to api helper changes

* Added Content tests with allowed templates

* Bumped version of test helper

* Updated code due to api helper changes

* Fixed naming
2024-09-27 10:36:15 +07:00
Jacob Overgaard c9c9374de1 update backoffice submodule 2024-09-26 14:39:12 +02:00
Jacob Overgaard 6bd558c016 update backoffice submodule 2024-09-26 14:38:27 +02:00
Bjarke Berg f1cddd91c6 Missing context complete
(cherry picked from commit fdb9cfa3e7)
2024-09-26 09:55:19 +02:00
Bjarke Berg fdb9cfa3e7 Missing context complete 2024-09-26 09:54:43 +02:00
Bjarke Berg 009394982c Merge remote-tracking branch 'origin/release/14.3' into v14/dev 2024-09-26 08:54:19 +02:00
Jacob Overgaard a43db4ff05 update backoffice submodule 2024-09-26 08:52:40 +02:00
Jacob Overgaard 8c4780380d update backoffice submodule 2024-09-26 08:51:36 +02:00
Kenn JacobsenandBjarke Berg d3a67fe4e0 Move all V14 User and User Group migration to pre-migrations (#17130)
(cherry picked from commit 910d70302e)
2024-09-26 08:45:37 +02:00
Kenn JacobsenandGitHub 910d70302e Move all V14 User and User Group migration to pre-migrations (#17130) 2024-09-26 08:45:08 +02:00
Bjarke Berg 63a487bc0b Merge remote-tracking branch 'origin/v13/dev' into v13/dev 2024-09-26 07:54:43 +02:00
Ronald BarendseandBjarke Berg a40eadcfce Add RemoveDefault() extension method to fluent API for CMS webhook events (#15424)
* Add RemoveDefault extension method

* Move default webhook event types to single list

(cherry picked from commit 8f26263178)
2024-09-26 07:54:26 +02:00
Ronald BarendseandBjarke Berg 0c1daa290b Add RemoveDefault() extension method to fluent API for CMS webhook events (#15424)
* Add RemoveDefault extension method

* Move default webhook event types to single list

(cherry picked from commit 8f26263178)
2024-09-26 07:53:54 +02:00
Ronald BarendseandGitHub 8f26263178 Add RemoveDefault() extension method to fluent API for CMS webhook events (#15424)
* Add RemoveDefault extension method

* Move default webhook event types to single list
2024-09-26 07:52:39 +02:00
Ronald BarendseandBjarke Berg 635d9b83f9 Use version of the assembly with the same name as the package ID (#16544)
(cherry picked from commit 14a0e62278)
2024-09-26 07:51:35 +02:00
Ronald BarendseandGitHub 14a0e62278 Use version of the assembly with the same name as the package ID (#16544) 2024-09-26 07:51:16 +02:00
Ronald BarendseandBjarke Berg a76af1de9d Fix IContentBase.GetUdi() extension method to support document-blueprint entity type (#16939)
* Add tests for all UDI entity types

* Fix IContentBase UDI entity type for blueprints

* Remove redundant switch statements and reorder methods

(cherry picked from commit 609b5f76d4)
2024-09-26 07:48:10 +02:00
Ronald BarendseandGitHub 609b5f76d4 Fix IContentBase.GetUdi() extension method to support document-blueprint entity type (#16939)
* Add tests for all UDI entity types

* Fix IContentBase UDI entity type for blueprints

* Remove redundant switch statements and reorder methods
2024-09-26 07:47:33 +02:00
9b19d63a6a update ImageSharpMiddlewareOption for fixing invalid width and height (#17126)
Co-authored-by: Lan Nguyen Thuy <lnt@umbraco.dk>
2024-09-25 13:19:09 +02:00
Andreas ZerbstandGitHub e4dacf5c8c V14 QA fixed E2E tests for SQL server (#17122)
* Updated version of test helpers

* Added option to run smoke tests

* Found the issue

* Fixed pipeline

* Removed duplicate file creation

* Removed

* Always run sql server tests

* Removed unused parameter

* Enables sqlServer E2E to run on pipeline

* Removed comment
2024-09-25 07:04:12 +02:00
dependabot[bot]andJacob Overgaard 99125ef5cc Bump rollup from 4.21.3 to 4.22.4 in /src/Umbraco.Web.UI.Login
Bumps [rollup](https://github.com/rollup/rollup) from 4.21.3 to 4.22.4.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.21.3...v4.22.4)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-24 14:43:07 +02:00
Jacob Overgaard 264fbb6987 update backoffice submodule 2024-09-24 14:34:00 +02:00
Emma L GarlandandGitHub ac575662ac Resolved more warnings, and marked more warning types as errors (#16991)
* Fix warnings SA1111, SA1028, SA1500, IDE1270  in Umbraco.Web.Website, and updated rules.

* Remove warnings: IDE0270: Null check can be simplified

* More SqlServer project warnings resolved

* CS0105 namespace appeared already

* Suppress warning until implementation:

#pragma warning disable CS0162 // Unreachable code detected
#pragma warning disable CS0618 // Type or member is obsolete

CS0162 remove unreachable code
SA1028 remove trailing whitespace
SA1106 no empty statements
CS1570 malformed XML
CS1572 corrected xml parameter
CS1573 param tag added
IDE0007 var not explicit
IDE0008 explicit not var
IDE0057 simplify substring
IDE0074 compound assignment
CA1825 array.empty

Down to 3479 warnings

* - SA1116, SA117 params on same line
- IDE0057 substring simplified

Specific warnings for Umbraco.Tests.Benchmarks

* Fixed IDE0074 compound assignment and added specific warnings for Umbraco.Tests.Common

* Specific warnings for Umbraco.Tests.Integration and Umbraco.Tests.Common

Fixed:

- SA1111, SA1116, SA117 params and line formatting (not all as there are many)
- SA1122 string.Empty
- IDE0057 simplify substring
- IDE0044,IDE0044 make field readonly
- IDE1006 naming rule violation (add _)
- SA1111 closing parenthesis on line of last parameter
- SA1649 filename match type name
- SA1312,SA1306 lowercase variable and field names

* Fixed various warnings where they are more straight-forward, including:

- SA1649 file name match type name
- SA111 parenthesis on line of last parameter
- IDE0028 simplify collection initializer
- SA1306 lower-case letter field
- IDE044 readonly field
- SA1122 string.Empty
- SA1116 params same line
- IDE1006 upper casing
- IDE0041 simplify null check

Updated the following projects to only list their remaining specific warning codes:

- Umbraco.Tests.UnitTests

Typo in `Umbraco.Web.Website` project

* Reverted test change

* Now 1556 warnings.

Fixed various warnings where they are more straight-forward, including:

- SA1111/SA1116/SA1119 parenthesis
- SA1117 params
- SA1312 lowercase variable
- SA1121 built-in type
- SA1500/SA1513/SA1503 formatting braces
- SA1400 declare access modifier
- SA1122 string.Empty
- SA1310 no underscore
- IDE0049 name simplified
- IDE0057 simplify substring
- IDE0074 compound assignment
- IDE0032 use auto-property
- IDE0037 simplify member name
- IDE0008 explicit type not var
- IDE0016/IDE0270/IDE0041 simplify null checks
- IDE0048/SA1407 clarity in arithmetic
- IDE1006 correct param names
- IDE0042 deconstruct variable
- IDE0044 readonly
- IDE0018 inline variable declarations
- IDE0074/IDE0054 compound assignment
- IDE1006 naming
- CS1573 param XML
- CS0168 unused variable

Comment formatting in project files for consistency.

Updated all projects to only list remaining specific warning codes as warnings instead of errors (errors is now default).

* Type not var, and more warning exceptions

* Tweaked merge issue, readded comment about rollback

* Readded comment re rollback.

* Readded comments

* Comment tweak

* Comment tweak
2024-09-24 12:56:28 +01:00
Terence BurridgeandSebastiaan Janssen 6939472f37 Update valid reasons not to have a template on a content node to include having a redirect field
Cherry-picked from: 385a5345b1
2024-09-23 14:30:13 +02:00
Sebastiaan Janssen 0387307301 Merge branch 'v13/dev' into v13/contrib 2024-09-23 14:27:48 +02:00
Andreas ZerbstandAndreas Zerbst e92b4f3172 V15 QA Enabled Nightly E2E Pipeline to run on V15 (#17103)
* Uncommented

* Added timeout

(cherry picked from commit 142db8c0fb)
2024-09-23 14:00:32 +02:00
Jacob Overgaard c70c8d86f9 update backoffice submodule 2024-09-23 09:58:52 +02:00
Bjarke Berg e733ec1717 Merge remote-tracking branch 'origin/release/14.3' into v14/dev 2024-09-18 13:48:55 +02:00
Bjarke Berg fa7b81474c Bump version to 14.3.0 2024-09-18 13:48:23 +02:00
Bjarke Berg 753aa6f9db Fixed version 2024-09-18 13:46:05 +02:00
Bjarke Berg 59aac9053f Bump version 2024-09-18 13:17:16 +02:00
Bjarke Berg 234c2673f6 Allow the client to send all content, with all languages, even when the user do not have permissions to save a specific language. (#17052)
(cherry picked from commit c5243e562e)
2024-09-18 13:16:25 +02:00
Bjarke Berg d2d6d3493f Revert "Bump version"
This reverts commit f8e26f5ba1.
2024-09-18 13:15:59 +02:00
Bjarke BergandGitHub c5243e562e Allow the client to send all content, with all languages, even when the user do not have permissions to save a specific language. (#17052) 2024-09-18 13:10:15 +02:00
Bjarke Berg 5c857aa97d Bump version 2024-09-18 12:57:05 +02:00
Bjarke Berg f8e26f5ba1 Bump version 2024-09-18 12:56:19 +02:00
Bjarke Berg 25a5dde8e9 Merge remote-tracking branch 'origin/release/13.5' into v13/dev
# Conflicts:
#	version.json
2024-09-18 12:55:35 +02:00
Bjarke Berg 47d843f424 Merge remote-tracking branch 'refs/remotes/origin/contrib' into v14/dev
# Conflicts:
#	tests/Umbraco.Tests.AcceptanceTest/package-lock.json
2024-09-18 11:05:15 +02:00
dependabot[bot]andJacob Overgaard c8899afed6 Bump vite from 5.3.1 to 5.4.6 in /src/Umbraco.Web.UI.Login
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.3.1 to 5.4.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.4.6/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.4.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-18 10:31:40 +02:00
Jacob Overgaard 939b2aaa3d update backoffice submodule to 14.3 release branch 2024-09-18 09:45:21 +02:00
Bjarke Berg 2e068bb73e Merge remote-tracking branch 'origin/release/13.5' into release/13.5 2024-09-17 14:51:05 +02:00
Bjarke Berg 842cacde19 Bump version 2024-09-17 14:50:57 +02:00
f72c39ef59 V14: Fix templates not having set master template on package install (#16978)
* Reorder templates to save master templates first, and use new ITemplateService

* Add obsoletion

* Fix if statement

* Refactor async calls into async method to avoid multiple get awaiters

* Update interface

* Avoid breaking changes

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-09-17 14:43:05 +02:00
MoleandGitHub 991b9a791e Updaet template to reference 13.5 (#17063) 2024-09-17 14:42:25 +02:00
Bjarke BergandGitHub 920591bcd1 Updated the assembly names to avoid a debug-warning in the log (#16997) 2024-09-17 14:41:29 +02:00
Dennis ÖhmanandSebastiaan Janssen 6a453a0910 v13.5 - New Swedish translation crashes Umbraco, removed duplicate areas. (#17059)
Cherry-picked from d64bf5de22
2024-09-17 14:04:22 +02:00
Sebastiaan Janssen ff9903b14d Merge branch 'v13/contrib' of https://github.com/umbraco/Umbraco-CMS into v13/contrib 2024-09-17 13:58:37 +02:00
Dennis ÖhmanandGitHub d64bf5de22 v13.5 - New Swedish translation crashes Umbraco, removed duplicate areas. (#17059) 2024-09-17 13:56:58 +02:00
Sebastiaan Janssen 9300d867fb Merge branch 'v13/dev' into v13/contrib 2024-09-17 13:12:04 +02:00
Andreas ZerbstandGitHub 66aeafe797 V14 QA Content with upload video (#17066)
* Added tests for upload video in content

* Added ogv file

* Added ogv to test

* Reverted smokeTest command
2024-09-17 12:13:35 +02:00
Andreas ZerbstandGitHub f32d40a35e V14 QA Content with vector graphics (#17065)
* Added tests for Upload vector graphics

* Run all content tests

* Fixed indentation

* Reverted smokeTest string
2024-09-17 12:13:10 +02:00
Jacob Overgaard 625366f82b update backoffice submodule 2024-09-17 11:46:51 +02:00
Jacob Overgaard 8ebc44f959 update OpenApi.json 2024-09-17 11:01:30 +02:00
Kenn JacobsenandJacob Overgaard e6f379034f Add notification alias to document notifications endpoint output (#17028) 2024-09-17 10:59:33 +02:00
Niels LyngsøandGitHub eb0f8b5c24 fire change event (#17078) 2024-09-17 10:06:16 +02:00
Niels LyngsøandGitHub d58768f26d utilize lock unlock events for readonly mode while saving (#17077) 2024-09-17 09:52:00 +02:00
Niels LyngsøandGitHub 3667217053 only resolve if value is present (#17070) 2024-09-17 09:51:47 +02:00
Andreas ZerbstandGitHub d12dedb526 V14 QA update fetch depth (#17068)
* Removed fetch depth

* Added fetch depth 0
2024-09-17 10:16:29 +07:00
Bjarke BergandGitHub 017209c5ba Updated nuget packages (#17062) 2024-09-16 12:15:36 +02:00
Andreas ZerbstandGitHub 48e4cdaa88 V14 QA new E2E test pipeline (#17064)
* Added E2E pipeline

* Set up CI with Azure Pipelines

[skip ci]

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Updated solution file

* Added fetch depth

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Added a step for installing wait-on

* Added runSqlServerE2ETests

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Updated pipeline so we only run smoke

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Update nightly-E2E-test-pipelines.yml for Azure Pipelines

* Removed pipeline
2024-09-16 10:13:26 +02:00
Jacob Overgaard ce379bc153 update backoffice submodule 2024-09-13 13:54:43 +02:00
Bjarke Berg 26bf04c085 Merge remote-tracking branch 'origin/v13/dev' into v14/dev 2024-09-13 08:12:23 +02:00
Sven Geusens b237285703 Merge branch 'release/13.5' into v13/dev and version bump 2024-09-12 15:12:20 +02:00
Andreas ZerbstandGitHub a96a304860 V14 Fix E2E tests (#17011)
* Fixed tests

* Fixed tests

* Added timeout

* Fixed rest of the failing tests

* Bumped version

* Added timeout

* Bumped version of helpers

* Added parameter

* Applied fixes for tests and did some skips

* Small changes

* Bumped version

* Fixed comments
2024-09-12 11:04:12 +02:00
Kenn JacobsenandGitHub 3d3f6b5021 Add endpoint for upgrade checks (#17026)
* Fix upgrade check repo, so it's able to check more than once :)

* Add VersionCheckPeriod to server configuration output

* Add upgrade check endpoint

* Obsolete unused response model

* Update OpenAPI JSON
2024-09-11 17:08:50 +02:00
Jacob Overgaard 78aaafedc7 update backoffice submodule 2024-09-11 07:53:34 +02:00
Sven Geusens a6c5581942 Update version to non RC 2024-09-10 18:10:57 +02:00
Sven GeusensandGitHub 9a088d36b9 Expand RedirectUrl.Url storage type to avoid truncation (#17038)
* Add migration to expand RedirectUrl.Url to varcharMax

* Simplify Migration

* readded notnull attribute
2024-09-10 18:07:20 +02:00
Emma L GarlandandGitHub 862820c6a6 Resolved more warnings, and marked more warning types as errors (#16990)
* Fix warnings SA1111, SA1028, SA1500, IDE1270  in Umbraco.Web.Website, and updated rules.

* Remove warnings: IDE0270: Null check can be simplified

* More SqlServer project warnings resolved

* CS0105 namespace appeared already

* Suppress warning until implementation:

#pragma warning disable CS0162 // Unreachable code detected
#pragma warning disable CS0618 // Type or member is obsolete

CS0162 remove unreachable code
SA1028 remove trailing whitespace
SA1106 no empty statements
CS1570 malformed XML
CS1572 corrected xml parameter
CS1573 param tag added
IDE0007 var not explicit
IDE0008 explicit not var
IDE0057 simplify substring
IDE0074 compound assignment
CA1825 array.empty

Down to 3479 warnings
2024-09-10 15:17:29 +01:00
Sven Geusens 407734ff4a Fix null reference exception in CacheValues.For when building the CompositeStringStringKey (#17024)
* Fix null ref exeption based on IPropertyValue.Culture documentation

* Clarify comment
2024-09-10 12:50:02 +02:00
Sven GeusensandGitHub a74d963cfa Fix null reference exception in CacheValues.For when building the CompositeStringStringKey (#17024)
* Fix null ref exeption based on IPropertyValue.Culture documentation

* Clarify comment
2024-09-09 18:13:14 +02:00
Jacob Overgaard a30827145c update backoffice submodule 2024-09-09 16:01:25 +02:00
Niels LyngsøandNiels Lyngsø 02a47695e7 dispatch change event when embedded media has been added (#17008) 2024-09-09 13:09:31 +02:00
Niels Lyngsø 0f37cd3a45 PR 17018 2024-09-09 13:07:47 +02:00
Yari MariënandGitHub 5fe18bb78c Content.EditorDirectiveController: added formSubmittedValidationFailed broadcast to prevent fields to stay disabled (#17018) 2024-09-09 13:05:12 +02:00
Niels LyngsøandGitHub b16dfa9ca1 dispatch change event when embedded media has been added (#17008) 2024-09-09 12:49:07 +02:00
kasparboelkjeldsenandGitHub 3d5e70654b ModelsGenerator to IModelsGenerator in BuildModelsBuilderController (#16919)
* ModelsGenerator to IModelsGenerator in BuildModelsBuilderController

* Added obsolete constructors for backwards compatibility
2024-09-09 08:06:52 +02:00
marwaldvandMatthew-Wise 7acce83c83 Update LogDto.cs
fix: issue resolved, where content saving breaks due to saving to umbracoLog with error message like that: String or binary data would be truncated in table 'dto.umbracoLog', column 'parameters'. Truncated value: 'English (United States), German (Switzerland), French (France), Italian (Italy), Arabic (Iraq), Pers'...
2024-09-05 14:55:35 +02:00
3e6116fcba No longer shows success message if content moving is cancelled (#15051)
* Fix for issue https://github.com/umbraco/Umbraco-CMS/issues/13923
 - Added AttemptMove method to the ContentService
 - Updated ContentController PostMove method to return ValidationProblem whenever the node is not moved

* Align changes with V14 solution. Make it non breaking.

---------

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
2024-09-05 14:08:48 +02:00
Bjarke Berg 3b3c9c57ca Merge remote-tracking branch 'refs/remotes/origin/v13/dev' into v14/dev 2024-09-04 14:20:43 +02:00
Ronald BarendseandGitHub ef3bf496e9 Avoid concurrent build of Umbraco.JsonSchema tool and add execution timeouts to Exec build tasks (#17006)
* Disable building Umbraco.JsonSchema and Umbraco.Tests.AcceptanceTest.UmbracoProject

* Add 10 minute timeout to Exec MSBuild tasks
2024-09-04 13:44:19 +02:00
087a01de83 V14/fix/cookie breaking installer (#16993)
* Do not run authentication if Umbraco is not ready for it. Fail instead.

* Fix breaking change

* Spelling + code style :)

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-09-03 11:05:22 +02:00
Sebastiaan Janssen bff293213d Merge branch 'v13/dev' into v13/contrib 2024-09-03 11:01:39 +02:00
a47a1775f2 Prevent templates being editable when using Production runtime mode (#16923)
Co-authored-by: Nick Hoang <nick@codeberwery.com>
Co-authored-by: Jason Elkin <jason@bumpdigital.co.uk>
2024-09-03 00:54:32 +01:00
Jacob Overgaard 9321774613 Merge branch 'v14/dev' of github.com:umbraco/Umbraco-CMS into v14/dev 2024-08-29 11:38:35 +02:00
Jacob Overgaard 590b28110b update backoffice submodule 2024-08-29 11:38:24 +02:00
c277005b62 improve missingProperties data returned for missing propertie values (#16910)
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-08-29 10:12:43 +02:00
Andreas ZerbstandGitHub 6851113cf1 V14 QA added block list editor tests (#16862)
* Added tests for blocklistEditor

* Added more tets

* Removed faker

* Added blockTest

* Updates

* Added tests

* Removed dependencies

* Fixes

* Clean up

* Fixed naming

* Cleaned up

* Bumped version

* Added missing semicolons

* Added tags

* Only runs the new tests

* Updates

* Bumped version

* Fixed tests

* Cleaned up

* Updated version

* Fixes, not done

* Fixed tests

* Bumped helpers

* Bumped helpers

* Fixed conflict

* Fixed comment

* Reverted to run smokeTests

* Updated helpers
2024-08-29 08:47:24 +02:00
Jason Elkin b2a2df7a8a Ignore Visual Studio's generated launchSettings file. 2024-08-28 14:08:52 +01:00
Sven Geusens 34179f5b7d Merge branch 'release/13.5' into v13/dev and bump version 2024-08-28 10:14:09 +02:00
98e9a300bc Treat warnings as errors for initial projects (#15019)
* Treat warnings as errors for Umbraco.Cms, Umbraco.Cms.Api.Common and Umbraco.Cms.Api.Delivery projects.

* Treat warnings as errors for Umbraco.Cms.Imaging.ImageSharp and Umbraco.Cms.Imaging.ImageSharp2 projects

* Treat warnings as errors for Umbraco.Cms.Persistence.EFCore.Sqlite, Umbraco.Cms.Persistence.EFCore.SqlServer and Umbraco.Cms.StaticAssets

* Treat warnings as errors for Umbraco.Cms.Targets

* Treat warnings as errors for templates/Umbraco.Templates and Umbraco.JsonSchema

* More projects with warnings as errors.

* Reverted warnings as errors due to some file changes since the update.

* Remove unwanted tag

* Removed warnings as errors on TestData project

* Implement warnings as errors in props file, and exclude specific warnings where appropriate as per PR review suggestions.

* Reverted spaces

* Revert "Reverted spaces"

This reverts commit 3734c45e22.

* Update sdk version to fully support Umbraco.code 2.2.0 dependency on Microsoft.CodeAnalysis.CSharp.Workspaces 4.10.0

* Ignore PathToLongErrors for now in static assets

---------

Co-authored-by: Emma Garland <emma.garland@rocksolidknowledge.com>
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-08-27 18:56:09 +02:00
Sven GeusensandGitHub 95f08e748e Update sdk version to fully support Umbraco.code 2.2.0 dependency on Microsoft.CodeAnalysis.CSharp.Workspaces 4.10.0 (#16963) 2024-08-27 18:55:42 +02:00
Sven Geusens d38b744c08 Merge branch 'v13/dev' into release/13.5 2024-08-27 18:54:54 +02:00
Jacob OvergaardandGitHub 04d96c6a94 fix: appEntryPoint types are not executed unless we have the UmbappEntryPointExtensionInitializer running (#16967) 2024-08-27 16:07:50 +01:00
Niels LyngsøandGitHub ef58416814 V13: Read only mode while saving (#16961)
* make a clear console error when case happens

* turn Content into readonly mode when submitting form aka saving
2024-08-27 15:01:59 +01:00
Sven GeusensandGitHub 62b7c9468e Fix undefined property read (#16941) 2024-08-27 14:28:04 +01:00
Sven GeusensandGitHub 27108036b4 Support parentId in document/media item search endpoints (#16933)
* Updated search services to start searching from a guid based key.

* Solved api breaking changes with new minor version

* Ordering and formatting

* Changed interface default implementation to the new method...

* Consolidated version

* PR review cleanup and renaming
2024-08-27 15:18:25 +02:00
148d51bf8c Remove warnings from Umbraco.Web.UI (#16958)
* Fixed warning SA1119 for Umbraco.Web.UI project (unnecessary parenthesis)

* Remove parenthesis (startup no longer exists)

---------

Co-authored-by: Emma Garland <emma.garland@rocksolidknowledge.com>
2024-08-27 11:29:02 +01:00
Andreas ZerbstandGitHub 3f8bae1a29 V14 QA added Block grid acceptance tests (#16908)
* Added blockgrid tests

* Additional tests

* Added more tets

* Split tests

* Block updates

* Bumped version

* Added block tests

* Fixes, not done

* Fixed

* Updated helper

* Bumped version

* Bumped helpers

* Fixed conflicts

* Removed page

* Removed page

* Bumped

* Reverted to run smoke tests
2024-08-27 10:36:44 +02:00
Nhu DinhandGitHub c5e5fa2dd1 V14 QA Added Content tests with various of data types (#16824)
* Added Content tests with content picker

* Removed the test for content picker

* Added Content tests with the default content picker

* Added more Content tests with Content Picker data type

* Added the Content tests with Dropdown

* Added Content tests with Image Cropper

* Updated upload file method due to test helper changes

* Added Content tests with Image Cropper

* Added Content tests with Image Cropper data type

* Added Content tests with Media Picker data type

* Updated Media tests due to ui helper changes

* Bumped version of test helper and json builder

* Make all Content tests run in pipeline - should remove it before merging

* Fixed the name of tests

* Updated the tests for Media Picker in Content section

* Added the Content tests with Multiple Media Picker

* Updated the Content test with Content Picker due to the test helper changes

* Bumped version of test helper

* Fixed the failing tests for Content

* Removed Image Cropper test in this branch

* Added more waits

* Added smoke tags

* Make smoke tests run in the pipeline

* Added Content tests for Image Cropper

* Added smoke tags to make all Image Cropper tests running in the pipeline

* Added Content tests with Member Picker

* Added Content tests with Multiple Image Media Picker

* Added Content tests with Numeric

* Bumped version of test helper

* Make all Content tests running in the pipeline

* Assert that the content is published

* Assert that the content is published

* Fixed code conflict

* Fixed comment and code conflict

* Make all Content tests run in the pipeline

* Refactor the Content tests with different data type

* Cleaned code

* Make the smoke tests run in the pipeline
2024-08-27 13:53:35 +07:00
Bjarke BergandGitHub bafdb21b45 Fix mandatory RTE validation (#16962)
* Added a custom RichTextRequiredValidator, to check that the empty richtext object (still with json) can be required or not. We are now testing the markdown needs to have a value

* Fixed namespaced and moved back wrong class

* Cleanup
2024-08-26 15:03:11 +02:00
MoleandGitHub a31e4265bd Improve dotnet templates (#16815)
* Add delivery api toggle

* Add Dockerfile

* add docker compose template

* Ensure no duplicate database containers

* Remove wwwroot/umbraco permission check

We don't need write access to this folder

* Provide environment variables from dokcer-compose

* Build as debug from compose

The compose file is intended to be used for local dev

* Don't store password in docker files

Still not great to store it in .env but it's fine for dev

* Add additional template files

* Add docker ignore file

* Enable delivery API in settings too

* Enable models builder mode toggle

* Add WIP for umbraco release option

* Add starterkit option

* Add option to chose LTS or latest

* Add development mode option

* Add descriptions

* Add display names

* Add backoffice development at explicit default

* Rearrange DevelopmentMode before ModelsBuilderMode

* Allow specifying a port for the compose file

* Add some notes

* Move starterkits into its own template

* Don't update version

* Remove test configuration from Dockerfile

* Add default modelsbuilder option

* Update descriptions

* overwrite default values in IDE development

* Remove obsolete runtime minification

* Try and fix healthcheck

* Don't use post action for starterkit

otherwise it won't work with Rider, also make the version 13.0.0 if LTS is chosen

* Move UmbracoVersion above FinalVersion

Otherwise, rider will use UmbracoVersion for some weird reason

* Fix healthcheck

* Use else instead of second if for modelsbuilder

* Obsolete UmbracoVersion

* Remove custom release option

* Use forward slashes for volumes

* Add MSSQL_SA_PASSWORD env variable

* Temporarily limit acceptance tests so it works

* Try again

* Disable SQLServer integration tests

* Set UseHttps to false in appsettings.Development.json

You still want to be able to use non-https when developing locally

* Fix LTS version

LTS still needs installer endpoints added

* Update permissions of wwwroot/umbraco for v13 sites

* Fix conditional in Program.cs

* Undo pipeline shenanigans
2024-08-26 11:21:02 +02:00
Terence BurridgeandEmma L Garland 385a5345b1 Update valid reasons not to have a template on a content node to include having a redirect field 2024-08-25 22:01:38 +01:00
Jason ElkinandMatthew-Wise 862e45eca3 Ignore Visual Studio's generated launchSettings file. 2024-08-25 15:31:51 +01:00
Nhu DinhandGitHub 17d441760d V14 QA Fixed the failing smoke tests (#16953)
* Updated api tests for Data type due to test helper changes

* Fixed Data Type tests due to test helper changes

* Updated the test for edit password due to ui helper changes

* Bumped version
2024-08-23 16:18:28 +07:00
Nhu DinhandGitHub 8eeac2774b V14 Added the Content tests with Upload Article, Upload Audio and Upload File data type (#16945)
* Added the test files for article

* Added Content tests with Upload Article datatype

* Added the audio test files

* Fix format

* Updated the Content tests with Upload Article

* Added Content tests with Upload Audio

* Added Content tests with Upload File

* Bumped version

* Make all Content tests run in the pipeline

* Cleaned code

* Make the smoke tests run in the pipeline
2024-08-23 15:17:30 +07:00
Nhu DinhandGitHub 405fd9724f V14 Added the Content tests with Textarea, Textstring, TrueFalse datatype (#16946)
* Added Contents test with Textarea

* Added Content tests with textstring

* Removed the tests for Textarea property editor

* Added Content tests for TrueFalse data type

* Bumped version of test helper

* Make all Content tests run in the pipeline

* Cleaned code

* Make the smoke tests run in the pipeline
2024-08-23 13:54:14 +07:00
dependabot[bot]andJason Elkin e8051978e9 Bump axios from 1.6.5 to 1.7.4 in /tests/Umbraco.Tests.AcceptanceTest
Bumps [axios](https://github.com/axios/axios) from 1.6.5 to 1.7.4.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.6.5...v1.7.4)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-22 20:49:13 +01:00
Sven Geusens 136753f0b0 Merge branch 'release/14.2' into v14/dev with correct version bump
# Conflicts:
#	version.json
2024-08-22 16:07:40 +02:00
Sven Geusens 1b21caa20a Update backoffice submodule with hotfix for breaking change that broke forms. 2024-08-22 12:14:43 +02:00
Nhu DinhandGitHub bbda1c8330 V14 Added Content tests with Multi URL picker (#16885)
* Added Content tests with Multi URL Picker

* Bumped version of test helper

* Make all Content tests run in the pipeline - remove it before merging

* Added goToSection step

* Fix comments

* Fix comments

* Fixed comments

* Make the smoke tests run in the pipeline
2024-08-22 16:00:35 +07:00
Bjarke BergandGitHub 79080ffa93 Updated nuget packages and take a explicit dependency on Microsoft.IdentityModel.JsonWebTokens (#16935) 2024-08-21 10:25:39 +02:00
Sven GeusensandGitHub f99f821a6d Fix Mismatching constraint names in old migration (#16891)
* Find the constraint name based on table,column,type name instead of hardcoding it

* removed unnecesary using

* Check constraint rename seperatly from column rename
2024-08-21 09:07:09 +02:00
Nikolaj Geisle bf805a181a Bump version 2024-08-20 12:54:19 +02:00
Nikolaj Geisle 66592bfbcc Merge branch 'release/14.1' into release/14.2
# Conflicts:
#	version.json
2024-08-20 12:53:40 +02:00
Sven Geusens 1a69bc9d8b Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	Directory.Packages.props
#	src/Umbraco.Core/EmbeddedResources/Lang/sv.xml
2024-08-20 11:25:31 +02:00
leekelleher 1ff3858a9e update backoffice submodule 2024-08-20 09:56:00 +01:00
Bjarke BergandNikolaj Geisle b76070c794 Merge commit from fork
* Use Debug Mode to determine content of the ProblemDetails

* Cache the debug value
2024-08-19 15:10:44 +02:00
Sven GeusensandNikolaj Geisle 72bef8861d Merge commit from fork 2024-08-19 15:10:24 +02:00
Bjarke BergandGitHub d0c76171dd Merge commit from fork
* Use Debug Mode to determine content of the ProblemDetails

* Cache the debug value
2024-08-19 15:05:02 +02:00
Sven GeusensandGitHub b0988e6136 Merge commit from fork 2024-08-19 15:04:08 +02:00
Nhu DinhandGitHub 20087c8e80 V14 Added the Content tests with Radiobox and Tags datatype (#16909)
* Added Content tests with Radiobox data type - not done

* Removed Content test with Tags property editor

* Added Content tests with Radiobox datatype

* Added Content tests with Tags data type

* Created content with data type via API

* Bumped version of test helper

* Make all Content tests run in the pipeline

* Make all smoke tests run in the pipeline
2024-08-19 13:54:55 +07:00
Matthew CareandGitHub 3b6fbf1a4c Cache a dictionary of dictionaries (#15908)
* Re-commit change

Re-commit change after merge

* Fix issues after merge

Update usings after merge

* Re-delete obsolete

Remove the obsolete method
2024-08-17 15:00:24 +01:00
Emanuel GustafzonandGitHub 9338395a59 Stripped username before login (#16921)
* Stripped username before login
2024-08-16 20:59:10 +01:00
Nikolaj Geisle a3ede67777 bump version 2024-08-16 09:29:03 +02:00
Niels LyngsøandGitHub 3b51475150 move and rename (#16916) 2024-08-15 12:53:57 +02:00
Sebastiaan Janssen b41de5764b Merge branch 'v13/dev' into v13/contrib 2024-08-15 11:28:55 +02:00
PeterandSebastiaan Janssen bb1c36f591 Making method ExecuteAsync virtual. (#16496)
Co-authored-by: Kvyatkovsky, Petr <pkvyatkovsky@qulix.com>
(cherry picked from commit 3a9ef3810b)
2024-08-15 11:15:24 +02:00
Sebastiaan Janssen 3560fc9848 Merge branch 'v14/dev' into contrib 2024-08-15 11:10:30 +02:00
Jason Elkin 80b8b2a4ed Issue-15712: MemberDefaultLockoutTimeInMinutes fix. 2024-08-15 09:51:27 +02:00
Andrii KudandJason Elkin 09f16c33d1 Issue-15712: MemberDefaultLockoutTimeInMinutes fix. 2024-08-15 08:48:58 +01:00
fd100602c2 V14/fix/element switch validation (#16421)
* Added Element <-> Document type switch validation

* Apply HasElementconfigured to block grid and block list

Fix smalle bug + optimization

* Moved some of the logic into warnings trough notifcationhandlers and eventmessages

* Cleanup

* Update openApi spec (merge changes)

* Add IsElement check between parent and child on creation

* Typos

* Transformed HasElementConfigured into HasElementConfigured

* Typo

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* IsElement Validation refactor

Moved validation logic regarding doctype IsElement switch into its own service as it will be consumed by more things down the line

* commit missing services...

* Naming improvements

* Bugfix

* First batch of integration tests for ElementSwitchValidator

* More integration tests!

* Little reformatting

* Changed the default values of block based configuration to match expected values.

---------

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
2024-08-15 07:11:17 +02:00
PeterGitHubKvyatkovsky, Petr <pkvyatkovsky@qulix.com>
3a9ef3810b Making method ExecuteAsync virtual. (#16496)
Co-authored-by: Kvyatkovsky, Petr <pkvyatkovsky@qulix.com>
2024-08-14 21:07:36 +01:00
Andreas ZerbstandGitHub 7a700f3029 V14 QA content image media picker tests (#16890)
* Started some tests for imageMediaPicker

* Added tests

* Added additional test

* Fixed based on updates to helpers

* Bumped versions

* Fixes based on comments

* Updated so we run all content test

* Cleaned
2024-08-14 21:05:09 +02:00
Nikolaj GeisleandGitHub de57523b4f Use browse instead of protect (#16907) 2024-08-14 10:03:35 +02:00
56b3f17355 V14: Don't duplicate audit loggin for media trashing (#16903)
* Remove auditlogging from media service

* Refactor to use backofficeSecurityaccessor to get backoffice user

* Fix constructor error

* Reinstate media service move

* Go back to audit type delete

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-08-13 12:29:29 +02:00
9d94658372 V13: fix 16663 (#16866)
* fix unit testing

* fix server value update case

* PastePropertyResolver for RTE Blocks

---------

Co-authored-by: leekelleher <leekelleher@gmail.com>
2024-08-13 09:43:20 +01:00
Niels LyngsøandGitHub 81f36df066 V13: fix 15516 (#16864)
* fix unit testing

* fix server value update case

* re initialize Block if it was offloaded
2024-08-13 09:25:24 +01:00
Nikolaj Geisle 66ccc92399 change version after merge 2024-08-13 08:57:26 +02:00
Nikolaj Geisle 8aee8a8bc9 Merge branch 'release/14.2' into v14/dev 2024-08-13 08:57:05 +02:00
Nikolaj Geisle a36535b354 bump version 2024-08-13 08:56:18 +02:00
EalseandEmma L Garland 7afc2b9963 fix: uploaded item not selected in media picker 2024-08-12 21:42:35 +01:00
Kenn JacobsenandNikolaj Geisle 79807999ee Add the default date-with-time configuration if missing (#16902) 2024-08-12 16:37:01 +02:00
Kenn JacobsenandGitHub 61a9386209 Add the default date-with-time configuration if missing (#16902) 2024-08-12 14:25:27 +02:00
Kenn JacobsenandZeegaan 506d3b3a9c Fix date conversion on the server-side (#16841)
(cherry picked from commit ceddf8681b)
2024-08-12 13:15:27 +02:00
Kenn JacobsenandGitHub ceddf8681b Fix date conversion on the server-side (#16841) 2024-08-12 12:41:37 +02:00
c288d038dd v14: TryGetUmbracouser default implementation (#16899)
* Add default implementation

* Update src/Umbraco.Core/Security/Authorization/IAuthorizationHelper.cs

Co-authored-by: Bjarke Berg <mail@bergmania.dk>

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-08-12 12:38:28 +02:00
a235591521 Add Content-Security-Policy (CSP) health check (#16830)
* Add CSP Header Check

* Update src/Umbraco.Core/EmbeddedResources/Lang/en.xml

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>

* Update src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>

---------

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
2024-08-12 10:18:20 +02:00
leekelleher 35d6fc2f39 update backoffice submodule 2024-08-12 08:16:20 +01:00
Zeegaan d3d057db60 bumb version.json 2024-08-12 09:04:37 +02:00
Andreas ZerbstandGitHub b30a45a248 V14 QA applied changes from our test helpers (#16889)
* Made fixes based on changes in our test helpers

* Bumped version

* Fixed user tests
2024-08-12 10:28:34 +07:00
leekelleher cae00d49d8 update backoffice submodule 2024-08-08 09:04:34 +01:00
Sven GeusensandGitHub 2e3369a09a Upgrade imagesharp2 dependency (#16883) 2024-08-07 15:20:28 +02:00
Bjarke BergandGitHub 58e515da11 Do not allow save of invalid domains (#16880) 2024-08-07 13:38:32 +02:00
Bjarke BergandGitHub 212b2c999f Updated to lastest nuget minor or patch versions (#16871) 2024-08-07 10:17:00 +02:00
Sebastiaan Janssen 1c1b4c6ee8 Merge branch 'v14/dev' into contrib 2024-08-06 14:42:37 +02:00
mcl-szandSebastiaan Janssen 2761f5cd20 Combining OpenId and OfflineAccess scope (#16220)
* Combining OpenId and OfflineAccess scope

When the client scope is set to "openid offline_access", the returned scope only has the "offline_access" scope. The "openid" scope and the "id_token" are missing. By combining the OpenId and OfflineAccess as return scope, the refresh_token and id_token are returned.

* Update MemberController.cs

Cleaner way, provided by @kjac, to check if the scope has openid and/or offiline_access set.

(cherry picked from commit 55f9b09ab7)
2024-08-06 14:35:59 +02:00
Nikolaj Geisle 0f16dae269 Merge remote-tracking branch 'origin/v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Infrastructure/Migrations/Upgrade/V_10_7_0/MigrateTagsFromNVarcharToNText.cs
#	src/Umbraco.Infrastructure/Migrations/Upgrade/V_12_0_0/UseNvarcharInsteadOfNText.cs
2024-08-06 09:09:10 +02:00
Sebastiaan Janssen d5831fea94 Merge branch 'v13/dev' into v13/contrib 2024-08-06 09:07:06 +02:00
Sebastiaan Janssen 71afa21701 Revert "Configure WebP encoder to use Lossy by default (#16769)"
This reverts commit ee0fd7dd5f.
2024-08-06 09:04:27 +02:00
Nikolaj GeisleandGitHub 4f63324411 Create new AccessPolicy (#16865) 2024-08-06 08:47:01 +02:00
18d2656414 FIX: Deleting language can make the backoffice client unusable (#16863)
* Make missing languages a non blocker for usergroup retrieval

* Add logging

* Update obsolete message

---------

Co-authored-by: Zeegaan <skrivdetud@gmail.com>
2024-08-05 13:30:18 +02:00
Bjarke BergandGitHub 4cd2f4637b Updated nuget packages (#16861) 2024-08-05 11:23:21 +02:00
Callum WhyteandGitHub d26f1e474d Remove favicon from dotnet templates (#16840) 2024-08-05 10:22:42 +01:00
Sven GeusensandGitHub c48490bf13 OpenIddict needs to process the /.well-known/openid-configuration url to be able to return the data. (#16845) 2024-08-05 11:11:56 +02:00
Bartlomiej KomendarczukandGitHub fc5cd6bdd1 Added apostrophe to allowed characters for username. (#16406) 2024-08-02 13:26:16 +01:00
Wojciech TenglerandZeegaan 2736a513a3 Fixing regression bug introduced in #14806 and found during investigation of #16803 - well tested on db with 300k+ nodes (#16837)
Co-authored-by: Wojciech Tengler <wtengler@umbracare.net>
(cherry picked from commit 688790e90a)
2024-08-02 11:58:02 +02:00
688790e90a Fixing regression bug introduced in #14806 and found during investigation of #16803 - well tested on db with 300k+ nodes (#16837)
Co-authored-by: Wojciech Tengler <wtengler@umbracare.net>
2024-08-02 11:21:48 +02:00
Sven GeusensandGitHub bb654360bf Improve migration performance (#16784)
* Improve migration performance

* Fix PR review comments

* Revert tags migration for sql lite as the optimized sql doesn't work properly and sqlLite datasets should not be large anyway
2024-07-31 10:35:28 +02:00
Kenn JacobsenandGitHub 5d866d7bae Graceful handling of unauthorized requests to the Management API (#16836) 2024-07-31 09:45:34 +02:00
mcl-szandGitHub 55f9b09ab7 Combining OpenId and OfflineAccess scope (#16220)
* Combining OpenId and OfflineAccess scope

When the client scope is set to "openid offline_access", the returned scope only has the "offline_access" scope. The "openid" scope and the "id_token" are missing. By combining the OpenId and OfflineAccess as return scope, the refresh_token and id_token are returned.

* Update MemberController.cs

Cleaner way, provided by @kjac, to check if the scope has openid and/or offiline_access set.
2024-07-30 08:38:06 +02:00
Sven GeusensandGitHub f8079608fe Clean up Processed local image links in Management api (#16828)
* Removed type attribute from processed local links

improved code readabilty by using multi return type to private class

* Removed type attribute from processed locallinks in delivery api

* Removed type attribute from expected output regarding locallink parsing

* Added type atttribute removal in deliveryapi for local image link and invalid local links

Test rename for clarity and
2024-07-29 13:32:42 +02:00
Jacob Overgaard ceb86b6c36 Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-07-26 11:06:25 +02:00
Jacob Overgaard 18c7fc5767 update backoffice submodule 2024-07-26 11:06:15 +02:00
Nhu DinhandGitHub 15a74e2511 V14 Fixing the failing smoke tests (#16822)
* Added tests with empty name for Partial View, Stylesheet, Script and Template

* Added tests with non-empty folder for Partial View, Stylesheet, Script

* Added tests to create a partial view in a folder in a folder

* Moved goToSetting to Arrange

* Fixed the failing tests and added the unhappy path tests

* Fixed the failing tests due to UI changes

* Fixed format

* Bumped version of test helper

* Run the tests for Settings in the pipeline

* Fixed the Member failing tests

* Fixed the Document Type Design Tab failing tests

* Fixed the Media Type Design Tab failing tests

* Fixed the Script failing tests

* Bumped version of test helper

* Bumped version of test helper
2024-07-26 10:56:23 +02:00
b14ac811ef Make block editor base classes public (#16774)
* Make block editor base classes public

* Update BlockEditorValues.cs

Change to trigger a new build for #16774

---------

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
2024-07-26 08:16:08 +02:00
Jacob Overgaard bec0bd6641 update backoffice submodule 2024-07-25 18:20:17 +02:00
Nhu DinhandGitHub 4f62746053 V14 Added Content tests with various data types (#16809)
* Added Content tests with content picker

* Removed the test for content picker

* Added Content tests with the default content picker

* Added more Content tests with Content Picker data type

* Added the Content tests with Dropdown

* Added Content tests with Image Cropper

* Updated upload file method due to test helper changes

* Added Content tests with Image Cropper

* Added Content tests with Image Cropper data type

* Added Content tests with Media Picker data type

* Updated Media tests due to ui helper changes

* Bumped version of test helper and json builder

* Make all Content tests run in pipeline - should remove it before merging

* Fixed the name of tests

* Updated the tests for Media Picker in Content section

* Added the Content tests with Multiple Media Picker

* Updated the Content test with Content Picker due to the test helper changes

* Bumped version of test helper

* Fixed the failing tests for Content

* Removed Image Cropper test in this branch

* Added more waits

* Added smoke tags

* Make smoke tests run in the pipeline
2024-07-25 17:59:47 +07:00
Elitsa MarinovskaandGitHub b61b71ee9d Returning the correct totalItems amount (#16799) 2024-07-25 10:01:53 +02:00
9a49ab712b Add Health Check for Runtime mode (#16715)
* Add Health Check for Runtime mode

* Update src/Umbraco.Core/EmbeddedResources/Lang/en.xml

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Update src/Umbraco.Core/HealthChecks/Checks/LiveEnvironment/RuntimeModeCheck.cs

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Update lang file

* Fix typo.

---------

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
2024-07-24 17:36:17 +01:00
Ronald BarendseandGitHub 2f78d1a8f3 Fix UdiRange.Parse() throwing ArgumentException for valid value (#16788)
* Add test to assert UdiRange can round-trip all selectors

* Fix parsing UdiRange without a selector
2024-07-24 14:28:19 +02:00
Jacob Overgaard 7e444e5604 update backoffice submodule 2024-07-24 10:12:54 +02:00
9e0fb54ea5 Removed Type attribute from parsed local links (#16780)
* Removed type attribute from processed local links

improved code readabilty by using multi return type to private class

* Removed type attribute from processed locallinks in delivery api

* Removed type attribute from expected output regarding locallink parsing

* Cleanup

* Fixed spacing bug

* Added 2 more edge test cases

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-07-23 10:25:54 +02:00
Nikolaj Geisle 94ee50c819 Merge branch 'release/14.1.1' into v14/dev
# Conflicts:
#	src/Umbraco.Web.UI.Client
#	version.json
2024-07-22 08:12:16 +02:00
MoleandGitHub 213a13db81 Merge pull request #16800 from umbraco/v14/merge
V14: Merge
2024-07-19 11:22:01 +02:00
nikolajlauridsen a7bfc6fbf0 Merge branch 'refs/heads/v13/dev' into v14/merge 2024-07-19 10:15:08 +02:00
nikolajlauridsen 635076d657 Revert "fix: revert the inert attribute on Tours since you are expected to be able to work with the background in certain steps"
This reverts commit d72fc5c4e8.
2024-07-19 10:14:54 +02:00
Jacob OvergaardandGitHub cad5502f79 V14: Remove user-defined.css (#16792)
* chore: remove the `user-defined.css` asset from the RCL

You cannot overwrite an asset in an RCL just like that, as the user-defined.css were intended.

* delete actual file
2024-07-18 13:06:27 +01:00
Jacob Overgaard 2f7afa67a3 update backoffice submodule 2024-07-18 12:56:58 +02:00
Daniël KnippersandGitHub ee0fd7dd5f Configure WebP encoder to use Lossy by default (#16769)
This greatly reduces file sizes in many cases compared to the default
Lossless setting that seems to be used for PNGs.
2024-07-16 20:48:32 +01:00
Jacob Overgaard eb4fc97c5d update backoffice submodule (datepicker hotfix) 2024-07-16 09:22:47 +02:00
Jacob Overgaard f6074b4c32 bump version to 14.1.1 2024-07-15 14:31:37 +02:00
Elitsa MarinovskaandGitHub dfe41d7f76 V13: Ensure TransformingIndexValues event is also raised from the DeliveryApiContentIndex (#16756)
* Removing override of OnTransformingIndexValues from DeliveryApiContentIndex

* Making sure that TransformingIndexValues event is raised for DeliveryApiContentIndex without performing the special index value transformations

* Review suggestion
2024-07-15 10:45:57 +02:00
Jacob Overgaard efe2f51d13 update backoffice submodule 2024-07-15 09:58:47 +02:00
Jacob Overgaard be81586b46 set version to 13.5.0-rc 2024-07-11 15:07:36 +02:00
Jacob Overgaard c33b06274d Merge remote-tracking branch 'origin/release/13.4' into v13/dev 2024-07-11 15:06:42 +02:00
Jacob Overgaard d72fc5c4e8 fix: revert the inert attribute on Tours since you are expected to be able to work with the background in certain steps 2024-07-11 12:50:49 +02:00
Jacob OvergaardandSebastiaan Janssen a41555cc0d fix: revert the inert attribute on Tours since you are expected to be able to work with the background in certain steps 2024-07-11 12:38:37 +02:00
Jacob Overgaard c1bf3a7e15 bump version to 13.4.1 2024-07-11 12:02:39 +02:00
Nikolaj Geisle cbb6c5c9bf Merge branch 'release/14.1' into v14/dev
# Conflicts:
#	src/Umbraco.Web.UI.Client
2024-07-11 11:37:40 +02:00
Zeegaan e4b776a56c bump version 2024-07-10 11:53:07 +02:00
Jacob Overgaard fd3f77c477 update backoffice submodule (hotfix ufm) 2024-07-10 11:50:40 +02:00
Jacob Overgaard d05e32b6e9 update backoffice submodule 2024-07-10 11:49:47 +02:00
nikolajlauridsen 40a782e50f Merge remote-tracking branch 'refs/remotes/origin/v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Core/DependencyInjection/UmbracoBuilder.Collections.cs
#	src/Umbraco.Web.BackOffice/Controllers/EntityController.cs
2024-07-10 09:21:40 +02:00
Elitsa MarinovskaandGitHub 510f805223 Keeping launchBrowser settings as in v13 (#16765) 2024-07-09 09:57:26 +02:00
Jacob OvergaardandGitHub 512114bcd7 V14: Add usernameIsEmail to the user configuration object (#16759)
* fix: move usernameIsEmail from the current user to the user configuration since it is a static variable not only relevant to the current user

* update OpenApi.json

* update OpenApi.json

* update OpenApi.json
2024-07-08 16:15:48 +02:00
Elitsa 5f6be40bdf Revert "Removing override of OnTransformingIndexValues from DeliveryApiContentIndex"
This reverts commit f6deaca452.
2024-07-08 09:30:12 +03:00
Elitsa 8dc02fa081 Revert "Making sure base.OnTransformingIndexValues(e); is called for DeliveryApiContentIndex without the special index value transformations"
This reverts commit a7ff32891e.
2024-07-08 09:30:12 +03:00
Elitsa a7ff32891e Making sure base.OnTransformingIndexValues(e); is called for DeliveryApiContentIndex without the special index value transformations 2024-07-08 09:28:34 +03:00
Elitsa f6deaca452 Removing override of OnTransformingIndexValues from DeliveryApiContentIndex 2024-07-08 09:27:36 +03:00
Jacob Overgaard 26084d8bb5 update backoffice submodule 2024-07-05 13:45:27 +02:00
Jacob Overgaard 58a766293e update backoffice submodule 2024-07-05 13:29:59 +02:00
8681a4e4e8 Move ReservedFieldNames to type configuration endpoints (#16735)
* Move ReservedFieldNames to type configuration endpoints

* Update obsoletion messages

* Update src/Umbraco.Cms.Api.Management/Controllers/MemberType/ConfigurationMemberTypeController.cs

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>

---------

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
2024-07-05 12:34:25 +03:00
Jacob Overgaard 4283f34fd1 update backoffice submodule 2024-07-05 11:05:18 +02:00
Jacob Overgaard a79f2705da introduce an "other changes" category 2024-07-05 09:10:19 +02:00
Jacob Overgaard ff3b1d678b introduce an "other changes" category 2024-07-05 09:10:06 +02:00
Jacob Overgaard d3fe69afe4 add type/improvement to list of bug fixes 2024-07-05 09:05:42 +02:00
Jacob Overgaard 36d00bd967 add type/improvement to list of bug fixes 2024-07-05 09:05:23 +02:00
Jason Elkin f20528c9fa Merge branch 'v14/dev' into contrib 2024-07-04 12:56:41 +01:00
Nhu DinhandGitHub ffa85ee3b5 V14 Added Content tests with Checkbox list (#16733)
* Added Content tests with checkbox list

* Bumped version of test helper

* Make the Content tests run in the pipeline

* Moved goToBackOffice to beforeEach

* Removed the unnecessary file

* Moved goToBackOffice to beforeEach

* Make smoke test run in the pipeline
2024-07-04 16:57:55 +07:00
Nikolaj Geisle dd67fd16fe Merge branch 'v14/dev' into release/14.1 2024-07-04 09:20:38 +02:00
Ronald BarendseandBjarke Berg 33338add76 Support parsing object to DateTimeOffset and preserve timezone offset (#16732)
(cherry picked from commit 4643b7dba3)
2024-07-04 07:36:58 +02:00
Ronald BarendseandGitHub 4643b7dba3 Support parsing object to DateTimeOffset and preserve timezone offset (#16732) 2024-07-04 07:36:09 +02:00
Lee KelleherandGitHub 0a9df3c105 V14: OpenAPI: Explicitly set ByRelationTypeKey endpoint name (#16729)
This is because of an `operationId` name clash with `ByKeyRelationTypeController.ByKey`,
ref: https://github.com/umbraco/Umbraco-CMS/blob/release-14.0.0/src/Umbraco.Cms.Api.Management/Controllers/RelationType/ByKeyRelationTypeController.cs#L27

This change attempts to ensure a unique `operationId` in the OpenAPI/Swagger JSON.
2024-07-03 12:54:31 +02:00
Lee KelleherandGitHub 32fe23ba41 V14: Expose Umb-Notifications HTTP header (#16728)
Enables client-side dev env to access the custom header.
2024-07-03 11:25:44 +02:00
6069610f83 v14: Implement backoffice signalR hub (#16723)
* Implement backoffice signalR hub

* Fix test

* Refactor to use object instead of string

* Update src/Umbraco.Cms.Api.Management/Routing/BackofficeHub.cs

Co-authored-by: Bjarke Berg <mail@bergmania.dk>

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-07-02 17:14:43 +02:00
Sven GeusensandGitHub 46acd51759 [V14] Make the backend work with the new localLinks format (#16661)
* Support new localLink format in core link parsing

* Updated devliery api to work with the new locallinks format

Added tests for old and new format handling.

* Fix error regarding type attribute not always being present (for example old format or non local links)
2024-07-02 14:22:19 +02:00
Elitsa MarinovskaandGitHub ef01c27fad Respect user start nodes in GetPagedChildren (used in List View) (#16722) 2024-07-02 09:55:03 +02:00
Jacob OvergaardandGitHub 13b77d35df V14: Build and publish Typedoc docs (#16724)
* rename display names of 'ui docs' to 'storybook'

* add new jobs to build and publish the ui-api docs (typedoc) to the blob storage
2024-07-02 09:40:53 +02:00
Jacob Overgaard ecd6e05c48 Merge remote-tracking branch 'origin/release/14.1' into v14/dev 2024-07-02 09:08:18 +02:00
Jacob Overgaard 9efcc4d8ed Merge branch 'release/14.1' into v14/dev 2024-07-02 09:05:46 +02:00
d2707acd3b V14: Create seperate Create and Update in ContentTypeServiceBase (#16714)
* Create seperate Create and Update in ContentTypeServiceBase

* Fix up notification for update

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-07-01 15:29:42 +02:00
Jacob OvergaardandGitHub 2122af7e96 V14: Build and release the type declarations of the Backoffice to npm (#16718)
* separate backoffice install into its own template

* add new job to build the backoffice npm package

* move location of templates

* set version, then build, then pack

* use nbgv to get just the NpmPackageVersion

* calculate version earlier and for both builds

* merge two tasks

* add Build keyword to the display name

* get the node version from the backoffice

* update backoffice submodule

* bump npm version before restoring cache to ensure the cache key doesn't change

* add template to umbraco.sln
2024-07-01 12:23:58 +02:00
Jacob Overgaard 2185be1b03 update backoffice submodule 2024-06-28 15:26:28 +02:00
Zeegaan 2010a241fe Bumb version 2024-06-28 09:30:06 +02:00
Sven GeusensandZeegaan 921598b667 Fixed toolbar not showing for seeded,untouched and then migrated RTE datatypes (#16665)
Moved 14.1 migrations into their own namespace

Co-authored-by: Sven Geusens <sge@umbraco.dk>
(cherry picked from commit d170193a95)
2024-06-28 09:29:55 +02:00
d170193a95 Fixed toolbar not showing for seeded,untouched and then migrated RTE datatypes (#16665)
Moved 14.1 migrations into their own namespace

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-06-28 09:28:55 +02:00
Bjarke Bergandnikolajlauridsen 2fa4149b62 Use the configured backoffice url to initialize openiddict if it is available and just fallback to the one from the first request. (#16660)
Fixes https://github.com/umbraco/Umbraco-CMS/issues/16179
2024-06-27 10:49:19 +02:00
Bjarke BergandGitHub 1ea65c1fb2 Use the configured backoffice url to initialize openiddict if it is available and just fallback to the one from the first request. (#16660)
Fixes https://github.com/umbraco/Umbraco-CMS/issues/16179
2024-06-27 10:47:41 +02:00
Elitsa MarinovskaandGitHub d8b4361936 V13: Update url scheme for Twitter OEmbedProvider (#16650)
* Adds url support for x.com/.*/status/.*

* Updated regex

* Obsoleting Twitter as OEmbedProvider

* Introducing X as its new alternative

* Adding X and removing Twitter from EmbedProvidersCollection

* Typo
2024-06-27 09:23:47 +02:00
Jacob Overgaard ed220035ef backoffice submodule release/14.1 2024-06-26 14:40:57 +02:00
Jacob Overgaard dacd324c9a Merge remote-tracking branch 'refs/remotes/origin/v14/dev' into release/14.1
# Conflicts:
#	src/Umbraco.Web.UI.Client
2024-06-26 14:26:04 +02:00
Jacob Overgaard 195d8b5843 backoffice submodule release/14.1 2024-06-26 13:33:07 +02:00
Jacob Overgaard 1774d4e234 update backoffice submodule 2024-06-26 13:32:28 +02:00
Jacob Overgaard f1b54fe426 fix login build errors 2024-06-26 11:34:52 +02:00
Jacob Overgaard bb058c4f89 update lockfile 2024-06-26 11:22:45 +02:00
Sebastiaan Janssen 3ce2e97f5e Merge branch 'v14/dev' into contrib 2024-06-26 10:45:31 +02:00
Jacob Overgaard 7e8dd02e79 update backoffice submodule 2024-06-26 10:32:45 +02:00
Nikolaj GeisleandGitHub 8ca637d0cb V14: Fix source code editor not showing on fresh install / upgrade (#16655)
* Create richtext with sourcecode by default

* Add rich text migration

* Create migration for migration "ace" value to "sourcecode"
2024-06-26 10:18:05 +02:00
Andreas ZerbstandGitHub 0b868638e0 V14 QA updated dictionary naming in E2E test (#16657)
* Updated naming

* Bumped version of helper
2024-06-25 17:24:47 +02:00
Bjarke Berg 37d22766b1 Merge remote-tracking branch 'refs/remotes/origin/v13/dev' into v14/dev 2024-06-25 14:10:22 +02:00
Bjarke BergandGitHub 0afb4f7283 Make GetHeaderValue support HttpContext unavailable (#16654)
* Make GetHeaderValue tolerant for when the http context is not available. Now it just returns null.

* Add unit tests
2024-06-25 13:47:25 +02:00
Bjarke BergandGitHub a01be0d16f Merge pull request #16653 from umbraco/v14/nuget-update-2024-06-25
Nuget update 2024 06 25
2024-06-25 12:03:20 +02:00
Bjarke Berg 3c34eaf739 Updated nuget packages 2024-06-25 11:20:52 +02:00
Bjarke Berg 3c3d9269ca Merge remote-tracking branch 'refs/remotes/origin/v13/dev' into v14/dev
# Conflicts:
#	Directory.Packages.props
2024-06-25 10:34:20 +02:00
Kenn JacobsenandGitHub 76bb2b0847 Add endpoint for calculating effective user start nodes (#16609)
* Add endpoint for calculating effective user start nodes

* Fix OpenAPI
2024-06-25 10:34:16 +02:00
Bjarke BergandGitHub 215fc4378e Merge pull request #16652 from umbraco/v14/feature/merge-2024-06-25
Code changes from V13.4
2024-06-25 10:32:27 +02:00
Bjarke Berg 9ad67e27c5 Fixed test by moving when the publishing notification is fired. 2024-06-25 10:03:19 +02:00
Bjarke Berg bda23c35e3 Merge remote-tracking branch 'refs/remotes/origin/v14/dev' into v14/feature/merge-2024-06-25
# Conflicts:
#	src/Umbraco.Web.UI.Client
2024-06-25 08:47:38 +02:00
Bjarke Berg 4cfa021132 Merged v13/dev into v14 2024-06-25 08:44:36 +02:00
Jacob Overgaard 2a57af8240 update backoffice submodule 2024-06-24 14:52:49 +02:00
Vlael LayugandGitHub 4e746d367e Use parentElement instead of parent when setting focus for modals with tabs (#16257)
* added null checker for umb-tab when it's trying to get the elm.parent

* use parentElement instead of parent
2024-06-22 13:01:04 +01:00
Josh BrownandGitHub cb090353f4 Fix unguarded calls to ServiceDescriptor.ImplementationType for keyed services (#16604)
* Update integration test base class to verify that calls to ServiceDescriptor.ImplementationType are guarded for keyed services

* Fix unguarded calls to ServiceDescriptor.ImplementationType for keyed services
2024-06-22 10:20:12 +01:00
Lars-Erik AabechandGitHub de74ae4c04 Added custom mvc setup method to testserver base class (#16545) 2024-06-21 16:43:30 +01:00
georgebid 53139a1046 Revert "test"
This reverts commit 462903397f.
2024-06-21 16:23:35 +01:00
georgebid 462903397f test 2024-06-21 16:22:40 +01:00
Nikolaj Geisle e3d65967aa Bump version.json 2024-06-20 14:45:13 +02:00
Nikolaj Geisle 73408f1cce Merge branch 'release/13.4' into v13/dev 2024-06-20 14:44:40 +02:00
Andreas ZerbstandNikolaj Geisle 6e3a6917c8 Decreased to 1 retry for this file only (#16623) 2024-06-20 11:30:22 +02:00
Andreas ZerbstandNikolaj Geisle b2b112eb8b V13 QA Updated depedencies (#16606)
* Bumped version of helper and builder

* Removed faker
2024-06-20 11:30:21 +02:00
MoleandNikolaj Geisle 56710d5b5b V13: Eaglery route domains for virtual page controllers (#16635)
* Do domain routing eagerly

* Cleanup

* Fix comment
2024-06-20 11:30:11 +02:00
MoleandGitHub 00ca9e0d2d V13: Eaglery route domains for virtual page controllers (#16635)
* Do domain routing eagerly

* Cleanup

* Fix comment
2024-06-20 11:25:02 +02:00
Bjarke BergandGitHub f717a5d0b7 Simplified how we disable the TransportSecurityRequirement in OpenIddict (#16629) 2024-06-20 10:39:24 +02:00
Bjarke BergandGitHub 75c42f4ea4 Added post configuration of OpenIddictServerOptions that removes the ValidateTransportSecurityRequirement iff globalsettings.usehttps is false. (#16614) 2024-06-19 15:21:57 +02:00
Kenn JacobsenandGitHub 1f52d01493 Do not rely on claims to figure out user access + prepare for claims removal (#16552)
* Do not rely on claims to figure out user access + prepare for claims removal

* Fix typos :)

* Ensure we fire all relevant notifications when creating and updating user groups

* Leave it to the cache refreshers to flush user cache data (start nodes)
2024-06-19 15:19:31 +02:00
Andreas ZerbstandGitHub 65c76fcfab Decreased to 1 retry for this file only (#16623) 2024-06-19 09:49:04 +02:00
a686ba2a0e V13: Update nuget packages (#16616)
* Update nuget packages

* Fix Imagesharp 2

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-06-19 07:50:52 +02:00
Andreas ZerbstandGitHub 01909ca204 V14 QA Users acceptance tests (#15916)
* Added tests for users

* Additional tests

* Found additional test scenarios

* File select

* Fixed tests

* Cleaned up user tests

* Bumped versions of helpers and builder

* Updated naming of method

* More updates

* Added more tests

* Fixed tests

* Fixed skipped tests

* Final touches

* Bumped

* Run userTests

* Fixes made based on review

* Updated so we run our smoketest again
2024-06-18 13:36:00 +02:00
Nikolaj GeisleandGitHub 8edb1885c9 Add missing translations (#16612) 2024-06-18 10:40:59 +02:00
Nikolaj Geisle 344245b1ea bump to final version 2024-06-18 10:05:36 +02:00
Nikolaj Geisle 82b4f506c2 bump version to rc2 2024-06-18 09:08:40 +02:00
dependabot[bot]andJason Elkin 8e98c1e023 Bump braces from 3.0.2 to 3.0.3 in /tests/Umbraco.Tests.AcceptanceTest
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-17 16:57:09 +01:00
Andreas ZerbstandGitHub 5e31fde416 V13 QA Updated depedencies (#16606)
* Bumped version of helper and builder

* Removed faker
2024-06-17 10:49:16 +02:00
Christian YngvessonandGitHub b60665d096 Feature/swedish translations (#16582)
* Added some translations

* Update sv.xml - Minor typo
2024-06-14 16:18:18 +01:00
Kenn JacobsenandGitHub a64dbe12a1 OpenIddict should only handle /umbraco/ requests (#16549) 2024-06-10 13:31:51 +02:00
Jacob Overgaard fe559c20ab set version to 14.1.0-rc 2024-06-10 12:11:24 +02:00
Jacob Overgaard 4d7e722b99 bump version back to 14.1 2024-06-10 12:09:39 +02:00
Jacob Overgaard 777bb4cd57 Merge remote-tracking branch 'refs/remotes/origin/contrib' into v14/dev 2024-06-10 11:28:04 +02:00
Matt DarbyandMatthew-Wise 0bb46b9667 Fix broken logo URL + replace old nonodes background 2024-06-10 10:23:52 +01:00
Jacob Overgaard fc9de30604 update backoffice submodule 2024-06-10 10:29:18 +02:00
46c0b66a70 V14 Adding unhappy path tests for Member and Member Group (#16564)
* Added unhappy path tests for MemberGroup

* Added unhappy path tests for Member

* Bumped version of test helpers

* Added smoke tag to make all the tests running in the pipeline

* Update tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Members/Members.spec.ts

* Removed smoke tags before merging

---------

Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
2024-06-07 12:53:54 +02:00
Zeegaan 24abc117fe update version.json 2024-06-07 12:50:46 +02:00
MoleandGitHub 5ae5fe338a V13: Set request culture for VirtualPageController (#16572)
* Rename FindDomain to FindAndSetDomain

* Ensure VariationContext and PublishedRequest is updated for virtual page controller
2024-06-07 12:49:13 +02:00
Nhu DinhandGitHub d5176d668d V14 Added acceptance test for Document Blueprint (#16563)
* Added tests for Document blueprints

* Fixed the failing tests for Partial View

* Updated tests for Document Blueprints

* Fixed the delete document blueprints tests

* Fixed method name due to the test helpers changes

* Fix arrange steps

* Bumped version of test helpers

* Removed 's' in the file name

* Removed the step to reload tree

* Fixed comments

* Removed test.describe before merging
2024-06-07 11:33:36 +02:00
b04e4d7586 V14: Add missing action parameters mapping (#16557)
* Add missing mapping for ActionParameters

* Remove -ActionParameters as that is now mapped

* Update OpenApi.json

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-06-07 10:22:13 +02:00
42ce64c357 V14 QA Fixed DocumentType and MediaType tests (#16539)
* Changed name of locator click

* fixed tests

* Bumped version of testHelpers

* Update tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Settings/DocumentType/DocumentTypeDesignTab.spec.ts

Co-authored-by: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com>

---------

Co-authored-by: Nhu Dinh <150406148+nhudinh0309@users.noreply.github.com>
2024-06-07 08:06:06 +02:00
71199b3323 V14 Added acceptance tests for Data Type - p2 (#15873)
* Added tests for Multi URL Picker

* Added tests for Multiple Media Picker

* Added tests for RichTextEditor - not done

* Added tests for Richtext Editor

* Added tests for Content Picker

* Added tests for Tags

* Fixed the tests for Approved Color

* Added tests for Checkbox list

* Fixed tests for DataTypeFolder

* Fixed tests for DatePicker due to api changes

* Added tests for Dropdown

* Fixed tests for ImageCropper due to ui changes

* Added tests for List View

* Added tests for Multiple Media Picker

* Added tests for RichTextEditor

* Added tests for Radiobox

* Added tests for True false

* Added tests for Upload

* Bumped version of test helper

* Bumped version

* Fixed code format

* Removed hard waits

* Updated tests for Template and Partial View - not done

* Added insert section tests

* Used defaultTemplateContent to avoid duplicate code

* Added insert section tests

* Added missing tests for Partial View

* Added missing tests for Scripts

* Added missing tests for Stylesheet

* Added missing tests for Template

* Changed method's name due to test helper changes

* Added skip tests

* Bumped version of test helper

* Reversed waits

* Changed createThreeDotsButton to createButton due to UI changes

* Removed List View - Members tests as the UI changes

* Added more waits

* Removed unnecessary waits

* Added and removed skip tests

* Fixed and added missing tests

* Changed name of test file for Media Picker, Image Media Picker, Multiple Media Picker and Multiple Image Media Picker

* Updated and added missing tests for Data Types

* Bumped version of test helper

* Changed configuration of smokeTest to make all DataType tests run in the pipeline. It should remove before merging

* Added skip for all tests of Numeric as there is no configuration now

* Removed test.describle

* Change syntax of smoke tag

* Removed duplicate code

* Added the tests that avoid the minimum value is greater than the maximum value

* Added the tests that avoid the min height value is greater than the max height value

* Added test for adding available block to RTE

* Remove skip and add more tests

* Added tests for create an empty data type

* Fixed the create data type tests

* Added tests for changing setting a data type

* Updated the test for creating a new data type

* Added skip tests due to UI changes

* Skipped unhappy tests as the front-end is not ready

* Changed the way to create a new stylesheet

* Updated method names due to test helpers changes

* Bumped version of test helper

* Updated expected result

* Updated method name due to UI changes

* Bumped version of test helper

* Bumped version of test helper

* Fixed add start node tests

* Added skip tests

* Updated the expected result

* Fixed add layout tests

* Added more waits

* Add skip tests

* Removed , in the objects and renamed some tests

* Added tests for updating the option

* Fixed naming and removed unnecessary commas

* Update tests/Umbraco.Tests.AcceptanceTest/package.json

Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>

---------

Co-authored-by: Andreas Zerbst <andr317c@live.dk>
Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
2024-06-06 14:36:49 +02:00
Zeegaan 5f8eac0464 bump version.json 2024-06-06 10:22:18 +02:00
Zeegaan fc951ee100 Merge branch 'release/13.4' into v13/dev 2024-06-06 10:21:53 +02:00
Nikolaj GeisleandGitHub ebf77024ce V14: Add clearer error for invalid property type (#16530)
* Add clearer error for invalid property type

* Update test
2024-06-06 08:54:47 +02:00
Nikolaj Geisle 78bf04ef67 bump version.json 2024-06-04 14:56:22 +02:00
Andreas ZerbstandGitHub ae7db56f77 Decreased retry count (#16554) 2024-06-04 14:25:57 +02:00
Kenn JacobsenandGitHub 3dace4fc9d RTE and media picker should route medias the same way in the Delivery API (#16550)
* RTE and media picker should route medias the same way in the Delivery API

* Fix failing unit test

* Fixed failing tests
2024-06-04 10:32:37 +02:00
Nikolaj GeisleandGitHub 32912b0c35 Update to query to SqlRaw (#16542) 2024-06-03 13:34:43 +02:00
Nikolaj Geisle f15be3ed65 Merge branch 'v13/dev' into release/13.4 2024-06-03 12:30:44 +02:00
Sebastiaan Janssen 46e99910e7 Merge branch 'v13/contrib' into v13/dev 2024-06-03 12:26:54 +02:00
Nikolaj Geisle c3e7dad236 bumb to rc version 2024-06-03 12:09:37 +02:00
MoleandGitHub 100f2c3bcd Add check to ensure that RenderControllers and SurfaceControllers are always routed through the UmbracoRouteValueTransforms (#16540) 2024-06-03 12:03:40 +02:00
0aaac78cfa A bunch of minor performance optimizations (#16335)
* Do not execute query if no macros found

* Request cache the permission lookup

* Unbreak change by adding obsolete ctor

* Clean up

* Wrap indexing for delivery API in a scope

* Do not ask options every time for the timeout, instead listen for updates

* Lookup content types once instead of one by one

* Use TryGetValue instead

* Do a distinct on user ids before building index, to avoid issue with more than 2100 parameters

* Don't map ContentDto (it's unused)

* Introduce request bound block editor element cache

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-06-03 11:23:25 +02:00
Don BuddhiandMatthew-Wise e4ac7c9752 Added git submodule update --init command to the documentation 2024-06-03 09:44:58 +01:00
Nhu DinhandGitHub 1f8b7f3a35 V14 QA Added acceptance tests for Members and Member Group (#16074)
* Updated tests for Member Group - not done

* Added api tests for Member

* Added api tests for Member Group

* Added ui tests for Members

* Added ui tests for Member Group

* Added tests for Member Type

* Added code to block unnecessary resources

* Updated createFolder

* Bumped version of test helper

* Changed clickCreateButton to clickCreateLink due to UI changes

* Bumped version of json builder

* Reversed previous code

* Removed waitForTimeout

* Removed waitForTimeout after login

* Bumped version of json builder

* Changed delete folder method

* Bumped version of test helper

* Update create link

* Removed waitForTimeout

* Added skip tests since currently only can view relations

* Added more explicit wait

* Removed hard wait

* Removed invalid verification step due to paging

* Moved get set telemetry level from test to before/after test

* Bumped version of test helper

* Added smoke tags - not done

* Added smoke tags

* Changed locator due to Ui changes

* Changed update to rename method due to test helpers change

* Bumped version of test helpers

* Removed tests for MemberType

* Fixed merge conflict

* Added code to run smoke E2E tests after each build instead of full E2E tests

* Updated command to run smoke test

* Added more smoke tag

* Added smoke tags

* Updated the syntax of smoke tag

* Added smoke tag to make all tests run in the pipeline

* Bumped version of test helper

* Fixed comment

* Removed unnecessary lines

* Removed test.describle
2024-06-03 10:23:50 +02:00
e0c64e4d6a V14: Add required dependency to management api (#16532)
* Add registration to management api

* Check for registration

* Update src/Umbraco.Cms.Api.Common/DependencyInjection/UmbracoBuilderApiExtensions.cs

Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>

---------

Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>
2024-06-03 10:01:17 +02:00
Shannon DeminickandMatthew-Wise f9a6712403 Fixes a bug where the ValueSetValidator is null which will cause a NullReferenceException.
Fixes a bug where the ValueSetValidator is null which will cause a NullReferenceException.
2024-06-01 13:03:47 +01:00
Johan RunstenandMatthew-Wise 5795cf119a Typo when getting query parm 2024-06-01 12:24:09 +01:00
Nikolaj GeisleandGitHub 4478d22390 Add retries to flaky tests (#16529) 2024-05-31 13:02:43 +02:00
Bjarke BergandGitHub 7c1f541bbb Handle MasterTemplateNotFound as bad request instead of unepxected (#16445) 2024-05-31 12:39:48 +02:00
Bjarke BergandGitHub e6568c69dc Added a notifiction handler that checks if we wanna have domain publish warnings. If so it adds as Umb-Notifications and logs it. (#16507) 2024-05-31 12:26:37 +02:00
Elitsa MarinovskaandGitHub 464eaa0409 Adding a base class of oembedresponse, so we can handle string values for dimentions (#16514) 2024-05-31 11:39:09 +02:00
Nikolaj GeisleandGitHub 71e1b74337 v14: Validate file name to return correct error (#16419)
* Validate name

* Add missing case for HandleRename
2024-05-31 11:25:27 +02:00
Nikolaj GeisleandGitHub 133f985293 Include description in DocumentTypeItemResponseModel (#16503) 2024-05-31 09:08:33 +02:00
Ronald BarendseandGitHub bb3ac68241 Include umbraco-package.json manifests in telemetry data (#16430)
* Include umbraco-package.json manifests in package telemetry and add ID

* Add package ID to ManifestResponseModel

* Use async service method and HTTP client factory

* Avoid breaking changes
2024-05-31 09:02:36 +02:00
Nhu DinhandGitHub d78a063f07 V14 QA Added Content acceptance tests (#16289)
* Added api tests for Document - not done

* Added ui tests for Content - not done

* Added api test for Documents

* Added ui tests for Content

* Updated method name due to ui changes

* Bumped version of test helpers and json builders

* Added smoke tag to run all Content tests in the pipeline

* Bumped version of json builder

* Revert files

* Updated the syntax of smoke tag

* Added tests for content with different property editors

* Added tests for Info Tab

* Added more steps for before tests

* Added more tests for Redirect Management

* Added more tests for Content

* Bumped version of test helper

* Changed test name

* Updated the method name due to the test helper changes

* Fixed typo

* Added more waits and skip tests

* Updated the test name

* Changed click action for save button

* Bumped version of test helper

* Bumped version of test helper

* Updated choose document type step after clicking create button due to UI changes

* Added skip tests

* Changed clean method

* Fixed arrange step

* Fixed the arrange steps

* Removed test.describe and unnecessary variables

* Added smoke tests
2024-05-31 08:45:07 +02:00
Bjarke Berg d10596896e Added PackageValidation 2024-05-30 13:49:48 +02:00
Jacob Overgaard 4041e290bf update backoffice submodule 2024-05-30 09:59:08 +02:00
Sebastiaan Janssen 41dddee620 Merge branch 'v14/dev' into contrib
# Conflicts:
#	src/Umbraco.Web.UI.Login/package-lock.json
#	src/Umbraco.Web.UI.Login/package.json
2024-05-30 08:41:49 +02:00
Zeegaan 48c8ffcbc5 Merge branch 'release/14.0' into v14/dev
# Conflicts:
#	src/Umbraco.Web.UI.Client
2024-05-30 08:14:30 +02:00
Jacob Overgaard 0c38eea6f7 update backoffice submodule 2024-05-29 10:20:47 +02:00
Jacob Overgaard 48c4d75886 update backoffice submodule 2024-05-29 10:18:47 +02:00
Jacob Overgaard 8685c7d64a fix: edit blocks in areas 2024-05-29 09:56:34 +02:00
Bjarke Berg 926a077374 Merge remote-tracking branch 'origin/release/14.0' into release/14.0 2024-05-29 07:47:37 +02:00
Bjarke Berg e39c600415 Bump version 2024-05-29 07:47:30 +02:00
Bjarke BergandGitHub 23461b3698 Handle the case where the editorvalue is from the db and just is a path. (#16429) 2024-05-28 15:27:23 +02:00
Jacob Overgaard 2a9808c776 update backoffice submodule 2024-05-28 15:01:32 +02:00
Jacob Overgaard 4046d13c29 update backoffice submodule 2024-05-28 15:00:45 +02:00
Jacob Overgaard d38421286f update backoffice submodule 2024-05-28 09:48:05 +02:00
Jacob Overgaard 17e1b823de update backoffice submodule 2024-05-28 09:45:23 +02:00
Jacob Overgaard 799e0dcca8 update backoffice submodule 2024-05-28 09:43:11 +02:00
Andreas ZerbstandGitHub 0ad177a522 V14 QA Fix E2E tests (#16427)
* Moved group

* Fixed button name

* Bumped version of testHelpers
2024-05-28 09:16:03 +02:00
Nikolaj Geisle 5a966ec3e7 Merge branch 'v14/dev' into release/14.0 2024-05-28 08:55:05 +02:00
Jacob Overgaard 64dbfd0bc9 update backoffice submodule 2024-05-28 00:10:58 +02:00
Nikolaj Geisle 7bfe3eda56 bumb version.json 2024-05-27 22:11:46 +02:00
Nikolaj Geisle 7eaaa8e2e6 Merge branch 'v14/dev' into release/14.0 2024-05-27 22:11:24 +02:00
Kenn JacobsenandGitHub 5296013d89 Enrich the datatype references output with content type data (#16417) 2024-05-27 19:38:57 +02:00
Kenn JacobsenandGitHub ce8e258d6d Make sure listviews are initialized correctly in a new DB (#16418) 2024-05-27 18:35:43 +02:00
Jacob Overgaard 57cca63d81 update backoffice submodule 2024-05-27 17:38:14 +02:00
Andreas ZerbstandGitHub b6be3c50f1 V14 QA Decreased retry amount (#16423)
* Decreased retry once again

* Changed fallback value to 1
2024-05-27 16:17:03 +02:00
Kenn JacobsenandGitHub 1f7b7043b3 The "item" endpoints should be accessible for all users (#16422) 2024-05-27 15:25:17 +02:00
806fce8ed9 Add editor ui alias to package xml (#16420)
* Add editor ui alias to package xml

* Update src/Umbraco.Infrastructure/Packaging/PackageDataInstallation.cs

* Add AllowAtRoot and AllowInAreas

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-05-27 14:10:19 +02:00
Jacob Overgaard f4a77ce217 update backoffice submodule 2024-05-27 13:35:58 +02:00
Kenn JacobsenandGitHub e7780265fa Use runtime mode to determine cache TTL for manifest files (#16393)
* Use runtime mode to determine cache TTL for manifest files

* Remove unused manifest settings
2024-05-27 10:33:49 +02:00
Jacob Overgaard 53ca2910fa update backoffice submodule 2024-05-27 09:49:31 +02:00
e5e87c96db [v14] Fix multiple upgrader issues (#16339)
* Made previewhubupdater work with full cache refreshes

* Make signout_Async available on coreSignInManager

* Allow Migrations to signout the logged in user

* Adding a guid to a user requires resignin

* Added a token revoke mechanism during migrations

* Revert "Make signout_Async available on coreSignInManager"

This reverts commit b103cf119a.

* Revert add allRefreshed on preview hub

Clarified with a comment

* Updated failing test setups

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-27 07:17:45 +02:00
Jacob OvergaardandGitHub c083b3bc8a fix: correct the validation localization constants to match the client (#16401) 2024-05-27 06:44:55 +02:00
Kenn JacobsenandGitHub d927146855 Fix issues with initial creation of external users (#16363)
* Use constant instead of "sub"

* Re-assign the newly created user key as well as its ID
2024-05-24 14:55:56 +02:00
Sebastiaan JanssenandGitHub 729016e429 Update README.md 2024-05-24 14:29:06 +02:00
Sebastiaan JanssenandGitHub 5545051cb1 Task/update readme (#16403)
* Update readme
2024-05-24 14:18:03 +02:00
Kenn JacobsenandGitHub 07711aac28 Expose and manage system media types (#16343)
* Expose and manage system media types

* Removed license :D
2024-05-24 08:59:47 +02:00
MoleandGitHub 8383532fd5 Fix use cache issue when deleting (#16284) 2024-05-23 15:35:08 +02:00
Jacob OvergaardandGitHub 7582b9bcea V14: Login updates (#16359)
* switch logos around to support new login image

* add new login image

* update npm dependencies

* chore: compress the image further
2024-05-23 15:14:23 +02:00
Kenn JacobsenandGitHub 2b79d24afa Add endpoint for retrieving "folder" media types. (#16345)
* Add endpoint for retrieving "folder" media types.

* The system Folder media type should always be considered a "folder"
2024-05-23 14:43:00 +02:00
Jacob Overgaard 8f4f23938d Merge remote-tracking branch 'origin/v14/dev' into contrib 2024-05-23 14:32:53 +02:00
Jacob Overgaard 228aab1154 remove temp database 2024-05-23 14:13:02 +02:00
Bjarke Berg 528583430f Merge remote-tracking branch 'refs/remotes/origin/release/13.3' into v13/dev
# Conflicts:
#	src/Umbraco.Web.Website/Routing/EagerMatcherPolicy.cs
#	version.json
2024-05-23 13:31:34 +02:00
Andreas ZerbstandGitHub cff1dd5219 V14 QA Added document type acceptance test (#16211)
* Added tests

* Added the rest of the tests

* Few changes to failing test

* Added tests for folders

* More cleanup

* Updates

* Fixed tests

* More documentType fixes

* Fixed test

* Cleaned up

* Cleaned

* Bumped version of testHelpers

* Added @smoke in the define to test all our tests

* Updated version

* Added smoke tags

* Remove reload

* Added clean

* Updates from comments, not done

* Added smoke tag

* Uncommented test.describe

* Bumped version

* Added semicolon

* Split documentType tests into more files

* Bumped version

* Removed test describe and fixed indentation
2024-05-23 12:00:01 +02:00
Andreas ZerbstandGitHub 876e91d41d V14 QA media type tests (#16282)
* Added mediaType and mediaTypeFolder

* Added more tests

* More tests!

* Even more tests

* More fixes

* Clean up

* Added smoke tags

* Bumped version

* Added wait after clicking login

* Added remaining tests

* Bumped version of testHelpers

* Skipped failing test

* Fixed to comments

* Fixed comments and added missing test

* Bumped version

* Split mediaType tests into different files

* Removed test.describe and fixed indentation
2024-05-23 11:59:43 +02:00
Jacob OvergaardandGitHub 380c5bbbe2 feat: add autofocus to the email/username field (#16350)
this field will be automatically focused when the user sees the login screen, and it should be valid according to a11y best practices as this is the first and main element on the page

fixes #16276
2024-05-23 11:17:57 +02:00
Bjarke BergandGitHub aabb5b7c48 Updated nuget packages (#16349) 2024-05-23 10:41:28 +02:00
Bjarke BergandGitHub 696a71166c Ensure ufprt-token requests are handle in the UmbracoRouteValueTransformer (#16347) 2024-05-23 10:14:37 +02:00
Jacob Overgaard 0c5d7b2627 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-23 09:13:33 +02:00
Jacob Overgaard fcf82240d0 update backoffice submodule 2024-05-23 09:13:15 +02:00
Sebastiaan Janssen 9dd5e706b1 Merge branch 'v14/dev' into contrib 2024-05-22 15:29:46 +02:00
Jacob Overgaard 3f20abf767 Merge branch 'v14/dev' into release/14.0 2024-05-22 14:32:10 +02:00
Jacob Overgaard b1f012f85f update backoffice submodule 2024-05-22 14:31:55 +02:00
Bjarke BergandGitHub dd537f8ae8 Update path (#16346) 2024-05-22 14:24:19 +02:00
Jacob Overgaard b940578d9d bump version to 14.0.0-rc4 2024-05-22 13:54:58 +02:00
Jacob Overgaard 9186d1de5e Merge branch 'v14/dev' into release/14.0 2024-05-22 13:54:28 +02:00
Jacob Overgaard beba9d92e8 update backoffice submodule 2024-05-22 13:53:37 +02:00
MoleandBjarke Berg 5f082df3ab Ensure there is always at least 1 valid candidate (#16344)
(cherry picked from commit eb6bb99eaf)
2024-05-22 13:30:54 +02:00
MoleandGitHub eb6bb99eaf Ensure there is always at least 1 valid candidate (#16344) 2024-05-22 13:29:17 +02:00
Bjarke Berg fd2138c1fd Bump version 2024-05-22 12:21:56 +02:00
Nikolaj GeisleandGitHub 0f3160f727 Move publishing notification after validation (#16331) 2024-05-22 12:17:04 +02:00
Kenn JacobsenandGitHub 9ab8b816b2 The preview hub throws an exception during DB upgrade (#16338) 2024-05-22 12:11:01 +02:00
+3 a4a9a274bb V14: Merge 13 to 14 (#16340)
* Updates JSON schema for Umbraco 10 with latest references for Forms and Deploy (#15918)

* Ported over #15928 changes for 13.3 RC (#16023)

* Ported over #15928 changes for 13.3 RC

* Use GetOrAdd()

* Lock dictionary initialization

---------

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Make the API content response builder extendable (#16056)

* Make the API content response builder extendable

* DeliveryApiJsonTypeResolver needs to be extendable too

* bump rc to regular

* Bump to next minor

* Add blocks in RTE telemetry (#16104)

* Add blocks telemetry

* Use constants and update tests

* V13: Add property type information to telemetry (#16109)

* Add property type counts to telemetry

* Use constants and fix tests

* Update description

* V10: Fix for fallback file upload (#14892) (#15868)

* Fix for fallback file upload (#14892)

* Added check for file type

* Removed unneeded null checks and fixed tabs

* Cleaning

* Cleanups, cleanups, and removal of unneeded null checks

* Reverted removal of relationshipservice

* Revert null check removals (too risky)

---------

Co-authored-by: Ambert van Unen <AvanUnen@ilionx.com>
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>

(cherry picked from commit 0b5d1f8aa6)

* Fix up formatting

---------

Co-authored-by: Ambert van Unen <ambertvu@gmail.com>

* Implementors using Umbraco.Tests.Integration won't have to override GetLocalizedTextService

(cherry picked from commit b0016687eb)
(cherry picked from commit 2bb56f1b81)

* Fix logic for retrieving lastKnownElement

(cherry picked from commit cae106bfe8)

* bump version

* Bump version

* Bump version

* Since v13 properties can sometimes be of type IRichTextEditorIntermediateValue - this was unexpected in the XPath navigator code (#16121)

* Webhook log improvements (#16200)

* fix: include all headers in webhook log

* feat: return webhook log status from server

* feat: make webhook logs deep linkable

* feat: add webhook log pagination

* feat: improve webhook request/response body preview

* V13: Optimize custom MVC routing (#16218)

* Introduce EagerMatcherPolicy to conditionally bypass content routing

* Ensure that the candidate we disable dynamic routing for is valid

* Skip Umbraco endpoints

* Simplify logic a bit

* Move install logic to matcher

* Ensure that dynamic routing is still skipped when in upgrade state

* Fixup comments

* Reduce nesting a bit

* Don't show maintenance page when statically routed controllers are hít

* Remove excess check, since installer requests are statically routed

* V13: Optimize custom MVC routing (#16218)

* Introduce EagerMatcherPolicy to conditionally bypass content routing

* Ensure that the candidate we disable dynamic routing for is valid

* Skip Umbraco endpoints

* Simplify logic a bit

* Move install logic to matcher

* Ensure that dynamic routing is still skipped when in upgrade state

* Fixup comments

* Reduce nesting a bit

* Don't show maintenance page when statically routed controllers are hít

* Remove excess check, since installer requests are statically routed

(cherry picked from commit ba9ddd11da)

* Property source level variation should only be applied when configured (#16270)

* Property source level variation should only be applied when configured (#16270)

(cherry picked from commit ab32bac5d9)

* Merge pull request from GHSA-j74q-mv2c-rxmp

* Merge pull request from GHSA-j74q-mv2c-rxmp

* Merge pull request from GHSA-j74q-mv2c-rxmp

* Fix up after merge

* Remove obselete test

---------

Co-authored-by: Andy Butland <abutland73@gmail.com>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
Co-authored-by: Ambert van Unen <ambertvu@gmail.com>
Co-authored-by: Lars-Erik <lars-erik@aabech.no>
Co-authored-by: Joshua Daniel Pratt Nielsen <jdpnielsen@gmail.com>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
Co-authored-by: Rasmus John Pedersen <mail@rjp.dk>
2024-05-22 12:05:41 +02:00
Nikolaj GeisleandGitHub 8ddb911a52 V14; Refactor permissions for Document/Media/Member (#16310)
* Refactor permissions

* Fix user startnode caching

* Relax permissions on user item endpoint

* Refactor media types to align with newly refactored content permissions

* Remove permissions from member type item endpoint
2024-05-22 10:56:26 +02:00
Andreas ZerbstandGitHub b56d14322a V14 QA remove test describe (#16330)
* Removed test.describe and fixed indentation

* Removed test.describe, fixed indentation and moved test file to settings
2024-05-22 15:28:43 +07:00
Jacob Overgaard 03be7b8f2c update backoffice submodule 2024-05-22 09:11:06 +02:00
Jacob Overgaard 365e3b39ca update backoffice submodule 2024-05-21 11:14:18 +02:00
393566a3fb V14: Adds preview.js (#16305)
* Adds `preview.js`

to replace the legacy `umbraco.websitepreview.min.js` script.

Updates the content's `Id` with `Key`.

* allow any protected route to render the backoffice

* optimise component so it doesn't need to observe its attributes and use the popover API to show it on top of the content

* handle case where the culture could be set to "invariant" - we just want to set the "lang" attribute to the default ui language

* convert 'end preview' into an api request and reset the style of the button

* minimize function

* move static text into constants

---------

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-05-21 11:13:26 +02:00
5a75488d0e Clean up null values in datatype configs (#16296)
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-21 09:50:02 +02:00
Bjarke Berg 04ed514a21 Merge remote-tracking branch 'refs/remotes/origin/v12/dev' into v13/dev 2024-05-21 08:57:43 +02:00
Bjarke Berg 4f382abc66 Merge remote-tracking branch 'refs/remotes/origin/v11/dev' into v12/dev
# Conflicts:
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
2024-05-21 08:49:33 +02:00
Bjarke Berg 60f656006d Merge remote-tracking branch 'refs/remotes/origin/release/12.3' into v12/dev
# Conflicts:
#	version.json
2024-05-21 08:48:54 +02:00
Bjarke Berg 5c777f3182 Merge remote-tracking branch 'refs/remotes/origin/v10/dev' into v11/dev
# Conflicts:
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
2024-05-21 08:46:37 +02:00
Bjarke Berg 0ee0db8071 Merge remote-tracking branch 'refs/remotes/origin/release/10.8' into v10/dev
# Conflicts:
#	version.json
2024-05-21 08:44:27 +02:00
Nhu DinhandGitHub bfbb9756f3 Updated smoke tag (#16326) 2024-05-21 08:36:02 +02:00
11e5257b56 V14: Untangle the preview functionality from the auth cookie (#16308)
* AB40660 - untangle the preview cookie from the auth cookie

* Clean up

* Allow anonymous to end preview sessions

* Some refinements

* update OpenApi.json

* Fix enter preview test

* correct tests to match new expectations of the preview cookie

* sync preview tests with correct expectations of access level

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-05-17 16:06:26 +02:00
Bjarke Berg 9bacd13ce2 Merge remote-tracking branch 'refs/remotes/origin/release/13.3' into v13/dev
# Conflicts:
#	version.json
2024-05-17 14:39:44 +02:00
80794f3efd [V14] import/export media/document type endpoints (#16100)
* Working import/export media/document types

* WIP

* Refactoring of import doctype/media types

- added analyze endpoint to extract relevant data without fully processing the file
- split up import endpoints into POST & PUT
- removed availableAtAction as the new endpoint allows clients to call the POST/PUT endpoints with confidence
- Added a new service that is responsible for turning temp files into Import compatible XML and being able to extracty partial information from it

* Wrap persistance access in scopes

* Typos, formatting, clean-up

* PR feedback

* update openapi spec

* Changed deleteFile flag to _temporaryFileService.EnlistDeleteIfScopeCompletes

* Itty bitty typo

* Moved magic cleanup into its own method so orchestration can decide when.

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: kjac <kja@umbraco.dk>
2024-05-17 14:35:18 +02:00
MoleandGitHub 13f2d52576 V14: Fix package creation (#16309)
* Fix documents and document types

* Fix remaining parts
2024-05-17 12:30:26 +02:00
56e0e1cc2b merge user/current/logins and user/current/login-providers (#16307)
also deleted unused requestmodel

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-17 09:23:56 +02:00
Bjarke BergandGitHub c17d4e1a60 Merge pull request from GHSA-j74q-mv2c-rxmp 2024-05-17 08:37:51 +02:00
Bjarke BergandGitHub 5f24de3085 Merge pull request from GHSA-j74q-mv2c-rxmp 2024-05-17 08:37:51 +02:00
Bjarke BergandGitHub d8df405db4 Merge pull request from GHSA-j74q-mv2c-rxmp 2024-05-17 08:37:51 +02:00
295f6f8720 V14: Backend changes to facilitate Preview mode in Bellissimma (#16279)
* Sends GUID instead of the numeric ID for SignalR Preview Hub

* Add possibility to set cookies as HttpOnly

* Set UMB_PREVIEW cookie as HttpOnly

* fixup! Add possibility to set cookies as HttpOnly

* Refactor ContentFinderByIdPath to more readable

* Create ContentFinderByKeyPath reusing logic from ContentFinderByIdPath

* Add a comment to DisableFindContentByIdPath setting

* Append new content finder

* Change ordering of content finders registrations

* Refactor with a base class

* Update/refactor and add tests regarding ContentFindersByIdentifier

* Fix comment

* Avoiding breaking change

* Make usages use non-obsolete implementation

* Fixed todo in config instead of use the one old legacy name even more. Also obsoleted the ContentFinderByIdPath

* add `preview` as an allowed backoffice client route

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-05-16 15:53:42 +02:00
Kenn JacobsenandGitHub 93db1912a6 Fix the editor UI alias migration and re-run it (#16292) 2024-05-16 15:20:29 +02:00
Nikolaj GeisleandGitHub d20892e329 Refactor UserGroupService methods to use attempt (#16302) 2024-05-16 15:04:54 +02:00
Andreas ZerbstandGitHub a8f6e8f8dd Bumped version of testHelpers (#16304) 2024-05-16 13:29:55 +02:00
Jacob Overgaard 9f83ff3ab5 update backoffice submodule 2024-05-16 10:10:26 +02:00
Jacob Overgaard 7287e7d740 update backoffice submodule 2024-05-16 08:57:13 +02:00
Nikolaj GeisleandGitHub 520e5e4206 V14: Refactor user and usergroups with referency by id model (#16287)
* Refactor user group endpoints to use reference by id models instead

* Update user endpoints to use reference by id models

* Update usergroup ids to ReferenceByIdModel
2024-05-15 14:55:54 +02:00
MoleandGitHub bdd231caee V14: Fix null ref exception in current user permission endpoint (#16286)
* Fix null reference exception

* Align behaviour with document and media version
2024-05-15 14:23:04 +02:00
MoleandGitHub e46a8d2d31 Use SearchRedirectUrls (#16285) 2024-05-15 09:54:08 +02:00
Jacob Overgaard 3c4da9df53 update backoffice submodule 2024-05-15 09:53:32 +02:00
742307dc32 [v14] backoffice user login providers endpoint (#16141)
* Added endpoint and backing service for backoffice login providers and the status per user.

* Improve link login redirect forming and error handling

* Add responseModel and mapping instead of returning core model

* Moved unlink endpoint logic into a service

* Refactored ExternalLinkLoginCallback logic into BackofficeExternalLoginService method

* typo and minor code style improvements

* async method name alignment

* Add BackOfficeExternalLoginService tests

* Remove helper method that makes less sense that thought.

* Minor formatting, clean-up and conventions

* Replaced cookie authentication in link-login with a short lived secret

Applied PR feedback

* Update openapi

* Changed link login to a form endpoint

* fix broken comment link

* Do not store claimsprinciple in secret + comments

* update redirect paths

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: kjac <kja@umbraco.dk>
Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-05-14 15:55:32 +02:00
MoleandGitHub 7f654a1c63 Add JsonDocumentOptions skipping comments (#16281) 2024-05-14 14:12:02 +02:00
cbf9781ae8 DX: Add BlockValue constructors to force correct property editor alias and layout item type (#16266)
* Improve getting and initializing new block value layouts

* Remove unnecessary generic type constraints

* Add and use new block value/layout item constructors in tests

* Removed GetLayouts that did not make sense

* Added constructor to BlockItemData to simplify explicit usages

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-05-14 13:34:54 +02:00
Jacob Overgaard 6a9f936cce update backoffice submodule 2024-05-14 11:04:58 +02:00
d18bce0ea7 V14: Resize url endpoint (#16275)
* Add image resizing endpoint

* Rename factory

* Actually use height and width

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-05-14 10:42:33 +02:00
Nhu DinhandGitHub eda4a6cc55 V14 QA Added missing acceptance tests for Dictionary (#16241)
* Changed name from Dictionary to Translation

* Removed old Dictionary

* Adding missing tests for Dictionary

* Added smoke tag to test

* Bumped version of test helper

* Add comments

* Fixed comments

* Removed smoke tag
2024-05-14 13:45:47 +07:00
Kenn JacobsenandBjarke Berg 94cef504a3 Property source level variation should only be applied when configured (#16270)
(cherry picked from commit ab32bac5d9)
2024-05-13 15:45:45 +02:00
Kenn JacobsenandGitHub ab32bac5d9 Property source level variation should only be applied when configured (#16270) 2024-05-13 15:44:07 +02:00
Jacob OvergaardandGitHub 22c0c250e0 V14: The login page does not respect certain error codes (#16244)
* handle 403 and unknown error codes from the server

* resolve 2fa errors in repository

error handling was never being activated because this specific endpoint did not return api errors as it works exactly like the "authorize" endpoint, which is being called directly

* chore: add obsolete message to unused `SetupViewPath`

* chore: remove unused events

* add missing labels

* fix: send only 'error' back if the response is not ok

* chore: remove duplicate error handling for 500 errors

* fix: add hack to allow to submit the form on enter click
2024-05-13 12:39:38 +01:00
leekelleher 2cc5f496f3 update backoffice submodule 2024-05-13 12:31:33 +01:00
39e9408a09 Allow FileUpload and Imagecropper to upload files in the same way (#16214)
* Allow FileUpload and Imagecropper to upload files in the same way

* Fixed issue with backward compatibility

* Exclude from converter

* Bugfix if editorvalue is not a string

* Fix file upload value editor + clean up + throw explicitly if editor value is invalid

* Revert changes to FileUploadPropertyEditor - the stored property data format remains the file path

* Actually revert all changes to FileUploadPropertyEditor

* Also revert JsonValueConverter

* Cleanup remove unused equality methods

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-05-13 12:29:31 +01:00
Kenn JacobsenandGitHub 079097427b Return all templates from GetAllAsync if no keys are passed (#16254) 2024-05-13 11:23:20 +02:00
Bjarke BergandGitHub 962bedac29 Ensure we do not expose any cultures we do not accept in languages. Futhermore, I moved it to a service to people can replace the logic (#16265) 2024-05-13 11:09:46 +02:00
Kenn JacobsenandGitHub 46864daf7a Use a fixed access token timeout for developer clients (#16255)
* Use a fixed access token timeout for developer clients

* Re-introduce auth persistence in Swagger UI
2024-05-13 09:41:13 +02:00
87c7347900 V14: Reintroduce umbraco api controller as obsolete (#16263)
* Revert "v14: Remove mentions of UmbracoApiController (#15863)"

This reverts commit 30e2dea57a.

* Obsolete UmbracoApiController

* Added a few more obsoletion messages

* Removed some of the reintroduced stuff again

* Add obsoletion to FrontEndRoutes controller

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-05-13 08:28:42 +02:00
Bjarke Berg b4b512dd53 Return 403 when missing permissions instead of 401 2024-05-10 14:36:25 +02:00
Bjarke Berg e9074ea97a Return 403 when missing permissions instead of 401 2024-05-10 13:28:15 +02:00
MoleandBjarke Berg 18765465ae V13: Optimize custom MVC routing (#16218)
* Introduce EagerMatcherPolicy to conditionally bypass content routing

* Ensure that the candidate we disable dynamic routing for is valid

* Skip Umbraco endpoints

* Simplify logic a bit

* Move install logic to matcher

* Ensure that dynamic routing is still skipped when in upgrade state

* Fixup comments

* Reduce nesting a bit

* Don't show maintenance page when statically routed controllers are hít

* Remove excess check, since installer requests are statically routed

(cherry picked from commit ba9ddd11da)
2024-05-10 11:37:11 +02:00
MoleandGitHub ba9ddd11da V13: Optimize custom MVC routing (#16218)
* Introduce EagerMatcherPolicy to conditionally bypass content routing

* Ensure that the candidate we disable dynamic routing for is valid

* Skip Umbraco endpoints

* Simplify logic a bit

* Move install logic to matcher

* Ensure that dynamic routing is still skipped when in upgrade state

* Fixup comments

* Reduce nesting a bit

* Don't show maintenance page when statically routed controllers are hít

* Remove excess check, since installer requests are statically routed
2024-05-10 11:36:12 +02:00
Bjarke BergandGitHub 86d98eda8d Return 401 in case the signin was not successfully (#16258) 2024-05-10 11:27:34 +02:00
c7328bcbbc v14: Return all data types from DataTypeService.GetAllAsync() (#16230)
* Return all data types from GetAllAsync

* Remove unnecessary async/awaits

* Ensure we don't accidentally fetch all data types when we mean to fetch none.

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-05-10 08:12:25 +02:00
53654d3b28 V14: Return the unhealthy error message from Examine index (#16228)
* Use Attempt<string> result to display the unhealthy error message

* Update OpenApi.json

* Code readability improvements

* Add unittest covering the bug

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-08 08:41:18 +02:00
Jacob OvergaardandGitHub 6577b56d23 V14: The dev server for the login app does not work (#16225)
* bump from es2020 to es2022 for better javascript support

* remove the hardcoded "paths" in tsconfig and replace with the backoffice package

* import uui-css to have styling on the dev server

* change endpoint mock url

* cleanup unused code
2024-05-07 13:54:26 +02:00
Jacob Overgaard 78d93a11d0 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-07 10:27:38 +02:00
Jacob Overgaard f65d465a8a update backoffice submodule 2024-05-07 10:27:23 +02:00
2260da210d Management api should use datetimeoffset (#16196)
* Move audit log endpoints to their respective silos and clean up

* Fix failing integration tests

* Using DateTimeOffset in management api and new methods in service layer

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-05-07 08:07:20 +02:00
f44fb59b34 V14 QA Added acceptance tests for Language (#15997)
* Fixed failing tests

* Updated tests to use the updated helpers

* Clean up tests

* Enabled our pipeline for E2E testing

* Updated the CMS URl for our E2E tests

* Bumped version of our testHelpers

* Did some fixing, still a bit more to do

* Updated auth tests to use LoginUiHelper

* Updated Telemetry tests to use TelemetryUiHelper

* Updated LogViewer tests to use LogViewerUiHelper

* Updated api tests to apply AAA pattern and fix failed tests

* Removed unused import

* Updated api tests for Language

* Added ui tests for Language

* Updated ui test of Language as test helper is changed

* Bumped version of test helper

* Updated create language tests

* Updated delete language test

* Added Language folder

* Fixed method name

* Bumped version of test helper

* Fix merge conflict

* Fixed typo

* Added more waits

* Fixed locator

* Updated locator

* Added timeout

* Fixed password

* Reversed file

* Bumped version

* Bumped version of test helper

* Added more waits

* Added skip for add language test

* Bumped version of test helper

* Added smoke tags

* Fix conflict

* Added @smoke tag to test all Language tests in the pipeline

* Fixed comment

* Removed smoke tag in describe

---------

Co-authored-by: Andreas Zerbst <andr317c@live.dk>
2024-05-07 11:59:59 +07:00
Jacob Overgaard 4035550dfa Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-06 18:15:32 +02:00
Jacob OvergaardandGitHub 91d81063a3 V14: Login page throws validation errors (#16222)
* remove unused login-input.element.ts

* fix: use regular html inputs to prevent validation errors that arose when we removed the shadow dom
2024-05-06 18:14:49 +02:00
Jacob Overgaard 97dcc90601 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-06 14:17:20 +02:00
Jacob Overgaard 70cc0a5a05 update backoffice submodule 2024-05-06 14:15:14 +02:00
Elitsa MarinovskaandNikolaj Geisle e352be14ea Change order of service converter check (#16182) 2024-05-06 13:39:44 +02:00
Elitsa MarinovskaandGitHub 4736683273 Change order of service converter check (#16182) 2024-05-06 13:38:29 +02:00
Rasmus John PedersenandGitHub cfcdc9c98d Webhook log improvements (#16200)
* fix: include all headers in webhook log

* feat: return webhook log status from server

* feat: make webhook logs deep linkable

* feat: add webhook log pagination

* feat: improve webhook request/response body preview
2024-05-06 13:14:11 +02:00
Jacob Overgaard b2d6bb20ba add release.yml to be able to categorise github release notes (#16219) 2024-05-06 11:28:48 +02:00
Jacob OvergaardandGitHub b0b2b59740 add release.yml to be able to categorise github release notes (#16219) 2024-05-06 11:22:54 +02:00
Kenn JacobsenandGitHub b98a6aaa41 Use the correct editor UI for MNTP (#16217) 2024-05-06 11:22:28 +02:00
Jacob Overgaard 73646a88b1 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-06 10:46:45 +02:00
Jacob Overgaard 09a8be12ec update backoffice submodule 2024-05-06 10:46:24 +02:00
Jacob Overgaard ba06e859c3 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-06 10:32:05 +02:00
Jacob Overgaard 6dbb7e286d update backoffice submodule 2024-05-06 10:31:45 +02:00
Jacob Overgaard 01ce93510e update backoffice submodule 2024-05-06 10:30:32 +02:00
Nikolaj GeisleandGitHub d13278af80 V14: Webhook endpoint fixes (#16215)
* Update to use presentation factory

* remove unused usings

* Update delete endpoint to work

* Remember to map key

* Map key for updating webhooks
2024-05-06 10:25:33 +02:00
Sebastiaan JanssenandGitHub 23d0a6b9b2 Since v13 properties can sometimes be of type IRichTextEditorIntermediateValue - this was unexpected in the XPath navigator code (#16121) 2024-05-06 09:40:52 +02:00
f9c0235a35 [v14] Add missing alias and id to usergroup related api models (#16154)
* Added missing alias and Id to usergroup models

create/update/response/item

* Changed userGroup IsSystemGroup to more meaningfull fields

Also enforced the AliasCanBeChanged businessrule 🙈

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Mads Rasmussen <madsr@hey.com>
2024-05-03 10:24:09 +02:00
Bjarke Berg fee222daff Bump version 2024-05-03 09:29:37 +02:00
Bjarke Berg edb516f71a Bump version 2024-05-03 09:28:43 +02:00
Bjarke Berg b6031dea1a bump version 2024-05-03 09:27:20 +02:00
8ad6c36038 Amend user start node handling (#16094)
* Amend user start node handling

* Add "has root access" to current user endpoint

* Add document and media root access to user response model

* Update OpenApi.json

* Applied API suggestions

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-03 08:47:10 +02:00
Sebastiaan Janssen 8b878a7aa6 Merge branch 'v14/dev' into contrib 2024-05-02 15:33:32 +02:00
Jacob Overgaard caebf37f51 Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-02 13:50:24 +02:00
Jacob OvergaardandGitHub f0dae526bf add the new oauth_complete path to the list of exemptions for the backoffice client (#16210) 2024-05-02 13:09:20 +02:00
Jacob Overgaard 8c8ebc0de1 update backoffice submodule 2024-05-02 12:59:30 +02:00
Jacob Overgaard 6eb8624291 update backoffice submodule 2024-05-02 12:50:11 +02:00
Jacob Overgaard 4a09e8dfd9 update backoffice submodule 2024-05-02 12:46:21 +02:00
Jacob Overgaard 7230091010 bump version.json 2024-05-02 12:04:47 +02:00
Jacob Overgaard 8db9913bdd Merge branch 'refs/heads/v14/dev' into release/14.0 2024-05-02 12:04:28 +02:00
Jacob Overgaard 859e1e65f1 update backoffice submodule 2024-05-02 11:59:31 +02:00
Jacob OvergaardandGitHub fe1ee46115 V14: Unique OAuth callback route (#16194)
* set the default for `AuthorizeCallbackPathName` to "/umbraco/oauth_complete" to allow the server to redirect the user back to a route where we don't load the entire backoffice.

* remove redundant method
2024-05-02 11:56:27 +02:00
2009989f6a [V14] Allow specifying ID on the create package endpoint (#16203)
* Allow package creation to specify the ID

* update openapi

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-05-02 11:33:15 +02:00
Nhu DinhandGitHub 0cfa8626b1 V14 QA Setting up the smoke E2E tests in pipeline (#16082)
* Added code to block unnecessary resources

* Updated createFolder

* Bumped version of test helper

* Changed clickCreateButton to clickCreateLink due to UI changes

* Bumped version of json builder

* Reversed previous code

* Removed waitForTimeout

* Removed waitForTimeout after login

* Bumped version of json builder

* Changed delete folder method

* Bumped version of test helper

* Update create link

* Removed waitForTimeout

* Added skip tests since currently only can view relations

* Added more explicit wait

* Removed hard wait

* Removed invalid verification step due to paging

* Moved get set telemetry level from test to before/after test

* Bumped version of test helper

* Added smoke tags - not done

* Added smoke tags

* Fixed merge conflict

* Added code to run smoke E2E tests after each build instead of full E2E tests

* Updated command to run smoke test

* Added more smoke tag

* Added reload tree steps

* Bumped version

* Removed hard waits

* Reduced wait time

* Reversed hard waits

* Set up full test suite in nightly build

* Fixed conditions

* Changed config
2024-05-02 10:09:48 +02:00
Nikolaj Geisle 5c02a560f4 Update openapi for webhooks 2024-05-02 09:55:09 +02:00
Nikolaj GeisleandGitHub bad211027b Don't validate credentials first (#16199) 2024-05-01 14:42:25 +02:00
374d699fd9 Move audit log endpoints to their respective silos and clean up (#16170)
* Move audit log endpoints to their respective silos and clean up

* Fix failing integration tests

---------

Co-authored-by: Mads Rasmussen <madsr@hey.com>
2024-05-01 12:07:06 +02:00
c8180d508b V14: Test new content and media list view service (#16193)
* Fix operation status msg

* Cleanup

* Removing unused status

* Adding WithConfigurationEditor on DataEditorBuilder to be able to create new list views with custom configuration

* Adding list view service tests for content and media

* Adding list view service tests base

* Consistency

* Clean up

* More cleanup

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-05-01 10:54:26 +02:00
Andreas ZerbstandGitHub 94b0f4d1a2 Skips failing test (#16197) 2024-05-01 10:00:34 +02:00
Nikolaj GeisleandGitHub abcb837eeb Add events v14/feature/add-webhook-events-endpoint (#16192) 2024-05-01 08:28:32 +02:00
Kenn JacobsenandGitHub e4986b9793 Set the data type editor UI aliases at install time (#16185) 2024-05-01 08:11:32 +02:00
Kenn JacobsenandGitHub 404cb28c59 Add data type editor UI aliases on upgrade (#16183) 2024-05-01 07:50:26 +02:00
d953a78ae6 Add avatarUrls to the userItem responsemodel (#16190)
Move "mapping" to the factory as there are now dependencies to build the model.

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-04-30 18:16:30 +02:00
Jacob Overgaard 87e21f5339 update backoffice submodule 2024-04-30 16:41:17 +02:00
Kenn JacobsenandGitHub b5f24d5297 Add member type icon to member type tree output (#16178) 2024-04-30 15:00:53 +02:00
Kenn JacobsenandGitHub de230334be Add user group filter endpoint (#16087) 2024-04-30 14:55:20 +02:00
39e51a4467 Add endpoint for retrieving allowed media types for file extensions (#16189)
* Add endpoint for retrieving allowed media types for file extensions

* Moved paging into service

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-04-30 14:26:12 +02:00
Bjarke BergandGitHub 3eef9b9579 Add oEmbed endpoint to the management api (#16188)
* OEmbed query endpoint

* Log provider instead of url from user
2024-04-30 14:21:50 +02:00
e3a4d4dae2 Handle multiple simultaneous block editor layouts (#16184)
* Handle multiple simultaneous block editor layouts

* Cleanup

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-04-30 12:53:26 +02:00
Nhu DinhandGitHub b833bace1e V14 QA Fixing failing tests for Partial View (#16181)
* Added code to block unnecessary resources

* Updated createFolder

* Bumped version of test helper

* Changed clickCreateButton to clickCreateLink due to UI changes

* Bumped version of json builder

* Reversed previous code

* Removed waitForTimeout

* Removed waitForTimeout after login

* Bumped version of json builder

* Changed delete folder method

* Bumped version of test helper

* Update create link

* Removed waitForTimeout

* Added skip tests since currently only can view relations

* Added more explicit wait

* Removed hard wait

* Removed invalid verification step due to paging

* Moved get set telemetry level from test to before/after test

* Bumped version of test helper

* Added smoke tags - not done

* Added smoke tags

* Fixed merge conflict

* Added code to run smoke E2E tests after each build instead of full E2E tests

* Updated command to run smoke test

* Added more smoke tag

* Added reload tree steps

* Bumped version

* Removed hard waits

* Reduced wait time

* Reversed hard waits

* Set up full test suite in nightly build

* Fixed conditions

* Changed config

* Added more waits

* Reversed yaml file

* Reversed yaml files

* Reversed YAML files

* Added .skip for failing tests due to RTE
2024-04-30 09:11:38 +02:00
Jacob OvergaardandGitHub 171eef9078 chore: remove import from backoffice icons since we now only have to rely on the ui library (#16155)
this also fixes an issue where icons did not work anymore due to changes in the backoffice taking over
2024-04-29 16:34:45 +01:00
976146b46e Persist claims from OnExternalLogin event (#16180)
* This fix ensures the claims added doing OnExternalLogin is persisted in the OpenIddict tokens

* Update comment

* Tiniest bit of formatting

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-04-29 11:54:39 +02:00
0e12b94107 Translate member picker property editor value to V14 compatible format (and back again) (#16149)
* Translate member picker property editor value to V14 compatible format (and back again)

* Fix typo

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-29 10:23:07 +02:00
Kenn JacobsenandGitHub d1e90dd3d8 Always use IActionResult - not ActionResult (#16145) 2024-04-29 09:07:19 +02:00
Bjarke Berg 25b47719ad Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-04-29 08:23:11 +02:00
Andreas ZerbstandGitHub 9236d6a3b9 V14 QA added acceptance tests for the media section (#16039)
* Added media tests

* Bumped versions

* Bumped version of testhelpers

* Cleaned up

* Added additional media tests

* Bumped version of playwright and testHelpers
2024-04-29 12:07:15 +07:00
Kenn JacobsenandGitHub 16a1f42985 Translate member group picker property editor value to V14 compatible format (and back again) (#16150) 2024-04-26 10:43:33 +02:00
Joshua Daniel Pratt NielsenandSebastiaan Janssen 5b46c718e6 Fix logic for retrieving lastKnownElement
(cherry picked from commit cae106bfe8)
2024-04-26 09:59:49 +02:00
Lars-ErikandSebastiaan Janssen 599ec18ecc Implementors using Umbraco.Tests.Integration won't have to override GetLocalizedTextService
(cherry picked from commit b0016687eb)
(cherry picked from commit 2bb56f1b81)
2024-04-26 09:59:32 +02:00
Joshua Daniel Pratt NielsenandSebastiaan Janssen cae106bfe8 Fix logic for retrieving lastKnownElement 2024-04-26 09:55:05 +02:00
Jacob OvergaardandGitHub e296c173cc V14: add authorized logout callback path (#16152)
* add option to SecuritySettings.cs to allow the developer to set an authorized logout callback path in line with the login callback path

* allow clients using the "Umbraco back-office access" descriptor to return back to either the login path or the logout path
2024-04-26 08:32:42 +02:00
Nikolaj GeisleandGitHub fcbfecd28e Reverse boolean check, to not fail if valid (#16153) 2024-04-26 08:29:50 +02:00
Andreas ZerbstandGitHub e1692f867f Skips failing test (#16148) 2024-04-26 09:22:44 +07:00
Bjarke Berg c4d49c2d73 Merge remote-tracking branch 'refs/remotes/origin/v13/hotfix/performance-optimizations-based-on-eu-data' into v14/dev
# Conflicts:
#	src/Umbraco.Core/Services/UserService.cs
#	src/Umbraco.Infrastructure/Templates/HtmlMacroParameterParser.cs
2024-04-25 15:57:55 +02:00
Nikolaj GeisleandGitHub 7bd499565d V14: Cache user by id (#16139)
* Cache user by id

* Add todo

* Fix tests

* Clear cache after update

* Refer to base class cache instead of implementing own

* Dont hardcode cache key

* Update to be Payload cache refresher instead
2024-04-25 15:56:01 +02:00
Kenn JacobsenandGitHub f824280162 Translate user picker property editor value to V14 compatible format (and back again) (#16151) 2024-04-25 13:20:41 +02:00
Kenn JacobsenandGitHub c85b1d4d37 Make public access endpoints work correctly (#16136) 2024-04-25 13:17:24 +02:00
Kenn JacobsenandGitHub b9e72a2d82 RTE media folder config is stored as a GUID in V14 (#16138) 2024-04-25 12:56:46 +02:00
9fc083fece V14: Migrate notify action from char to string (#16142)
* Migrate nofication chars to strings

* Add a length to the UserGroup2PermissionDto.Permission

* Remove StripWhitespace

It was only nececary when it was nchar

* Better name for migration

* Reuse dictionary in migrations

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-04-25 12:51:17 +02:00
Kenn JacobsenandGitHub 7a39314586 Remove all RTE config from appsettings (#16140) 2024-04-25 12:25:47 +02:00
Kenn JacobsenandGitHub ca84d002a4 Fix RTEs stylesheet loading error (#16128) 2024-04-25 12:19:41 +02:00
Zeegaan 37ae17ad20 Use renamed controller 2024-04-25 12:12:56 +02:00
Kenn JacobsenandGitHub 0cac0f8b5c Add endpoint for retrieveing the configured default language (#16086)
* Add endpoint for retrieveing the configured default language

* Update OpenApi.json
2024-04-25 11:42:16 +02:00
Kenn JacobsenandGitHub c7b3175621 Fix data parsing error for dropdown and checkbox list (#16132) 2024-04-25 11:21:12 +02:00
Jacob Overgaard 4b922c65e7 Merge branch 'v14/dev' into release/14.0 2024-04-25 11:09:31 +02:00
Jacob Overgaard f4cc408a11 update backoffice submodule 2024-04-25 11:08:11 +02:00
Bjarke BergandGitHub 89755157c1 Support member saving Cancel (#16147)
* Fixes https://github.com/umbraco/Umbraco-CMS/issues/15152

Handle when a notification cancels the member saving operation.

* Fixed unit tests
2024-04-25 10:59:41 +02:00
Jacob Overgaard a8021c46f6 update backoffice submodule 2024-04-25 10:33:24 +02:00
Bjarke BergandGitHub 73de6e164f Configured the swagger UI to persist the authentication token (still only valid for 5 minutes, as it cannot use refreshtoken) and added filtering. (#16146) 2024-04-25 09:45:36 +02:00
f1e43a7376 Align various controllers (#16137)
* Renamed the language item controllers to follow the current standard (they should not be called "entity")

* Renamed the webhook item controllers to follow the current standard (they should not be called "entity")

* Moved the webhook item controllers to the "/item" silo

* Renamed the user gorup controller base to be singular instead of plural

* Create member group endpoint should yield a 201 created response

* Update member endpoint should yield an empty 200 OK upon success

* Update UpdateUserDataController with correct action name and return an empty 200 OK upon success

* More item endpoints alignment

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-25 08:34:21 +02:00
Kenn JacobsenandGitHub c4958365fe Support OpenAPI polymorphic output with JsonDerivedType (#16144) 2024-04-25 08:26:44 +02:00
Nikolaj GeisleandGitHub fc9b47a2ea V14: Fixup webhook endpoints (#16143)
* Use presentation factory, as there is no map definition

* Refactor to actually get entities by key
2024-04-24 15:41:32 +02:00
Kenn JacobsenandGitHub ed64dbf3e4 Cleaned up V13 related and obsoleted system directory constants (#16133)
* Cleaned up V13 related and obsoleted system directory constants

* The LogFiles constant is still used, it seems
2024-04-24 13:54:15 +02:00
119fde2033 V10: Fix for fallback file upload (#14892) (#15868)
* Fix for fallback file upload (#14892)

* Added check for file type

* Removed unneeded null checks and fixed tabs

* Cleaning

* Cleanups, cleanups, and removal of unneeded null checks

* Reverted removal of relationshipservice

* Revert null check removals (too risky)

---------

Co-authored-by: Ambert van Unen <AvanUnen@ilionx.com>
Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>

(cherry picked from commit 0b5d1f8aa6)

* Fix up formatting

---------

Co-authored-by: Ambert van Unen <ambertvu@gmail.com>
2024-04-24 13:44:20 +02:00
c7a1205180 Refactor endpoints to return 0 items if the ids/paths are empty (#16126)
Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-24 12:28:24 +02:00
Jacob Overgaard ca0c90e321 set version to rc2 2024-04-24 11:47:05 +02:00
Jacob Overgaard a62fbf4269 update backoffice submodule 2024-04-24 11:46:04 +02:00
Andreas ZerbstandGitHub aec90b2e58 Fixed failing test (#16130) 2024-04-24 08:59:18 +02:00
Nikolaj GeisleandGitHub 7bbef2a584 V14: Fix member mapping (#16106)
* convert key to name before saving roles

* Rework MemberEditingService to convert keys

* Rename variable to groups

* Extract to variable
2024-04-23 12:25:36 +02:00
94bf4efe10 V14: Obsolete runtime minification settings (#16123)
* Obsolete RuntimeMinificationSettings

* Obsolete RuntimeMinificationValidator

* Update src/Umbraco.Core/Constants-Configuration.cs

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>

* Obsolete RuntimeMinificationCacheBuster

---------

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
2024-04-23 11:17:50 +02:00
Bjarke Berg 07431e092b Do a distinct on user ids before building index, to avoid issue with more than 2100 parameters 2024-04-23 11:03:42 +02:00
Sebastiaan Janssen d4188022af Merge branch 'v14/dev' into contrib 2024-04-23 10:01:39 +02:00
Jacob Overgaard 263b995991 update backoffice submodule 2024-04-23 09:54:14 +02:00
Nikolaj GeisleandGitHub 4118f441c9 Remove UI settings (#16064) 2024-04-22 13:05:12 +02:00
MoleandGitHub 0980350172 Add blocks in RTE telemetry (#16104)
* Add blocks telemetry

* Use constants and update tests

* V13: Add property type information to telemetry (#16109)

* Add property type counts to telemetry

* Use constants and fix tests

* Update description
2024-04-22 12:56:36 +02:00
7b46d44eeb RC2 Breaking - Ensure migrations persist the executed key, when executed. (#16113)
* Adds new functionality to the migrations.

This requires a migration to call Context.SetDone() on the migration context. This happens automatically on scoped migrations before the scope is completed. But migrations inheriting the UnScopedMigrationBase needs to call this manually, inside the scopes or when it is considered done.

Thereby, we minimize the risk (and eliminate it for SqlServer) that a migration is executed but the state is not saved.

If a migration is executed without the SetDone is called, the migration upgrader throws an error, so we do not start executing the next migration

* Updated tests

* Renamed after review suggestion

* Rename in test

* More renaming after review

* Remove public modifier from interface

* Add missing space in exception message

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-04-22 12:21:16 +02:00
Jacob Overgaard c6898ec3f6 update backoffice submodule 2024-04-22 09:45:39 +02:00
Andreas ZerbstandGitHub b392a499cf V14 QA Token access fix (#16111)
* Added fixtures

* Fixed existing tests

* Temporary file path for updating StorageState

* Fixed indentation

* Bumped version

* Added a storageStatePath

* Deleted unnecessary fixtures

* Deleted commented out code

* Bumped version of testHelpers

* Updated Pipeline

* Bumped version

* Added fixes from review

* Added another wait and goToSection
2024-04-22 13:58:05 +07:00
Nikolaj GeisleandGitHub cceb4180f2 V14: Redirect to login screen (#16051)
* Redirect to login screen after flows complete

* Revoke tokens after completing flow

* Use Ok not Redirect

* skip length check
2024-04-19 09:42:13 +02:00
Jacob Overgaard 4dfd26e59e update backoffice submodule 2024-04-19 09:32:47 +02:00
Bjarke Berg 5c16cfb947 Use TryGetValue instead 2024-04-18 20:44:26 +02:00
Bjarke Berg 61908b4235 Lookup content types once instead of one by one 2024-04-18 16:27:56 +02:00
Bjarke Berg c2d1b7a315 Do not ask options every time for the timeout, instead listen for updates 2024-04-18 16:27:26 +02:00
Bjarke Berg e1e584ba64 Wrap indexing for delivery API in a scope 2024-04-18 16:26:57 +02:00
Sven Geusens a27a4dcd84 Bump to next minor 2024-04-18 15:36:44 +02:00
Sven Geusens adc2435073 Merge branch 'release/13.3.0' into v13/dev 2024-04-18 15:24:41 +02:00
Bjarke Berg 487f480548 Clean up 2024-04-18 13:43:01 +02:00
d04769a84b V14/feature/all segment endpoint (#16054)
* Added All Segments service with backing noopService

* Add openapi spec

* Apply suggestions from code review

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Fix ctor

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-18 12:20:26 +02:00
Jacob OvergaardandGitHub 337d547698 Do not refer to $npmTag which does not exist (#16075)
`--access` is not required either since we now specify that in the package.json file
2024-04-18 10:22:11 +02:00
Sven Geusens a325ba339b bump rc to regular 2024-04-18 09:10:22 +02:00
Nikolaj Geisle 8247360700 Merge branch 'release/14.0' into v14/dev 2024-04-18 09:02:28 +02:00
Nikolaj Geisle 8b0bf9da27 bump version 2024-04-18 09:01:17 +02:00
e33d7a779d V14: Apply sliding window token expiry based on the configured max login lifetime (#16028)
* Consider max login lifetime with access and refresh tokens

* Adding clarification comment

* Updated comment and added a little explanation for future clarity

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-04-18 08:24:58 +02:00
Nhu DinhandGitHub e20e001c12 V14 QA Added skip to the failing test due to UI changes (#16076)
* Added skip to the failing test due to UI changes

* Added skip tests

* Added skip tests
2024-04-17 15:33:05 +02:00
Andreas ZerbstandGitHub 55f68f477f Added timeout (#16073) 2024-04-17 15:30:51 +02:00
ChadandMichael Latouche cc39d36ff5 Correct BasicAuthSettings.Enabled description
Correct BasicAuthSettings.Enabled description.
2024-04-17 15:24:35 +02:00
Bjarke Berg 5d51d81545 Unbreak change by adding obsolete ctor 2024-04-17 13:05:03 +02:00
Bjarke Berg 7b4581bd8d Request cache the permission lookup 2024-04-17 12:55:14 +02:00
Jacob Overgaard 15b85d0e4a update backoffice submodule 2024-04-17 12:36:35 +02:00
Jacob Overgaard 8a15c14e70 update backoffice submodule 2024-04-17 11:21:17 +02:00
Jacob Overgaard 1e7b048756 update backoffice submodule 2024-04-17 09:38:48 +02:00
Nikolaj Geisle d25c3ca86d Merge remote-tracking branch 'origin/v13/dev' into release/14.0
# Conflicts:
#	src/Umbraco.Core/EmbeddedResources/Lang/en_us.xml
#	src/Umbraco.Infrastructure/BackgroundJobs/Jobs/ReportSiteJob.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Core/Telemetry/TelemetryServiceTests.cs
2024-04-17 09:10:05 +02:00
Zeegaan 0993a61d39 dont depend on e2e 2024-04-17 08:07:01 +02:00
dependabot[bot]andJacob Overgaard bb9e66d0da Bump vite from 5.2.2 to 5.2.6 in /src/Umbraco.Web.UI.Login
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.2.2 to 5.2.6.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.2.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-16 17:23:20 +02:00
ElitsaandJacob Overgaard dc9c28db9a Added missing endpoints 2024-04-16 17:18:51 +02:00
Jacob Overgaard db0c315aae bump to 14.0.0-rc1 2024-04-16 17:14:45 +02:00
6dd08b2377 V14 External login linking + Proposed error handling (#16052)
* Added mostly working linking methods to the backoffice controller

Cleanup still required

* Added proposed default error handling extionsion methods

* Cleanup, clarification and PR feedback

* More cleanup

* Transformed the OAuthOptionsExtensions into a helper class

this allows for proper DI for the dependencies

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-04-16 17:08:55 +02:00
Lee KelleherandGitHub 298f4de973 Merge pull request #16069 from umbraco/v14/feature/login-assets-cleanup
V14: Optimise login screen javascript
2024-04-16 15:59:12 +01:00
Jacob Overgaard 9be314b509 load the auth bundle 2024-04-16 16:52:28 +02:00
Bjarke BergandGitHub 36bde9e7f0 Add JsonObjectConverter to the default serializer and make a safe check before adding index (#16067)
* Do not add index if it already exists

* Add the JsonObjectConverter by default. This is required by the block editor

* Update test to reflect that fact we have the json object converter applied
2024-04-16 16:47:58 +02:00
Jacob Overgaard 41bbe67343 update backoffice submodule 2024-04-16 16:43:35 +02:00
Jacob Overgaard 9698b8331e make the login client load in the uui-css assets directly from the backoffice client since we are hooking on to the uui javascript anyway (this way we dont have to maintain uui several places) 2024-04-16 16:34:43 +02:00
Jacob Overgaard 43e4d3e83d make sure the login screen doesn't load entrypoints meant for the backoffice client (only simple extensions are supported on the login screen) 2024-04-16 16:31:15 +02:00
Jacob OvergaardandGitHub a15c8ddf3b V14/chore/pipelines e2e nuget (#16066)
* make the myget release wait for e2e tests

* update api docs after the nuget stage
2024-04-16 14:56:40 +02:00
MoleandGitHub 096991ac79 V13: Add webhook information to detailed telemetry (#16060)
* Cleanup ReportSiteJob

* Report on registered webhook event types

* Report on custom header webhook count

* Use constants instead of magic strings

* Update tests

* Update translation files
2024-04-16 14:36:02 +02:00
Bjarke BergandGitHub 43bf2a26d1 Fixed issue with custom fields not determined as custom (#16065) 2024-04-16 13:39:14 +02:00
cd6f2b4b6d V14: Support custom Swagger schema and operation identifiers for external packages (#16062)
* Adding ISchemaIdHandler and core implementation enabling custom package implementations

* Adding IOperationIdSelector and refactoring core implementation to enable custom package implementations

* Adding OperationIdSelector core implementation enabling custom package

* Removing old way of Operation id extensibility

* Registering schema and operation id handlers

* Refactoring based on unnecessary param

* Obsoletion

* Refactoring SchemaIdSelector to make use of the new ISchemaIdHandler

* Update OpenApi.json

* Revert "Update OpenApi.json"

This reverts commit c9165f174b.

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-04-16 12:52:45 +02:00
Nhu DinhandGitHub 0988f4a7be V14 QA Added missing tests for Partial View, Stylesheet, Script, Template (#16059)
* Removed hard waits

* Updated tests for Template and Partial View - not done

* Added insert section tests

* Used defaultTemplateContent to avoid duplicate code

* Added insert section tests

* Added missing tests for Partial View

* Added missing tests for Scripts

* Added missing tests for Stylesheet

* Added missing tests for Template

* Changed method's name due to test helper changes

* Added skip tests

* Bumped version of test helper

* Reversed waits

* Changed createThreeDotsButton to createButton due to UI changes

* Removed List View - Members tests as the UI changes

* Added more waits

* Removed unnecessary waits
2024-04-16 12:12:09 +02:00
Kenn JacobsenandGitHub a6a76d1815 Make the API content response builder extendable (#16056)
* Make the API content response builder extendable

* DeliveryApiJsonTypeResolver needs to be extendable too
2024-04-16 12:03:44 +02:00
Jacob OvergaardandGitHub 9f6af970b4 V14/feature/login image (#16063)
* update the login image to the v14 variant

* switch out the default value of the "alternative" logo to the dark version since it fits better in this version
2024-04-16 11:34:19 +02:00
Ronald BarendseandGitHub e680be506f v14: Update ImageSharp and MailKit dependencies (#16061)
* Remove duplicate PackageReferences

* Update ImageSharp dependencies

* Update MailKit dependency to 4.5.0
2024-04-16 11:12:05 +02:00
Lee KelleherandGitHub 68f623ede8 V14: MediaPicker/MNTP - Changed StartNodeId from a Udi to Guid (#16042)
* MediaPicker3: Changed `StartNodeId` from a `Udi` to `Guid`

* MNTP: Changed `StartNodeId` from a `Udi` to `Guid`
2024-04-16 11:01:18 +02:00
6379f2fd35 Ported over #15928 changes for 13.3 RC (#16023)
* Ported over #15928 changes for 13.3 RC

* Use GetOrAdd()

* Lock dictionary initialization

---------

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
2024-04-16 08:55:40 +02:00
Ronald BarendseandGitHub 2d850bf8f1 v14: Add async methods to Deploy interfaces (#16055)
* Add async method to IContextCache

* Add async methods to IImageSourceParser and ILocalLinkParser

* Add async methods to IDataTypeConfigurationConnector, IServiceConnector and IValueConnector

* Obsolete non-aysnc methods

* Add cancellation tokens to new async methods

* Add ConfigureAwait(false) to awaits
2024-04-15 18:04:47 +02:00
Kenn JacobsenandGitHub 5ddf7a1be7 Clean up FIXMEs in security controllers (#16038) 2024-04-15 17:27:37 +02:00
3edc783ddb V14: Additional blueprint endpoints (#16047)
* Fix /item endpoint response when 0 ids

* Adding GetPagedByContentTypeKeyAsync to IContentBlueprintEditingService

* Adding mapping for new DocumentTypeBlueprintItemResponseModel

* New endpoint and operation status handling

* Fix test cases

* Added tests

* Fixed partial test references

* Rename method

* Add ancestors endpoint for blueprints

* Change == to is

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-15 13:49:08 +02:00
MoleandGitHub 2a889f502b V14: Clean up backend translation files (#16050)
* Remove unused translation areas

* Cleanup translation files
2024-04-15 11:13:58 +02:00
Bjarke Berg ee5936804d Do not execute query if no macros found 2024-04-15 10:55:42 +02:00
Nikolaj GeisleandGitHub e15bddcc39 Set invite users to false if deny local login is true (#16043) 2024-04-15 10:26:49 +02:00
Ronald BarendseandGitHub ad82fe89cf v14: JSON schema tool improvements (#16035)
* Use require modifier instead of setting null-suppressed default values

* Only remove read-only properties when IgnoreReadOnlyProperties is set

* Obsolete UmbracoPath property and remove work-around for obsolete setter
2024-04-15 08:58:52 +02:00
767c417153 Only add a SQL in statement if there are keys to filter on (#16044)
* Only add a SQL in statement if there are keys to filter on

* Improved faulty query fix by calling a cached path.

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-04-15 08:55:50 +02:00
Kenn JacobsenandGitHub 576b360cce Removed leftover System.Text.Json dependencies (#16040) 2024-04-15 08:51:00 +02:00
Bjarke BergandGitHub 2f0b3d055f Fixed check to support unix/linux OS (#16045) 2024-04-12 14:57:31 +02:00
89de08a1e8 V14: Remove member list view (#15979)
* Remove default member list view

* Fix up test

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-04-12 10:58:26 +02:00
Sebastiaan Janssen 62421f67ac Sync submodule 2024-04-11 17:08:55 +02:00
Sebastiaan Janssen 403ab49c22 Merge branch 'v14/dev' into contrib 2024-04-11 16:49:21 +02:00
Jacob Overgaard 5c3527d4f4 bump to 14.0.0-beta004 2024-04-11 15:57:48 +02:00
Jacob Overgaard 159e103936 Merge branch 'release/14.0' into v14/dev 2024-04-11 15:56:22 +02:00
Jacob Overgaard ba16aef194 add manual check for validation 2024-04-11 14:59:39 +02:00
Jacob Overgaard 8965e9c180 update dependencies 2024-04-11 14:59:19 +02:00
d5809da665 V14: Move towards get guid (#15889)
* Implement using keymap for member

* Remove current usages of GetUserById

* User userId resolver to resolve user key

* Refactor user repository to use GUID not int

* Add happy path test

* Remove user in cache when user gets updated

* Use await in async method

* Fix up according to review

* Update IMetricsConsentService.cs to have async method

* Fix according to review

* Fix more according to comments

* Revert "Fix up according to review"

This reverts commit a75acaaa

* Get current backoffice user from method

* Update user repository delete functionality

* Fix up more test

* Try to get user by id if key fails

* Add user key as required claim

* Fix tests

* Don't set claim in BackofficeController

* Create constant for the Sub claim

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-04-11 13:53:34 +02:00
Nikolaj GeisleandGitHub 0b62df2bb4 Add "UserIsAlreadyLoggedIn" property to BackOfficeLoginModel (#16034) 2024-04-11 13:48:20 +02:00
Jacob Overgaard 821e4e439e Merge remote-tracking branch 'origin/v14/dev' into release/14.0 2024-04-11 12:21:12 +02:00
Jacob Overgaard 40e6359499 update backoffice submodule 2024-04-11 12:20:45 +02:00
Jacob Overgaard 5c197cfa43 Merge remote-tracking branch 'origin/v14/dev' into release/14.0 2024-04-11 12:20:16 +02:00
Bjarke BergandGitHub 782c009754 Improvements to the OpenAPI Docs (#14754)
* Ensure APIS only can produce one response type

* Ensure APIs document Unauthorized and Forbidden results

* If a controller constructor injects IAuthorizationService we assume the actions can return forbidden

* Updated OpenApi.json

* OpenApi.json

* Update OpenApi.json

* Update OpenApi.json
2024-04-11 11:58:47 +02:00
Alina-Magdalena TincasandGitHub 85747593cc Update v14 api docs with info from umbraco docs (#15977)
* update api docs

* small update
2024-04-11 11:19:23 +02:00
513f39f623 Prevent template circular references (#15907)
* Added a simpel circular reference check to templates

* Upgraded detecting to all levels

* Rename method and add comment to clarify why we have 2 similar methods

* Apply suggestions from code review

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-11 11:18:00 +02:00
acae5f2d57 Remove "additional data" from entities (#16024)
* Remove "additional data" from entities

* Fix merge issue

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-04-11 10:55:21 +02:00
Kenn JacobsenandGitHub faee63627f Cleaned up some low-hanging FIXMEs (#16010)
* Cleaned up some low-hanging FIXMEs

* Fixed merge
2024-04-11 10:50:31 +02:00
Kenn JacobsenandGitHub a982df97a6 Remove manifest validators (#16027)
* Remove manifest validators

* Remove "Configuration" from RegexValidator
2024-04-11 10:42:22 +02:00
Kenn JacobsenandGitHub 459cd79a06 Remove RTE embedded image handling + clean up file upload configuration (#16025) 2024-04-11 10:40:44 +02:00
Jacob Overgaard 10fa3b87bf update backoffice submodule 2024-04-11 10:30:40 +02:00
Jacob OvergaardandGitHub 858a1af6c1 update imports on Web.Ui.Login after breaking change merged in the backoffice client (#16033) 2024-04-11 09:27:56 +02:00
Kenn JacobsenandGitHub 45a169f62b Clean up explicit test dependencies for System.Text.Json serializer (#16017) 2024-04-11 09:17:48 +02:00
Jacob Overgaard 5a87b1af6f update backoffice submodule 2024-04-11 09:15:23 +02:00
48e9be2b73 Content & media url endpoints (#15832)
* First go at the document url controller

Added optimizations for documenturlFactory

* Updated Document Url endpoint

Duplicated the endpoint for media
Cleaned up some code marked async that will never hit a long running operation

* Remove dupplicate attributes

* Rename resource sets to response model

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-11 09:10:45 +02:00
Kenn JacobsenandGitHub d47638df98 Remove remnants of the Angular implementation (#16026) 2024-04-11 09:08:56 +02:00
Ronald BarendseandGitHub 80c5d28316 v14: Update .NET dependencies to 8.0.4 (#16031)
* Update .NET dependencies to 8.0.4

* Update StyleCop.Analyzers to 1.2.0-beta.556
2024-04-10 21:32:58 +02:00
Ronald BarendseandGitHub 7c2a0f8976 Update to NJsonSchema 11.0.0 and use SystemTextJsonSchemaGeneratorSettings (#16030) 2024-04-10 21:25:54 +02:00
16dd5327d4 v14: Refactor and enhance System.Text.Json converters (#15960)
* Update JsonUdiConverter to support Udi, GuidUdi and StringUdi types

* Require boolean (like) value and rename to JsonFuzzyBooleanConverter

* Add read/write only JsonConverters and align naming

* Rename SystemTextJsonSerializer to DefaultJsonSerializer

* Rename SystemTextConfigurationEditorJsonSerializer to DefaultConfigurationEditorJsonSerializer

* Add JsonUdiRangeConverter

* Rename JsonFuzzyBooleanConverter back to JsonBooleanConverter

* Fix value type check in JsonObjectConverter

* Revert class names

* Updated tests

* Post fix after merge.

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-04-10 20:21:24 +02:00
Ronald BarendseandGitHub 1c5e27397b Remove Newtonsoft.Json from tests (#16029) 2024-04-10 19:30:32 +02:00
Kenn JacobsenandGitHub 1c799802c5 Deduplicate the magic string "/management/api/" (#16016) 2024-04-10 14:21:59 +02:00
Bjarke Berg 7b6db02426 Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-04-10 13:21:38 +02:00
Bjarke Berg 46994c2d1c Added missing index, while adding column key to users 2024-04-10 13:21:32 +02:00
d50b3a521e Simplify user group authorization failure statuses (#16009)
Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-10 12:39:22 +02:00
fcda25af50 Premigrations + Updated NuGet Dependencies (#15987)
* Updated nuget packages + added migrations for OpenIddict - Currently can only be executed using unatttended installs

* Added new Premigration concept - Migrations that always runs unattended before other migrations

* Apply suggestions from code review

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

---------

Co-authored-by: Zeegaan <skrivdetud@gmail.com>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-10 12:30:30 +02:00
082d504b33 Fix tracked reference queries for SqlServer (#16020)
* Fixed issue with SqlServer and optimized queries to not do the actual paging if total count is 0

* Cleanup

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-10 12:03:32 +02:00
Jacob Overgaard c241bfd85a update backoffice submodule 2024-04-10 11:56:59 +02:00
Ronald BarendseandGitHub 4c3c3cd158 v14: Align Deploy interfaces, remove obsolete methods and default interface implementations (#15965)
* Align FromArtifact return type with IDataType.ConfigurationData

* Align Alias nullability with interface

* Lazily initialize ArtifactDependency collection when not set

* Remove ShouldSerializeChecksum (not used by STJ)

* Remove obsolete methods and default interface implementations

* Order dependencies once when setting collection

* Update test to include artifact Checksum property
2024-04-10 10:12:38 +02:00
Jacob Overgaard eecb493585 use correct types for login build 2024-04-10 08:53:47 +02:00
Jacob Overgaard fe7f79aacf update backoffice submodule 2024-04-09 17:45:44 +02:00
41238d141a Move manifest endpoints to their own, independent API group and fix access policies accordingly (#15989)
* Move manifests to their own API group and fix access policies

* Update OpenApi.json

* add an endpoint to fetch "private" packages, i.e. AllowPublicAccess=false

* Review comments

* update OpenAPI.json

* update OpenApi.json

* allow /umbraco/logout to be used for PostLogoutRedirectUris when logging out through the management api

* use the Umbraco.Extensions string extensions instead

* add constraints to the BackofficeDefaultController to handle the cases of 'install', 'upgrade', and 'logout'

---------

Co-authored-by: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com>
2024-04-09 17:44:49 +02:00
Lars-ErikandSebastiaan Janssen 2bb56f1b81 Implementors using Umbraco.Tests.Integration won't have to override GetLocalizedTextService
(cherry picked from commit b0016687eb)
2024-04-09 12:56:15 +02:00
Elitsa MarinovskaandGitHub ac7e4c1fa3 Clean up comments that won't apply (#16018) 2024-04-09 12:07:55 +02:00
b8ae3e34ff Convert Tourdata into a more generic concept (#15923)
* Added UserData and migrated tours data into it

* Remove tourdata from user

* Removed tour definition/manipulation classes

Fixed a userData error typo

* Removed toursettings

* Update openapi spec

* V13: Align database schemas of migrated and new database (#15934)

* Drop default constraint umbracoCacheInstruction table

* Align umbracoContentVersion table

* Update indexes on external login table

* Align node table

* Make relation type index unique

* Remove user-group default constraint

* Re-order methods

* Make webhook url not nullable

* Cleanup

* Cleanup

* Update OpenApi.json

* Update src/Umbraco.Cms.Api.Management/Controllers/UserData/UserDataControllerBase.cs

* Remove tour settings from schema

* Add cancelation tokens

* Dont inject, but take as parameter

* Remove some from injection

* Update schema

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Mole <nikolajlauridsen@protonmail.ch>
Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
Co-authored-by: Zeegaan <skrivdetud@gmail.com>
2024-04-09 11:59:43 +02:00
Sebastiaan Janssen 9ad413db4c Merge branch 'v14/dev' into contrib 2024-04-09 11:18:11 +02:00
Kenn JacobsenandGitHub de1fc65393 Swagger: Don't use allOf for inheritance + fix polymorphic models (#15985)
* Swagger: Don't use allOf for inheritance + fix polymorphic models

* Cannot mix $ref and nullable in OpenAPI

* Update OpenApi.json

* Regenerate OpenApi.json
2024-04-09 10:20:20 +02:00
MoleandGitHub 91085d9b21 Refactor DocumentPresentationFactory to use ITemplateService instead of IFileService (#15995) 2024-04-09 10:18:26 +02:00
9c18cd22e0 V14: Deleted code marked as obsolete for V14 (#15998)
* Obsoletions related to Delivery API

* Fix TypeLoader and TypeFinder tests

* Remove obsolete and default implementations of IFileSource and IFileTypeCollection

* More Delivery API related obsoletions

* VariationContextAccessor related

* ValueFactories obsoletion and fix references

* ValueSetBuilders obsoletions

* ValueConverters obsoletions

* Other obsolete ctors and methods

* Forgotten VariationContextAccessor obsoletion

* More obsoletions

* XPath related obsoletions

* Revert XmlHelper changes

* Delete RenamedRootNavigator and its tests

* Fix test

* XmlHelper obsoletion

* Return null instead of GetXPathValue

* Obsolete entire class instead

* Remove XPath obsoletions from IPublishedCache

* Remove XPath-related if-block that is no longer needed

* Change obsolete msg for classes needed for NuCache

* Moving classes to NuCache and making them internal

* Remove more XPath-related obsoletions

* Remove NavigableNavigator and its tests

* Cleanup

* Remove Xpath references from tests

* Revert interface deletion in MediaCache

* Using XOR operation

Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>

---------

Co-authored-by: Nuklon <Nuklon@users.noreply.github.com>
2024-04-09 09:06:48 +02:00
187d45860a V14: Add cancellation tokens to all endpoints (#15984)
* Add CancellationToken to controllers

* Fix GetManagementApiUrl

* Forgotten Item and Tree controllers

* Document Blueprint and Version endpoints

* Fix merge conflict

* Cleanup

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-09 08:18:45 +02:00
ddf663d30b Support containers for blueprints (#15983)
* Support containers for blueprints

* Update OpenApi.json

* Fix tree ordering

* Add CancellationToken to new endpoints

* Change to doc blueprint specific things

* Fix policies

* Cleanup

* Use ContentBlueprintEditingService methods instead of underlying ContentService

* Review comments

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-08 14:55:46 +02:00
e326370b5f V14: Deleted code marked as obsolete for V12 and V13 (#15999)
* Forgotten v12 obsoletions

* V13 obsoletions

* Remove LegacyStaticServiceProvider and fix using statements of StaticServiceProvider

* Remove obsolete ctors for v13

* More v13 obsoletions

* UmbracoMapper obsoletion

* UmbracoPipelineFilter obsoletion

---------

Co-authored-by: nikolajlauridsen <nikolajlauridsen@protonmail.ch>
2024-04-08 11:17:32 +02:00
Bjarke BergandGitHub 85d35b3a69 Ensure the user is authenticated to see webprofiler/miniprofiler logs (#16007) 2024-04-08 11:14:25 +02:00
Kenn JacobsenandGitHub b552ccb885 Rename Examine based entity search service (#15991)
* Rename Examine based entity search service

* Add a few comments to make it easier to tell the "indexed" search service from the "regular" one.
2024-04-05 17:42:08 +02:00
Sven Geusens 45e584c061 Merge remote-tracking branch 'origin/v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs

# Ignored Conflicts (Umbraco.Web.UI.Client is completly replaced in v14)
#	src/Umbraco.Web.UI.Client/src/common/directives/components/application/umbtour/umbtourstep.directive.js
#	src/Umbraco.Web.UI.Client/src/views/components/application/umb-tour.html
#	src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step-content.html
#	src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step-counter.html
#	src/Umbraco.Web.UI.Client/src/views/components/application/umbtour/umb-tour-step-header.html
#	src/Umbraco.Web.UI.Client~HEAD
#	src/Umbraco.Web.UI.Login/package-lock.json
#	src/Umbraco.Web.UI.Login/package.json
2024-04-05 14:14:45 +02:00
Kenn JacobsenandGitHub c6f1189418 Return 404 instead of 500 when an "original parent" has been deleted (#15990) 2024-04-05 12:49:24 +02:00
Lars-ErikandJason Elkin b0016687eb Implementors using Umbraco.Tests.Integration won't have to override GetLocalizedTextService 2024-04-04 17:07:24 +01:00
3cc14888a9 Moved logic from FolderTreeControllerBase service layer (#15976)
* Moved logic from FolderTreeControllerBase into EntityService and EntityRepository

* Custom sorting for data types, not media types

* Ensure ordering is the same for SQLite and SQLServer

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-04-04 11:27:13 +02:00
Sebastiaan Janssen e993c23d5c Merge branch 'v13/dev' into contrib
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
2024-04-04 11:25:13 +02:00
Elitsa MarinovskaandGitHub 43f77eef64 Remove StaticServiceProvider usage (#15978) 2024-04-04 11:25:13 +02:00
dependabot[bot]andSebastiaan Janssen 71e16d20ef Bump vite from 5.1.1 to 5.1.7 in /src/Umbraco.Web.UI.Login
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 5.1.1 to 5.1.7.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v5.1.7/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v5.1.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-04 11:12:22 +02:00
Nhu DinhandGitHub 978d191039 Bumped version of test helper (#15981) 2024-04-04 10:58:49 +02:00
Lee KelleherandGitHub ac1ef52aba Download Created Package MIME type (#15982)
Sets the appropriate MIME type of the Created Package download,
this would be either an XML string or a ZIP file. The MIME type will
be used on the client-side to handle the responds accordingly.
2024-04-04 10:37:42 +02:00
Nikolaj GeisleandGitHub b5c6a2088f Return null if container type is not found (#15974) 2024-04-04 09:50:31 +02:00
Elitsa MarinovskaandGitHub be16aa0663 V14: Test new content blueprint editing service (#15970)
* Fix wrong service name

* Move tests to correct place and fix naming

* Introducing a test base

* Tests IContentBlueprintEditingService

* Remove comment

* Adding Assert.Multiple

* More Assert.Multiple + Can_Create_With_Basic_Model() and Cannot_Create_When_Content_Type_Not_Found()
2024-04-04 09:40:06 +02:00
Kenn JacobsenandGitHub 70878f501e Make property container type parsing explicit (#15963) 2024-04-04 09:32:24 +02:00
Jacob Overgaard d74b4d99d1 update backoffice submodule 2024-04-04 09:14:50 +02:00
Kenn JacobsenandGitHub 75b1d4729f Examine entity search for documents, media and members (#15972) 2024-04-03 18:49:23 +02:00
a95a092c39 V14: login screen (#15932)
* remove the temp login screen

* set login build back to esm

* convert razor entrypoint to show new login screen

* enable loading a user defined stylesheet that can be overridden through RCL mechanics

* remove unused file

* for now, remove the call to the old `localizedtext` endpoint until a replacement has been built

* add fallback font

* remove login to the old backoffice

* change models for twoFactorView

* Send view that have to be used for 2fa.

* get 2fa providers from the login call directly

* Return 2fa providers

* map enabledTwoFactorProviderNames to the view

* use correct endpoints for 2fa

* Send link

* change key to id in querystring

* improve localization

* merge authUrl

* Added flow query parameter

* remove unused getter

* remove debug info

* fix fallback value

* fallback value

* Added invite url to email

* Clean up

* Added password configuration to the verify responses, so the client knows, and have confirmed the user is allwed to see it

* allow reset password

* Allow anonymous on invite create password

* open api

* check for invite

* fix fallback text

* validate invite token

* try to extract the problem details object

* add error logging

* fix invite user parameters

* Use correct id for performing user

* Allow password reset on yourself without the old password, if you are currently invited

* hardcode the authorize endpoint url for now

* fix handlers and disable icons for now

* import icons from backoffice client

* add backoffice path to icons

* fix handler for 2fa custom view

* update image temporarily

* remove old icon registry

* convert login components to UmbLitElement

* convert `UmbAuthContext` into a real context with a token

* cleanup dependencies

* optimise vite

* remove lit

* optimise external login component loader

* use generated resources for reset password

* use generated resources for all methods

* import and register the main bundle

* register localization

* change localization keys

* update all localization keys to new format

* replace tokens

* copy code

* added danish translations

* convert to lowercase

* all languages should have same weight

* added german translations

* add missing variable

* missing text

* added dutch translations

* added swedish translations

* added norwegian translations

* add temporary fix so the login app can be built

* make sure BuildLogin is run only after BuildBellissima has been run to ensure the dependencies are present on disk

* run the real login build in pipelines

* set vite language to en-us

* optimise msw warnings

* wait a bit before rendering the form so we know everything has been loaded

* Add external login endpoint + move models around

* Allow FORM submissions to the external login endpoint

* rename `IdentityProvider` back to `Provider` to avoid a breaking change from V13

* type in url for login-external manually (for now) since route attributes are no longer a thing

* move GET back to POST for external forms

* load in public manifests on boot of the login screen

* Clean up

* handle the case where an external login provider has disabled local login and show a message instead of the login form

* remove external login providers from the server login screen

* add more translations

* use the friendly greeting for the error layout

* show login form

* add mock handler for public manifest endpoint

* remove the external login layout

* fix test

* Added generic English localization

as a fallback language.

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
Co-authored-by: kjac <kja@umbraco.dk>
Co-authored-by: leekelleher <leekelleher@gmail.com>
2024-04-03 15:45:09 +02:00
be58f3142d V14 QA Fixed/Cleaned up the api acceptance tests (#15964)
* Removed api tests for RelationType since it is impossible to create/update/delete relation type

* Fixed api tests for UserGroup

* Fixed api tests for UserAvatar

* Fixed api tests for User

* Fixed api tests for Temporary File

* Fixed api tests for Dictionary

* Fixed api tests for DataType

* Fixed api tests for DataTypeFolder

* Cleaned up

* Bumped version of test helper

* Update tests/Umbraco.Tests.AcceptanceTest/tests/ApiTesting/Dictionary/Dictionary.spec.ts

Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>

* Reversed the api tests for Relation Type

---------

Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
2024-04-03 12:06:54 +02:00
1437483a68 V14: Add IsAdmin to user and current user response models (#15969)
* Added isAdmin og user response models

* updated factory

* revert line removal

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-04-03 11:08:47 +02:00
Kenn JacobsenandGitHub 06cfec25aa Fix swagger schema error after #15946 (#15971) 2024-04-03 10:16:02 +02:00
ChadandJason Elkin 682b7656bc Update RefreshMethodType.cs 2024-04-02 21:49:03 +01:00
Elitsa MarinovskaandGitHub 37734efd15 V14: Blueprint CRUD endpoints (#15947)
* Get blueprint by key

* Renaming

* Implementing DeleteBlueprintAsync

* Fixing tests to use the new method

* Making ContentControllerBase abstract

* Cleanup

* Implementing Delete blueprint endpoint

* Revert obsoletion in ContentService.cs

* More reverting

* Remove usings

* Introducing IContentBlueprintEditingService

* Refactor Get and Delete blueprint endpoints to use the new IContentBlueprintEditingService

* Fix base inheritance case in SchemaIdSelector

* Creating RequestModelBase for UpdateDocument to be reused in both document and blueprint models

* Creating DocumentResponseModelBase to be reused in both document and blueprint models

* Renamed blueprint response model for item endpoint to be aligned with the rest of the item models

* More renaming changes of the DocumentBlueprintItemResponseModel

* Refactor ByKeyDocumentBlueprintController to make use of the new blueprint models

* New blueprint models and mapping

* Adding UpdateAsync to ContentBlueprintEditingService

* Adding IDocumentBlueprintEditingPresentationFactory.cs

* Adding UpdateDocumentBlueprintController.cs

* Adding methods required from the base

* Fixing bug in document type mapping - mapping incorrect key

* Cleanup

* Fix item endpoint

* Adding MapCreateModel

* Adding create model

* Creating request model base + related classes

* Another request model

* Blueprint editing service

* Adding create controllers

* Adding DuplicateName operation status for blueprints and handling it

* Updating OpenApi.json

* Fix comment

* Fix mapping

* Adding comments

* Passing in id for create blueprint from document model

* Mapping default state to Draft - no need to calculate it, it will always be that for blueprints

* Cleanup

* Update OpenApi.json

* Review comments

* Fix policies

* More policy updates
2024-04-02 12:53:06 +02:00
95849c265b Document version endpoints (#15946)
* Rename/Move/duplicate PaginationService to facilitate conversion closer to the data layer

Duplication is because of internal modifier as we don't want to expose these temporary classes

* Move Guid to Int Extensions into core + add unittests

* Added Document version endpoints

Updated used services to use async methods

* Moved PaginationConverter into core so it can be used by the service layer

* Endpoint structure improvements

* Updating OpenApi.json

* Add greedy constructors for contentService tests

* Namespace changes and naming cleanup

* Update openapispec again...

* Refactor injected services

* PR suggestion updates

- Move endpoints into their own structural section as they are also in a different swagger section
- Naming improvements
- Allign PresentationFactories with similar classes
- Cleanup unused assignments
- Cleanup refactoring comments
- Improve obsoletion remarks

* Cleanup

* ResponseModel improvements

* OpenApi spec update

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Elitsa <elm@umbraco.dk>
2024-04-02 12:12:36 +02:00
Kenn JacobsenandGitHub 1866b61e12 Use an extension method for fetching a required user in a common way (#15953) 2024-04-02 11:20:05 +02:00
Kenn JacobsenandGitHub 96f2b17c5a Entity search - take one (#15951)
* Add entity search endpoints (to be replaced with Examine based ones for content, media and member)

* Update OpenApi.json
2024-04-02 10:40:45 +02:00
Nhu DinhandGitHub 892a39d39a V14 QA Fixed the failing tests due to UI changes (#15944)
* Bumped version of test helper

* Changed clickCreateButton to clickCreateLink due to UI changes

* Bumped version of json builder

* Changed delete folder method

* Bumped version of test helper

* Added skip tests since currently only can view relations
2024-04-02 09:39:01 +02:00
MoleandGitHub d765e69713 V13: Align database schemas of migrated and new database (#15934)
* Drop default constraint umbracoCacheInstruction table

* Align umbracoContentVersion table

* Update indexes on external login table

* Align node table

* Make relation type index unique

* Remove user-group default constraint

* Re-order methods

* Make webhook url not nullable

* Cleanup

* Cleanup
2024-04-02 08:31:38 +02:00
Jacob Overgaard b3c25ca477 update backoffice submodule 2024-03-27 17:43:59 +01:00
Sven Geusens 67d80da9ed Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Infrastructure/PropertyEditors/MultiUrlPickerValueEditor.cs
#	src/Umbraco.Web.Common/Profiler/WebProfiler.cs
#	src/Umbraco.Web.UI.Client/package-lock.json
#	src/Umbraco.Web.UI.Client/src/common/directives/validation/valpropertymsg.directive.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/linkpicker/linkpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/linkpicker/linkpicker.html
#	src/Umbraco.Web.UI.Client/src/views/content/content.create.controller.js
#	src/Umbraco.Web.UI.Client/src/views/content/create.html
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/blockgrid/umbBlockGridPropertyEditor.component.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.controller.js
#	src/Umbraco.Web.UI.Client/src/views/propertyeditors/multiurlpicker/multiurlpicker.html
#	src/Umbraco.Web.UI.Client~HEAD

# Ignored changes
#  https://github.com/umbraco/Umbraco-CMS/pull/14787
#  https://github.com/umbraco/Umbraco-CMS/pull/15853
#  https://github.com/umbraco/Umbraco-CMS/pull/15841
2024-03-27 16:13:09 +01:00
Jacob Overgaard 03044202fa update backoffice submodule 2024-03-27 15:20:40 +01:00
Sven Geusens 43920f9adc Merge branch 'v12/dev' into v13/dev 2024-03-27 15:04:00 +01:00
1fdc0e2582 Relations/types mangement api cleanup (#15910)
* Made Relation types read only trough the management api

* Removed path from RelationTypeResponseModel

* Removed RelationTypes tree controllers

* Deleted ByChildRelationController as the usecase has been internalized

* Reworked RelationResponseModel

* Added the ID the toe relation response model

* RelationType.IsDeletable is no longer relevant for the management api

Since types are only managed trough code.

* Removed RelationType create/update leftovers

Brought RelationType responsemodels more in line with similar models
Update openapi spec

* Review improvements

* Renamed controller file to match class name

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Mads Rasmussen <madsr@hey.com>
Co-authored-by: kjac <kja@umbraco.dk>
2024-03-27 10:01:29 +01:00
e1ee896556 Refactor Tracked references endpoints (#15933)
* Moved tracked references under their respective sources

Prepped the endpoints to be more inline with how we will optimize in the future

* Fixed some endpoint signature issues and update openapi spec

* Partial Revert "Moved tracked references under their respective sources"

This reverts the submodule update in commit 3819276a74.

* Fix duplicate line

* Rework for polymorphic output

* Improved endpoint naming

* Regenerate OpenApi.json

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: kjac <kja@umbraco.dk>
2024-03-26 14:32:56 +01:00
Ethan NaganoandGitHub fdea8c28c8 14744 tour not coded to best practice (#15133)
* Apply focusLockService to TourStepDirective

Apply focusLockService to TourStepDirective in order to ensure that
non-modal page contents are inert and do not interfere with focus on
modal dialog with regards to screen reading technologies.

* Add properties to umb-tour.html.

Add properties to umb-tour html page to ensure that it aligns with modal
dialog best practices.

* Add dialog properties to Umbraco tour .html files.

Add properties relating to dialog and accessibility to the Umbraco tour
.html files, including aria-label, role, and tab index.
2024-03-26 09:39:34 +00:00
Jacob Overgaard 2175d523cc update backoffice submodule 2024-03-26 09:55:04 +01:00
Jacob Overgaard 7cb03c3a71 update backoffice submodule 2024-03-26 09:07:41 +01:00
3e6d48e6d0 Fixed contentTypeIds being mapped to the id of the wrapping entity (#15941)
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-03-25 17:45:50 +01:00
4dca7495f8 Handle sensitive properties in the Management API (#15936)
* Handle sensitive properties in the Management API

* Use Assert.Multiple to catch all failing tests in one run

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-03-25 16:56:13 +01:00
Ethan NaganoandGitHub ce372abf8a Add check for ContentVariation.Nothing when copying documents. (#15185)
A new check for ContentVariation.Nothing is necessary when copying from
documents to ensure that if there is no content variation as defined by
the Nothing property, values are still copied even if variation is not
supported since the content itself will not vary.
2024-03-25 13:27:36 +00:00
f6f868e463 Add ancestor endpoints and remove explicit parent context (#15746)
* Remove explicit parent context in API outputs

* Add ancestor endpoints for document and data type (experimental for now)

* Add ancestor endpoints for doctypes, media, mediatypes, partial views, scripts, static files, stylesheets and templates

* Add unit tests for ancestor ID parsing

* Add ancestor endpoint for dictionary items

* Update OpenApi.json

* Fix merge and regenerate OpenApi.json

* Regenerate OpenApi.json

* Rename "folder" to "parent" for consistency

* Fix merge

* Fix merge

* Include "self" in ancestor endpoints

* Handle ancestors for root items correctly

* Remove "type" from recycle bin items

* Tests against fixed values instead of calculated ones.

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-03-25 12:15:50 +01:00
Jacob Overgaard e441639786 update backoffice submodule 2024-03-25 11:10:18 +01:00
Jacob Overgaard 82f725b2be update backoffice submodule 2024-03-25 10:57:08 +01:00
Jacob Overgaard c620b84fdc update backoffice submodule 2024-03-25 09:57:16 +01:00
Kenn JacobsenandGitHub b1c3473856 Introduce path provider and resolver for the Content Delivery API (#15922) 2024-03-22 14:12:33 +01:00
Jacob Overgaard d5d7023eaa update backoffice submodule 2024-03-22 13:28:02 +01:00
dd68a6da7f V14: Add reserved fields to config endpoints (#15919)
* Add reserved fields to documents

* Add member configuration endpoint

* Add reserved field to media configuration

* Refactor to use service instead on hardcoded methods

* Clean up, aligning

* Update OpenApi

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-03-22 12:11:38 +01:00
Kenn JacobsenandGitHub 0ed65671bb Use the correct localization keys for core property validation errors (#15931) 2024-03-22 10:19:33 +01:00
Jacob Overgaard 113068e17d update backoffice submodule 2024-03-22 09:55:34 +01:00
kjac bef0d659c0 Update OpenApi.json (add missing manifest method) 2024-03-21 15:01:35 +01:00
Kenn JacobsenandGitHub e750d29d14 Ensure correct access to all manifests + introduce "public" package manifests (#15921)
* Introduce "public" package manifests

* Make sure "all manifests" are available to anyone with backoffice access

* review comments
2024-03-21 09:55:30 +01:00
Andy ButlandandGitHub 52c21b0fca Updates JSON schema for Umbraco 10 with latest references for Forms and Deploy (#15918) 2024-03-20 13:20:40 +01:00
Andreas ZerbstandGitHub 129e9004d8 Bumped timeout for auth test (#15917) 2024-03-20 13:03:55 +01:00
Bjarke BergandGitHub a9e5a46829 Added missing 404 (#15915) 2024-03-20 11:19:52 +01:00
Bjarke Berg d03362486b Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-03-20 10:30:40 +01:00
Jacob Overgaard 1ab7c304bb update backoffice submodule 2024-03-20 10:23:26 +01:00
Bjarke Berg 2cb7597749 Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-03-20 09:44:43 +01:00
Bjarke Berg b7533b57b4 Merge remote-tracking branch 'origin/release/13.2' into v13/dev
# Conflicts:
#	version.json
2024-03-20 07:15:18 +01:00
Bjarke Berg 0dc13cf23f Merge remote-tracking branch 'origin/release/12.3' into v12/dev
# Conflicts:
#	version.json
2024-03-20 07:14:33 +01:00
Ronald BarendseandGitHub dd5d5ecf51 Add additional lock timeouts and clean-up ObjectCacheAppCache (#15911)
* Remove IHostEnvironment parameter and update clear cache

* Add lock timeouts and update exception messages

* Update constructor to internal
2024-03-19 18:38:05 +01:00
Jacob Overgaard 3f95af9b02 update backoffice submodule 2024-03-19 17:34:34 +01:00
Jacob Overgaard 0ed1d6869a update beta002 backoffice submodule 2024-03-19 16:36:14 +01:00
Jacob Overgaard 5a23127832 update beta002 backoffice submodule 2024-03-19 16:22:15 +01:00
Nikolaj GeisleandGitHub 30e2dea57a v14: Remove mentions of UmbracoApiController (#15863)
* Remove mentions of UmbracoApiController

* Remove last mentions of UmbracoApi controller
2024-03-19 14:42:08 +01:00
dependabot[bot]andSebastiaan Janssen d3b96a163f Bump follow-redirects in /src/Umbraco.Web.UI.Client
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-19 14:42:03 +01:00
dependabot[bot]andSebastiaan Janssen 95aba6d696 Bump follow-redirects in /tests/Umbraco.Tests.AcceptanceTest
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-03-19 14:41:45 +01:00
Sebastiaan Janssen 9030b1c19f Merge branch 'v13/dev' into contrib 2024-03-19 14:40:30 +01:00
Jacob Overgaard 08783c6065 bump version to beta003 2024-03-19 14:20:23 +01:00
Jacob Overgaard 7213e940ca Merge branch 'v14/dev' into release/14.0 2024-03-19 14:14:17 +01:00
Bjarke Berg 79d241a910 Bump version 2024-03-19 13:59:49 +01:00
Bjarke Berg c48d6f5a38 Update imagesharp 3 2024-03-19 13:59:38 +01:00
Bjarke Berg d9e890e954 Fixed duplicate reference 2024-03-19 13:58:43 +01:00
Bjarke Berg ecdbd9653b Update imagesharp 2 2024-03-19 13:57:46 +01:00
Bjarke Berg e0bb4b6a23 Bump version 2024-03-19 13:57:36 +01:00
Jacob Overgaard 4e0df98c34 update backoffice submodule 2024-03-19 13:44:12 +01:00
Andreas ZerbstandGitHub d2f8b18456 Skipped flaky test (#15905) 2024-03-19 13:31:08 +01:00
Andreas ZerbstandGitHub e7f40affac V14 Bugfix ensures correct line endings for partial view snippets (#15906)
* Created extension class so we can ensure native line endings

* Added usage of extension method for ensuring native line endings

* Added tests, to see if the snippets return the correct content

* Removed space
2024-03-19 13:14:38 +01:00
2c41388096 Preserve user populated link title when selecting nodes in link picker (#14787)
* Prevent user populated link names being removed

When selecting a node in a link picker, the "name" (Link title) field is always overridden with the selected node's name.
This change prevents the field from being overridden if it is user populated.

* Don't update for media either

If there is already a name, don't update when selecting media

* Deselect current node

When selecting media, deselect current node if there is one

* Change to suggested functionality

Update to more elaborate functionality which will always use the *current* node name. i.e If you change the node name then the link picker name changes also.

* Reapply changes

Repply changes after merge from contrib branch

* Use IsCulturePublished() and only track node name

* Fallback to node name in preview

* Fix setting media name

---------

Co-authored-by: Ronald Barendse <ronald@barend.se>
2024-03-19 11:31:31 +00:00
Bjarke BergandGitHub 1e69695650 Added missing locks and use timeout on all of them in ObjectCacheAppCache (#15902)
* Added missing locks, and ensure we have timeout on all of them

* Wrap the removable of objects from the hashset in a lock

* remove old comment

* Exit correct lock
2024-03-19 10:23:11 +01:00
Bjarke Berg 697c13c649 Merge remote-tracking branch 'origin/v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Infrastructure/Migrations/PreMigration/DataTypeSplitDataCollector.cs
2024-03-19 08:52:47 +01:00
Bjarke Berg 0ec9423e0a Merge remote-tracking branch 'origin/release/13.2' into v13/dev
# Conflicts:
#	version.json
2024-03-19 08:48:07 +01:00
Bjarke Berg efe24289bf Merge remote-tracking branch 'origin/v11/dev' into v12/dev 2024-03-19 08:45:29 +01:00
Bjarke Berg 03aa17e602 Merge remote-tracking branch 'origin/v10/dev' into v11/dev 2024-03-19 08:44:55 +01:00
Bjarke Berg 99d5a7e609 Merge remote-tracking branch 'origin/release/10.8' into v10/dev 2024-03-19 08:43:59 +01:00
Bjarke Berg 383617ec17 Fix after wrong log merge 2024-03-18 19:00:30 +01:00
Kenn JacobsenandGitHub 39085b9ad4 Add DB locking for container APIs (#15870) 2024-03-18 14:27:11 +01:00
Sven GeusensandBjarke Berg a39030f4ba DataTypeSplit datacollector should not care about propertyEditors (#15898)
This ensures keys are correctly assumed to be unique => safe for dictionary usage

Co-authored-by: Sven Geusens <sge@umbraco.dk>
(cherry picked from commit e267b41575)
2024-03-18 13:21:35 +01:00
Elitsa MarinovskaandGitHub e9cfcf4e99 Revoke previous sessions when AllowConcurrentLogins is false (#15892) 2024-03-18 13:18:57 +01:00
e267b41575 DataTypeSplit datacollector should not care about propertyEditors (#15898)
This ensures keys are correctly assumed to be unique => safe for dictionary usage

Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-03-18 12:39:24 +01:00
Andreas ZerbstandGitHub 76066eac5a Skipped failing tests (#15897) 2024-03-18 12:04:51 +01:00
Jacob Overgaard 82611f9fd2 update backoffice submodule 2024-03-18 11:59:05 +01:00
MoleandGitHub 1408298adf V14: Extend IContentEntitySlim (#15890)
* Extend EntitySlim with key

* Add ListView to GenericContentEntityDto and ContentEntitySlim

* Move ContentTypeKey and ListViewKey back to BaseDto

* Remove extra DB call when mapping to DocumentTypeReferenceResponseModel

* Remove extra DB call when mapping to MediaTypeReferenceResponseModel

* Remove duplicate db call for members

* Remove now redundant base class

* Fix comment
2024-03-18 10:46:03 +01:00
Bjarke Berg 6e3496d3f5 Fix after merge
(cherry picked from commit 3e08ce1efb)

(cherry picked from commit 7e822bb8a1)
2024-03-18 08:53:35 +01:00
Bjarke Berg 14f3336941 Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>

(cherry picked from commit 2c23e67c65)
2024-03-18 08:53:15 +01:00
Bjarke Berg da43d2f08c Fix after merge
(cherry picked from commit 3e08ce1efb)

(cherry picked from commit 7e822bb8a1)
2024-03-18 08:42:59 +01:00
Bjarke Berg 827fa188f4 Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>

(cherry picked from commit 2c23e67c65)
2024-03-18 08:42:27 +01:00
Bjarke Berg 352b6fa45b Bump version 2024-03-18 08:39:19 +01:00
Bjarke Berg 8789a643ec Bump version 2024-03-18 08:38:55 +01:00
Bjarke Berg cb02c51da7 Merge remote-tracking branch 'origin/v13/dev' into v14/dev 2024-03-18 08:36:36 +01:00
Bjarke Berg 8696f66915 Merge remote-tracking branch 'origin/v12/dev' into v13/dev 2024-03-18 08:35:17 +01:00
Bjarke Berg 98de8acece Merge remote-tracking branch 'origin/v11/dev' into v12/dev 2024-03-18 08:33:15 +01:00
Bjarke Berg 0f076f7a13 Merge remote-tracking branch 'origin/v10/dev' into v11/dev
# Conflicts:
#	src/Umbraco.Infrastructure/Security/UmbracoUserManager.cs
2024-03-18 08:31:10 +01:00
JeyandBjarke Berg 7e1d1a1968 Merge pull request from GHSA-552f-97wf-pmpq
Co-authored-by: jey <jey@umbraco.dk>
(cherry picked from commit b743f6a2df)
2024-03-18 08:28:25 +01:00
b743f6a2df Merge pull request from GHSA-552f-97wf-pmpq
Co-authored-by: jey <jey@umbraco.dk>
2024-03-18 08:27:41 +01:00
Bjarke Berg 7e822bb8a1 Fix after merge
(cherry picked from commit 3e08ce1efb)
2024-03-15 17:16:04 +01:00
Bjarke Berg 6f26aae708 Update client 2024-03-15 17:13:16 +01:00
Bjarke Berg 17bc6f1d0c Merge remote-tracking branch 'origin/v13/dev' into v14/dev 2024-03-15 16:00:46 +01:00
Bjarke Berg 3e08ce1efb Fix after merge 2024-03-15 15:58:22 +01:00
Bjarke Berg 1011a2c1a6 Merge 2024-03-15 15:35:08 +01:00
Bjarke Berg 77bfff83f2 Merge remote-tracking branch 'origin/v12/dev' into v13/dev 2024-03-15 15:05:17 +01:00
Bjarke Berg a34c63a313 Merge remote-tracking branch 'origin/v11/dev' into v12/dev
# Conflicts:
#	src/Umbraco.Infrastructure/Scoping/Scope.cs
#	tests/Umbraco.Tests.Integration/Umbraco.Infrastructure/Persistence/LocksTests.cs
2024-03-15 15:01:36 +01:00
Bjarke Berg 6ea84db0ae Merge remote-tracking branch 'origin/v10/dev' into v11/dev 2024-03-15 14:55:56 +01:00
Bjarke Berg a2511ff09b Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>
(cherry picked from commit 2c23e67c65)
2024-03-15 14:55:20 +01:00
Nikolaj GeisleandGitHub 0bafede51a Remove mention of backoffice project (#15894) 2024-03-15 13:40:09 +01:00
MoleandGitHub b619399edb Remove KeepAliveJob (#15891) 2024-03-15 12:48:31 +01:00
Jacob Overgaard c2fe847ba5 update backoffice submodule 2024-03-15 11:46:19 +01:00
Kenn JacobsenandGitHub 469a54cbbe Workaround for failing entity tree children (#15887)
* Workaround for failing entity tree children

* Fix typo from original PR

* Expose and actually use GetPagedTrashedChildren on EntityService (the default implementation on the interface is currently used).

* Ensure that ID/Key mapping for recycle bins work
2024-03-15 11:21:36 +01:00
2c23e67c65 Fixing locking issues for document type saves. (#15854)
* Added  ExecuteNonQuery(DbCommand command) on database to ensure we call OnExecutingCommand and OnExecutedCommand when executing DbCommands

* Added Cache Instructions lock, to avoid deadlocks

* Optimized read locks for nucache when only one content type is rebuilt

* Optimized the SqlServer locks, so only one command is executed (and thereby roundtrip) per lock instead of two

* Avoid breaking changes

* Cosmetic changes

* Take locks if everything is rebuild

* Use same lock in scopes, to avoid potential deadlocks between the two

* Use eager locks in PublishedSnapshotService.cs

* Added timeouts to some of the application locks

* Revert "Use eager locks in PublishedSnapshotService.cs"

This reverts commit 01873aae97.

* Revert "Added Cache Instructions lock, to avoid deadlocks"

This reverts commit e3fca7c12a.

* Use single readlock call to lock many

* Use eager locks for reads

* Eager write locks

* Ignore test of lazy locks

* Unique timeout exception messages

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-03-15 10:56:02 +01:00
Kenn JacobsenandGitHub 7964f33d0d Removed "type" from tree item response models (#15862) 2024-03-15 10:37:32 +01:00
Bjarke Berg 3718a9cdd4 Revert "Ignore test of lazy locks"
This reverts commit e03ff2661b.
2024-03-15 09:47:18 +01:00
Bjarke Berg e03ff2661b Ignore test of lazy locks 2024-03-15 09:35:19 +01:00
Jacob Overgaard ab3e420cd2 update backoffice submodule 2024-03-15 09:08:52 +01:00
Bjarke Berg d82e262e13 Update imagesharp 3 2024-03-15 08:22:53 +01:00
Bjarke Berg 0e7e16f455 Merge remote-tracking branch 'origin/v12/dev' into v13/dev 2024-03-15 08:21:10 +01:00
Bjarke Berg 7585918821 Revert ImageSharp 3 upgrade due to breaking changes 2024-03-15 08:20:50 +01:00
Bjarke Berg 0e43c43609 Update imagesharp 3 2024-03-15 08:09:39 +01:00
Bjarke Berg 233452cb55 Merge remote-tracking branch 'origin/v12/dev' into v13/dev
# Conflicts:
#	src/Directory.Packages.props
2024-03-15 08:09:05 +01:00
Bjarke Berg 659e74d831 Update imagesharp 3 2024-03-15 08:08:27 +01:00
Bjarke Berg b4e2191a4d Merge remote-tracking branch 'origin/v12/dev' into v13/dev
# Conflicts:
#	src/Directory.Packages.props
2024-03-15 08:07:14 +01:00
Bjarke Berg fc86f2222c Merge remote-tracking branch 'origin/v11/dev' into v12/dev
# Conflicts:
#	src/Directory.Packages.props
2024-03-15 08:05:53 +01:00
Bjarke Berg 26958df79e Merge remote-tracking branch 'origin/v10/dev' into v11/dev
# Conflicts:
#	src/Directory.Packages.props
2024-03-15 07:58:21 +01:00
Kenn JacobsenandGitHub 072903cb7a Port V13 backoffice cookie validation to V14 (#15886)
* Port V13 backoffice cookie validator to V14

* Don't use ISystemClock
2024-03-15 07:53:06 +01:00
Bjarke Berg 8e837d387d Merge remote-tracking branch 'origin/v10/dev' into release/10.8
# Conflicts:
#	version.json
2024-03-14 14:53:42 +01:00
Bjarke Berg 801fb5f885 Bump version 2024-03-14 14:48:09 +01:00
Bjarke BergandGitHub ed517ecd86 Update Imagesharp (#15885) 2024-03-14 14:31:30 +01:00
6e1924d054 V14: Create member filter (#15877)
* Update filter to include membergroup name

* add filter by isApproved

* Add isLockedOut

* Implement member filter

* Move filter logic to repository

* Add more fields to sort by

* Update openApi

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-03-14 14:24:10 +01:00
Jacob Overgaard 88a1768b1d update backoffice submodule 2024-03-14 11:16:00 +01:00
ffcc4ac170 fix udi leaking in the management api (#15684)
* [WIP] Stop Udi leaking on ConterPicker

* Refined Udi conversion for contentPicker

Cleaned up base construcor usage to move away from the obsoleted one.

* Fixed Udi lieaking in MNTP

* Stopped Udi bleeding for MultiUrlPicker

* Remove unused assignment

* Resolved namespace issue

* Use correct configuration value for MNTP udi parsing

* Turn helper auto props into local helper function to avoid unnecesary serialization

* Remove Newtonsoft.Json from Multi URL picker

* Fixed MNTP configuration serialization

* Changed MNTP editor data from csv guid to EditorEntityReference[]

* Added remarks for the MNTP editor conversion logic

* Reworked MNTPPropertyEditor Unittests

changed intent of one
fixed bug because of 1 rework

* Update OpenApi.json

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Elitsa <elm@umbraco.dk>
Co-authored-by: kjac <kja@umbraco.dk>
2024-03-14 11:06:46 +01:00
albinjandSebastiaan Janssen 4a977b85a2 Fix UmbracoMapper InvalidOperationException due to concurrent modification of inner dictionary (#15830) 2024-03-14 11:05:18 +01:00
Jacob Overgaard f41a4f1f06 update backoffice submodule 2024-03-14 10:48:03 +01:00
9c3bc4a5c0 V14: Fix FIXMEs (#15869)
* Fix FIXMEs

* Bring AuthorizationPolicies.DenyLocalLoginIfConfigured authz policy to an action level as it doesn't apply to all

* Remove unnecessary policy

* Remove AuthorizationPolicies.DenyLocalLoginIfConfigured from base and apply to specific controllers

* Fix comment

* AllowAnonymous as it doesn't get it from the base anymore

* Reorder

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-03-14 09:02:17 +01:00
ChadandGitHub 2fbda6e64b Dispose IDisposable instances (#15810) 2024-03-13 14:59:28 +00:00
nzdevandJason Elkin ac5539a8be Avoid string.Format allocations when profiler is not enabled. 2024-03-13 14:39:57 +00:00
3fdf43cff5 Make GetByIds in ContentService extensions non nullable (#15736)
* Make GetByIds in MediaService extensions nullable

* Update src/Umbraco.Core/Packaging/PackagesRepository.cs

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Update src/Umbraco.Core/Services/MediaServiceExtensions.cs

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Update src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

* Make extensions non nullable

* Update src/Umbraco.Infrastructure/Persistence/Repositories/Implement/CreatedPackageSchemaRepository.cs

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>

---------

Co-authored-by: Jason Elkin <jasonelkin86@gmail.com>
Co-authored-by: Sebastiaan Janssen <sebastiaan@umbraco.com>
2024-03-13 15:20:31 +01:00
36bb1c9d78 Add "is deletable" to relation types + align namespaces for controllers (#15867)
Co-authored-by: Elitsa <elm@umbraco.dk>
2024-03-13 15:01:07 +01:00
MoleandGitHub ae675b28f7 V14: Remove duplicate pagination helper (#15856)
* Remove management PaginationService

* Remove usage of PaginationHelper in FilterMemberFilterController
2024-03-12 12:57:29 +01:00
Bishal TimandGitHub d8b0616434 Update documentation for GetAllContentTags method in ITagQuery interface (#15860) 2024-03-12 10:23:22 +00:00
Zeegaan e84e8fdcec Update sln to include management api 2024-03-12 11:10:15 +01:00
MoleandGitHub 1e59041667 Expose default listview ids in datatype configuration endpoint (#15865) 2024-03-12 10:40:48 +01:00
9c58714343 V14: Rename new projects (#15836)
* Rename Web.UI.New back to Web.UI

* Delete new backoffiec folder

* Rename client project

* Add new submodule

* Update template csproj

* Remove more mentions of new

* Add missing views

* Moving up the "Umbraco.Web.UI" proj reference, so that it is the first project listed in solution file (.sln) since it will be selected as startup one in VS by default.

* don't include grid

* Update with section of how to get started with backoffice

* Update .github/BUILD.md

Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>

* Add line about white page

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
Co-authored-by: Elitsa Marinovska <21998037+elit0451@users.noreply.github.com>
2024-03-12 10:17:42 +01:00
Kenn JacobsenandGitHub 69a691f315 Removed unused content editing models (#15855) 2024-03-11 13:15:25 +01:00
Bjarne FyrstenborgandGitHub ae541f5636 Webhook paged results (#15802)
* Add controller to fetch paged results of webhooks

* Return OK directly

* Fix total

* Update all languages
2024-03-11 09:56:32 +01:00
Stefan StankovicandMichael Latouche d97cbf486d Show BlockGrid Create Dialog if there are items in clipboard
Default behavior:

If you have only one available module for an area Umbraco will
open a dialog for adding the module. If you have more than one
module you will get a dialog to choose a module and that dialog
will have a Paste option in the top right corner.

New behavior:

If there is a module in the clipboard, Umbraco will open a dialog
with the Paste option even thou there is only one available module
in the area. In other cases, it will work as usual.

Reported issue: https://github.com/umbraco/Umbraco-CMS/issues/15755
2024-03-10 19:55:11 +01:00
Joe DearsleyandMichael Latouche 90864d8e58 Validation messages for blocklists no longer show HTML markup. #15697 2024-03-09 01:23:14 +01:00
Paul SealandBusra Sengul 7813acfa2b Added a check for the runtime mode and showed the relevant error message if 2024-03-08 14:18:50 +03:00
ea31ddea6d Enable member management authorization (#15843)
* Enabled Section authorization on member management endpoints

Changed filter endpoints from tree style auth to section as it returns the same model and be in line with other filter endpoints

* Clean up member filter base inheritance

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: kjac <kja@umbraco.dk>
2024-03-08 10:37:46 +01:00
Elitsa MarinovskaandGitHub 90820483d5 Try to parse string as int and return id.ToString(CultureInfo.InvariantCulture) (#15848) 2024-03-08 08:36:00 +01:00
MoleandGitHub eca13ea011 V14: Add additional validation around manipulating groups (#15834)
* Add additional validation when removing a user from usergroup

* Add additional validation to UpdateUserGroups

* Don't re-implement operation results

* Add additional validation to the update user endpoint

* Complete scopes where it's safe to do so
2024-03-07 13:21:48 +01:00
Nikolaj Geisle b86eeb6b52 bumb version 2024-03-07 09:54:14 +01:00
Nikolaj Geisle bf942d17bf Merge branch 'release/13.2' into v13/dev 2024-03-07 09:53:42 +01:00
3344274616 Xpath Query on Multinode Treepicker no longer working for new Nodes (#15159)
* fix for #14698

* Adjust XPath logic so it uses parentId as $current only when nodeContextId is null or 0

---------

Co-authored-by: Laura Neto <12862535+lauraneto@users.noreply.github.com>
2024-03-06 18:45:20 +01:00
Jacob Overgaard 614c384c47 bump version to beta002 2024-03-06 16:28:07 +00:00
Jacob Overgaard 396ee78a51 Merge branch 'v14/dev' into release/14.0 2024-03-06 15:08:00 +00:00
Jacob Overgaard 6f7c94efdb update backoffice submodule 2024-03-06 15:07:27 +00:00
Bjarke Berg 2cdc6fddc7 Merge branch 'v14/dev' into release/14.0 2024-03-06 14:33:52 +01:00
Nikolaj Geisle 7dff3a3755 bump version 2024-03-06 11:01:37 +01:00
Jacob Overgaard a48e7a7452 update backoffice submodule 2024-03-06 10:26:05 +01:00
9e455f9325 Check for duplicate keys on media if we know it's a fresh entity (#15838)
Co-authored-by: Sven Geusens <sge@umbraco.dk>
2024-03-06 08:21:33 +01:00
da6aa7735a V14: add checkboxlist to list of migrations (#15844)
* add checkboxlist to the list of migrations that should be converted

* Adds string-array type-checking

to the `ValueListUniqueValueValidator`.

As `value?.ToString()` would give you a literal string of the
object-type, e.g. `"System.Collections.Generic.List`1[System.String]"`.

* Clean up and add tests

---------

Co-authored-by: leekelleher <leekelleher@gmail.com>
Co-authored-by: kjac <kja@umbraco.dk>
2024-03-06 06:53:17 +01:00
Elitsa MarinovskaandGitHub 04400054ac V14: Cleanup [ApiController] attribute usage (#15842)
* Applying [ApiController] to ManagementApiControllerBase and the rest derive it from it

* Removing [ApiController] from deriving controllers

* Removing [ApiVersion("1.0")] from controller base

* Cleanup

* [ApiController] from deriving DeliveryApiControllerBase controller
2024-03-05 15:49:40 +01:00
Jacob Overgaard 7710d9d66c update backoffice submodule 2024-03-05 14:18:40 +01:00
Kenn JacobsenandGitHub 3830e40eff Remove legacy media picker from install (#15835)
* Remove legacy media picker from install

* Fix bad auth policy
2024-03-05 13:33:04 +01:00
Erik-Jan WestendorpandBusra Sengul ce769ffff4 Add health checks results to payload 2024-03-05 14:24:34 +03:00
Steve MorganandGitHub 3b4ca0b0f5 Media Picker - upload button disabled bug #13383 (#15115) 2024-03-05 11:13:44 +01:00
Jacob Overgaard cc6aa93ee7 update backoffice submodule 2024-03-04 22:01:09 +01:00
Jacob Overgaard 72cda44db0 correct version name replacing the double dashes with a single dash 2024-03-04 21:59:00 +01:00
Jacob Overgaard 28b5113969 update backoffice submodule 2024-03-04 17:44:41 +01:00
Jacob Overgaard fb2b6d446e update backoffice submodule 2024-03-04 17:40:55 +01:00
Jacob Overgaard 1b85341a6d update backoffice submodule 2024-03-04 17:13:46 +01:00
1fd4fce3a8 Rename policies to original names (#15825)
* Removed the "New" from all policy names now that the legacy backoffice is gone.

* more policy renaming

* more policy renaming

* Uncommenting tests

* Cleanup

* Removing unused policy names

* Renaming AdminUserEditsRequireAdmin to a more meaningful UserPermissionByResource

* Completing TODO and some alphabetical rearranging

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-03-04 15:51:24 +01:00
Jacob Overgaard 4c1cd3008c update backoffice submodule 2024-03-04 14:37:03 +01:00
3c36fd5f06 V14: Data type filter endpoint (#15804)
* Implement endpoints

* Update to orderby and orderdirection

* Implement Filter endpoint

* Remove old ByEditorUiAlias endpoint

* Add clarifying comments

* Fix up according to review

* use model in reflection

* Remove leftover sorting

* remove ordering

* Implement skip and take directly in service

* Dont use GetAllAsync

* Update OpenApi

* Refactor get all to return full list if no keys are given

* Revert "Refactor get all to return full list if no keys are given"

This reverts commit 1dd3167e96.

* Use invariant contains

* A little query optimization

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-03-04 13:21:40 +01:00
Kenn JacobsenandGitHub ca9a3bbf1b Use same cache level for MNTP no matter the output channel (#15828) 2024-03-04 13:17:38 +01:00
Kenn JacobsenandGitHub 21126b7ba6 Localize validation messages with user lang files (#15820)
* Localize validation messages with user lang files

* Fixed unit tests
2024-03-04 12:50:24 +01:00
Sven Geusens 3c653d11bb Removed smidge injection in viewImports since we no longer include smidge 2024-03-04 10:11:08 +01:00
Kenn JacobsenandGitHub d523541340 Validate culture codes for document variants (#15818)
* Validate culture codes for document variants

* Validate culture with casing in publish and unpublish

* Fix merge
2024-03-04 10:07:01 +01:00
0208522f79 V14: member group controllers fixes (#15817)
* Remove mention of keys outwards

* Get member group by id

* Update openapi.json

* Rename to align

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-03-04 08:06:20 +01:00
Andreas ZerbstandGitHub 86ed066490 Skipped failing tests. (#15821)
The reasons they are being skipped is because we are timing out on the pipeline
2024-03-03 20:36:32 +01:00
Kenn JacobsenandGitHub 55d8954b0c Align parent contexts (#15819)
* Remove explicit parent context in API outputs

* Rename "folder" to "parent" for consistency

* Regenerate OpenApi.json
2024-03-03 15:53:50 +01:00
Elitsa MarinovskaandGitHub f990ea3693 Removing workaround since we now have the content type and list view binding in place (#15816) 2024-03-01 15:10:50 +01:00
Nikolaj GeisleandGitHub 7c33afa3a9 enable start node calculation (#15813) 2024-03-01 14:18:22 +01:00
Jacob Overgaard a9c0e10595 bump to beta001 2024-03-01 14:16:34 +01:00
Elitsa MarinovskaandGitHub 6010565fab V14: Segments configuration (#15812)
* Adding configuration options for segment settings

* Add "useSegments" to the document type configuration endpoint

* Adding additional configuration for creation of non-existing segments
2024-03-01 13:06:03 +01:00
9cb1d66b10 V14: Remove Newtonsoft from packed projects (#15811)
* Migrate ObjectJsonExtensions

* Use more generic exception to not use Newtonsoft

It should matter if it's a JsonReaderException, if we can't read we can't read

* Remove obsoleted constructors

* Use more generic exception in ContentValueSetBuilder

* Fix constructors

* Remove UdiRangeJsonConverter

* Remove more legacy newtonsoft stuff

* Migrate away from newtonsoft in CacheInstructionService

* Remove unused model binders

* Remove more newtonsoft

* Remove newtonsoft from DatabaseServerMessenger

* Remove now irrelevant benchmark

* Remove the usage of Newtonsoft from ImageCropperTemplateCoreExtensions

The value converter will never return JObject, JsonDocument, or JsonNode

* Remove usages of newtonsoft in ComplexPropertyEditorContentNotificationHandler

JTokens are no longer returned, so we don't need to check for it

* Remove newtonsoft references

* Re-add newtonsoft dependency to Umbraco.Tests.Common

* Fix package references

* move dependency

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-03-01 12:51:21 +01:00
Jacob Overgaard 72d8b02426 bump version.json 2024-03-01 12:43:57 +01:00
Jacob Overgaard dd1c4fb8b7 Merge branch 'v14/dev' into release/14.0 2024-03-01 12:01:39 +01:00
Jacob Overgaard 2080fd5524 update backoffice submodule 2024-03-01 12:01:05 +01:00
Kenn JacobsenandGitHub d8659ca53e Refactor content updates to shift responsibility downwards (#15807) 2024-03-01 10:45:19 +01:00
Elitsa MarinovskaandGitHub 33c1d4e1fb V14: Return all (even nested) compositions when getting a content type by id (#15800)
* Adding a generic implementation to get all content type compositions, even the nested ones

* Modifying mappers to use the generic implementation
2024-03-01 10:23:40 +01:00
Jacob Overgaard 1bcd45f4df update backoffice submodule 2024-03-01 09:23:45 +01:00
Ethan NaganoandBusra Sengul 0cf436fa5c Add handling of failed publish.
When publishing, if the selected page does not yet have a page created,
handle the FailedPublishNothingToPublish error so that the user is not
presented with an exception. A warning is shown to the user that some
languages failed to publish due to nothing to publish and to check that
a page has been created for selected languages. Additionally fixed a
validation issue where publish would always succeed if all languages
were selected.

Issue: 15352
2024-03-01 10:42:59 +03:00
Bjarke Berg efb72b5b49 Merge remote-tracking branch 'origin/v13/dev' into v14/dev
# Conflicts:
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml
#	src/Umbraco.Core/Security/ContentPermissions.cs
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/pickdynamicrootcustomstep/pickdynamicrootcustomstep.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/pickdynamicrootorigin/pickdynamicrootorigin.controller.js
#	src/Umbraco.Web.UI.Client/src/views/common/infiniteeditors/pickdynamicrootquerystep/pickdynamicrootquerystep.controller.js
#	src/Umbraco.Web.UI.Client/src/views/prevalueeditors/treesourcetypepicker.controller.js
#	version.json
2024-03-01 08:17:06 +01:00
MihailichenkoPavelandMichael Latouche 4f9c793d00 fix user login 2024-03-01 02:31:56 +01:00
Jacob Overgaard add6908e3f update backoffice submodule 2024-02-29 17:17:42 +01:00
Kenn JacobsenandGitHub 976bca456e Remove macros (#15794)
* Remove macros!

* Clean up snippets

* Add migration that deletes all macros

* Review comments
2024-02-29 15:11:06 +01:00
Kenn JacobsenandGitHub 47d07bf2d8 ValueListConfiguration should not use ValueListItem (#15796)
* ValueListConfiguration should not use ValueListItem

* Fix test
2024-02-29 15:10:54 +01:00
b8577e3af2 V14: Unpublish multiple cultures (#15789)
* Refactor to accept multiple cultures

* Add test

* Move logic into service

* Remember to complete scope

* Move scope creation.

* Add test

* Close scope on early return

* Handle invalid cultures with bad request

* Handle valid cultures based on content

* Change return type if a culture is required

* Refactor content publishing service to have 1 unpublish method

* Update tests

* Return better error

* Scope completes

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-02-29 14:38:47 +01:00
Kenn JacobsenandGitHub 10c18e4162 Swap Newtonsoft.Json dependency for System.Text.Json in BlockEditorPropertyNotificationHandlerBase (#15790)
* Swap Newtonsoft.Json dependency for System.Text.Json in BlockEditorPropertyNotificationHandlerBase

* Review comments
2024-02-29 14:38:32 +01:00
Sebastiaan Janssen eff25b5abe Merge branch 'v13/dev' into contrib 2024-02-29 14:06:35 +01:00
Jacob Overgaard 7d1feb4ad5 update backoffice submodule 2024-02-29 14:05:28 +01:00
Kenn JacobsenandGitHub d7b77b0163 Remove Newtonsoft.Json from ImageCropperPropertyEditor (#15784)
* Remove Newtonsoft.Json from ImageCropperPropertyEditor.cs

* Make the media JSON valid
2024-02-29 13:04:41 +01:00
Kenn JacobsenandGitHub 04849948f1 Fix build errors for user permissions (#15797) 2024-02-29 11:40:47 +01:00
cf9b00bffc Refactor authorizers to be reusable from the core project (#15782)
* Refactored the Authorizers to be reuseable from core by now knowing about principal but only the IUser. Also moved them to core

* Fix multiple enumeration

* Fix more multiple enumerations

---------

Co-authored-by: Nikolaj <nikolajlauridsen@protonmail.ch>
2024-02-29 10:41:56 +01:00
393d178b58 User endpoint additions and corrections (#15773)
* Make create user endpoint work with the supplied id

Return 201 instead of 200 with correct resource identifier

* Add ResetPassword endpoint

* Bring changepassword route inline with other resource actions

* Fixed User endpoints not advertising all their possible response codes/ models

Fixed certain endpoints not authorizing targeted user(s) versus the admin needs admin authorization requirement
Fixed a user not found response bug for the update flow
Fix spacing

* Fixed CurrentUser endpoints not advertising all their possible response codes/ models

Fix incorrect responseStatus in UserService.GetPermissionsAsync

* Update OpenApi definition

Fix smal model oversights in previous commits

* Update incorrect Response type

* Check for duplicate id's in user create validation

* Remove unnecasary returnmodel from changepassword

Renamed the model to it's remaining usage

* rename bad constructor parameter

* Renamed method parameters for better readability and usage

* Fixed wrong userkey being passed down because of (refactored) bad naming

Technically doesn't change anything as the two id's should be the same in this case (reset with token is always for self)

* Fixed resetpassword bug

* Update openapi

* Update src/Umbraco.Core/Services/UserService.cs

Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>

* Remove old password from change user password request model

Only makes sense when doing it for the logged in user => current endpoint

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Kenn Jacobsen <kja@umbraco.dk>
2024-02-29 10:40:48 +01:00
Nikolaj GeisleandGitHub 1e043cbcfb V14: Member group controller (#15669)
* Add models & mapping

* Add controller

* Add create async to service

* Add auth policy

* Implement delete

* Rename response model

* Implement updateAsync

* Refactor update to use own model

* Implement all async counterparts for IMemberService

* Add tests

* Implement update member group mapping

* Dont fail if updating the current user group

* Return not found if not found

* Add missing OperationResults to MemberGroupOperationStatusResult

* Add 404 to response type

* Update openapi

* Update OpenApi

* Update OpenApi.json
2024-02-29 09:16:27 +01:00
Jacob Overgaard 3d5bb07ab1 update backoffice submodule 2024-02-29 09:15:18 +01:00
Nhu DinhandGitHub 9448854942 V14 QA Updated Dashboard acceptance tests (#15787)
* Added tests for Examine Management tab

* Added tests for Heath Check

* Added tests for Models Builder

* Added tests for Profiling

* Added tests for Published Status

* Bumped version

* Added tests for Welcome Dashboard

* Updated test name

* Bumped version of test helper

* Bumped version of test helpers

* Replace " with '

* Fixed comments

* Bumped version of test helper
2024-02-29 07:26:17 +01:00
Owain JonesandMichael Latouche beb431900a Update Welsh lang file 2024-02-29 01:46:28 +01:00
Andreas ZerbstandGitHub 664473d8eb Skips failing test so the pipeline can run (#15793) 2024-02-28 20:43:27 +01:00
Lee KelleherandGitHub ed8df56ff0 Checks that contentType isn't null before checking for .ListView (#15791)
For a collection use at the Media root, the `contentType` will be
`null`, and not have a `.ListView` configured, so would need to
fallback to the default collection configuration (data-type).

This was a small regression in PR #15687.
https://github.com/umbraco/Umbraco-CMS/pull/15687/files#diff-2ad7a39ca3a7e9fd7c4cbc72a2a28b28bf0d24c12449beff76ff8eb3b0a3ce99L192
2024-02-28 17:15:42 +01:00
fg-gscandGitHub 7a7b8461c5 Added the possibility to select all the cultures at once in the save and save&publish dialogs (#15776) 2024-02-28 15:54:50 +00:00
Jacob Overgaard 5d31a23902 update backoffice submodule 2024-02-28 15:39:16 +01:00
fa007ac257 Output notification handler messages as a header (#15786)
* Output notification handler messages as a header

* Make the notification contract public

* Moved the Notification type and added it to swagger schema

* Update swagger docs

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-02-28 15:09:08 +01:00
Kenn JacobsenandGitHub 4b4b003fc6 Add filter option to the "dictionar overview" endpoint (#15777) 2024-02-28 12:41:32 +01:00
3fea1b441c Removes more old backoffice files + Smidge! (#15788)
* Removes lots of files used by the old backoffice and that is not needed for the management api

* A little clean-up

---------

Co-authored-by: kjac <kja@umbraco.dk>
2024-02-28 12:27:54 +01:00
68a101371a Allow operation id selector to work for non-CMS API's (#15771)
* Allow OperationIdSelector to work for non CMS APIs

https://github.com/umbraco/Umbraco-CMS/issues/15716

* Fixed condition to be more readable

---------

Co-authored-by: Elitsa <elm@umbraco.dk>
2024-02-28 12:11:56 +01:00
Nhu DinhandGitHub cc6ebf35fb V14 Added acceptance tests for Dashboard (#15748)
* Added tests for Examine Management tab

* Added tests for Heath Check

* Added tests for Models Builder

* Added tests for Profiling

* Added tests for Published Status

* Bumped version

* Added tests for Welcome Dashboard

* Updated test name

* Bumped version of test helper

* Bumped version of test helpers

* Replace " with '
2024-02-28 08:40:54 +01:00
2494d8c5aa Granular permissions in Management API (#15734)
* It builds..

* Added granular permissions

* Added granular permissions

* Rename content to document

* Added migration

* Fixed issues causing the migration from v13 was not possible.

* Merged Permissions and Granular Permissions in viewmodel

* Prepared the viewmodel to a future where permissions can be more types.

* OpenApi

* Allow to translate a single char to many strings

* Use frontend friendly values for known permissions

* Validate the documents exist

* Allow setting non-document settings

* Add "$type" when required

* Rename to presentation model and update OpenApi.json

* OpenApi.json

* Fix tests

* OpenAPI

* Fixed issues with upgrades

* Add the discriminator name

* Fixed issues that only happended on SqlServer

* Fixed queries for SqlServer

* Clean up

* More cleanup

* Fix issue when migrating sqlserver

* Split fallback permissions into own concept in view model

* Also split on current user

* Added a extenable pattern for mappers between DTO => Granular Permission => ViewModel and ViewModel => Granular Permission

* Fixed issue with new exists method, that did not take duplicate keys into account.

* Added sections to current user response model

* Formatting fixes

* Move class to its own file

* xml comment

---------

Co-authored-by: Zeegaan <skrivdetud@gmail.com>
2024-02-27 21:57:02 +01:00
Kenn JacobsenandGitHub 3c2ae389f4 Remove Newtonsoft.Json from Multi URL picker (#15768) 2024-02-27 17:18:58 +01:00
Bjarke Berg 64bfe88fba Fixes tests after killing of old backoffice 2024-02-27 13:53:45 +01:00
Bjarke Berg 3db8ef029f Merge remote-tracking branch 'origin/v14/dev' into v14/dev 2024-02-27 13:01:07 +01:00
Bjarke Berg 99ce994a3c disable step for now, as it do not make sense before the client code is in the same repo 2024-02-27 13:01:03 +01:00
595ee242aa V14: Remove old backoffice project. (#15752)
* Move magical route to management api

* Move auth around

* Remove "New" cookies, as they are no longer needed

* Move all installer related

* Remove BackOfficeServerVariables.cs and trees

* Move webhooks to management api

* Remove remainting controllers

* Remove last services

* Move preview to management api

* Remove mroe extensions

* Remove tours

* Remove old Auth handlers

* Remove server variables entirely

* Remove old backoffice controller

* Remove controllers namespace entirely

* Move rest of preview

* move last services

* Move language file extension

* Remove old backoffice entirely (Backoffice and Web.UI projects)

* Clean up unused security classes

* Fix up installer route

* Remove obsolete tests

* Fix up DI in integration test

* Add missing property mapping

* Move core mapping into core

* Add composers to integration test

* remove identity

* Fix up DI

* Outcomment failing test :)

* Fix up remaining test

* Update mapper

* Remove the actual project files

* Remove backoffice cs proj

* Remove old backoffice from yml

* Run belissima before login

* Remove caching

* Refactor file paths

* Remove belle from static assets

* Dont refer to old project in templates

* update gitignore

* Add missing files

* Remove install view as its no longer used

* Fix up failing test

* Remove outcommented code

* Update submodule to latest

* fix build

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-02-27 12:40:30 +01:00
Elitsa MarinovskaandGitHub 593f1eea6c V14: Align cultures & segments casing (#15745)
* Removing to ToLowerInvariant from culture and segments

* Adding ToLowerInvariant for DeliveryAPIIndex to not modify the stored data

* Fix failing test - remove ToLowerInvariant
2024-02-27 09:56:57 +01:00
Jacob Overgaard 9a274084d6 update backoffice submodule 2024-02-27 09:51:34 +01:00
Kenn JacobsenandGitHub 48d371a9d5 Finalized the data type config migration (#15766) 2024-02-27 09:33:29 +01:00
Jacob Overgaard 9d7aea6da0 update backoffice submodule 2024-02-27 08:45:07 +01:00
Kenn JacobsenandGitHub 4443f8b88a Validate collisions in domain assignments (#15759)
* Validate collisions in domain assignments

* Update OpenApi.json
2024-02-26 15:52:02 +01:00
b320cf1b22 V14: Remove legacy manifest parser (#15744)
* Remove legacy manifest parser

* Remove unused usings

---------

Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-02-26 15:43:48 +01:00
Nikolaj GeisleandGitHub 01a7643164 Add webhooks to openapi schema (#15772) 2024-02-26 15:39:53 +01:00
Kenn JacobsenandGitHub 3f1635d742 Validate data type configuration values (#15757) 2024-02-26 15:25:41 +01:00
f47830b165 V14: Webhook Management API (#15147)
* Add webhook to management api

* Update webhook controllers

* Add ByKey webhook controller

* Fix typo

* Fix typo

* Update multiple webhooks

* Update using

* Remove duplicate constant after merge

* Fix typo in file name

* Update casing of IWebhookService

* Fix typo

* Use Webhook entity type

* Fix ambiguous reference

* Update webhook mapping

* Update after change of CreatedAtAction

* Use CreatedAtId instead

* Update src/Umbraco.Cms.Api.Management/Controllers/Webhook/ByKeyWebhookController.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Update src/Umbraco.Cms.Api.Management/Controllers/Webhook/ByKeyWebhookController.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Update src/Umbraco.Cms.Api.Management/ViewModels/Webhook/CreateWebhookRequestModel.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Update src/Umbraco.Cms.Api.Management/Controllers/Webhook/DeleteWebhookController.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Update src/Umbraco.Cms.Api.Management/Controllers/Webhook/CreateWebhookController.cs

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>

* Add Guid to WebhookResponseModel

* Cleanup

* Add Auth

* Move webhook logic from backoffice to management api

* Add mapping

---------

Co-authored-by: Nikolaj Geisle <70372949+Zeegaan@users.noreply.github.com>
2024-02-26 14:35:35 +01:00
Jacob Overgaard 0f6705795a update backoffice submodule 2024-02-26 13:36:19 +01:00
Jacob Overgaard fbfb3ad1f7 update backoffice submodule 2024-02-26 13:18:05 +01:00
Kenn JacobsenandGitHub e3d890ce47 Regenerate OpenApi.json to match current server schema (#15763) 2024-02-26 13:05:59 +01:00
Jacob Overgaard bc5d140640 generate api models before building 2024-02-26 11:23:13 +01:00
Jacob Overgaard 7ffa68e822 update backoffice submodule 2024-02-26 11:20:51 +01:00
Jacob Overgaard 405a494938 update backoffice submodule 2024-02-26 11:09:44 +01:00
Jacob OvergaardandSebastiaan Janssen f17f5522c0 revert changes in Default.cshtml regarding external login providers, as there are still parts of the backoffice using the AngularJS variables 2024-02-26 10:44:25 +01:00
Bjarke Berg 6016ecb9cf Updated openapi and added response type to temp file config 2024-02-26 10:33:59 +01:00
Kenn JacobsenandGitHub afa7c5789b Fix datatype configs for new installs (#15756) 2024-02-26 10:23:33 +01:00
203b003e41 V14 Added missing tests and fixed failed tests for Partial View (#15635)
* Added beforeEach() and remove .skip for the passed tests

* Fixed failed tests and add the tests to cover query builder

* Bumped version of test helper

* Updated api tests for Partial View as the endpoints are changed

* Fixed failed tests and remove .skip tests

* Updated test helper version and api tests for Partial View as the name of method changes

* Changed createButton() to createThreeDotsButton()

* Bumped version

* Bumped version of test helper

* Fixed comments

* Added more waits

* Splited tests out

* Changed verification method

* Added debug

* Removed console.log() and increased wait time

* Changed expect from toEqual to toBeTruthy

* Changed to use "" instead of ''

* more changes

* Updated the expectedPartialViewContent

* Changes

* Removed

* Fixed test

* Update PartialView.spec.ts

* Removed .skip

* Added code to detect os platform

* Updated expectedPartialViewContent varibale

* Added waits

* Bumped version of test helper

---------

Co-authored-by: Andreas Zerbst <andr317c@live.dk>
Co-authored-by: Andreas Zerbst <73799582+andr317c@users.noreply.github.com>
2024-02-23 12:41:35 +01:00
Kenn JacobsenandGitHub 7b80d59c36 Align tree item namespaces (#15754) 2024-02-23 11:27:48 +01:00
00dade48f6 Document and Media restore endpoints (#15681)
* Added Endpoint to get Document restore information

* Add media version of original paent recycle bin

update document permission
regisered interfaces

* Added restore endpoints

* PR feedback and other cleanup

* Update orignal root parent logic & shrank return model

---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Bjarke Berg <mail@bergmania.dk>
2024-02-22 17:37:27 +01:00
Jacob Overgaard 8027873438 update backoffice submodule 2024-02-22 17:03:41 +01:00
Kenn JacobsenandGitHub 918457d9f8 Output "operationStatus" for error scenarios whenever possible (#15703) 2024-02-22 15:17:06 +01:00
1bb4fdf43a Do not allow ignoring user start nodes for system data types (#15739)
* Do not allow ignoring start nodes for system data types

* Update OpenApi.json

* Update src/Umbraco.Cms.Api.Management/Mapping/DataType/DataTypeViewModelMapDefinition.cs

Co-authored-by: Sven Geusens <geusens@gmail.com>

* Regenerate OpenApi.json

---------

Co-authored-by: Sven Geusens <geusens@gmail.com>
2024-02-22 15:16:31 +01:00
Jacob Overgaard 641c160e60 update backoffice submodule 2024-02-22 15:13:36 +01:00
Sven Geusens 99f841b7ae Bump rc version 2024-02-22 14:44:01 +01:00
Kenn JacobsenandGitHub ac01abd55f Clean up leftovers from old dictionary pagination (#15747) 2024-02-22 13:03:25 +01:00
Jacob Overgaard 4ca2c814f5 down version to 007 2024-02-22 12:55:46 +01:00
Kenn JacobsenandGitHub 00d1ebe3de Remove the default value constraint on "isContainer" before deleting the column (#15751)
* Remove the default value constraint on "isContainer" before deleting the column

* Swap migrations to avoid targeting missing column
2024-02-22 12:47:07 +01:00
Jacob OvergaardandGitHub da41373f85 V14: Run SQL Server Integration/Acceptance tests manually (#15750)
* temp fix until we stop getting timeouts: sql server tests should only be run manually

* simplify condition
2024-02-22 12:22:28 +01:00
Jacob Overgaard e0e1688e6a update backoffice submodule 2024-02-22 11:41:39 +01:00
MoleandGitHub 7735552877 V14: Migrate Newtonsoft to System.Text in value converters (#15728)
* Force system text json for IJSonSerializer

* Migrate ColorPickerValueConverter

* Move ColorPickerValueConverter

* Clean up ColorPickerValueConverter

* Remove obsoleted property editors

* Migrate FlexibleDropdownPropertyValueConverter to System.Text.Json

* Use IJsonSerializer instead and move the value converter to Core

* Migrate ImageCropperValueConverter to System.Text.Json

* Inject jsonserializer in test and obsolete old constructor

* Migrate JsonValueConverter to System.Text.Json

* Remove ContextualConfigurationEditorJsonSerializer

* Remove JsonNetSerializer

* Remove obsolete DeserializeSubset from JsonSerializer interface

* Fix FlexibleDropdownPropertyValueConverter

* Update test JSON to be actual valid json

* Update more test json

* Update time format to be valid

* Add JsonPropertyName to models
2024-02-22 11:22:57 +01:00
Jacob Overgaard 58bc868374 update backoffice submodule 2024-02-22 10:47:44 +01:00
Jacob Overgaard 9c7949d46f add test to ensure the json converter do not mess with the extensions list 2024-02-22 10:47:43 +01:00
Sebastiaan Janssen 3e1abd1404 Merge branch 'v13/dev' into contrib 2024-02-22 10:34:56 +01:00
Kenn JacobsenandGitHub 1a8797e694 Migrate data type configurations from V7.0+ (#15733)
* Migrate data type configurations from V7.0+

* Update listview defaults to match the install ones
2024-02-22 10:31:48 +01:00
Zeegaan b744f58b58 Order migrations correctly 2024-02-22 10:17:19 +01:00
Nikolaj GeisleandGitHub 4eb1ea6205 V14: List view reference in ContentType (#15687)
* Replace all IsContainer mentions with new ListView property

* Map the list view when creating and updating

* Implement list view migration

* Refactor listview to collection

* Do not assign listview if IsContainer is false

* Fix up HasContainerInPath query

* Update OpenApi.json

* fix up according to review

* Refactor duplicate code to use extension method instead

* Dont make new guid, check for null

* Make extension internal

* Fix up after merge

* Use ReferenceById static method instead of extension
2024-02-22 09:11:31 +01:00
Christian VåganandJason Elkin a7cacc9bb3 Add CultureInfo.InvariantCulture argument to nodeId.ToString() in CheckPermissionsPath() call 2024-02-21 22:29:11 +00:00
Jeavon LeopoldandJason Elkin 5978412b23 Add custom Examine FileSystemDirectoryFactory
So that the Umbraco SiteName property is used when generating the temp folder name hash
2024-02-21 22:14:06 +00:00
Jacob Overgaard ce24845907 allow release tags to reference public releases 2024-02-21 15:57:24 +01:00
Sven Geusens 793b0e591f Merge branch 'v14/dev' of https://github.com/umbraco/Umbraco-CMS into v14/dev 2024-02-21 15:02:55 +01:00
Sven Geusens 1b95679c89 Fix v14 tests 2024-02-21 15:02:48 +01:00
Jacob Overgaard 32117dbfd7 Merge branch 'v14/dev' of https://github.com/umbraco/Umbraco-CMS into v14/dev 2024-02-21 14:46:08 +01:00
Jacob Overgaard aab4acce8d bump to preview008 2024-02-21 14:45:46 +01:00
Sven Geusens 380d3eab6d Merge branch 'v14/dev' of https://github.com/umbraco/Umbraco-CMS into v14/dev 2024-02-21 14:41:21 +01:00
Sven Geusens ed7b4ce44f Merge branch 'v13/dev' into v14/dev
# Conflicts:
#	Directory.Packages.props
#	src/Umbraco.Core/DependencyInjection/UmbracoBuilder.cs
#	src/Umbraco.Core/Models/Mapping/ContentPropertyDisplayMapper.cs
#	src/Umbraco.Core/Services/DataTypeService.cs
#	src/Umbraco.Infrastructure/PropertyEditors/BlockEditorPropertyValueEditor.cs
#	src/Umbraco.Infrastructure/PropertyEditors/BlockValuePropertyValueEditorBase.cs
#	src/Umbraco.Infrastructure/PropertyEditors/ImageCropperPropertyValueEditor.cs
#	src/Umbraco.Infrastructure/PropertyEditors/MediaPicker3PropertyEditor.cs
#	src/Umbraco.Infrastructure/PropertyEditors/NestedContentPropertyEditor.cs
#	src/Umbraco.Infrastructure/PropertyEditors/RichTextPropertyEditor.cs
2024-02-21 14:39:41 +01:00
129adf2699 Fix excessive datatype load times in propertyValueEditors and backoffice mapping (#15731)
* Introduced IDataTypeConfigurationCache
* Applied IDataTypeConfigurationCache to Property Editors and display mapping
* Invalidate new cache trough DataTypeConfigurationCacheRefresher
* Improve IDatatype service to use cached int path when fetching by guid (using idkeymap)
---------

Co-authored-by: Sven Geusens <sge@umbraco.dk>
Co-authored-by: Ronald Barendse <ronald@barend.se>
2024-02-21 09:05:44 +01:00
Bjarne FyrstenborgandGitHub 8145a90094 Content type picker in dynamic root pickers (#15514) 2024-02-14 12:34:18 +01:00
5477 changed files with 95593 additions and 379724 deletions
+10
View File
@@ -13,6 +13,16 @@ If the answer is yes, please read on. Otherwise, make sure to head on over [to t
↖️ You can jump to any section by using the "table of contents" button ( ![Table of contents icon](img/tableofcontentsicon.svg) ) above.
## Getting Started:
To run umbraco, we first need to initialize the client git submodule:
* Execute `git submodule update --init` to get the files into Umbraco.Web.UI.Client project
* If you are going to work on the Backoffice, you can either go to the Umbraco.Web.UI.Client folder and check out a new branch or set it up in your IDE, which will allow you to commit to each repository simultaneously:
* **Rider**: Preferences -> Version Control -> Directory Mappings -> Click the '+' sign
* If you get a white page delete Umbraco.Cms.StaticAssets\wwwroot\umbraco folder and run `npm ci && npm run build:for:cms` inside Umbraco.Web.UI.Client folder to clear out any leftover files from older versions.
### Latest version
* If you want to get the latest changes from the client repository, run `git submodule update` again which will pull the latest main branch.
## Debugging source locally
-38
View File
@@ -1,38 +0,0 @@
# New backoffice
> **Warning**:
> This is an early WIP and is set not to be packable since we don't want to release this yet. There will be breaking changes in these projects.
This solution folder contains the projects for the new backoffice. If you're looking to fix or improve the existing CMS, this is not the place to do it, although we do very much appreciate your efforts.
### Getting Started: Management API
This branch contains the project for the new Management API as well as the new Backoffice. To get started with the Management API you should:
* Run any of the executables (Umbraco.Web.UI or Umbraco.Web.UI.New)
* Access "/umbraco/swagger" in the browser to see the Swagger interface
* The API lives in the Umbraco.Cms.Api.Management project
### Getting Started: Backoffice
To run the new Backoffice:
* Execute `git submodule init` and then `git submodule update` to get the files into Umbraco.Web.UI.New.Client project
* Run Umbraco.Web.UI.New project
* If you get a white page delete Umbraco.Cms.StaticAssets\wwwroot\umbraco folder and run `npm ci && npm run build:for:cms` inside Umbraco.Web.UI.New.Client folder to clear out any leftover files from older versions.
* If you are going to work on the Backoffice, you can either go to the Umbraco.Web.UI.New.Client folder and check out a new branch or set it up in your IDE, which will allow you to commit to each repository simultaneously:
* **Rider**: Preferences -> Version Control -> Directory Mappings -> Click the '+' sign
### Latest version
* If you want to get the latest changes from the Backoffice repository, run `git submodule update` again which will pull the latest main branch.
### Project structure
Since the new backoffice API is still very much a work in progress, we've created new projects for the new backoffice API:
* Umbrao.Cms.ManagementApi - The "presentation layer" for the management API
* "New" versions of existing projects, should be merged with the existing projects when the new API is released:
* Umbraco.Cms.Core
* Umbraco.Cms.Infrastructure
* Umbraco.Cms.Web.Common
* Umbraco.Web.UI.New
* Umbraco.Web.UI.New.Client
This also means that we have to use "InternalsVisibleTo" for the new projects since these should be able to access the internal classes since they will when they get merged.
+26 -21
View File
@@ -2,47 +2,52 @@
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](../LICENSE.md)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](CONTRIBUTING.md)
[![Follow Umbraco on Twitter](https://img.shields.io/badge/Follow-blue?logo=twitter&logoColor=fff)](https://twitter.com/intent/follow?screen_name=umbraco)
![Mastodon Follow](https://img.shields.io/mastodon/follow/110661369750014952?domain=https%3A%2F%2Fumbracocommunity.social)
[![Chat about Umbraco on Discord](https://img.shields.io/discord/869656431308189746?logo=discord&logoColor=fff)](https://discord.gg/umbraco)
[![Read what's going on in the Umbraco Discord chat now](https://img.shields.io/badge/read-discord-blue)](https://discord-chats.umbraco.com)
[![Build status](https://img.shields.io/azure-devops/build/umbraco/Umbraco%2520Cms/301?logo=azurepipelines&label=Azure%20Pipelines)](https://umbraco.visualstudio.com/Umbraco%20Cms/_build?definitionId=301)
[![Open in GitHub Codespaces](https://img.shields.io/badge/Open%20in%20GitHub%20Codespaces-525252?logo=github)](https://github.com/codespaces/new?hide_repo_select=true&ref=contrib&repo=10601208&machine=basicLinux32gb&devcontainer_path=.devcontainer%2Fdevcontainer.json&location=WestEurope)
Umbraco is the friendliest, most flexible and fastest growing ASP.NET CMS, and used by more than 500,000 websites worldwide. Our mission is to help you deliver delightful digital experiences by making Umbraco friendly, simpler and social.
### Umbraco is a free and open source .NET content management system. Our mission is to help you deliver delightful digital experiences by making Umbraco friendly, simpler and social.
Learn more at [umbraco.com](https://umbraco.com)
<p align="center">
<img src="img/logo.png" alt="Umbraco Logo" />
<img src="img/logo.png" alt="Umbraco Logo" />
</p>
See the official [Umbraco website](https://umbraco.com) for an introduction, core mission and values of the product and team behind it.
## <a name="install"></a>Looking to install Umbraco?
- [Getting Started](#getting-started)
- [Documentation](#documentation)
- [Community](#join-the-umbraco-community)
- [Contributing](#contributing)
You can get started using the following commands on Windows, Linux and MacOS (after installing the [.NET Runtime and SDK](https://docs.umbraco.com/umbraco-cms/fundamentals/setup/requirements)):
Please also see our [Code of Conduct](https://github.com/umbraco/.github/blob/main/.github/CODE_OF_CONDUCT.md).
## Getting Started
[Umbraco Cloud](https://umbraco.com/cloud) is the easiest and fastest way to use Umbraco yet, with full support for all your custom .NET code and integrations. You're up and running in less than a minute, and your life will be made easier with automated upgrades and a built-in deployment engine. We offer a free 14-day trial, no credit card needed.
If you want to DIY, then you can [download Umbraco]((https://our.umbraco.com/download)) either as a ZIP file or via NuGet. It's the same version of Umbraco CMS that powers Umbraco Cloud, but you'll need to find a place to host it yourself, and handling deployments and upgrades will be all up to you.
```
dotnet new install Umbraco.Templates
dotnet new umbraco --name MyProject
cd MyProject
dotnet run
```
## Documentation
The documentation for Umbraco CMS can be found [on Our Umbraco](https://docs.umbraco.com/). The source for the Umbraco docs is [open source as well](https://github.com/umbraco/UmbracoDocs) and we're happy to look at your documentation contributions.
Our [comprehensive documentation](https://docs.umbraco.com/umbraco-cms) takes you from the fundamentals on how to start with Umbraco to deploying it to production.
## Join the Umbraco community
Some important documentation links to get you started:
Our friendly community is available 24/7 at the community hub, we call ["Our Umbraco"](https://our.umbraco.com/). Our Umbraco features forums for questions and answers, documentation, downloadable plugins for Umbraco, and a rich collection of community resources.
- [Installing Umbraco CMS](https://docs.umbraco.com/umbraco-cms/fundamentals/setup/install)
- [Getting to know Umbraco](https://docs.umbraco.com/umbraco-cms/fundamentals/get-to-know-umbraco)
- [Tutorials for creating a basic website and customizing the editing experience](https://docs.umbraco.com/umbraco-cms/tutorials/overview)
Besides "Our", we all support each other in our [Community Discord Server](https://discord.gg/umbraco) and on Twitter: [Umbraco HQ](https://twitter.com/umbraco), [Release Updates](https://twitter.com/umbracoproject), [#umbraco](https://twitter.com/hashtag/umbraco)
## 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!
## Looking to contribute back to Umbraco?
## Contributing
You came to the right place! Our GitHub repository is available for all kinds of contributions:
- [Create a bug report](https://github.com/umbraco/Umbraco-CMS/issues)
- [Create a feature request](https://github.com/umbraco/Umbraco-CMS/discussions)
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/).
+38
View File
@@ -0,0 +1,38 @@
# .github/release.yml
changelog:
exclude:
labels:
- ignore-for-release
- duplicate
- wontfix
categories:
- title: 🙌 Notable Changes
labels:
- category/notable
- title: 💥 Breaking Changes
labels:
- category/breaking
- title: 🐛 Bug Fixes
labels:
- type/bug
- category/bug
- type/improvement
- title: 📄 Documentation
labels:
- category/documentation
- title: 🏠 Internal
labels:
- internal
- title: 📦 Dependencies
labels:
- dependencies
- title: 🌈 A11Y
labels:
- category/accessibility
- title: 🚀 New Features
labels:
- type/feature
- title: Other Changes
labels:
- '*'
+2 -2
View File
@@ -1,3 +1,3 @@
[submodule "src/Umbraco.Web.UI.New.Client"]
path = src/Umbraco.Web.UI.New.Client
[submodule "src/Umbraco.Web.UI.Client"]
path = src/Umbraco.Web.UI.Client
url = https://github.com/umbraco/Umbraco.CMS.Backoffice.git
+3 -2
View File
@@ -14,6 +14,7 @@
<NeutralLanguage>en-US</NeutralLanguage>
<Nullable>enable</Nullable>
<WarningsAsErrors>nullable</WarningsAsErrors>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<WarnOnPackingNonPackableProject>false</WarnOnPackingNonPackableProject>
@@ -28,8 +29,8 @@
<!-- Package Validation -->
<PropertyGroup>
<GenerateCompatibilitySuppressionFile>true</GenerateCompatibilitySuppressionFile>
<EnablePackageValidation>false</EnablePackageValidation>
<GenerateCompatibilitySuppressionFile>false</GenerateCompatibilitySuppressionFile>
<EnablePackageValidation>true</EnablePackageValidation>
<PackageValidationBaselineVersion>14.0.0</PackageValidationBaselineVersion>
<EnableStrictModeForCompatibleFrameworksInPackage>true</EnableStrictModeForCompatibleFrameworksInPackage>
<EnableStrictModeForCompatibleTfms>true</EnableStrictModeForCompatibleTfms>
+42 -40
View File
@@ -5,32 +5,33 @@
</PropertyGroup>
<!-- Global packages (private, build-time packages for all projects) -->
<ItemGroup>
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.6.133" />
<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.507" />
<GlobalPackageReference Include="Umbraco.Code" Version="2.1.0" />
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.6.139" />
<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
<GlobalPackageReference Include="Umbraco.Code" Version="2.2.0" />
<GlobalPackageReference Include="Umbraco.GitVersioning.Extensions" Version="0.2.0" />
</ItemGroup>
<!-- Microsoft packages -->
<ItemGroup>
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.1" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.1" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.8.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.1" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.11" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.11" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0" />
<PackageVersion Include="Microsoft.Data.Sqlite" Version="8.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.11" />
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.11" />
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="8.0.11" />
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="8.0.11" />
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="8.0.11" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageVersion Include="Microsoft.Extensions.Options" Version="8.0.2" />
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="8.0.0" />
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="8.0.0" />
</ItemGroup>
@@ -41,53 +42,54 @@
</ItemGroup>
<!-- Third-party packages -->
<ItemGroup>
<PackageVersion Include="Asp.Versioning.Mvc" Version="8.0.0" />
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.0.0" />
<PackageVersion Include="Asp.Versioning.Mvc" Version="8.1.0" />
<PackageVersion Include="Asp.Versioning.Mvc.ApiExplorer" Version="8.1.0" />
<PackageVersion Include="Dazinator.Extensions.FileProviders" Version="2.0.0" />
<PackageVersion Include="Examine" Version="3.2.0" />
<PackageVersion Include="Examine.Core" Version="3.2.0" />
<PackageVersion Include="HtmlAgilityPack" Version="1.11.57" />
<PackageVersion Include="JsonPatch.Net" Version="2.1.0" />
<PackageVersion Include="K4os.Compression.LZ4" Version="1.3.6" />
<PackageVersion Include="MailKit" Version="4.3.0" />
<PackageVersion Include="Examine" Version="3.5.0" />
<PackageVersion Include="Examine.Core" Version="3.5.0" />
<PackageVersion Include="HtmlAgilityPack" Version="1.11.71" />
<PackageVersion Include="JsonPatch.Net" Version="3.1.1" />
<PackageVersion Include="K4os.Compression.LZ4" Version="1.3.8" />
<PackageVersion Include="MailKit" Version="4.8.0" />
<PackageVersion Include="Markdown" Version="2.2.1" />
<PackageVersion Include="MessagePack" Version="2.5.140" />
<PackageVersion Include="MessagePack" Version="2.5.192" />
<PackageVersion Include="MiniProfiler.AspNetCore.Mvc" Version="4.3.8" />
<PackageVersion Include="MiniProfiler.Shared" Version="4.3.8" />
<PackageVersion Include="ncrontab" Version="3.3.3" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
<PackageVersion Include="NPoco" Version="5.7.1" />
<PackageVersion Include="NPoco.SqlServer" Version="5.7.1" />
<PackageVersion Include="OpenIddict.Abstractions" Version="4.10.1" />
<PackageVersion Include="OpenIddict.AspNetCore" Version="4.10.1" />
<PackageVersion Include="OpenIddict.EntityFrameworkCore" Version="4.10.1" />
<PackageVersion Include="OpenIddict.Abstractions" Version="5.7.0" />
<PackageVersion Include="OpenIddict.AspNetCore" Version="5.7.0" />
<PackageVersion Include="OpenIddict.EntityFrameworkCore" Version="5.7.0" />
<PackageVersion Include="Serilog" Version="3.1.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.3" />
<PackageVersion Include="Serilog.Enrichers.Process" Version="2.0.2" />
<PackageVersion Include="Serilog.Enrichers.Thread" Version="3.1.0" />
<PackageVersion Include="Serilog.Expressions" Version="4.0.0" />
<PackageVersion Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageVersion Include="Serilog.Formatting.Compact" Version="2.0.0" />
<PackageVersion Include="Serilog.Formatting.Compact.Reader" Version="3.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.0" />
<PackageVersion Include="Serilog.Settings.Configuration" Version="8.0.4" />
<PackageVersion Include="Serilog.Sinks.Async" Version="1.5.0" />
<PackageVersion Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageVersion Include="Serilog.Sinks.Map" Version="1.0.2" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.2" />
<PackageVersion Include="SixLabors.ImageSharp.Web" Version="3.1.0" />
<PackageVersion Include="Smidge.InMemory" Version="4.3.0" />
<PackageVersion Include="Smidge.Nuglify" Version="4.3.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageVersion Include="SixLabors.ImageSharp" Version="3.1.7" />
<PackageVersion Include="SixLabors.ImageSharp.Web" Version="3.1.3" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.9.0" />
</ItemGroup>
<!-- Transitive pinned versions (only required because our direct dependencies have vulnerable versions of transitive dependencies) -->
<ItemGroup>
<!-- Both Microsoft.EntityFrameworkCore.SqlServer and NPoco.SqlServer bring in a vulnerable version of Azure.Identity -->
<PackageVersion Include="Azure.Identity" Version="1.10.4" />
<PackageVersion Include="Azure.Identity" Version="1.13.1" />
<!-- Dazinator.Extensions.FileProviders brings in a vulnerable version of System.Net.Http -->
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
<!-- Examine brings in a vulnerable version of System.Security.Cryptography.Xml -->
<PackageVersion Include="System.Security.Cryptography.Xml" Version="8.0.0" />
<PackageVersion Include="System.Security.Cryptography.Xml" Version="8.0.2" />
<!-- Both Dazinator.Extensions.FileProviders and MiniProfiler.AspNetCore.Mvc bring in a vulnerable version of System.Text.RegularExpressions -->
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
<!-- Both OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer bring in a vulnerable version of Microsoft.IdentityModel.JsonWebTokens -->
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="7.7.1" />
<!-- Examine.Lucene bring in a vulnerable version of Lucene.Net.Replicator -->
<PackageVersion Include="Lucene.Net.Replicator" Version="4.8.0-beta00017" />
</ItemGroup>
</Project>
+92 -86
View File
@@ -5,8 +5,8 @@ parameters:
displayName: Run SQL Server Integration Tests
type: boolean
default: false
- name: sqlServerAcceptanceTests
displayName: Run SQL Server Acceptance Tests
- name: sqlServerLinuxAcceptanceTests
displayName: Run SQL Server Linux Acceptance Tests
type: boolean
default: false
- name: myGetDeploy
@@ -63,64 +63,36 @@ variables:
DOTNET_GENERATE_ASPNET_CERTIFICATE: false
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
npm_config_cache: $(Pipeline.Workspace)/.npm_client
NODE_OPTIONS: --max_old_space_size=16384
stages:
###############################################
## Build
###############################################
- stage: Build
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm_client
NODE_OPTIONS: --max_old_space_size=16384
jobs:
- job: A
displayName: Build Umbraco CMS
pool:
vmImage: 'ubuntu-latest'
vmImage: 'windows-latest'
steps:
- checkout: self
submodules: true
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
versionSpec: $(nodeVersion)
- task: Cache@2
displayName: Cache node_modules
inputs:
key: '"npm_client" | "$(Agent.OS)" | $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/package-lock.json'
restoreKeys: |
"npm_client" | "$(Agent.OS)"
"npm_client"
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: src/Umbraco.Web.UI.Client
displayName: Run npm ci (Backoffice)
- task: gulp@0
displayName: Run gulp build (Backoffice)
inputs:
gulpFile: src/Umbraco.Web.UI.Client/gulpfile.js
targets: coreBuild
workingDirectory: src/Umbraco.Web.UI.Client
useGlobalJson: true
- template: templates/backoffice-install.yml
- script: npm run build:for:cms
displayName: Run build (Bellissima)
workingDirectory: src/Umbraco.Web.UI.Client
- script: npm ci --no-fund --no-audit --prefer-offline
displayName: Run npm ci (Login)
workingDirectory: src/Umbraco.Web.UI.Login
- script: npm run build
displayName: Run npm build (Login)
workingDirectory: src/Umbraco.Web.UI.Login
- script: npm ci --no-fund --no-audit --prefer-offline
displayName: Run npm ci (Bellissima)
workingDirectory: src/Umbraco.Web.UI.New.Client
- script: npm run build:for:cms
displayName: Run build (Bellissima)
workingDirectory: src/Umbraco.Web.UI.New.Client
- script: npm run build
displayName: Run Login Build (Bellissima)
workingDirectory: src/Umbraco.Web.UI.New.Client/apps/auth
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
useGlobalJson: true
- task: DotNetCoreCLI@2
displayName: Run dotnet restore
inputs:
@@ -143,19 +115,26 @@ stages:
inputs:
targetPath: $(Build.SourcesDirectory)
artifactName: build_output
- job: B
displayName: Build Bellissima Package
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
submodules: true
- template: templates/backoffice-install.yml
- script: npm run build:for:npm
displayName: Run build:for:npm
workingDirectory: src/Umbraco.Web.UI.Client
- bash: |
echo "##[command]Running npm version"
echo "##[debug]Version: $PACKAGE_VERSION"
echo "##[command]Running npm pack"
echo "##[debug]Output directory: $(Build.ArtifactStagingDirectory)"
npm version $PACKAGE_VERSION --allow-same-version --no-git-tag-version
mkdir $(Build.ArtifactStagingDirectory)/npm
npm pack --pack-destination $(Build.ArtifactStagingDirectory)/npm
mv .npmrc $(Build.ArtifactStagingDirectory)/npm/
displayName: Prepare Bellissima npm package
env:
PACKAGE_VERSION: $(build.NBGV_NpmPackageVersion)
workingDirectory: src/Umbraco.Web.UI.New.Client
displayName: Run npm pack
workingDirectory: src/Umbraco.Web.UI.Client
- task: PublishPipelineArtifact@1
displayName: Publish Bellissima npm artifact
inputs:
@@ -224,47 +203,44 @@ stages:
pool:
vmImage: 'ubuntu-latest'
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm_client
NODE_OPTIONS: --max_old_space_size=16384
BASE_PATH: /v$(umbracoMajorVersion)/ui
steps:
- checkout: self
submodules: true
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
inputs:
versionSpec: $(nodeVersion)
- task: Cache@2
displayName: Cache node_modules
inputs:
key: '"npm_client" | "$(Agent.OS)"| $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/package-lock.json | $(Build.SourcesDirectory)/src/Umbraco.Web.UI.New.Client/package-lock.json'
restoreKeys: |
"npm_client" | "$(Agent.OS)"
"npm_client"
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: src/Umbraco.Web.UI.New.Client
displayName: Run npm ci
- template: templates/backoffice-install.yml
- script: npm run storybook:build
displayName: Build Storybook
env:
VITE_BASE_PATH: $(BASE_PATH)/
workingDirectory: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.New.Client
workingDirectory: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client
- script: sed -i "s|/umbraco/backoffice|$(BASE_PATH)/umbraco/backoffice|" assets/*.js
displayName: Replace BASE_PATH on assets
workingDirectory: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.New.Client/storybook-static
workingDirectory: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/storybook-static
- task: ArchiveFiles@2
displayName: Archive js Docs
displayName: Archive Storybook
inputs:
rootFolderOrFile: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.New.Client/storybook-static
rootFolderOrFile: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/storybook-static
includeRootFolder: false
archiveFile: $(Build.ArtifactStagingDirectory)/ui-docs.zip
- task: PublishPipelineArtifact@1
displayName: Publish js Docs
displayName: Publish Storybook
inputs:
targetPath: $(Build.ArtifactStagingDirectory)/ui-docs.zip
artifact: ui-docs
- script: npm run generate:ui-api-docs
displayName: Generate API Docs
workingDirectory: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client
- task: ArchiveFiles@2
displayName: Archive UI API Docs
inputs:
rootFolderOrFile: $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/ui-api
includeRootFolder: false
archiveFile: $(Build.ArtifactStagingDirectory)/ui-api-docs.zip
- task: PublishPipelineArtifact@1
displayName: Publish UI API Docs
inputs:
targetPath: $(Build.ArtifactStagingDirectory)/ui-api-docs.zip
artifact: ui-api-docs
###############################################
## Test
@@ -357,7 +333,8 @@ stages:
# Integration Tests (SQL Server)
- job:
timeoutInMinutes: 180
condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerIntegrationTests}})
# condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerIntegrationTests}}) # Outcommented due to timeouts
condition: eq(${{parameters.sqlServerIntegrationTests}}, True)
displayName: Integration Tests (SQL Server)
strategy:
matrix:
@@ -481,7 +458,8 @@ stages:
- pwsh: |
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
URL=$(ASPNETCORE_URLS)" | Out-File .env
URL=$(ASPNETCORE_URLS)
STORAGE_STAGE_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/playwright/.auth/user.json" | Out-File .env
displayName: Generate .env
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
@@ -528,6 +506,10 @@ stages:
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
workingDirectory: $(Agent.BuildDirectory)/app
# Ensures we have the package wait-on installed
- pwsh: npm install wait-on
displayName: Install wait-on package
# Wait for application to start responding to requests
- pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS)
displayName: Wait for application
@@ -539,7 +521,7 @@ stages:
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Test
- pwsh: npm run test --ignore-certificate-errors
- pwsh: npm run smokeTestSqlite --ignore-certificate-errors
displayName: Run Playwright tests
continueOnError: true
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
@@ -575,17 +557,17 @@ stages:
- job:
displayName: E2E Tests (SQL Server)
condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerAcceptanceTests}})
variables:
# Connection string
CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True
CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.SqlClient
strategy:
matrix:
Linux:
vmImage: 'ubuntu-latest'
SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True'
${{ if eq(parameters.sqlServerLinuxAcceptanceTests, True) }} :
Linux:
vmImage: 'ubuntu-latest'
SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True'
Windows:
vmImage: 'windows-latest'
pool:
@@ -611,7 +593,8 @@ stages:
- pwsh: |
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
URL=$(ASPNETCORE_URLS)" | Out-File .env
URL=$(ASPNETCORE_URLS)
STORAGE_STAGE_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/playwright/.auth/user.json" | Out-File .env
displayName: Generate .env
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
@@ -678,7 +661,7 @@ stages:
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Test
- pwsh: npm run test --ignore-certificate-errors
- pwsh: npm run smokeTest --ignore-certificate-errors
displayName: Run Playwright tests
continueOnError: true
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
@@ -729,7 +712,7 @@ stages:
dependsOn:
- Unit
- Integration
# - E2E
# - E2E
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.myGetDeploy}}))
jobs:
- job:
@@ -782,7 +765,7 @@ stages:
# Find the first .tgz file in the current directory and publish it
files=( ./*.tgz )
npm publish --access public "${files[0]}"
npm publish "${files[0]}"
displayName: Push to npm (MyGet)
workingDirectory: $(Pipeline.Workspace)/npm
@@ -836,7 +819,7 @@ stages:
# Find the first .tgz file in the current directory and publish it
files=( ./*.tgz )
npm publish --tag $npmTag --access public "${files[0]}"
npm publish "${files[0]}"
displayName: Push to npm
workingDirectory: $(Pipeline.Workspace)/npm
@@ -848,7 +831,7 @@ stages:
displayName: Upload API Documentation
dependsOn:
- Build
- Deploy_MyGet # Change to "Deploy_Nuget" after release of v14
- Deploy_NuGet
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.uploadApiDocs}}))
jobs:
- job:
@@ -875,7 +858,7 @@ stages:
BlobPrefix: v$(umbracoMajorVersion)/csharp
CleanTargetBeforeCopy: true
- job:
displayName: Upload js Docs
displayName: Upload Storybook
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
@@ -888,7 +871,7 @@ stages:
archiveFilePatterns: $(Build.SourcesDirectory)/ui-docs.zip
destinationFolder: $(Build.ArtifactStagingDirectory)/ui-docs
- task: AzureFileCopy@4
displayName: 'Copy UI Docs to blob storage'
displayName: 'Copy Storybook to blob storage'
inputs:
SourcePath: '$(Build.ArtifactStagingDirectory)/ui-docs/*'
azureSubscription: umbraco-storage
@@ -897,3 +880,26 @@ stages:
ContainerName: '$web'
BlobPrefix: v$(umbracoMajorVersion)/ui
CleanTargetBeforeCopy: true
- job:
displayName: Upload UI API Docs
steps:
- checkout: none
- task: DownloadPipelineArtifact@2
displayName: Download artifact
inputs:
artifact: ui-api-docs
path: $(Build.SourcesDirectory)
- task: ExtractFiles@1
inputs:
archiveFilePatterns: $(Build.SourcesDirectory)/ui-api-docs.zip
destinationFolder: $(Build.ArtifactStagingDirectory)/ui-api-docs
- task: AzureFileCopy@4
displayName: 'Copy UI API Docs to blob storage'
inputs:
SourcePath: '$(Build.ArtifactStagingDirectory)/ui-api-docs/*'
azureSubscription: umbraco-storage
Destination: AzureBlob
storage: umbracoapidocs
ContainerName: '$web'
BlobPrefix: v$(umbracoMajorVersion)/ui-api
CleanTargetBeforeCopy: true
+399
View File
@@ -0,0 +1,399 @@
name: Nightly_E2E_Test_$(TeamProject)_$(Build.DefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)
pr: none
trigger: none
# schedules:
# - cron: '0 0 * * *'
# displayName: Daily midnight build
# branches:
# include:
# - v14/dev
variables:
nodeVersion: 20
solution: umbraco.sln
buildConfiguration: Release
UMBRACO__CMS__GLOBAL__ID: 00000000-0000-0000-0000-000000000042
DOTNET_NOLOGO: true
DOTNET_GENERATE_ASPNET_CERTIFICATE: false
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
npm_config_cache: $(Pipeline.Workspace)/.npm_client
NODE_OPTIONS: --max_old_space_size=16384
parameters:
- name: runSmokeTests
displayName: Run the smoke tests
type: boolean
default: false
stages:
###############################################
## Build
###############################################
- stage: Build
jobs:
- job: A
displayName: Build Umbraco CMS
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
fetchDepth: 0
submodules: true
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
useGlobalJson: true
- template: templates/backoffice-install.yml
- script: npm run build:for:cms
displayName: Run build (Bellissima)
workingDirectory: src/Umbraco.Web.UI.Client
- script: npm ci --no-fund --no-audit --prefer-offline
displayName: Run npm ci (Login)
workingDirectory: src/Umbraco.Web.UI.Login
- script: npm run build
displayName: Run npm build (Login)
workingDirectory: src/Umbraco.Web.UI.Login
- task: DotNetCoreCLI@2
displayName: Run dotnet restore
inputs:
command: restore
projects: $(solution)
- task: DotNetCoreCLI@2
name: build
displayName: Run dotnet build and generate NuGet packages
inputs:
command: build
projects: $(solution)
arguments: '--configuration $(buildConfiguration) --no-restore --property:ContinuousIntegrationBuild=true --property:GeneratePackageOnBuild=true --property:PackageOutputPath=$(Build.ArtifactStagingDirectory)/nupkg'
- task: PublishPipelineArtifact@1
displayName: Publish nupkg
inputs:
targetPath: $(Build.ArtifactStagingDirectory)/nupkg
artifactName: nupkg
- task: PublishPipelineArtifact@1
displayName: Publish build artifacts
inputs:
targetPath: $(Build.SourcesDirectory)
artifactName: build_output
- stage: E2E
displayName: E2E Tests
dependsOn: Build
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm_e2e
# Enable console logging in Release mode
SERILOG__WRITETO__0__NAME: Async
SERILOG__WRITETO__0__ARGS__CONFIGURE__0__NAME: Console
# Set unattended install settings
UMBRACO__CMS__UNATTENDED__INSTALLUNATTENDED: true
UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERNAME: Playwright Test
UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD: UmbracoAcceptance123!
UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL: playwright@umbraco.com
# Custom Umbraco settings
UMBRACO__CMS__CONTENT__CONTENTVERSIONCLEANUPPOLICY__ENABLECLEANUP: false
UMBRACO__CMS__GLOBAL__DISABLEELECTIONFORSINGLESERVER: true
UMBRACO__CMS__GLOBAL__INSTALLMISSINGDATABASE: true
UMBRACO__CMS__GLOBAL__ID: 00000000-0000-0000-0000-000000000042
UMBRACO__CMS__GLOBAL__VERSIONCHECKPERIOD: 0
UMBRACO__CMS__GLOBAL__USEHTTPS: true
UMBRACO__CMS__HEALTHCHECKS__NOTIFICATION__ENABLED: false
UMBRACO__CMS__KEEPALIVE__DISABLEKEEPALIVETASK: true
UMBRACO__CMS__WEBROUTING__UMBRACOAPPLICATIONURL: https://localhost:44331/
ASPNETCORE_URLS: https://localhost:44331
jobs:
# E2E Tests
- job:
displayName: E2E Tests (SQLite)
timeoutInMinutes: 180
variables:
# Connection string
CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=Umbraco;Mode=Memory;Cache=Shared;Foreign Keys=True;Pooling=True
CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.Sqlite
strategy:
matrix:
Linux:
vmImage: 'ubuntu-latest'
Windows:
vmImage: 'windows-latest'
pool:
vmImage: $(vmImage)
steps:
# Setup test environment
- task: DownloadPipelineArtifact@2
displayName: Download NuGet artifacts
inputs:
artifact: nupkg
path: $(Agent.BuildDirectory)/app/nupkg
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
inputs:
versionSpec: $(nodeVersion)
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
useGlobalJson: true
- pwsh: |
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
URL=$(ASPNETCORE_URLS)
STORAGE_STAGE_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/playwright/.auth/user.json" | Out-File .env
displayName: Generate .env
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
# Cache and restore NPM packages
- task: Cache@2
displayName: Cache NPM packages
inputs:
key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json'
restoreKeys: |
npm_e2e | "$(Agent.OS)"
npm_e2e
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
displayName: Restore NPM packages
# Build application
- pwsh: |
$cmsVersion = "$(Build.BuildNumber)" -replace "\+",".g"
dotnet new nugetconfig
dotnet nuget add source ./nupkg --name Local
dotnet new install Umbraco.Templates::$cmsVersion
dotnet new umbraco --name UmbracoProject --version $cmsVersion --exclude-gitignore --no-restore --no-update-check
dotnet restore UmbracoProject
cp $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/*.cs UmbracoProject
dotnet build UmbracoProject --configuration $(buildConfiguration) --no-restore
dotnet dev-certs https
displayName: Build application
workingDirectory: $(Agent.BuildDirectory)/app
# Run application
- bash: |
nohup dotnet run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 &
echo "##vso[task.setvariable variable=AcceptanceTestProcessId]$!"
displayName: Run application (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
workingDirectory: $(Agent.BuildDirectory)/app
- pwsh: |
$process = Start-Process dotnet "run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -NoNewWindow -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log
Write-Host "##vso[task.setvariable variable=AcceptanceTestProcessId]$($process.Id)"
displayName: Run application (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
workingDirectory: $(Agent.BuildDirectory)/app
# Ensures we have the package wait-on installed
- pwsh: npm install wait-on
displayName: Install wait-on package
# Wait for application to start responding to requests
- pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS)
displayName: Wait for application
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Install Playwright and dependencies
- pwsh: npx playwright install --with-deps
displayName: Install Playwright
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Test
- ${{ if eq(parameters.runSmokeTests, true) }}:
pwsh: npm run smokeTestSqlite --ignore-certificate-errors
${{ else }}:
pwsh: npm run testSqlite --ignore-certificate-errors
displayName: Run Playwright tests
continueOnError: true
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
env:
CI: true
CommitId: $(Build.SourceVersion)
AgentOs: $(Agent.OS)
# Stop application
- bash: kill -15 $(AcceptanceTestProcessId)
displayName: Stop application (Linux)
condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Linux'))
- pwsh: Stop-Process -Id $(AcceptanceTestProcessId)
displayName: Stop application (Windows)
condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Windows_NT'))
# Copy artifacts
- pwsh: |
if (Test-Path tests/Umbraco.Tests.AcceptanceTest/results/*) {
Copy-Item tests/Umbraco.Tests.AcceptanceTest/results $(Build.ArtifactStagingDirectory) -Recurse
}
displayName: Copy Playwright results
condition: succeededOrFailed()
# Publish
- task: PublishPipelineArtifact@1
displayName: Publish test artifacts
condition: succeededOrFailed()
inputs:
targetPath: $(Build.ArtifactStagingDirectory)
artifact: 'Acceptance Tests - $(Agent.JobName) - Attempt #$(System.JobAttempt)'
- job:
displayName: E2E Tests (SQL Server)
timeoutInMinutes: 180
variables:
# Connection string
CONNECTIONSTRINGS__UMBRACODBDSN: Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Umbraco.mdf;Integrated Security=True
CONNECTIONSTRINGS__UMBRACODBDSN_PROVIDERNAME: Microsoft.Data.SqlClient
strategy:
matrix:
Linux:
vmImage: 'ubuntu-latest'
SA_PASSWORD: $(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
CONNECTIONSTRINGS__UMBRACODBDSN: 'Server=(local);Database=Umbraco;User Id=sa;Password=$(SA_PASSWORD);TrustServerCertificate=True'
Windows:
vmImage: 'windows-latest'
pool:
vmImage: $(vmImage)
steps:
# Setup test environment
- task: DownloadPipelineArtifact@2
displayName: Download NuGet artifacts
inputs:
artifact: nupkg
path: $(Agent.BuildDirectory)/app/nupkg
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
inputs:
versionSpec: $(nodeVersion)
- task: UseDotNet@2
displayName: Use .NET SDK from global.json
inputs:
useGlobalJson: true
- pwsh: |
"UMBRACO_USER_LOGIN=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSEREMAIL)
UMBRACO_USER_PASSWORD=$(UMBRACO__CMS__UNATTENDED__UNATTENDEDUSERPASSWORD)
URL=$(ASPNETCORE_URLS)
STORAGE_STAGE_PATH=$(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/playwright/.auth/user.json" | Out-File .env
displayName: Generate .env
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
# Cache and restore NPM packages
- task: Cache@2
displayName: Cache NPM packages
inputs:
key: 'npm_e2e | "$(Agent.OS)" | $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/package-lock.json'
restoreKeys: |
npm_e2e | "$(Agent.OS)"
npm_e2e
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest
displayName: Restore NPM packages
# Build application
- pwsh: |
$cmsVersion = "$(Build.BuildNumber)" -replace "\+",".g"
dotnet new nugetconfig
dotnet nuget add source ./nupkg --name Local
dotnet new install Umbraco.Templates::$cmsVersion
dotnet new umbraco --name UmbracoProject --version $cmsVersion --exclude-gitignore --no-restore --no-update-check
dotnet restore UmbracoProject
cp $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest.UmbracoProject/*.cs UmbracoProject
dotnet build UmbracoProject --configuration $(buildConfiguration) --no-restore
dotnet dev-certs https
displayName: Build application
workingDirectory: $(Agent.BuildDirectory)/app
# Start SQL Server
- powershell: docker run --name mssql -d -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=$(SA_PASSWORD)" mcr.microsoft.com/mssql/server:2022-latest
displayName: Start SQL Server Docker image (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
- pwsh: SqlLocalDB start MSSQLLocalDB
displayName: Start SQL Server LocalDB (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
# Run application
- bash: |
nohup dotnet run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile > $(Build.ArtifactStagingDirectory)/playwright.log 2>&1 &
echo "##vso[task.setvariable variable=AcceptanceTestProcessId]$!"
displayName: Run application (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
workingDirectory: $(Agent.BuildDirectory)/app
- pwsh: |
$process = Start-Process dotnet "run --project UmbracoProject --configuration $(buildConfiguration) --no-build --no-launch-profile 2>&1" -PassThru -NoNewWindow -RedirectStandardOutput $(Build.ArtifactStagingDirectory)/playwright.log
Write-Host "##vso[task.setvariable variable=AcceptanceTestProcessId]$($process.Id)"
displayName: Run application (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
workingDirectory: $(Agent.BuildDirectory)/app
# Ensures we have the package wait-on installed
- pwsh: npm install wait-on
displayName: Install wait-on package
# Wait for application to start responding to requests
- pwsh: npx wait-on -v --interval 1000 --timeout 120000 $(ASPNETCORE_URLS)
displayName: Wait for application
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Install Playwright and dependencies
- pwsh: npx playwright install --with-deps
displayName: Install Playwright
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
# Test
- ${{ if eq(parameters.runSmokeTests, true) }}:
pwsh: npm run smokeTest --ignore-certificate-errors
${{ else }}:
pwsh: npm run test --ignore-certificate-errors
displayName: Run Playwright tests
continueOnError: true
workingDirectory: tests/Umbraco.Tests.AcceptanceTest
env:
CI: true
CommitId: $(Build.SourceVersion)
AgentOs: $(Agent.OS)
# Stop application
- bash: kill -15 $(AcceptanceTestProcessId)
displayName: Stop application (Linux)
condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Linux'))
- pwsh: Stop-Process -Id $(AcceptanceTestProcessId)
displayName: Stop application (Windows)
condition: and(succeeded(), ne(variables.AcceptanceTestProcessId, ''), eq(variables['Agent.OS'], 'Windows_NT'))
# Stop SQL Server
- pwsh: docker stop mssql
displayName: Stop SQL Server Docker image (Linux)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Linux'))
- pwsh: SqlLocalDB stop MSSQLLocalDB
displayName: Stop SQL Server LocalDB (Windows)
condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))
# Copy artifacts
- pwsh: |
if (Test-Path tests/Umbraco.Tests.AcceptanceTest/results/*) {
Copy-Item tests/Umbraco.Tests.AcceptanceTest/results $(Build.ArtifactStagingDirectory) -Recurse
}
displayName: Copy Playwright results
condition: succeededOrFailed()
# Publish
- task: PublishPipelineArtifact@1
displayName: Publish test artifacts
condition: succeededOrFailed()
inputs:
targetPath: $(Build.ArtifactStagingDirectory)
artifact: 'Acceptance Tests - $(Agent.JobName) - Attempt #$(System.JobAttempt)'
+31
View File
@@ -0,0 +1,31 @@
steps:
- task: NodeTool@0
displayName: Use Node.js
retryCountOnTaskFailure: 3
inputs:
versionSource: 'fromFile'
versionFilePath: src/Umbraco.Web.UI.Client/.nvmrc
- bash: |
echo "##[command]Install nbgv"
dotnet tool install --tool-path . nbgv
echo "##[command]Running nbgv get-version"
PACKAGE_VERSION=$(nbgv get-version -v NpmPackageVersion)
echo "##[command]Running npm version"
echo "##[debug]Version: $PACKAGE_VERSION"
cd src/Umbraco.Web.UI.Client
npm version $PACKAGE_VERSION --allow-same-version --no-git-tag-version
displayName: Set NPM Version
- task: Cache@2
displayName: Cache node_modules
inputs:
key: '"npm_client" | "$(Agent.OS)"| $(Build.SourcesDirectory)/src/Umbraco.Web.UI.Client/package-lock.json'
restoreKeys: |
"npm_client" | "$(Agent.OS)"
"npm_client"
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
displayName: Run npm ci (Bellissima)
workingDirectory: src/Umbraco.Web.UI.Client
+1 -1
View File
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "8.0.100",
"version": "8.0.300",
"rollForward": "latestFeature"
}
}
@@ -1,22 +0,0 @@
namespace Umbraco.Cms.Api.Common.Attributes;
public abstract class ShortGenericSchemaNameAttribute : Attribute
{
public Type[] GenericTypes { get; set; }
public string SchemaName { get; set; }
public ShortGenericSchemaNameAttribute(string schemaName, Type[] genericTypes)
{
GenericTypes = genericTypes;
SchemaName = schemaName;
}
}
public class ShortGenericSchemaNameAttribute<T1, T2> : ShortGenericSchemaNameAttribute
{
public ShortGenericSchemaNameAttribute(string schemaName)
: base(schemaName, new[] { typeof(T1), typeof(T2) })
{
}
}
@@ -0,0 +1,15 @@
using Microsoft.Extensions.Options;
using OpenIddict.Server.AspNetCore;
using Umbraco.Cms.Core.Configuration.Models;
namespace Umbraco.Cms.Api.Common.Configuration;
internal class ConfigureOpenIddict : IConfigureOptions<OpenIddictServerAspNetCoreOptions>
{
private readonly IOptions<GlobalSettings> _globalSettings;
public ConfigureOpenIddict(IOptions<GlobalSettings> globalSettings) => _globalSettings = globalSettings;
public void Configure(OpenIddictServerAspNetCoreOptions options)
=> options.DisableTransportSecurityRequirement = _globalSettings.Value.UseHttps is false;
}
@@ -12,16 +12,22 @@ namespace Umbraco.Cms.Api.Common.Configuration;
public class ConfigureUmbracoSwaggerGenOptions : IConfigureOptions<SwaggerGenOptions>
{
private readonly IOptions<ApiVersioningOptions> _apiVersioningOptions;
private readonly IOperationIdSelector _operationIdSelector;
private readonly ISchemaIdSelector _schemaIdSelector;
[Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 15.")]
public ConfigureUmbracoSwaggerGenOptions(
IOptions<ApiVersioningOptions> apiVersioningOptions,
IOperationIdSelector operationIdSelector,
ISchemaIdSelector schemaIdSelector)
: this(operationIdSelector, schemaIdSelector)
{
}
public ConfigureUmbracoSwaggerGenOptions(
IOperationIdSelector operationIdSelector,
ISchemaIdSelector schemaIdSelector)
{
_apiVersioningOptions = apiVersioningOptions;
_operationIdSelector = operationIdSelector;
_schemaIdSelector = schemaIdSelector;
}
@@ -34,10 +40,10 @@ public class ConfigureUmbracoSwaggerGenOptions : IConfigureOptions<SwaggerGenOpt
{
Title = "Default API",
Version = "Latest",
Description = "All endpoints not defined under specific APIs"
Description = "All endpoints not defined under specific APIs",
});
swaggerGenOptions.CustomOperationIds(description => _operationIdSelector.OperationId(description, _apiVersioningOptions.Value));
swaggerGenOptions.CustomOperationIds(description => _operationIdSelector.OperationId(description));
swaggerGenOptions.DocInclusionPredicate((name, api) =>
{
if (string.IsNullOrWhiteSpace(api.GroupName))
@@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Http;
using OpenIddict.Server;
using OpenIddict.Validation;
using Umbraco.Cms.Core;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.DependencyInjection;
public class ProcessRequestContextHandler
: IOpenIddictServerHandler<OpenIddictServerEvents.ProcessRequestContext>, IOpenIddictValidationHandler<OpenIddictValidationEvents.ProcessRequestContext>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly string[] _pathsToHandle;
public ProcessRequestContextHandler(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
var backOfficePathSegment = Constants.System.DefaultUmbracoPath.TrimStart(Constants.CharArrays.Tilde)
.EnsureStartsWith('/')
.EnsureEndsWith('/');
_pathsToHandle = [backOfficePathSegment, "/.well-known/openid-configuration"];
}
public ValueTask HandleAsync(OpenIddictServerEvents.ProcessRequestContext context)
{
if (SkipOpenIddictHandlingForRequest())
{
context.SkipRequest();
}
return ValueTask.CompletedTask;
}
public ValueTask HandleAsync(OpenIddictValidationEvents.ProcessRequestContext context)
{
if (SkipOpenIddictHandlingForRequest())
{
context.SkipRequest();
}
return ValueTask.CompletedTask;
}
private bool SkipOpenIddictHandlingForRequest()
{
var requestPath = _httpContextAccessor.HttpContext?.Request.Path.Value;
if (requestPath.IsNullOrWhiteSpace())
{
return false;
}
foreach (var path in _pathsToHandle)
{
if (requestPath.StartsWith(path))
{
return false;
}
}
return true;
}
}
@@ -11,11 +11,18 @@ public static class UmbracoBuilderApiExtensions
{
public static IUmbracoBuilder AddUmbracoApiOpenApiUI(this IUmbracoBuilder builder)
{
if (builder.Services.Any(x => !x.IsKeyedService && x.ImplementationType == typeof(OperationIdSelector)))
{
return builder;
}
builder.Services.AddSwaggerGen();
builder.Services.ConfigureOptions<ConfigureUmbracoSwaggerGenOptions>();
builder.Services.AddSingleton<IUmbracoJsonTypeInfoResolver, UmbracoJsonTypeInfoResolver>();
builder.Services.AddSingleton<IOperationIdSelector, OperationIdSelector>();
builder.Services.AddSingleton<IOperationIdHandler, OperationIdHandler>();
builder.Services.AddSingleton<ISchemaIdSelector, SchemaIdSelector>();
builder.Services.AddSingleton<ISchemaIdHandler, SchemaIdHandler>();
builder.Services.Configure<UmbracoPipelineOptions>(options => options.AddFilter(new SwaggerRouteTemplatePipelineFilter("UmbracoApiCommon")));
return builder;
@@ -1,11 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using System.Security.Cryptography;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Tokens;
using OpenIddict.Server;
using OpenIddict.Validation;
using Umbraco.Cms.Api.Common.Configuration;
using Umbraco.Cms.Api.Common.Security;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Infrastructure.BackgroundJobs.Jobs;
using Umbraco.Cms.Infrastructure.HostedServices;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.DependencyInjection;
@@ -14,7 +18,7 @@ public static class UmbracoBuilderAuthExtensions
{
public static IUmbracoBuilder AddUmbracoOpenIddict(this IUmbracoBuilder builder)
{
if (builder.Services.Any(x=>x.ImplementationType == typeof(OpenIddictCleanupJob)) is false)
if (builder.Services.Any(x => !x.IsKeyedService && x.ImplementationType == typeof(OpenIddictCleanupJob)) is false)
{
ConfigureOpenIddict(builder);
}
@@ -30,7 +34,6 @@ public static class UmbracoBuilderAuthExtensions
{
// Enable the authorization and token endpoints.
// - important: member endpoints MUST be added before backoffice endpoints to ensure that auto-discovery works for members
// FIXME: swap paths here so member API is first (see comment above)
options
.SetAuthorizationEndpointUris(
Paths.MemberApi.AuthorizationEndpoint.TrimStart(Constants.CharArrays.ForwardSlash),
@@ -43,7 +46,9 @@ public static class UmbracoBuilderAuthExtensions
Paths.BackOfficeApi.LogoutEndpoint.TrimStart(Constants.CharArrays.ForwardSlash))
.SetRevocationEndpointUris(
Paths.MemberApi.RevokeEndpoint.TrimStart(Constants.CharArrays.ForwardSlash),
Paths.BackOfficeApi.RevokeEndpoint.TrimStart(Constants.CharArrays.ForwardSlash));
Paths.BackOfficeApi.RevokeEndpoint.TrimStart(Constants.CharArrays.ForwardSlash))
.SetUserinfoEndpointUris(
Paths.MemberApi.UserinfoEndpoint.TrimStart(Constants.CharArrays.ForwardSlash));
// Enable authorization code flow with PKCE
options
@@ -55,7 +60,8 @@ public static class UmbracoBuilderAuthExtensions
options
.UseAspNetCore()
.EnableAuthorizationEndpointPassthrough()
.EnableLogoutEndpointPassthrough();
.EnableLogoutEndpointPassthrough()
.EnableUserinfoEndpointPassthrough();
// Enable reference tokens
// - see https://documentation.openiddict.com/configuration/token-storage.html
@@ -63,6 +69,17 @@ public static class UmbracoBuilderAuthExtensions
.UseReferenceAccessTokens()
.UseReferenceRefreshTokens();
// Apply sliding window expiry based on the configured max login lifetime
GlobalSettings globalSettings = builder.Config
.GetSection(Constants.Configuration.ConfigGlobal)
.Get<GlobalSettings>() ?? new GlobalSettings();
TimeSpan timeOut = globalSettings.TimeOut;
// Make the access token lifetime 25% of the refresh token lifetime, to help ensure that new access tokens
// are obtained by the client before the refresh token expires.
options.SetAccessTokenLifetime(new TimeSpan(timeOut.Ticks / 4));
options.SetRefreshTokenLifetime(timeOut);
// Use ASP.NET Core Data Protection for tokens instead of JWT.
// This is more secure, and has the added benefit of having a high throughput
// but means that all servers (such as in a load balanced setup)
@@ -85,6 +102,13 @@ public static class UmbracoBuilderAuthExtensions
options
.AddEncryptionKey(new SymmetricSecurityKey(RandomNumberGenerator.GetBytes(32))) // generate a cryptographically secure random 256-bits key
.AddSigningKey(new RsaSecurityKey(RSA.Create(keySizeInBits: 2048))); // generate RSA key with recommended size of 2048-bits
// Add custom handler for the "ProcessRequestContext" server event, to stop OpenIddict from handling
// every last request to the server (including front-end requests).
options.AddEventHandler<OpenIddictServerEvents.ProcessRequestContext>(configuration =>
{
configuration.UseSingletonHandler<ProcessRequestContextHandler>().SetOrder(OpenIddict.Server.AspNetCore.OpenIddictServerAspNetCoreHandlers.ResolveRequestUri.Descriptor.Order - 1);
});
})
// Register the OpenIddict validation components.
@@ -102,8 +126,16 @@ public static class UmbracoBuilderAuthExtensions
// Use ASP.NET Core Data Protection for tokens instead of JWT. (see note in AddServer)
options.UseDataProtection();
// Add custom handler for the "ProcessRequestContext" validation event, to stop OpenIddict from handling
// every last request to the server (including front-end requests).
options.AddEventHandler<OpenIddictValidationEvents.ProcessRequestContext>(configuration =>
{
configuration.UseSingletonHandler<ProcessRequestContextHandler>().SetOrder(OpenIddict.Validation.AspNetCore.OpenIddictValidationAspNetCoreHandlers.ResolveRequestUri.Descriptor.Order - 1);
});
});
builder.Services.AddRecurringBackgroundJob<OpenIddictCleanupJob>();
builder.Services.ConfigureOptions<ConfigureOpenIddict>();
}
}
@@ -0,0 +1,11 @@
namespace Umbraco.Cms.Api.Common.OpenApi;
/// <summary>
/// Marker interface that ensure the type have a "$type" discriminator in the open api schema.
/// </summary>
/// <remarks>
/// This is required when an endpoint can receive different types, to ensure the correct type is deserialized.
/// </remarks>
public interface IOpenApiDiscriminator
{
}
@@ -0,0 +1,10 @@
using Microsoft.AspNetCore.Mvc.ApiExplorer;
namespace Umbraco.Cms.Api.Common.OpenApi;
public interface IOperationIdHandler
{
bool CanHandle(ApiDescription apiDescription);
string Handle(ApiDescription apiDescription);
}
@@ -5,5 +5,8 @@ namespace Umbraco.Cms.Api.Common.OpenApi;
public interface IOperationIdSelector
{
[Obsolete("Use overload that only takes ApiDescription instead. This will be removed in Umbraco 15.")]
string? OperationId(ApiDescription apiDescription, ApiVersioningOptions apiVersioningOptions);
string? OperationId(ApiDescription apiDescription);
}
@@ -0,0 +1,8 @@
namespace Umbraco.Cms.Api.Common.OpenApi;
public interface ISchemaIdHandler
{
bool CanHandle(Type type);
string Handle(Type type);
}
@@ -0,0 +1,94 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.Extensions.Options;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.OpenApi;
// NOTE: Left unsealed on purpose, so it is extendable.
public class OperationIdHandler : IOperationIdHandler
{
private readonly ApiVersioningOptions _apiVersioningOptions;
public OperationIdHandler(IOptions<ApiVersioningOptions> apiVersioningOptions)
=> _apiVersioningOptions = apiVersioningOptions.Value;
public bool CanHandle(ApiDescription apiDescription)
{
if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor)
{
return false;
}
return CanHandle(apiDescription, controllerActionDescriptor);
}
protected virtual bool CanHandle(ApiDescription apiDescription, ControllerActionDescriptor controllerActionDescriptor)
=> controllerActionDescriptor.ControllerTypeInfo.Namespace?.StartsWith("Umbraco.Cms.Api") is true;
public virtual string Handle(ApiDescription apiDescription)
=> UmbracoOperationId(apiDescription);
/// <summary>
/// Generates a unique operation identifier for a given API following Umbraco's operation id naming conventions.
/// </summary>
protected string UmbracoOperationId(ApiDescription apiDescription)
{
if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor)
{
throw new ArgumentException($"This handler operates only on {nameof(ControllerActionDescriptor)}.");
}
ApiVersion defaultVersion = _apiVersioningOptions.DefaultApiVersion;
var httpMethod = apiDescription.HttpMethod?.ToLower().ToFirstUpper() ?? "Get";
// if the route info "Name" is supplied we'll use this explicitly as the operation ID
// - usage example: [HttpGet("my-api/route}", Name = "MyCustomRoute")]
if (string.IsNullOrWhiteSpace(apiDescription.ActionDescriptor.AttributeRouteInfo?.Name) == false)
{
var explicitOperationId = apiDescription.ActionDescriptor.AttributeRouteInfo!.Name;
return explicitOperationId.InvariantStartsWith(httpMethod)
? explicitOperationId
: $"{httpMethod}{explicitOperationId}";
}
var relativePath = apiDescription.RelativePath;
if (string.IsNullOrWhiteSpace(relativePath))
{
throw new InvalidOperationException(
$"There is no relative path for controller action {apiDescription.ActionDescriptor.RouteValues["controller"]}");
}
// Remove the prefixed base path with version, e.g. /umbraco/management/api/v1/tracked-reference/{id} => tracked-reference/{id}
var unprefixedRelativePath = OperationIdRegexes
.VersionPrefixRegex()
.Replace(relativePath, string.Empty);
// Remove template placeholders, e.g. tracked-reference/{id} => tracked-reference/Id
var formattedOperationId = OperationIdRegexes
.TemplatePlaceholdersRegex()
.Replace(unprefixedRelativePath, m => $"By{m.Groups[1].Value.ToFirstUpper()}");
// Remove dashes (-) and slashes (/) and convert the following letter to uppercase with
// the word "By" in front, e.g. tracked-reference/Id => TrackedReferenceById
formattedOperationId = OperationIdRegexes
.ToCamelCaseRegex()
.Replace(formattedOperationId, m => m.Groups[1].Value.ToUpper());
// Get map to version attribute
string? version = null;
var versionAttributeValue = controllerActionDescriptor.MethodInfo.GetMapToApiVersionAttributeValue();
// We only want to add a version, if it is not the default one.
if (string.Equals(versionAttributeValue, defaultVersion.ToString()) == false)
{
version = versionAttributeValue;
}
// Return the operation ID with the formatted http method verb in front, e.g. GetTrackedReferenceById
return $"{httpMethod}{formattedOperationId.ToFirstUpper()}{version}";
}
}
@@ -1,79 +1,27 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.OpenApi;
public class OperationIdSelector : IOperationIdSelector
{
public virtual string? OperationId(ApiDescription apiDescription, ApiVersioningOptions apiVersioningOptions)
{
if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor
|| controllerActionDescriptor.ControllerTypeInfo.Namespace?.StartsWith("Umbraco.Cms.Api") is not true)
{
return null;
}
private readonly IEnumerable<IOperationIdHandler> _operationIdHandlers;
return UmbracoOperationId(apiDescription, apiVersioningOptions);
[Obsolete("Use non-obsolete constructor. This will be removed in Umbraco 15.")]
public OperationIdSelector()
: this(Enumerable.Empty<IOperationIdHandler>())
{
}
protected string? UmbracoOperationId(ApiDescription apiDescription, ApiVersioningOptions apiVersioningOptions)
public OperationIdSelector(IEnumerable<IOperationIdHandler> operationIdHandlers)
=> _operationIdHandlers = operationIdHandlers;
[Obsolete("Use overload that only takes ApiDescription instead. This will be removed in Umbraco 15.")]
public virtual string? OperationId(ApiDescription apiDescription, ApiVersioningOptions apiVersioningOptions) => OperationId(apiDescription);
public virtual string? OperationId(ApiDescription apiDescription)
{
if (apiDescription.ActionDescriptor is not ControllerActionDescriptor controllerActionDescriptor)
{
return null;
}
ApiVersion defaultVersion = apiVersioningOptions.DefaultApiVersion;
var httpMethod = apiDescription.HttpMethod?.ToLower().ToFirstUpper() ?? "Get";
// if the route info "Name" is supplied we'll use this explicitly as the operation ID
// - usage example: [HttpGet("my-api/route}", Name = "MyCustomRoute")]
if (string.IsNullOrWhiteSpace(apiDescription.ActionDescriptor.AttributeRouteInfo?.Name) == false)
{
var explicitOperationId = apiDescription.ActionDescriptor.AttributeRouteInfo!.Name;
return explicitOperationId.InvariantStartsWith(httpMethod)
? explicitOperationId
: $"{httpMethod}{explicitOperationId}";
}
var relativePath = apiDescription.RelativePath;
if (string.IsNullOrWhiteSpace(relativePath))
{
throw new Exception(
$"There is no relative path for controller action {apiDescription.ActionDescriptor.RouteValues["controller"]}");
}
// Remove the prefixed base path with version, e.g. /umbraco/management/api/v1/tracked-reference/{id} => tracked-reference/{id}
var unprefixedRelativePath = OperationIdRegexes
.VersionPrefixRegex()
.Replace(relativePath, string.Empty);
// Remove template placeholders, e.g. tracked-reference/{id} => tracked-reference/Id
var formattedOperationId = OperationIdRegexes
.TemplatePlaceholdersRegex()
.Replace(unprefixedRelativePath, m => $"By{m.Groups[1].Value.ToFirstUpper()}");
// Remove dashes (-) and slashes (/) and convert the following letter to uppercase with
// the word "By" in front, e.g. tracked-reference/Id => TrackedReferenceById
formattedOperationId = OperationIdRegexes
.ToCamelCaseRegex()
.Replace(formattedOperationId, m => m.Groups[1].Value.ToUpper());
//Get map to version attribute
string? version = null;
var versionAttributeValue = controllerActionDescriptor.MethodInfo.GetMapToApiVersionAttributeValue();
// We only wanna add a version, if it is not the default one.
if (string.Equals(versionAttributeValue, defaultVersion.ToString()) == false)
{
version = versionAttributeValue;
}
// Return the operation ID with the formatted http method verb in front, e.g. GetTrackedReferenceById
return $"{httpMethod}{formattedOperationId.ToFirstUpper()}{version}";
IOperationIdHandler? handler = _operationIdHandlers.FirstOrDefault(h => h.CanHandle(apiDescription));
return handler?.Handle(apiDescription);
}
}
@@ -0,0 +1,51 @@
using System.Text.RegularExpressions;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.OpenApi;
// NOTE: Left unsealed on purpose, so it is extendable.
public class SchemaIdHandler : ISchemaIdHandler
{
public virtual bool CanHandle(Type type)
=> type.Namespace?.StartsWith("Umbraco.Cms") is true;
public virtual string Handle(Type type)
=> UmbracoSchemaId(type);
/// <summary>
/// Generates a sanitized and consistent schema identifier for a given type following Umbraco's schema id naming conventions.
/// </summary>
protected string UmbracoSchemaId(Type type)
{
var name = SanitizedTypeName(type);
name = HandleGenerics(name, type);
if (name.EndsWith("Model") == false)
{
// because some models names clash with common classes in TypeScript (i.e. Document),
// we need to add a "Model" postfix to all models
name = $"{name}Model";
}
// make absolutely sure we don't pass any invalid named by removing all non-word chars
return Regex.Replace(name, @"[^\w]", string.Empty);
}
private string SanitizedTypeName(Type t) => t.Name
// first grab the "non-generic" part of any generic type name (i.e. "PagedViewModel`1" becomes "PagedViewModel")
.Split('`').First()
// then remove the "ViewModel" postfix from type names
.TrimEnd("ViewModel");
private string HandleGenerics(string name, Type type)
{
if (!type.IsGenericType)
{
return name;
}
// use attribute custom name or append the generic type names, ultimately turning i.e. "PagedViewModel<RelationItemViewModel>" into "PagedRelationItem"
return $"{name}{string.Join(string.Empty, type.GenericTypeArguments.Select(SanitizedTypeName))}";
}
}
@@ -1,82 +1,15 @@
using System.Text.RegularExpressions;
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.OpenApi;
namespace Umbraco.Cms.Api.Common.OpenApi;
public class SchemaIdSelector : ISchemaIdSelector
{
private readonly IEnumerable<ISchemaIdHandler> _schemaIdHandlers;
public SchemaIdSelector(IEnumerable<ISchemaIdHandler> schemaIdHandlers)
=> _schemaIdHandlers = schemaIdHandlers;
public virtual string SchemaId(Type type)
=> type.Namespace?.StartsWith("Umbraco.Cms") is true ? UmbracoSchemaId(type) : type.Name;
protected string UmbracoSchemaId(Type type)
{
var name = SanitizedTypeName(type);
name = HandleGenerics(name, type);
if (name.EndsWith("Model") == false)
{
// because some models names clash with common classes in TypeScript (i.e. Document),
// we need to add a "Model" postfix to all models
name = $"{name}Model";
}
// make absolutely sure we don't pass any invalid named by removing all non-word chars
return Regex.Replace(name, @"[^\w]", string.Empty);
}
private string SanitizedTypeName(Type t) => t.Name
// first grab the "non generic" part of any generic type name (i.e. "PagedViewModel`1" becomes "PagedViewModel")
.Split('`').First()
// then remove the "ViewModel" postfix from type names
.TrimEnd("ViewModel");
private string HandleGenerics(string name, Type type)
{
if (!type.IsGenericType)
{
return name;
}
// find all types that implement this type and have an matching attribute
var assignableTypesWithAttributeInfo = AppDomain.CurrentDomain.GetAssemblies()
.Where(assembly => assembly.FullName?.StartsWith("Umbraco") == true)
.SelectMany(assembly => assembly.GetTypes())
.Where(t => t.IsAssignableTo(type))
.Select(t =>
{
var attribute = System.Attribute.GetCustomAttributes(t)
.FirstOrDefault(attribute => attribute is ShortGenericSchemaNameAttribute) as
ShortGenericSchemaNameAttribute;
return attribute == null
? new ShortSchemaNameAttributeInfo(t)
: new ShortSchemaNameAttributeInfo(t, attribute.GenericTypes, attribute.SchemaName);
})
.Where(info => info.GenericTypes != null);
var matchingType = assignableTypesWithAttributeInfo
.SingleOrDefault(t => t.GenericTypes!.Length == type.GenericTypeArguments.Length
&& t.GenericTypes.Intersect(type.GenericTypeArguments).Count() ==
type.GenericTypeArguments.Length && t.SchemaName.IsNullOrWhiteSpace() == false);
// use attribute custom name or append the generic type names, ultimately turning i.e. "PagedViewModel<RelationItemViewModel>" into "PagedRelationItem"
return matchingType != null
? matchingType.SchemaName!
: $"{name}{string.Join(string.Empty, type.GenericTypeArguments.Select(SanitizedTypeName))}";
}
private class ShortSchemaNameAttributeInfo
{
public Type Type { get; set; }
public Type[]? GenericTypes { get; set; }
public string? SchemaName { get; set; }
public ShortSchemaNameAttributeInfo(Type type, Type[]? genericTypes = null, string? schemaName = null)
{
Type = type;
GenericTypes = genericTypes;
SchemaName = schemaName;
}
ISchemaIdHandler? handler = _schemaIdHandlers.FirstOrDefault(h => h.CanHandle(type));
return handler?.Handle(type) ?? type.Name;
}
}
@@ -62,6 +62,10 @@ public class SwaggerRouteTemplatePipelineFilter : UmbracoPipelineFilter
swaggerUiOptions.SwaggerEndpoint($"{name}/swagger.json", $"{apiInfo.Title}");
}
// Add custom configuration from https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/
swaggerUiOptions.ConfigObject.PersistAuthorization = true; // persists authorization data so it would not be lost on browser close/refresh
swaggerUiOptions.ConfigObject.Filter = string.Empty; // Enable the filter with an empty string as default filter.
swaggerUiOptions.OAuthClientId(Constants.OAuthClientIds.Swagger);
swaggerUiOptions.OAuthUsePkce();
}
+5 -1
View File
@@ -1,3 +1,5 @@
using Umbraco.Cms.Core;
namespace Umbraco.Cms.Api.Common.Security;
public static class Paths
@@ -14,7 +16,7 @@ public static class Paths
public static readonly string RevokeEndpoint = EndpointPath($"{EndpointTemplate}/revoke");
private static string EndpointPath(string relativePath) => $"/umbraco/management/api/v1/{relativePath}";
private static string EndpointPath(string relativePath) => $"/umbraco{Constants.Web.ManagementApiPath}v1/{relativePath}";
}
public static class MemberApi
@@ -29,6 +31,8 @@ public static class Paths
public static readonly string RevokeEndpoint = EndpointPath($"{EndpointTemplate}/revoke");
public static readonly string UserinfoEndpoint = EndpointPath($"{EndpointTemplate}/userinfo");
// NOTE: we're NOT using /api/v1.0/ here because it will clash with the Delivery API docs
private static string EndpointPath(string relativePath) => $"/umbraco/delivery/api/v1/{relativePath}";
}
@@ -5,4 +5,6 @@ namespace Umbraco.Cms.Api.Common.Serialization;
public interface IUmbracoJsonTypeInfoResolver : IJsonTypeInfoResolver
{
IEnumerable<Type> FindSubTypes(Type type);
string? GetTypeDiscriminatorValue(Type type);
}
@@ -1,7 +1,10 @@
using System.Collections.Concurrent;
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Umbraco.Cms.Api.Common.OpenApi;
using Umbraco.Cms.Core.Composing;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Common.Serialization;
@@ -11,12 +14,26 @@ public sealed class UmbracoJsonTypeInfoResolver : DefaultJsonTypeInfoResolver, I
private readonly ConcurrentDictionary<Type, ISet<Type>> _subTypesCache = new ConcurrentDictionary<Type, ISet<Type>>();
public UmbracoJsonTypeInfoResolver(ITypeFinder typeFinder)
{
_typeFinder = typeFinder;
}
=> _typeFinder = typeFinder;
public IEnumerable<Type> FindSubTypes(Type type)
{
JsonDerivedTypeAttribute[] explicitJsonDerivedTypes = type
.GetCustomAttributes<JsonDerivedTypeAttribute>(false)
.ToArray();
if (explicitJsonDerivedTypes.Any())
{
return explicitJsonDerivedTypes.Select(a => a.DerivedType);
}
if (type.IsInterface is false)
{
// IMPORTANT: do NOT return an empty enumerable here. it will cause nullability to fail on reference
// properties, because "$ref" does not mix and match well with "nullable" in OpenAPI.
// see also https://github.com/OAI/OpenAPI-Specification/issues/1368
return new[] { type };
}
if (_subTypesCache.TryGetValue(type, out ISet<Type>? cachedResult))
{
return cachedResult;
@@ -27,35 +44,30 @@ public sealed class UmbracoJsonTypeInfoResolver : DefaultJsonTypeInfoResolver, I
return result;
}
public string? GetTypeDiscriminatorValue(Type type)
{
JsonDerivedTypeAttribute? jsonDerivedTypeAttribute = type
.GetBaseTypes(false)
.WhereNotNull()
.SelectMany(baseType => baseType.GetCustomAttributes<JsonDerivedTypeAttribute>(false))
.FirstOrDefault(attr => attr.DerivedType == type);
if (jsonDerivedTypeAttribute is not null)
{
// IMPORTANT: do NOT perform fallback to type.Name here - it will work for the schema generation,
// but not for the actual serialization, and then it's only going to cause confusion.
return jsonDerivedTypeAttribute.TypeDiscriminator?.ToString();
}
return typeof(IOpenApiDiscriminator).IsAssignableFrom(type) ? type.Name : null;
}
public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
{
JsonTypeInfo result = base.GetTypeInfo(type, options);
if (type.IsInterface)
{
return GetTypeInfoForInterface(result, type, options);
}
else
{
return GetTypeInfoForClass(result, type, options);
}
}
private JsonTypeInfo GetTypeInfoForClass(JsonTypeInfo result, Type type, JsonSerializerOptions options)
{
if (result.Kind != JsonTypeInfoKind.Object || !type.GetInterfaces().Any())
{
return result;
}
JsonPolymorphismOptions jsonPolymorphismOptions = result.PolymorphismOptions ?? new JsonPolymorphismOptions();
jsonPolymorphismOptions.DerivedTypes.Add(new JsonDerivedType(type, type.Name));
result.PolymorphismOptions = jsonPolymorphismOptions;
return result;
return type.IsInterface
? GetTypeInfoForInterface(result, type, options)
: result;
}
private JsonTypeInfo GetTypeInfoForInterface(JsonTypeInfo result, Type type, JsonSerializerOptions options)
@@ -3,7 +3,6 @@
<Title>Umbraco CMS - API Common</Title>
<Description>Contains the bits and pieces that are shared between the Umbraco CMS APIs.</Description>
</PropertyGroup>
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
@@ -14,6 +13,12 @@
<PackageReference Include="Swashbuckle.AspNetCore" />
<PackageReference Include="OpenIddict.Abstractions" />
<PackageReference Include="OpenIddict.AspNetCore" />
<!-- Both OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer bring in a vulnerable version of Microsoft.IdentityModel.JsonWebTokens -->
<PackageReference Include="Microsoft.IdentityModel.JsonWebTokens"/>
<!-- Take top-level depedendency on OpenIddict.AspNetCore depends on a vulnerable version -->
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
</ItemGroup>
<ItemGroup>
@@ -1,12 +1,9 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models.DeliveryApi;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Delivery.Controllers.Content;
@@ -16,32 +13,6 @@ public class ByIdContentApiController : ContentApiItemControllerBase
{
private readonly IRequestMemberAccessService _requestMemberAccessService;
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
public ByIdContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
StaticServiceProvider.Instance.GetRequiredService<IRequestMemberAccessService>())
{
}
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
public ByIdContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService,
IRequestMemberAccessService requestMemberAccessService)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
requestMemberAccessService)
{
}
[ActivatorUtilitiesConstructor]
public ByIdContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
@@ -1,12 +1,9 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models.DeliveryApi;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Services;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Delivery.Controllers.Content;
@@ -17,32 +14,6 @@ public class ByIdsContentApiController : ContentApiItemControllerBase
{
private readonly IRequestMemberAccessService _requestMemberAccessService;
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
public ByIdsContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
StaticServiceProvider.Instance.GetRequiredService<IRequestMemberAccessService>())
{
}
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
public ByIdsContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService,
IRequestMemberAccessService requestMemberAccessService)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
requestMemberAccessService)
{
}
[ActivatorUtilitiesConstructor]
public ByIdsContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
@@ -8,7 +8,6 @@ using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models.DeliveryApi;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.Services;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Delivery.Controllers.Content;
@@ -16,34 +15,16 @@ namespace Umbraco.Cms.Api.Delivery.Controllers.Content;
[ApiVersion("2.0")]
public class ByRouteContentApiController : ContentApiItemControllerBase
{
private readonly IRequestRoutingService _requestRoutingService;
private readonly IApiContentPathResolver _apiContentPathResolver;
private readonly IRequestRedirectService _requestRedirectService;
private readonly IRequestPreviewService _requestPreviewService;
private readonly IRequestMemberAccessService _requestMemberAccessService;
private const string PreviewContentRequestPathPrefix = $"/{Constants.DeliveryApi.Routing.PreviewContentPathPrefix}";
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
[Obsolete($"Please use the constructor that accepts {nameof(IApiContentPathResolver)}. Will be removed in V15.")]
public ByRouteContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService,
IRequestRoutingService requestRoutingService,
IRequestRedirectService requestRedirectService,
IRequestPreviewService requestPreviewService)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
requestRoutingService,
requestRedirectService,
requestPreviewService,
StaticServiceProvider.Instance.GetRequiredService<IRequestMemberAccessService>())
{
}
[Obsolete($"Please use the constructor that does not accept {nameof(IPublicAccessService)}. Will be removed in V14.")]
public ByRouteContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService,
IRequestRoutingService requestRoutingService,
IRequestRedirectService requestRedirectService,
IRequestPreviewService requestPreviewService,
@@ -51,10 +32,30 @@ public class ByRouteContentApiController : ContentApiItemControllerBase
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
requestRoutingService,
requestRedirectService,
requestPreviewService,
requestMemberAccessService)
requestMemberAccessService,
StaticServiceProvider.Instance.GetRequiredService<IApiContentPathResolver>())
{
}
[Obsolete($"Please use the non-obsolete constructor. Will be removed in V15.")]
public ByRouteContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IPublicAccessService publicAccessService,
IRequestRoutingService requestRoutingService,
IRequestRedirectService requestRedirectService,
IRequestPreviewService requestPreviewService,
IRequestMemberAccessService requestMemberAccessService,
IApiContentPathResolver apiContentPathResolver)
: this(
apiPublishedContentCache,
apiContentResponseBuilder,
requestRedirectService,
requestPreviewService,
requestMemberAccessService,
apiContentPathResolver)
{
}
@@ -62,16 +63,16 @@ public class ByRouteContentApiController : ContentApiItemControllerBase
public ByRouteContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilder,
IRequestRoutingService requestRoutingService,
IRequestRedirectService requestRedirectService,
IRequestPreviewService requestPreviewService,
IRequestMemberAccessService requestMemberAccessService)
IRequestMemberAccessService requestMemberAccessService,
IApiContentPathResolver apiContentPathResolver)
: base(apiPublishedContentCache, apiContentResponseBuilder)
{
_requestRoutingService = requestRoutingService;
_requestRedirectService = requestRedirectService;
_requestPreviewService = requestPreviewService;
_requestMemberAccessService = requestMemberAccessService;
_apiContentPathResolver = apiContentPathResolver;
}
[HttpGet("item/{*path}")]
@@ -105,8 +106,6 @@ public class ByRouteContentApiController : ContentApiItemControllerBase
private async Task<IActionResult> HandleRequest(string path)
{
path = DecodePath(path);
path = path.TrimStart("/");
path = path.Length == 0 ? "/" : path;
IPublishedContent? contentItem = GetContent(path);
@@ -128,17 +127,12 @@ public class ByRouteContentApiController : ContentApiItemControllerBase
}
private IPublishedContent? GetContent(string path)
=> path.StartsWith(Constants.DeliveryApi.Routing.PreviewContentPathPrefix)
=> path.StartsWith(PreviewContentRequestPathPrefix)
? GetPreviewContent(path)
: GetPublishedContent(path);
private IPublishedContent? GetPublishedContent(string path)
{
var contentRoute = _requestRoutingService.GetContentRoute(path);
IPublishedContent? contentItem = ApiPublishedContentCache.GetByRoute(contentRoute);
return contentItem;
}
=> _apiContentPathResolver.ResolveContentPath(path);
private IPublishedContent? GetPreviewContent(string path)
{
@@ -147,7 +141,7 @@ public class ByRouteContentApiController : ContentApiItemControllerBase
return null;
}
if (Guid.TryParse(path.AsSpan(Constants.DeliveryApi.Routing.PreviewContentPathPrefix.Length).TrimEnd("/"), out Guid contentId) is false)
if (Guid.TryParse(path.AsSpan(PreviewContentRequestPathPrefix.Length).TrimEnd("/"), out Guid contentId) is false)
{
return null;
}
@@ -15,6 +15,7 @@ namespace Umbraco.Cms.Api.Delivery.Controllers.Content;
[ApiExplorerSettings(GroupName = "Content")]
[LocalizeFromAcceptLanguageHeader]
[ValidateStartItem]
[AddVaryHeader]
[OutputCache(PolicyName = Constants.DeliveryApi.OutputCache.ContentCachePolicy)]
public abstract class ContentApiControllerBase : DeliveryApiControllerBase
{
@@ -1,11 +1,9 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.DeliveryApi;
using Umbraco.Cms.Core.Models.PublishedContent;
@@ -21,20 +19,6 @@ public class QueryContentApiController : ContentApiControllerBase
private readonly IRequestMemberAccessService _requestMemberAccessService;
private readonly IApiContentQueryService _apiContentQueryService;
[Obsolete($"Please use the constructor that accepts {nameof(IRequestMemberAccessService)}. Will be removed in V14.")]
public QueryContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilderBuilder,
IApiContentQueryService apiContentQueryService)
: this(
apiPublishedContentCache,
apiContentResponseBuilderBuilder,
apiContentQueryService,
StaticServiceProvider.Instance.GetRequiredService<IRequestMemberAccessService>())
{
}
[ActivatorUtilitiesConstructor]
public QueryContentApiController(
IApiPublishedContentCache apiPublishedContentCache,
IApiContentResponseBuilder apiContentResponseBuilderBuilder,
@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc;
using System.Net;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.Attributes;
using Umbraco.Cms.Api.Common.Filters;
using Umbraco.Cms.Api.Delivery.Configuration;
@@ -13,7 +13,7 @@ namespace Umbraco.Cms.Api.Delivery.Controllers;
[ApiController]
[JsonOptionsName(Constants.JsonOptionsNames.DeliveryApi)]
[MapToApi(DeliveryApiConfiguration.ApiName)]
[Authorize(Policy = "New" + AuthorizationPolicies.UmbracoFeatureEnabled)]
[Authorize(Policy = AuthorizationPolicies.UmbracoFeatureEnabled)]
public abstract class DeliveryApiControllerBase : Controller, IUmbracoFeature
{
protected string DecodePath(string path)
@@ -0,0 +1,28 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using OpenIddict.Server.AspNetCore;
using Umbraco.Cms.Api.Delivery.Routing;
using Umbraco.Cms.Core.DeliveryApi;
namespace Umbraco.Cms.Api.Delivery.Controllers.Security;
[ApiVersion("1.0")]
[ApiController]
[VersionedDeliveryApiRoute(Common.Security.Paths.MemberApi.EndpointTemplate)]
[ApiExplorerSettings(IgnoreApi = true)]
[Authorize(AuthenticationSchemes = OpenIddictServerAspNetCoreDefaults.AuthenticationScheme)]
public class CurrentMemberController : DeliveryApiControllerBase
{
private readonly ICurrentMemberClaimsProvider _currentMemberClaimsProvider;
public CurrentMemberController(ICurrentMemberClaimsProvider currentMemberClaimsProvider)
=> _currentMemberClaimsProvider = currentMemberClaimsProvider;
[HttpGet("userinfo")]
public async Task<IActionResult> Userinfo()
{
Dictionary<string, object> claims = await _currentMemberClaimsProvider.GetClaimsAsync();
return Ok(claims);
}
}
@@ -15,13 +15,12 @@ using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Web.Common.Security;
using Umbraco.Extensions;
using SignInResult = Microsoft.AspNetCore.Mvc.SignInResult;
using IdentitySignInResult = Microsoft.AspNetCore.Identity.SignInResult;
using SignInResult = Microsoft.AspNetCore.Mvc.SignInResult;
namespace Umbraco.Cms.Api.Delivery.Controllers.Security;
[ApiVersion("1.0")]
[ApiController]
[VersionedDeliveryApiRoute(Common.Security.Paths.MemberApi.EndpointTemplate)]
[ApiExplorerSettings(IgnoreApi = true)]
public class MemberController : DeliveryApiControllerBase
@@ -160,11 +159,12 @@ public class MemberController : DeliveryApiControllerBase
claim.SetDestinations(OpenIddictConstants.Destinations.AccessToken);
}
if (request.GetScopes().Contains(OpenIddictConstants.Scopes.OfflineAccess))
{
// "offline_access" scope is required to use refresh tokens
memberPrincipal.SetScopes(OpenIddictConstants.Scopes.OfflineAccess);
}
// "openid" and "offline_access" are the only scopes allowed for members; explicitly ensure we only add those
// NOTE: the "offline_access" scope is required to use refresh tokens
IEnumerable<string> allowedScopes = request
.GetScopes()
.Intersect(new[] { OpenIddictConstants.Scopes.OpenId, OpenIddictConstants.Scopes.OfflineAccess });
memberPrincipal.SetScopes(allowedScopes);
return new SignInResult(OpenIddictServerAspNetCoreDefaults.AuthenticationScheme, memberPrincipal);
}
@@ -60,6 +60,7 @@ public static class UmbracoBuilderExtensions
builder.Services.AddSingleton<IApiMediaQueryService, ApiMediaQueryService>();
builder.Services.AddTransient<IMemberApplicationManager, MemberApplicationManager>();
builder.Services.AddTransient<IRequestMemberAccessService, RequestMemberAccessService>();
builder.Services.AddTransient<ICurrentMemberClaimsProvider, CurrentMemberClaimsProvider>();
builder.Services.ConfigureOptions<ConfigureUmbracoDeliveryApiSwaggerGenOptions>();
builder.AddUmbracoApiOpenApiUI();
@@ -0,0 +1,13 @@
using Microsoft.AspNetCore.Mvc.Filters;
namespace Umbraco.Cms.Api.Delivery.Filters;
public sealed class AddVaryHeaderAttribute : ActionFilterAttribute
{
private const string Vary = "Accept-Language, Preview, Start-Item";
public override void OnResultExecuting(ResultExecutingContext context)
=> context.HttpContext.Response.Headers.Vary = context.HttpContext.Response.Headers.Vary.Count > 0
? $"{context.HttpContext.Response.Headers.Vary}, {Vary}"
: Vary;
}
@@ -1,18 +0,0 @@
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace Umbraco.Cms.Api.Delivery.Filters;
[Obsolete($"Superseded by {nameof(SwaggerContentDocumentationFilter)} and {nameof(SwaggerMediaDocumentationFilter)}. Will be removed in V14.")]
public class SwaggerDocumentationFilter : IOperationFilter, IParameterFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
// retained for backwards compat
}
public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
{
// retained for backwards compat
}
}
@@ -1,43 +1,7 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using System.Text.Json.Serialization.Metadata;
using Umbraco.Cms.Core.Models.DeliveryApi;
using Umbraco.Cms.Infrastructure.Serialization;
namespace Umbraco.Cms.Api.Delivery.Json;
// see https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/polymorphism?pivots=dotnet-7-0
public class DeliveryApiJsonTypeResolver : DefaultJsonTypeInfoResolver
{
public override JsonTypeInfo GetTypeInfo(Type type, JsonSerializerOptions options)
{
JsonTypeInfo jsonTypeInfo = base.GetTypeInfo(type, options);
if (jsonTypeInfo.Type == typeof(IApiContent))
{
ConfigureJsonPolymorphismOptions(jsonTypeInfo, typeof(ApiContent));
}
else if (jsonTypeInfo.Type == typeof(IApiContentResponse))
{
ConfigureJsonPolymorphismOptions(jsonTypeInfo, typeof(ApiContentResponse));
}
else if (jsonTypeInfo.Type == typeof(IRichTextElement))
{
ConfigureJsonPolymorphismOptions(jsonTypeInfo, typeof(RichTextRootElement), typeof(RichTextGenericElement), typeof(RichTextTextElement));
}
return jsonTypeInfo;
}
private void ConfigureJsonPolymorphismOptions(JsonTypeInfo jsonTypeInfo, params Type[] derivedTypes)
{
jsonTypeInfo.PolymorphismOptions = new JsonPolymorphismOptions
{
UnknownDerivedTypeHandling = JsonUnknownDerivedTypeHandling.FailSerialization,
};
foreach (Type derivedType in derivedTypes)
{
jsonTypeInfo.PolymorphismOptions.DerivedTypes.Add(new JsonDerivedType(derivedType));
}
}
}
public class DeliveryApiJsonTypeResolver : ContentJsonTypeResolverBase
{ }
@@ -0,0 +1,88 @@
using System.Reflection;
using System.Text.Json;
using System.Text.Json.Serialization;
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Umbraco.Cms.Core.DeliveryApi;
namespace Umbraco.Cms.Api.Delivery.Json;
public abstract class DeliveryApiVersionAwareJsonConverterBase<T> : JsonConverter<T>
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly JsonConverter<T> _defaultConverter = (JsonConverter<T>)JsonSerializerOptions.Default.GetConverter(typeof(T));
public DeliveryApiVersionAwareJsonConverterBase(IHttpContextAccessor httpContextAccessor)
=> _httpContextAccessor = httpContextAccessor;
/// <inheritdoc />
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
=> _defaultConverter.Read(ref reader, typeToConvert, options);
/// <inheritdoc />
public override void Write(Utf8JsonWriter writer, T value, JsonSerializerOptions options)
{
Type type = typeof(T);
var apiVersion = GetApiVersion();
// Get the properties in the specified order
PropertyInfo[] properties = type.GetProperties().OrderBy(GetPropertyOrder).ToArray();
writer.WriteStartObject();
foreach (PropertyInfo property in properties)
{
// Filter out properties based on the API version
var include = apiVersion is null || ShouldIncludeProperty(property, apiVersion.Value);
if (include is false)
{
continue;
}
var propertyName = property.Name;
writer.WritePropertyName(options.PropertyNamingPolicy?.ConvertName(propertyName) ?? propertyName);
JsonSerializer.Serialize(writer, property.GetValue(value), options);
}
writer.WriteEndObject();
}
private int? GetApiVersion()
{
HttpContext? httpContext = _httpContextAccessor.HttpContext;
ApiVersion? apiVersion = httpContext?.GetRequestedApiVersion();
return apiVersion?.MajorVersion;
}
private int GetPropertyOrder(PropertyInfo prop)
{
var attribute = prop.GetCustomAttribute<JsonPropertyOrderAttribute>();
return attribute?.Order ?? 0;
}
/// <summary>
/// Determines whether a property should be included based on version bounds.
/// </summary>
/// <param name="propertyInfo">The property info.</param>
/// <param name="version">An integer representing an API version.</param>
/// <returns><c>true</c> if the property should be included; otherwise, <c>false</c>.</returns>
private bool ShouldIncludeProperty(PropertyInfo propertyInfo, int version)
{
var attribute = propertyInfo
.GetCustomAttributes(typeof(IncludeInApiVersionAttribute), false)
.FirstOrDefault();
if (attribute is not IncludeInApiVersionAttribute apiVersionAttribute)
{
return true; // No attribute means include the property
}
// Check if the version is within the specified bounds
var isWithinMinVersion = apiVersionAttribute.MinVersion.HasValue is false || version >= apiVersionAttribute.MinVersion.Value;
var isWithinMaxVersion = apiVersionAttribute.MaxVersion.HasValue is false || version <= apiVersionAttribute.MaxVersion.Value;
return isWithinMinVersion && isWithinMaxVersion;
}
}
@@ -1,6 +1,5 @@
using Umbraco.Cms.Api.Delivery.Indexing.Filters;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Delivery.Querying.Filters;
@@ -15,15 +14,15 @@ public sealed class ContentTypeFilter : IFilterHandler
/// <inheritdoc/>
public FilterOption BuildFilterOption(string filter)
{
var alias = filter.Substring(ContentTypeSpecifier.Length);
var filterValue = filter.Substring(ContentTypeSpecifier.Length);
var negate = filterValue.StartsWith('!');
var aliases = filterValue.TrimStart('!').Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
return new FilterOption
{
FieldName = ContentTypeFilterIndexer.FieldName,
Values = alias.IsNullOrWhiteSpace() == false
? new[] { alias.TrimStart('!') }
: Array.Empty<string>(),
Operator = alias.StartsWith('!')
Values = aliases,
Operator = negate
? FilterOperation.IsNot
: FilterOperation.Is
};
@@ -1,5 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Api.Delivery.Indexing.Selectors;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.DependencyInjection;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Cms.Core.PublishedCache;
using Umbraco.Extensions;
@@ -10,10 +12,22 @@ public sealed class AncestorsSelector : QueryOptionBase, ISelectorHandler
{
private const string AncestorsSpecifier = "ancestors:";
private readonly IPublishedSnapshotAccessor _publishedSnapshotAccessor;
private readonly IRequestPreviewService _requestPreviewService;
public AncestorsSelector(IPublishedSnapshotAccessor publishedSnapshotAccessor, IRequestRoutingService requestRoutingService)
: base(publishedSnapshotAccessor, requestRoutingService) =>
[Obsolete("Please use the non-obsolete constructor. Will be removed in V17.")]
public AncestorsSelector(
IPublishedSnapshotAccessor publishedSnapshotAccessor,
IRequestRoutingService requestRoutingService)
: this(publishedSnapshotAccessor, requestRoutingService, StaticServiceProvider.Instance.GetRequiredService<IRequestPreviewService>())
{
}
public AncestorsSelector(IPublishedSnapshotAccessor publishedSnapshotAccessor, IRequestRoutingService requestRoutingService, IRequestPreviewService requestPreviewService)
: base(publishedSnapshotAccessor, requestRoutingService)
{
_publishedSnapshotAccessor = publishedSnapshotAccessor;
_requestPreviewService = requestPreviewService;
}
/// <inheritdoc />
public bool CanHandle(string query)
@@ -37,10 +51,20 @@ public sealed class AncestorsSelector : QueryOptionBase, ISelectorHandler
};
}
IPublishedSnapshot publishedSnapshot = _publishedSnapshotAccessor.GetRequiredPublishedSnapshot();
IPublishedContentCache contentCache = _publishedSnapshotAccessor.GetRequiredPublishedSnapshot()?.Content
?? throw new InvalidOperationException("Could not obtain the content cache");
IPublishedContent contentItem = publishedSnapshot.Content?.GetById((Guid)id)
?? throw new InvalidOperationException("Could not obtain the content cache");
IPublishedContent? contentItem = contentCache.GetById(_requestPreviewService.IsPreview(), id.Value);
if (contentItem is null)
{
// no such content item, make sure the selector does not yield any results
return new SelectorOption
{
FieldName = AncestorsSelectorIndexer.FieldName,
Values = Array.Empty<string>()
};
}
var ancestorKeys = contentItem.Ancestors().Select(a => a.Key.ToString("D")).ToArray();
@@ -36,7 +36,7 @@ public class MemberApplicationManager : OpenIdDictApplicationManagerBase, IMembe
{
DisplayName = "Umbraco member access",
ClientId = Constants.OAuthClientIds.Member,
Type = OpenIddictConstants.ClientTypes.Public,
ClientType = OpenIddictConstants.ClientTypes.Public,
Permissions =
{
OpenIddictConstants.Permissions.Endpoints.Authorization,
@@ -48,17 +48,6 @@ internal sealed class ApiContentQueryProvider : IApiContentQueryProvider
}
[Obsolete($"Use the {nameof(ExecuteQuery)} method that accepts {nameof(ProtectedAccess)}. Will be removed in V14.")]
public PagedModel<Guid> ExecuteQuery(
SelectorOption selectorOption,
IList<FilterOption> filterOptions,
IList<SortOption> sortOptions,
string culture,
bool preview,
int skip,
int take)
=> ExecuteQuery(selectorOption, filterOptions, sortOptions, culture, ProtectedAccess.None, preview, skip, take);
/// <inheritdoc/>
public PagedModel<Guid> ExecuteQuery(
SelectorOption selectorOption,
@@ -37,15 +37,6 @@ internal sealed class ApiContentQueryService : IApiContentQueryService
_requestPreviewService = requestPreviewService;
}
[Obsolete($"Use the {nameof(ExecuteQuery)} method that accepts {nameof(ProtectedAccess)}. Will be removed in V14.")]
public Attempt<PagedModel<Guid>, ApiContentQueryOperationStatus> ExecuteQuery(
string? fetch,
IEnumerable<string> filters,
IEnumerable<string> sorts,
int skip,
int take)
=> ExecuteQuery(fetch, filters, sorts, ProtectedAccess.None, skip, take);
/// <inheritdoc/>
public Attempt<PagedModel<Guid>, ApiContentQueryOperationStatus> ExecuteQuery(
string? fetch,
@@ -0,0 +1,44 @@
using OpenIddict.Abstractions;
using Umbraco.Cms.Core.DeliveryApi;
using Umbraco.Cms.Core.Security;
namespace Umbraco.Cms.Api.Delivery.Services;
// NOTE: this is public and unsealed to allow overriding the default claims with minimal effort.
public class CurrentMemberClaimsProvider : ICurrentMemberClaimsProvider
{
private readonly IMemberManager _memberManager;
public CurrentMemberClaimsProvider(IMemberManager memberManager)
=> _memberManager = memberManager;
public virtual async Task<Dictionary<string, object>> GetClaimsAsync()
{
MemberIdentityUser? memberIdentityUser = await _memberManager.GetCurrentMemberAsync();
return memberIdentityUser is not null
? await GetClaimsForMemberIdentityAsync(memberIdentityUser)
: throw new InvalidOperationException("Could not retrieve the current member. This method should only ever be invoked when a member has been authorized.");
}
protected virtual async Task<Dictionary<string, object>> GetClaimsForMemberIdentityAsync(MemberIdentityUser memberIdentityUser)
{
var claims = new Dictionary<string, object>
{
[OpenIddictConstants.Claims.Subject] = memberIdentityUser.Key
};
if (memberIdentityUser.Name is not null)
{
claims[OpenIddictConstants.Claims.Name] = memberIdentityUser.Name;
}
if (memberIdentityUser.Email is not null)
{
claims[OpenIddictConstants.Claims.Email] = memberIdentityUser.Email;
}
claims[OpenIddictConstants.Claims.Role] = await _memberManager.GetRolesAsync(memberIdentityUser);
return claims;
}
}
@@ -8,11 +8,5 @@ internal abstract class RequestHeaderHandler
protected RequestHeaderHandler(IHttpContextAccessor httpContextAccessor) => _httpContextAccessor = httpContextAccessor;
protected string? GetHeaderValue(string headerName)
{
HttpContext httpContext = _httpContextAccessor.HttpContext ??
throw new InvalidOperationException("Could not obtain an HTTP context");
return httpContext.Request.Headers[headerName];
}
protected string? GetHeaderValue(string headerName) => _httpContextAccessor.HttpContext?.Request.Headers[headerName];
}
@@ -42,31 +42,42 @@ internal sealed class RequestRedirectService : RoutingServiceBase, IRequestRedir
{
requestedPath = requestedPath.EnsureStartsWith("/");
IPublishedContent? startItem = GetStartItem();
// must append the root content url segment if it is not hidden by config, because
// the URL tracking is based on the actual URL, including the root content url segment
if (_globalSettings.HideTopLevelNodeFromPath == false)
if (_globalSettings.HideTopLevelNodeFromPath == false && startItem?.UrlSegment != null)
{
IPublishedContent? startItem = GetStartItem();
if (startItem?.UrlSegment != null)
{
requestedPath = $"{startItem.UrlSegment.EnsureStartsWith("/")}{requestedPath}";
}
requestedPath = $"{startItem.UrlSegment.EnsureStartsWith("/")}{requestedPath}";
}
var culture = _requestCultureService.GetRequestedCulture();
// append the configured domain content ID to the path if we have a domain bound request,
// because URL tracking registers the tracked url like "{domain content ID}/{content path}"
Uri contentRoute = GetDefaultRequestUri(requestedPath);
DomainAndUri? domainAndUri = GetDomainAndUriForRoute(contentRoute);
if (domainAndUri != null)
// important: redirect URLs are always tracked without trailing slashes
requestedPath = requestedPath.TrimEnd("/");
IRedirectUrl? redirectUrl = _redirectUrlService.GetMostRecentRedirectUrl(requestedPath, culture);
// if a redirect URL was not found, try by appending the start item ID because URL tracking might have tracked
// a redirect with "{root content ID}/{content path}"
if (redirectUrl is null && startItem is not null)
{
requestedPath = GetContentRoute(domainAndUri, contentRoute);
culture ??= domainAndUri.Culture;
redirectUrl = _redirectUrlService.GetMostRecentRedirectUrl($"{startItem.Id}{requestedPath}", culture);
}
// still no redirect URL found - try looking for a configured domain if we have a domain bound request,
// because URL tracking might have tracked a redirect with "{domain content ID}/{content path}"
if (redirectUrl is null)
{
Uri contentRoute = GetDefaultRequestUri(requestedPath);
DomainAndUri? domainAndUri = GetDomainAndUriForRoute(contentRoute);
if (domainAndUri is not null)
{
requestedPath = GetContentRoute(domainAndUri, contentRoute);
culture ??= domainAndUri.Culture;
redirectUrl = _redirectUrlService.GetMostRecentRedirectUrl(requestedPath, culture);
}
}
// important: redirect URLs are always tracked without trailing slashes
IRedirectUrl? redirectUrl = _redirectUrlService.GetMostRecentRedirectUrl(requestedPath.TrimEnd("/"), culture);
IPublishedContent? content = redirectUrl != null
? _apiPublishedContentCache.GetById(redirectUrl.ContentKey)
: null;
@@ -3,7 +3,11 @@
<Title>Umbraco CMS - Delivery API</Title>
<Description>Contains the presentation layer for the Umbraco CMS Delivery API.</Description>
</PropertyGroup>
<PropertyGroup>
<!-- TODO: [ASP0019] use IHeaderDictionary.Append or the indexer to append or set headers,
and remove this override -->
<WarningsNotAsErrors>ASP0019</WarningsNotAsErrors>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Umbraco.Cms.Api.Common\Umbraco.Cms.Api.Common.csproj" />
<ProjectReference Include="..\Umbraco.Web.Common\Umbraco.Web.Common.csproj" />
@@ -0,0 +1,254 @@
using System.Security.Claims;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Api.Management.Security;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Net;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Web.Common.Security;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Configuration;
/// <summary>
/// Used to configure <see cref="CookieAuthenticationOptions" /> for the back office authentication type
/// </summary>
public class ConfigureBackOfficeCookieOptions : IConfigureNamedOptions<CookieAuthenticationOptions>
{
private readonly IDataProtectionProvider _dataProtection;
private readonly GlobalSettings _globalSettings;
private readonly IIpResolver _ipResolver;
private readonly IRuntimeState _runtimeState;
private readonly SecuritySettings _securitySettings;
private readonly IUserService _userService;
private readonly TimeProvider _timeProvider;
/// <summary>
/// Initializes a new instance of the <see cref="ConfigureBackOfficeCookieOptions" /> class.
/// </summary>
/// <param name="securitySettings">The <see cref="SecuritySettings" /> options</param>
/// <param name="globalSettings">The <see cref="GlobalSettings" /> options</param>
/// <param name="runtimeState">The <see cref="IRuntimeState" /></param>
/// <param name="dataProtection">The <see cref="IDataProtectionProvider" /></param>
/// <param name="userService">The <see cref="IUserService" /></param>
/// <param name="ipResolver">The <see cref="IIpResolver" /></param>
/// <param name="timeProvider">The <see cref="TimeProvider" /></param>
public ConfigureBackOfficeCookieOptions(
IOptions<SecuritySettings> securitySettings,
IOptions<GlobalSettings> globalSettings,
IRuntimeState runtimeState,
IDataProtectionProvider dataProtection,
IUserService userService,
IIpResolver ipResolver,
TimeProvider timeProvider)
{
_securitySettings = securitySettings.Value;
_globalSettings = globalSettings.Value;
_runtimeState = runtimeState;
_dataProtection = dataProtection;
_userService = userService;
_ipResolver = ipResolver;
_timeProvider = timeProvider;
}
/// <inheritdoc />
public void Configure(string? name, CookieAuthenticationOptions options)
{
if (name != Constants.Security.BackOfficeAuthenticationType)
{
return;
}
Configure(options);
}
/// <inheritdoc />
public void Configure(CookieAuthenticationOptions options)
{
options.SlidingExpiration = false;
options.ExpireTimeSpan = _globalSettings.TimeOut;
options.Cookie.Domain = _securitySettings.AuthCookieDomain;
options.Cookie.Name = _securitySettings.AuthCookieName;
options.Cookie.HttpOnly = true;
options.Cookie.SecurePolicy =
_globalSettings.UseHttps ? CookieSecurePolicy.Always : CookieSecurePolicy.SameAsRequest;
options.Cookie.Path = "/";
// NOTE: matches route in BackOfficeLoginController
const string backOfficeLoginPath = "/umbraco/login";
options.LoginPath = backOfficeLoginPath;
options.LogoutPath = backOfficeLoginPath;
options.AccessDeniedPath = backOfficeLoginPath;
options.DataProtectionProvider = _dataProtection;
// NOTE: This is borrowed directly from aspnetcore source
// Note: the purpose for the data protector must remain fixed for interop to work.
IDataProtector dataProtector = options.DataProtectionProvider.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
Constants.Security.BackOfficeAuthenticationType,
"v2");
var ticketDataFormat = new TicketDataFormat(dataProtector);
options.TicketDataFormat = new BackOfficeSecureDataFormat(_globalSettings.TimeOut, ticketDataFormat);
options.Events = new CookieAuthenticationEvents
{
// IMPORTANT! If you set any of OnRedirectToLogin, OnRedirectToAccessDenied, OnRedirectToLogout, OnRedirectToReturnUrl
// you need to be aware that this will bypass the default behavior of returning the correct status codes for ajax requests and
// not redirecting for non-ajax requests. This is because the default behavior is baked into this class here:
// https://github.com/dotnet/aspnetcore/blob/master/src/Security/Authentication/Cookies/src/CookieAuthenticationEvents.cs#L58
// It would be possible to re-use the default behavior if any of these need to be set but that must be taken into account else
// our back office requests will not function correctly. For now we don't need to set/configure any of these callbacks because
// the defaults work fine with our setup.
OnValidatePrincipal = async ctx =>
{
// We need to resolve the BackOfficeSecurityStampValidator per request as a requirement (even in aspnetcore they do this)
BackOfficeSecurityStampValidator securityStampValidator =
ctx.HttpContext.RequestServices.GetRequiredService<BackOfficeSecurityStampValidator>();
// Same goes for the signinmanager
IBackOfficeSignInManager signInManager =
ctx.HttpContext.RequestServices.GetRequiredService<IBackOfficeSignInManager>();
ClaimsIdentity? backOfficeIdentity = ctx.Principal?.GetUmbracoIdentity();
if (backOfficeIdentity == null)
{
ctx.RejectPrincipal();
await signInManager.SignOutAsync();
}
// ensure the thread culture is set
backOfficeIdentity?.EnsureCulture();
EnsureTicketRenewalIfKeepUserLoggedIn(ctx);
// add or update a claim to track when the cookie expires, we use this to track time remaining
backOfficeIdentity?.AddOrUpdateClaim(new Claim(
Constants.Security.TicketExpiresClaimType,
ctx.Properties.ExpiresUtc!.Value.ToString("o"),
ClaimValueTypes.DateTime,
Constants.Security.BackOfficeAuthenticationType,
Constants.Security.BackOfficeAuthenticationType,
backOfficeIdentity));
await securityStampValidator.ValidateAsync(ctx);
// We have to manually specify Issued and Expires,
// because the SecurityStampValidator refreshes the principal every 30 minutes,
// When the principal is refreshed the Issued is update to time of refresh, however, the Expires remains unchanged
// When we then try and renew, the difference of issued and expires effectively becomes the new ExpireTimeSpan
// meaning we effectively lose 30 minutes of our ExpireTimeSpan for EVERY principal refresh if we don't
// https://github.com/dotnet/aspnetcore/blob/main/src/Security/Authentication/Cookies/src/CookieAuthenticationHandler.cs#L115
ctx.Properties.IssuedUtc = _timeProvider.GetUtcNow();
ctx.Properties.ExpiresUtc = _timeProvider.GetUtcNow().Add(_globalSettings.TimeOut);
ctx.ShouldRenew = true;
},
OnSigningIn = ctx =>
{
// occurs when sign in is successful but before the ticket is written to the outbound cookie
ClaimsIdentity? backOfficeIdentity = ctx.Principal?.GetUmbracoIdentity();
if (backOfficeIdentity != null)
{
// generate a session id and assign it
// create a session token - if we are configured and not in an upgrade state then use the db, otherwise just generate one
Guid session = _runtimeState.Level == RuntimeLevel.Run
? _userService.CreateLoginSession(
backOfficeIdentity.GetId()!.Value,
_ipResolver.GetCurrentRequestIpAddress())
: Guid.NewGuid();
// add our session claim
backOfficeIdentity.AddClaim(new Claim(
Constants.Security.SessionIdClaimType,
session.ToString(),
ClaimValueTypes.String,
Constants.Security.BackOfficeAuthenticationType,
Constants.Security.BackOfficeAuthenticationType,
backOfficeIdentity));
// since it is a cookie-based authentication add that claim
backOfficeIdentity.AddClaim(new Claim(
ClaimTypes.CookiePath,
"/",
ClaimValueTypes.String,
Constants.Security.BackOfficeAuthenticationType,
Constants.Security.BackOfficeAuthenticationType,
backOfficeIdentity));
}
return Task.CompletedTask;
},
OnSignedIn = ctx =>
{
// occurs when sign in is successful and after the ticket is written to the outbound cookie
// When we are signed in with the cookie, assign the principal to the current HttpContext
ctx.HttpContext.SetPrincipalForRequest(ctx.Principal);
return Task.CompletedTask;
},
OnSigningOut = ctx =>
{
// Clear the user's session on sign out
if (ctx.HttpContext?.User?.Identity != null)
{
var claimsIdentity = ctx.HttpContext.User.Identity as ClaimsIdentity;
var sessionId = claimsIdentity?.FindFirstValue(Constants.Security.SessionIdClaimType);
if (sessionId.IsNullOrWhiteSpace() == false && Guid.TryParse(sessionId, out Guid guidSession))
{
_userService.ClearLoginSession(guidSession);
}
}
// Remove all of our cookies
var cookies = new[]
{
_securitySettings.AuthCookieName,
Constants.Web.PreviewCookieName, Constants.Security.BackOfficeExternalCookieName,
Constants.Web.CsrfValidationCookieName
};
foreach (var cookie in cookies)
{
ctx.Options.CookieManager.DeleteCookie(ctx.HttpContext!, cookie, new CookieOptions { Path = "/" });
}
return Task.CompletedTask;
}
};
}
/// <summary>
/// Ensures the ticket is renewed if the <see cref="SecuritySettings.KeepUserLoggedIn" /> is set to true
/// and the current request is for the get user seconds endpoint
/// </summary>
/// <param name="context">The <see cref="CookieValidatePrincipalContext" /></param>
private void EnsureTicketRenewalIfKeepUserLoggedIn(CookieValidatePrincipalContext context)
{
if (!_securitySettings.KeepUserLoggedIn)
{
return;
}
DateTimeOffset currentUtc = _timeProvider.GetUtcNow();
DateTimeOffset? issuedUtc = context.Properties.IssuedUtc;
DateTimeOffset? expiresUtc = context.Properties.ExpiresUtc;
if (expiresUtc.HasValue && issuedUtc.HasValue)
{
TimeSpan timeElapsed = currentUtc.Subtract(issuedUtc.Value);
TimeSpan timeRemaining = expiresUtc.Value.Subtract(currentUtc);
// if it's time to renew, then do it
if (timeRemaining < timeElapsed)
{
context.ShouldRenew = true;
}
}
}
}
@@ -0,0 +1,28 @@
using Microsoft.Extensions.Options;
using Umbraco.Cms.Api.Management.Security;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Web.Common.Security;
namespace Umbraco.Cms.Api.Management.Configuration;
/// <summary>
/// Configures the back office security stamp options.
/// </summary>
public class ConfigureBackOfficeSecurityStampValidatorOptions : IConfigureOptions<BackOfficeSecurityStampValidatorOptions>
{
private readonly SecuritySettings _securitySettings;
private readonly TimeProvider _timeProvider;
public ConfigureBackOfficeSecurityStampValidatorOptions(IOptions<SecuritySettings> securitySettings, TimeProvider timeProvider)
{
_timeProvider = timeProvider;
_securitySettings = securitySettings.Value;
}
/// <inheritdoc />
public void Configure(BackOfficeSecurityStampValidatorOptions options)
{
options.TimeProvider = _timeProvider;
ConfigureSecurityStampOptions.ConfigureOptions(options, _securitySettings);
}
}
@@ -2,6 +2,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using Umbraco.Cms.Api.Common.OpenApi;
using Umbraco.Cms.Api.Common.Serialization;
using Umbraco.Cms.Api.Management.DependencyInjection;
using Umbraco.Cms.Api.Management.OpenApi;
@@ -32,7 +33,11 @@ public class ConfigureUmbracoManagementApiSwaggerGenOptions : IConfigureOptions<
swaggerGenOptions.OperationFilter<ResponseHeaderOperationFilter>();
swaggerGenOptions.SelectSubTypesUsing(_umbracoJsonTypeInfoResolver.FindSubTypes);
swaggerGenOptions.UseOneOfForPolymorphism();
swaggerGenOptions.UseAllOfForInheritance();
// Ensure all types that implements the IOpenApiDiscriminator have a $type property in the OpenApi schema with the default value (The class name) that is expected by the server
swaggerGenOptions.SelectDiscriminatorNameUsing(type => _umbracoJsonTypeInfoResolver.GetTypeDiscriminatorValue(type) is not null ? "$type" : null);
swaggerGenOptions.SelectDiscriminatorValueUsing(_umbracoJsonTypeInfoResolver.GetTypeDiscriminatorValue);
swaggerGenOptions.AddSecurityDefinition(
ManagementApiConfiguration.ApiSecurityName,
@@ -55,7 +60,7 @@ public class ConfigureUmbracoManagementApiSwaggerGenOptions : IConfigureOptions<
// Sets Security requirement on backoffice apis
swaggerGenOptions.OperationFilter<BackOfficeSecurityRequirementsOperationFilter>();
swaggerGenOptions.OperationFilter<NotificationHeaderFilter>();
swaggerGenOptions.SchemaFilter<RequireNonNullablePropertiesSchemaFilter>();
}
}
@@ -1,11 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
namespace Umbraco.Cms.Api.Management.Controllers.AuditLog;
[ApiController]
[VersionedApiBackOfficeRoute("audit-log")]
[ApiExplorerSettings(GroupName = "Audit Log")]
public class AuditLogControllerBase : ManagementApiControllerBase
{
}
@@ -1,43 +0,0 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.Factories;
using Umbraco.Cms.Api.Management.ViewModels.AuditLogs;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.AuditLog;
[ApiVersion("1.0")]
[Authorize(Policy = "New" + AuthorizationPolicies.SectionAccessContentOrMedia)]
public class ByKeyAuditLogController : AuditLogControllerBase
{
private readonly IAuditService _auditService;
private readonly IAuditLogPresentationFactory _auditLogPresentationFactory;
public ByKeyAuditLogController(IAuditService auditService, IAuditLogPresentationFactory auditLogPresentationFactory)
{
_auditService = auditService;
_auditLogPresentationFactory = auditLogPresentationFactory;
}
[HttpGet("{id:guid}")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<AuditLogResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> ByKey(Guid id, Direction orderDirection = Direction.Descending, DateTime? sinceDate = null, int skip = 0, int take = 100)
{
PagedModel<IAuditItem> result = await _auditService.GetItemsByKeyAsync(id, skip, take, orderDirection, sinceDate);
IEnumerable<AuditLogResponseModel> mapped = _auditLogPresentationFactory.CreateAuditLogViewModel(result.Items);
var viewModel = new PagedViewModel<AuditLogResponseModel>
{
Total = result.Total,
Items = mapped,
};
return Ok(viewModel);
}
}
@@ -1,39 +0,0 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.Factories;
using Umbraco.Cms.Api.Management.ViewModels.AuditLogs;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.AuditLog;
[ApiVersion("1.0")]
public class ByTypeAuditLogController : AuditLogControllerBase
{
private readonly IAuditService _auditService;
private readonly IAuditLogPresentationFactory _auditLogPresentationFactory;
public ByTypeAuditLogController(IAuditService auditService, IAuditLogPresentationFactory auditLogPresentationFactory)
{
_auditService = auditService;
_auditLogPresentationFactory = auditLogPresentationFactory;
}
[HttpGet("type/{logType}")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<AuditLogResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> ByType(AuditType logType, DateTime? sinceDate = null, int skip = 0, int take = 100)
{
IAuditItem[] result = _auditService.GetLogs(logType, sinceDate).ToArray();
IEnumerable<AuditLogResponseModel> mapped = _auditLogPresentationFactory.CreateAuditLogViewModel(result.Skip(skip).Take(take));
var viewModel = new PagedViewModel<AuditLogResponseModel>
{
Total = result.Length,
Items = mapped,
};
return await Task.FromResult(Ok(viewModel));
}
}
@@ -1,65 +0,0 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.Factories;
using Umbraco.Cms.Api.Management.ViewModels.AuditLogs;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Exceptions;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Membership;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.AuditLog;
[ApiVersion("1.0")]
public class CurrentUserAuditLogController : AuditLogControllerBase
{
private readonly IAuditService _auditService;
private readonly IAuditLogPresentationFactory _auditLogPresentationFactory;
private readonly IUserService _userService;
public CurrentUserAuditLogController(
IAuditService auditService,
IAuditLogPresentationFactory auditLogPresentationFactory,
IUserService userService)
{
_auditService = auditService;
_auditLogPresentationFactory = auditLogPresentationFactory;
_userService = userService;
}
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<AuditLogWithUsernameResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> CurrentUser(Direction orderDirection = Direction.Descending, DateTime? sinceDate = null, int skip = 0, int take = 100)
{
// FIXME: Pull out current backoffice user when its implemented.
// var userId = _backOfficeSecurityAccessor.BackOfficeSecurity?.GetUserId().Result ?? -1;
var userId = Constants.Security.SuperUserId;
IUser? user = _userService.GetUserById(userId);
if (user is null)
{
throw new PanicException("Could not find current user");
}
PagedModel<IAuditItem> result = await _auditService.GetPagedItemsByUserAsync(
user.Key,
skip,
take,
orderDirection,
null,
sinceDate);
IEnumerable<AuditLogWithUsernameResponseModel> mapped = _auditLogPresentationFactory.CreateAuditLogWithUsernameViewModels(result.Items);
var viewModel = new PagedViewModel<AuditLogWithUsernameResponseModel>
{
Total = result.Total,
Items = mapped,
};
return Ok(viewModel);
}
}
@@ -1,13 +1,14 @@
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Hosting;
namespace Umbraco.Cms.Api.Management;
[BindProperties]
public class
BackOfficeLoginModel
public class BackOfficeLoginModel
{
/// <summary>
/// Gets or sets the value of the "ReturnUrl" query parameter or defaults to the configured Umbraco directory.
@@ -19,12 +20,15 @@ public class
/// The configured Umbraco directory.
/// </summary>
public string? UmbracoUrl { get; set; }
public bool UserIsAlreadyLoggedIn { get; set; }
}
[ApiExplorerSettings(IgnoreApi=true)]
[Route("/umbraco/login")]
[Route(LoginPath)]
public class BackOfficeLoginController : Controller
{
public const string LoginPath = "/umbraco/login";
private readonly IHostingEnvironment _hostingEnvironment;
private readonly GlobalSettings _globalSettings;
@@ -37,8 +41,14 @@ public class BackOfficeLoginController : Controller
}
// GET
public IActionResult Index(BackOfficeLoginModel model)
public async Task<IActionResult> Index(CancellationToken cancellationToken, BackOfficeLoginModel model)
{
AuthenticateResult cookieAuthResult = await HttpContext.AuthenticateAsync(Constants.Security.BackOfficeAuthenticationType);
if (cookieAuthResult.Succeeded)
{
model.UserIsAlreadyLoggedIn = true;
}
if (string.IsNullOrEmpty(model.UmbracoUrl))
{
model.UmbracoUrl = _hostingEnvironment.ToAbsolute(_globalSettings.UmbracoPath);
@@ -49,6 +59,11 @@ public class BackOfficeLoginController : Controller
model.ReturnUrl = model.UmbracoUrl;
}
if ( Uri.TryCreate(model.ReturnUrl, UriKind.Relative, out _) is false) // Needs to test for relative and not absolute, as /whatever/ is an absolute path on linux
{
return BadRequest("ReturnUrl must be a relative path.");
}
return View("/umbraco/UmbracoLogin/Index.cshtml", model);
}
}
@@ -68,10 +68,6 @@ public abstract class ContentCollectionControllerBase<TContent, TCollectionRespo
.WithTitle("Data type id does not belong to a collection")
.WithDetail("The specified data type does not represent a collection")
.Build()),
ContentCollectionOperationStatus.DataTypeNotContentCollection => new BadRequestObjectResult(problemDetailsBuilder
.WithTitle("Data type id does not represent the configured collection")
.WithDetail($"The specified data type is not the configured collection for the given {type} item")
.Build()),
ContentCollectionOperationStatus.DataTypeNotContentProperty => new BadRequestObjectResult(problemDetailsBuilder
.WithTitle($"Data type id is not a {type} property")
.WithDetail($"The specified data type is not part of the {type} properties")
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Content;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models.ContentEditing;
using Umbraco.Cms.Core.Models.ContentEditing.Validation;
using Umbraco.Cms.Core.Services.OperationStatus;
@@ -8,8 +9,9 @@ using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Controllers.Content;
public class ContentControllerBase : ManagementApiControllerBase
public abstract class ContentControllerBase : ManagementApiControllerBase
{
protected IActionResult ContentEditingOperationStatusResult(ContentEditingOperationStatus status)
=> OperationStatusResult(status, problemDetailsBuilder => status switch
{
@@ -18,7 +20,7 @@ public class ContentControllerBase : ManagementApiControllerBase
.WithDetail("A notification handler prevented the content operation.")
.Build()),
ContentEditingOperationStatus.ContentTypeNotFound => NotFound(problemDetailsBuilder
.WithTitle("The requested content could not be found")
.WithTitle("The requested content type could not be found")
.Build()),
ContentEditingOperationStatus.ContentTypeCultureVarianceMismatch => BadRequest(problemDetailsBuilder
.WithTitle("Content type culture variance mismatch")
@@ -61,6 +63,18 @@ public class ContentControllerBase : ManagementApiControllerBase
.WithTitle("Invalid sorting options")
.WithDetail("The supplied sorting operations were invalid. Additional details can be found in the log.")
.Build()),
ContentEditingOperationStatus.InvalidCulture => BadRequest(problemDetailsBuilder
.WithTitle("Invalid culture")
.WithDetail("One or more of the supplied culture codes did not match the configured languages.")
.Build()),
ContentEditingOperationStatus.DuplicateKey => BadRequest(problemDetailsBuilder
.WithTitle("Invalid Id")
.WithDetail("The supplied id is already in use.")
.Build()),
ContentEditingOperationStatus.DuplicateName => BadRequest(problemDetailsBuilder
.WithTitle("Duplicate name")
.WithDetail("The supplied name is already in use for the same content type.")
.Build()),
ContentEditingOperationStatus.Unknown => StatusCode(
StatusCodes.Status500InternalServerError,
problemDetailsBuilder
@@ -85,7 +99,8 @@ public class ContentControllerBase : ManagementApiControllerBase
}
var errors = new SortedDictionary<string, string[]>();
var missingPropertyAliases = new List<string>();
var missingPropertyModels = new List<PropertyValidationResponseModel>();
foreach (PropertyValidationError validationError in validationResult.ValidationErrors)
{
TValueModel? requestValue = requestModel.Values.FirstOrDefault(value =>
@@ -94,7 +109,7 @@ public class ContentControllerBase : ManagementApiControllerBase
&& value.Segment == validationError.Segment);
if (requestValue is null)
{
missingPropertyAliases.Add(validationError.Alias);
missingPropertyModels.Add(MapMissingProperty(validationError));
continue;
}
@@ -108,7 +123,16 @@ public class ContentControllerBase : ManagementApiControllerBase
.WithTitle("Validation failed")
.WithDetail("One or more properties did not pass validation")
.WithRequestModelErrors(errors)
.WithExtension("missingProperties", missingPropertyAliases.ToArray())
.WithExtension("missingValues", missingPropertyModels.ToArray())
.Build()));
}
private PropertyValidationResponseModel MapMissingProperty(PropertyValidationError source) =>
new()
{
Alias = source.Alias,
Segment = source.Segment,
Culture = source.Culture,
Messages = source.ErrorMessages,
};
}
@@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Api.Management.ViewModels.Culture;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.Culture;
@@ -12,8 +13,13 @@ namespace Umbraco.Cms.Api.Management.Controllers.Culture;
public class AllCultureController : CultureControllerBase
{
private readonly IUmbracoMapper _umbracoMapper;
private readonly ICultureService _cultureService;
public AllCultureController(IUmbracoMapper umbracoMapper) => _umbracoMapper = umbracoMapper;
public AllCultureController(IUmbracoMapper umbracoMapper, ICultureService cultureService)
{
_umbracoMapper = umbracoMapper;
_cultureService = cultureService;
}
/// <summary>
/// Returns all cultures available for creating languages.
@@ -22,12 +28,9 @@ public class AllCultureController : CultureControllerBase
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<CultureReponseModel>), StatusCodes.Status200OK)]
public async Task<PagedViewModel<CultureReponseModel>> GetAll(int skip = 0, int take = 100)
public async Task<PagedViewModel<CultureReponseModel>> GetAll(CancellationToken cancellationToken, int skip = 0, int take = 100)
{
CultureInfo[] all = CultureInfo.GetCultures(CultureTypes.AllCultures)
.DistinctBy(x => x.Name)
.OrderBy(x => x.EnglishName)
.ToArray();
CultureInfo[] all = _cultureService.GetValidCultureInfos();
var viewModel = new PagedViewModel<CultureReponseModel>
{
@@ -3,7 +3,6 @@ using Umbraco.Cms.Api.Management.Routing;
namespace Umbraco.Cms.Api.Management.Controllers.Culture;
[ApiController]
[VersionedApiBackOfficeRoute("culture")]
[ApiExplorerSettings(GroupName = "Culture")]
public abstract class CultureControllerBase : ManagementApiControllerBase
@@ -24,7 +24,7 @@ public class ByKeyDataTypeController : DataTypeControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(DataTypeResponseModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> ByKey(Guid id)
public async Task<IActionResult> ByKey(CancellationToken cancellationToken, Guid id)
{
IDataType? dataType = await _dataTypeService.GetAsync(id);
if (dataType == null)
@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Api.Management.ViewModels.DataType;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
@@ -17,12 +18,14 @@ public class ConfigurationDataTypeController : DataTypeControllerBase
[HttpGet("configuration")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(DatatypeConfigurationResponseModel), StatusCodes.Status200OK)]
public Task<IActionResult> Configuration()
public Task<IActionResult> Configuration(CancellationToken cancellationToken)
{
var responseModel = new DatatypeConfigurationResponseModel
{
CanBeChanged = _dataTypesSettings.CanBeChanged,
DocumentListViewId = Constants.DataTypes.Guids.ListViewContentGuid,
MediaListViewId = Constants.DataTypes.Guids.ListViewMediaGuid,
};
return Task.FromResult<IActionResult>(Ok());
return Task.FromResult<IActionResult>(Ok(responseModel));
}
}
@@ -1,4 +1,5 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.DataType;
@@ -7,10 +8,12 @@ using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class CopyDataTypeController : DataTypeControllerBase
{
private readonly IDataTypeService _dataTypeService;
@@ -26,7 +29,7 @@ public class CopyDataTypeController : DataTypeControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Copy(Guid id, CopyDataTypeRequestModel copyDataTypeRequestModel)
public async Task<IActionResult> Copy(CancellationToken cancellationToken, Guid id, CopyDataTypeRequestModel copyDataTypeRequestModel)
{
IDataType? source = await _dataTypeService.GetAsync(id);
if (source is null)
@@ -1,4 +1,5 @@
using Asp.Versioning;
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Factories;
@@ -8,10 +9,12 @@ using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class CreateDataTypeController : DataTypeControllerBase
{
private readonly IDataTypeService _dataTypeService;
@@ -30,7 +33,7 @@ public class CreateDataTypeController : DataTypeControllerBase
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Create(CreateDataTypeRequestModel createDataTypeRequestModel)
public async Task<IActionResult> Create(CancellationToken cancellationToken, CreateDataTypeRequestModel createDataTypeRequestModel)
{
var attempt = await _dataTypePresentationFactory.CreateAsync(createDataTypeRequestModel);
if (!attempt.Success)
@@ -43,10 +46,5 @@ public class CreateDataTypeController : DataTypeControllerBase
return result.Success
? CreatedAtId<ByKeyDataTypeController>(controller => nameof(controller.ByKey), result.Result.Key)
: DataTypeOperationStatusResult(result.Status);
}
}
@@ -9,53 +9,54 @@ using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiController]
[VersionedApiBackOfficeRoute(Constants.UdiEntityType.DataType)]
[ApiExplorerSettings(GroupName = "Data Type")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDocumentsOrDocumentTypes)]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDocumentOrMediaOrContentTypes)]
public abstract class DataTypeControllerBase : ManagementApiControllerBase
{
protected IActionResult DataTypeOperationStatusResult(DataTypeOperationStatus status) =>
status switch
OperationStatusResult(status, problemDetailsBuilder => status switch
{
DataTypeOperationStatus.InvalidConfiguration => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.InvalidConfiguration => BadRequest(problemDetailsBuilder
.WithTitle("Invalid data type configuration")
.WithDetail("The supplied data type configuration was not valid. Please see the log for more details.")
.Build()),
DataTypeOperationStatus.NotFound => DataTypeNotFound(),
DataTypeOperationStatus.InvalidName => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.NotFound => DataTypeNotFound(problemDetailsBuilder),
DataTypeOperationStatus.InvalidName => BadRequest(problemDetailsBuilder
.WithTitle("Invalid data type name")
.WithDetail("The data type name must be non-empty and no longer than 255 characters.")
.Build()),
DataTypeOperationStatus.ParentNotContainer => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.ParentNotContainer => BadRequest(problemDetailsBuilder
.WithTitle("parent id is not a container")
.WithDetail("The parent id does not represent a container.")
.Build()),
DataTypeOperationStatus.DuplicateKey => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.DuplicateKey => BadRequest(problemDetailsBuilder
.WithTitle("The id is already used")
.WithDetail("The data type id must be unique.")
.Build()),
DataTypeOperationStatus.CancelledByNotification => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.CancelledByNotification => BadRequest(problemDetailsBuilder
.WithTitle("Cancelled by notification")
.WithDetail("A notification handler prevented the data type operation.")
.Build()),
DataTypeOperationStatus.PropertyEditorNotFound => NotFound(
new ProblemDetailsBuilder()
.WithTitle("The targeted property editor was not found.")
.Build()),
DataTypeOperationStatus.ParentNotFound => NotFound(new ProblemDetailsBuilder()
.WithTitle("The targeted parent for the data type operation was not found.")
.Build()),
DataTypeOperationStatus.NonDeletable => BadRequest(new ProblemDetailsBuilder()
DataTypeOperationStatus.PropertyEditorNotFound => NotFound(problemDetailsBuilder
.WithTitle("The targeted property editor was not found.")
.Build()),
DataTypeOperationStatus.ParentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The targeted parent for the data type operation was not found.")
.Build()),
DataTypeOperationStatus.NonDeletable => BadRequest(problemDetailsBuilder
.WithTitle("The data type is non-deletable")
.WithDetail("The specified data type is required by the system and cannot be deleted.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, new ProblemDetailsBuilder()
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown data type operation status.")
.Build()),
};
});
protected IActionResult DataTypeNotFound() => NotFound(new ProblemDetailsBuilder()
.WithTitle("The data type could not be found")
.Build());
protected IActionResult DataTypeNotFound() => OperationStatusResult(DataTypeOperationStatus.NotFound, DataTypeNotFound);
private IActionResult DataTypeNotFound(ProblemDetailsBuilder problemDetailsBuilder)
=> NotFound(problemDetailsBuilder
.WithTitle("The data type could not be found")
.Build());
}
@@ -1,4 +1,5 @@
using Asp.Versioning;
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core;
@@ -6,10 +7,12 @@ using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class DeleteDataTypeController : DataTypeControllerBase
{
private readonly IDataTypeService _dataTypeService;
@@ -26,7 +29,7 @@ public class DeleteDataTypeController : DataTypeControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Delete(Guid id)
public async Task<IActionResult> Delete(CancellationToken cancellationToken, Guid id)
{
Attempt<IDataType?, DataTypeOperationStatus> result = await _dataTypeService.DeleteAsync(id, CurrentUserKey(_backOfficeSecurityAccessor));
@@ -0,0 +1,15 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Core;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Filter;
[ApiExplorerSettings(GroupName = "Data Type")]
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Filter}/{Constants.UdiEntityType.DataType}")]
// This auth policy might become problematic, as when getting DataTypes on Media types, you don't need access to the document tree.
[Authorize(Policy = AuthorizationPolicies.TreeAccessDocumentsOrDocumentTypes)]
public abstract class DataTypeFilterControllerBase : ManagementApiControllerBase
{
}
@@ -0,0 +1,46 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Language;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Filter;
[ApiVersion("1.0")]
public class FilterDataTypeFilterController : DataTypeFilterControllerBase
{
private readonly IDataTypeService _dataTypeService;
private readonly IUmbracoMapper _mapper;
public FilterDataTypeFilterController(IDataTypeService dataTypeService, IUmbracoMapper mapper)
{
_dataTypeService = dataTypeService;
_mapper = mapper;
}
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<DataTypeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Filter(
CancellationToken cancellationToken,
int skip = 0,
int take = 100,
string name = "",
string? editorUiAlias = null,
string? editorAlias = null)
{
PagedModel<IDataType> dataTypes = await _dataTypeService.FilterAsync(name, editorUiAlias, editorAlias, skip, take);
List<DataTypeItemResponseModel> responseModels = _mapper.MapEnumerable<IDataType, DataTypeItemResponseModel>(dataTypes.Items);
var viewModel = new PagedViewModel<DataTypeItemResponseModel>
{
Total = dataTypes.Total,
Items = responseModels,
};
return Ok(viewModel);
}
}
@@ -21,5 +21,5 @@ public class ByKeyDataTypeFolderController : DataTypeFolderControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(FolderResponseModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> ByKey(Guid id) => await GetFolderAsync(id);
public async Task<IActionResult> ByKey(CancellationToken cancellationToken, Guid id) => await GetFolderAsync(id);
}
@@ -22,7 +22,7 @@ public class CreateDataTypeFolderController : DataTypeFolderControllerBase
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Create(CreateFolderRequestModel createFolderRequestModel)
public async Task<IActionResult> Create(CancellationToken cancellationToken, CreateFolderRequestModel createFolderRequestModel)
=> await CreateFolderAsync<ByKeyDataTypeFolderController>(
createFolderRequestModel,
controller => nameof(controller.ByKey));
@@ -9,10 +9,9 @@ using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Folder;
[ApiController]
[VersionedApiBackOfficeRoute($"{Constants.UdiEntityType.DataType}/folder")]
[ApiExplorerSettings(GroupName = "Data Type")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDocumentTypes)]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDocumentTypes)]
public abstract class DataTypeFolderControllerBase : FolderManagementControllerBase<IDataType>
{
protected DataTypeFolderControllerBase(
@@ -21,5 +21,5 @@ public class DeleteDataTypeFolderController : DataTypeFolderControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Delete(Guid id) => await DeleteFolderAsync(id);
public async Task<IActionResult> Delete(CancellationToken cancellationToken, Guid id) => await DeleteFolderAsync(id);
}
@@ -22,6 +22,9 @@ public class UpdateDataTypeFolderController : DataTypeFolderControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Update(Guid id, UpdateFolderResponseModel updateFolderResponseModel)
public async Task<IActionResult> Update(
CancellationToken cancellationToken,
Guid id,
UpdateFolderResponseModel updateFolderResponseModel)
=> await UpdateFolderAsync(id, updateFolderResponseModel);
}
@@ -21,7 +21,7 @@ public class IsUsedDataTypeController : DataTypeControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(bool), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> IsUsed(Guid id)
public async Task<IActionResult> IsUsed(CancellationToken cancellationToken, Guid id)
{
Attempt<bool, DataTypeOperationStatus> result = await _dataTypeUsageService.HasSavedValuesAsync(id);
@@ -1,34 +0,0 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Item;
[ApiVersion("1.0")]
public class ByEditorUiAliasController : DatatypeItemControllerBase
{
private readonly IDataTypeService _dataTypeService;
private readonly IUmbracoMapper _mapper;
public ByEditorUiAliasController(
IDataTypeService dataTypeService,
IUmbracoMapper mapper)
{
_dataTypeService = dataTypeService;
_mapper = mapper;
}
[HttpGet("{*alias}")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(DataTypeItemResponseModel), StatusCodes.Status200OK)]
public async Task<IActionResult> ByEditorUiAlias(string alias)
{
IEnumerable<IDataType> dataTypes = await _dataTypeService.GetByEditorUiAlias(alias);
List<DataTypeItemResponseModel> responseModels = _mapper.MapEnumerable<IDataType, DataTypeItemResponseModel>(dataTypes);
return Ok(responseModels);
}
}
@@ -1,15 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Core;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Item;
[ApiController]
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Item}/{Constants.UdiEntityType.DataType}")]
[ApiExplorerSettings(GroupName = "Data Type")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDocumentsOrDocumentTypes)]
public class DatatypeItemControllerBase : ManagementApiControllerBase
{
}
@@ -23,8 +23,15 @@ public class ItemDatatypeItemController : DatatypeItemControllerBase
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<DataTypeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult> Item([FromQuery(Name = "id")] HashSet<Guid> ids)
public async Task<IActionResult> Item(
CancellationToken cancellationToken,
[FromQuery(Name = "id")] HashSet<Guid> ids)
{
if (ids.Count is 0)
{
return Ok(Enumerable.Empty<DataTypeItemResponseModel>());
}
var dataTypes = new List<IDataType>();
foreach (Guid id in ids)
{
@@ -0,0 +1,46 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Core.Mapping;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Item;
[ApiVersion("1.0")]
public class SearchDataTypeItemController : DatatypeItemControllerBase
{
private readonly IEntitySearchService _entitySearchService;
private readonly IDataTypeService _dataTypeService;
private readonly IUmbracoMapper _mapper;
public SearchDataTypeItemController(IEntitySearchService entitySearchService, IDataTypeService dataTypeService, IUmbracoMapper mapper)
{
_entitySearchService = entitySearchService;
_dataTypeService = dataTypeService;
_mapper = mapper;
}
[HttpGet("search")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedModel<DataTypeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<IActionResult> Search(CancellationToken cancellationToken, string query, int skip = 0, int take = 100)
{
PagedModel<IEntitySlim> searchResult = _entitySearchService.Search(UmbracoObjectTypes.DataType, query, skip, take);
if (searchResult.Items.Any() is false)
{
return Ok(new PagedModel<DataTypeItemResponseModel> { Total = searchResult.Total });
}
IEnumerable<IDataType> dataTypes = await _dataTypeService.GetAllAsync(searchResult.Items.Select(item => item.Key).ToArray());
var result = new PagedModel<DataTypeItemResponseModel>
{
Items = _mapper.MapEnumerable<IDataType, DataTypeItemResponseModel>(dataTypes),
Total = searchResult.Total
};
return Ok(result);
}
}
@@ -1,4 +1,5 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.DataType;
@@ -7,10 +8,12 @@ using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class MoveDataTypeController : DataTypeControllerBase
{
private readonly IDataTypeService _dataTypeService;
@@ -26,7 +29,7 @@ public class MoveDataTypeController : DataTypeControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Move(Guid id, MoveDataTypeRequestModel moveDataTypeRequestModel)
public async Task<IActionResult> Move(CancellationToken cancellationToken, Guid id, MoveDataTypeRequestModel moveDataTypeRequestModel)
{
IDataType? source = await _dataTypeService.GetAsync(id);
if (source is null)
@@ -25,7 +25,7 @@ public class ReferencesDataTypeController : DataTypeControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(DataTypeReferenceResponseModel[]), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> References(Guid id)
public async Task<IActionResult> References(CancellationToken cancellationToken, Guid id)
{
Attempt<IReadOnlyDictionary<Udi, IEnumerable<string>>, DataTypeOperationStatus> result = await _dataTypeService.GetReferencesAsync(id);
if (result.Success == false)
@@ -0,0 +1,22 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Tree;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Tree;
[ApiVersion("1.0")]
public class AncestorsDataTypeTreeController : DataTypeTreeControllerBase
{
public AncestorsDataTypeTreeController(IEntityService entityService, IDataTypeService dataTypeService)
: base(entityService, dataTypeService)
{
}
[HttpGet("ancestors")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<DataTypeTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerable<DataTypeTreeItemResponseModel>>> Ancestors(CancellationToken cancellationToken, Guid descendantId)
=> await GetAncestors(descendantId);
}
@@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Api.Common.ViewModels.Pagination;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Api.Management.ViewModels.Tree;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Tree;
@@ -18,7 +18,7 @@ public class ChildrenDataTypeTreeController : DataTypeTreeControllerBase
[HttpGet("children")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<DataTypeTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DataTypeTreeItemResponseModel>>> Children(Guid parentId, int skip = 0, int take = 100, bool foldersOnly = false)
public async Task<ActionResult<PagedViewModel<DataTypeTreeItemResponseModel>>> Children(CancellationToken cancellationToken, Guid parentId, int skip = 0, int take = 100, bool foldersOnly = false)
{
RenderFoldersOnly(foldersOnly);
return await GetChildren(parentId, skip, take);
@@ -1,21 +1,20 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Controllers.Tree;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Api.Management.ViewModels.Tree;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.Entities;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Api.Management.Controllers.Tree;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Api.Management.ViewModels.DataType.Item;
using Umbraco.Cms.Web.Common.Authorization;
using Umbraco.Extensions;
namespace Umbraco.Cms.Api.Management.Controllers.DataType.Tree;
[ApiController]
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Tree}/{Constants.UdiEntityType.DataType}")]
[ApiExplorerSettings(GroupName = "Data Type")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDataTypes)]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class DataTypeTreeControllerBase : FolderTreeControllerBase<DataTypeTreeItemResponseModel>
{
private readonly IDataTypeService _dataTypeService;
@@ -28,11 +27,24 @@ public class DataTypeTreeControllerBase : FolderTreeControllerBase<DataTypeTreeI
protected override UmbracoObjectTypes FolderObjectType => UmbracoObjectTypes.DataTypeContainer;
protected override Ordering ItemOrdering
{
get
{
var ordering = Ordering.By(nameof(Infrastructure.Persistence.Dtos.NodeDto.NodeObjectType), Direction.Descending); // We need to override to change direction
ordering.Next = Ordering.By(nameof(Infrastructure.Persistence.Dtos.NodeDto.Text));
return ordering;
}
}
protected override DataTypeTreeItemResponseModel[] MapTreeItemViewModels(Guid? parentId, IEntitySlim[] entities)
{
var dataTypes = _dataTypeService
.GetAllAsync(entities.Select(entity => entity.Key).ToArray()).GetAwaiter().GetResult()
.ToDictionary(contentType => contentType.Id);
Dictionary<int, IDataType> dataTypes = entities.Any()
? _dataTypeService
.GetAllAsync(entities.Select(entity => entity.Key).ToArray()).GetAwaiter().GetResult()
.ToDictionary(contentType => contentType.Id)
: new Dictionary<int, IDataType>();
return entities.Select(entity =>
{
@@ -19,7 +19,7 @@ public class RootDataTypeTreeController : DataTypeTreeControllerBase
[HttpGet("root")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<DataTypeTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DataTypeTreeItemResponseModel>>> Root(int skip = 0, int take = 100, bool foldersOnly = false)
public async Task<ActionResult<PagedViewModel<DataTypeTreeItemResponseModel>>> Root(CancellationToken cancellationToken, int skip = 0, int take = 100, bool foldersOnly = false)
{
RenderFoldersOnly(foldersOnly);
return await GetRoot(skip, take);
@@ -1,4 +1,5 @@
using Asp.Versioning;
using Asp.Versioning;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Factories;
@@ -8,10 +9,12 @@ using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.DataType;
[ApiVersion("1.0")]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDataTypes)]
public class UpdateDataTypeController : DataTypeControllerBase
{
private readonly IDataTypeService _dataTypeService;
@@ -30,7 +33,7 @@ public class UpdateDataTypeController : DataTypeControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Update(Guid id, UpdateDataTypeRequestModel updateDataTypeViewModel)
public async Task<IActionResult> Update(CancellationToken cancellationToken, Guid id, UpdateDataTypeRequestModel updateDataTypeViewModel)
{
IDataType? current = await _dataTypeService.GetAsync(id);
if (current == null)
@@ -25,10 +25,14 @@ public class AllDictionaryController : DictionaryControllerBase
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(PagedViewModel<DictionaryOverviewResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<PagedViewModel<DictionaryOverviewResponseModel>>> All(int skip = 0, int take = 100)
public async Task<ActionResult<PagedViewModel<DictionaryOverviewResponseModel>>> All(
CancellationToken cancellationToken,
string? filter = null,
int skip = 0,
int take = 100)
{
// unfortunately we can't paginate here...we'll have to get all and paginate in memory
IDictionaryItem[] items = (await _dictionaryItemService.GetDescendantsAsync(Constants.System.RootKey)).ToArray();
IDictionaryItem[] items = (await _dictionaryItemService.GetDescendantsAsync(Constants.System.RootKey, filter)).ToArray();
var model = new PagedViewModel<DictionaryOverviewResponseModel>
{
Total = items.Length,
@@ -24,12 +24,12 @@ public class ByKeyDictionaryController : DictionaryControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(DictionaryItemResponseModel), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> ByKey(Guid id)
public async Task<IActionResult> ByKey(CancellationToken cancellationToken, Guid id)
{
IDictionaryItem? dictionary = await _dictionaryItemService.GetAsync(id);
if (dictionary == null)
{
return DictionaryNotFound();
return DictionaryItemNotFound();
}
return Ok(await _dictionaryPresentationFactory.CreateDictionaryItemViewModelAsync(dictionary));
@@ -3,12 +3,12 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Factories;
using Umbraco.Cms.Api.Management.Security.Authorization.Dictionary;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Core.Services;
using Umbraco.Cms.Api.Management.ViewModels.Dictionary;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Security.Authorization;
using Umbraco.Cms.Core.Services.OperationStatus;
using Umbraco.Cms.Web.Common.Authorization;
using Umbraco.Extensions;
@@ -41,11 +41,13 @@ public class CreateDictionaryController : DictionaryControllerBase
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status409Conflict)]
public async Task<IActionResult> Create(CreateDictionaryItemRequestModel createDictionaryItemRequestModel)
public async Task<IActionResult> Create(
CancellationToken cancellationToken,
CreateDictionaryItemRequestModel createDictionaryItemRequestModel)
{
IDictionaryItem created = await _dictionaryPresentationFactory.MapCreateModelToDictionaryItemAsync(createDictionaryItemRequestModel);
AuthorizationResult authorizationResult = await _authorizationService.AuthorizeResourceAsync(
AuthorizationResult authorizationResult = await _authorizationService.AuthorizeResourceAsync(
User,
new DictionaryPermissionResource(createDictionaryItemRequestModel.Translations.Select(t => t.IsoCode)),
AuthorizationPolicies.DictionaryPermissionByResource);
@@ -26,7 +26,7 @@ public class DeleteDictionaryController : DictionaryControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Delete(Guid id)
public async Task<IActionResult> Delete(CancellationToken cancellationToken, Guid id)
{
Attempt<IDictionaryItem?, DictionaryItemOperationStatus> result = await _dictionaryItemService.DeleteAsync(id, CurrentUserKey(_backOfficeSecurityAccessor));
@@ -8,38 +8,39 @@ using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.Dictionary;
[ApiController]
[VersionedApiBackOfficeRoute("dictionary")]
[ApiExplorerSettings(GroupName = "Dictionary")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDictionary)]
[Authorize(Policy = AuthorizationPolicies.TreeAccessDictionary)]
public abstract class DictionaryControllerBase : ManagementApiControllerBase
{
protected IActionResult DictionaryItemOperationStatusResult(DictionaryItemOperationStatus status) =>
status switch
OperationStatusResult(status, problemDetailsBuilder => status switch
{
DictionaryItemOperationStatus.DuplicateItemKey => Conflict(new ProblemDetailsBuilder()
DictionaryItemOperationStatus.DuplicateItemKey => Conflict(problemDetailsBuilder
.WithTitle("Duplicate dictionary item name detected")
.WithDetail("Another dictionary item exists with the same name. Dictionary item names must be unique.")
.Build()),
DictionaryItemOperationStatus.ItemNotFound => DictionaryNotFound(),
DictionaryItemOperationStatus.ParentNotFound => NotFound(new ProblemDetailsBuilder()
.WithTitle("The dictionary item parent could not be found")
.Build()),
DictionaryItemOperationStatus.CancelledByNotification => BadRequest(new ProblemDetailsBuilder()
DictionaryItemOperationStatus.ItemNotFound => DictionaryItemNotFound(problemDetailsBuilder),
DictionaryItemOperationStatus.ParentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The dictionary item parent could not be found")
.Build()),
DictionaryItemOperationStatus.CancelledByNotification => BadRequest(problemDetailsBuilder
.WithTitle("Cancelled by notification")
.WithDetail("A notification handler prevented the dictionary item operation.")
.Build()),
DictionaryItemOperationStatus.InvalidParent => BadRequest(new ProblemDetailsBuilder()
DictionaryItemOperationStatus.InvalidParent => BadRequest(problemDetailsBuilder
.WithTitle("Invalid parent")
.WithDetail("The targeted parent dictionary item is not valid for this dictionary item operation.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, new ProblemDetailsBuilder()
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown dictionary operation status.")
.Build()),
};
});
protected IActionResult DictionaryItemNotFound() => OperationStatusResult(DictionaryItemOperationStatus.ItemNotFound, DictionaryItemNotFound);
protected IActionResult DictionaryNotFound() => NotFound(new ProblemDetailsBuilder()
.WithTitle("The dictionary item could not be found")
.Build());
private IActionResult DictionaryItemNotFound(ProblemDetailsBuilder problemDetailsBuilder)
=> NotFound(problemDetailsBuilder
.WithTitle("The dictionary item could not be found")
.Build());
}
@@ -26,12 +26,12 @@ public class ExportDictionaryController : DictionaryControllerBase
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Export(Guid id, bool includeChildren = false)
public async Task<IActionResult> Export(CancellationToken cancellationToken, Guid id, bool includeChildren = false)
{
IDictionaryItem? dictionaryItem = await _dictionaryItemService.GetAsync(id);
if (dictionaryItem is null)
{
return DictionaryNotFound();
return DictionaryItemNotFound();
}
XElement xml = _entityXmlSerializer.Serialize(dictionaryItem, includeChildren);
@@ -30,7 +30,9 @@ public class ImportDictionaryController : DictionaryControllerBase
[ProducesResponseType(StatusCodes.Status201Created)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Import(ImportDictionaryRequestModel importDictionaryRequestModel)
public async Task<IActionResult> Import(
CancellationToken cancellationToken,
ImportDictionaryRequestModel importDictionaryRequestModel)
{
Attempt<IDictionaryItem?, DictionaryImportOperationStatus> result = await _dictionaryItemImportService
.ImportDictionaryItemFromUdtFileAsync(
@@ -38,26 +40,27 @@ public class ImportDictionaryController : DictionaryControllerBase
importDictionaryRequestModel.Parent?.Id,
CurrentUserKey(_backOfficeSecurityAccessor));
return result.Status switch
{
DictionaryImportOperationStatus.Success => CreatedAtId<ByKeyDictionaryController>(controller => nameof(controller.ByKey), result.Result!.Key),
DictionaryImportOperationStatus.ParentNotFound => NotFound(new ProblemDetailsBuilder()
return result.Success
? CreatedAtId<ByKeyDictionaryController>(controller => nameof(controller.ByKey), result.Result!.Key)
: OperationStatusResult(result.Status, problemDetailsBuilder => result.Status switch
{
DictionaryImportOperationStatus.ParentNotFound => NotFound(problemDetailsBuilder
.WithTitle("The parent dictionary item could not be found.")
.Build()),
DictionaryImportOperationStatus.TemporaryFileNotFound => NotFound(new ProblemDetailsBuilder()
DictionaryImportOperationStatus.TemporaryFileNotFound => NotFound(problemDetailsBuilder
.WithTitle("The temporary file with specified id could not be found.")
.Build()),
DictionaryImportOperationStatus.InvalidFileType => BadRequest(new ProblemDetailsBuilder()
.WithTitle("Invalid file type")
.WithDetail("The dictionary import only supports UDT files.")
.Build()),
DictionaryImportOperationStatus.InvalidFileContent => BadRequest(new ProblemDetailsBuilder()
.WithTitle("Invalid file content")
.WithDetail("The uploaded file could not be read as a valid UDT file.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, new ProblemDetailsBuilder()
.WithTitle("Unknown dictionary import operation status.")
.Build()),
};
DictionaryImportOperationStatus.InvalidFileType => BadRequest(problemDetailsBuilder
.WithTitle("Invalid file type")
.WithDetail("The dictionary import only supports UDT files.")
.Build()),
DictionaryImportOperationStatus.InvalidFileContent => BadRequest(problemDetailsBuilder
.WithTitle("Invalid file content")
.WithDetail("The uploaded file could not be read as a valid UDT file.")
.Build()),
_ => StatusCode(StatusCodes.Status500InternalServerError, problemDetailsBuilder
.WithTitle("Unknown dictionary import operation status.")
.Build()),
});
}
}
@@ -1,15 +1,11 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.Routing;
using Umbraco.Cms.Core;
using Umbraco.Cms.Web.Common.Authorization;
namespace Umbraco.Cms.Api.Management.Controllers.Dictionary.Item;
[ApiController]
[VersionedApiBackOfficeRoute($"{Constants.Web.RoutePath.Item}/dictionary")]
[ApiExplorerSettings(GroupName = "Dictionary")]
[Authorize(Policy = "New" + AuthorizationPolicies.TreeAccessDictionary)]
public class DictionaryItemControllerBase : ManagementApiControllerBase
{
}
@@ -23,8 +23,15 @@ public class ItemDictionaryItemController : DictionaryItemControllerBase
[HttpGet]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<DictionaryItemItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult> Item([FromQuery(Name = "id")] HashSet<Guid> ids)
public async Task<IActionResult> Item(
CancellationToken cancellationToken,
[FromQuery(Name = "id")] HashSet<Guid> ids)
{
if (ids.Count is 0)
{
return Ok(Enumerable.Empty<DictionaryItemItemResponseModel>());
}
IEnumerable<IDictionaryItem> dictionaryItems = await _dictionaryItemService.GetManyAsync(ids.ToArray());
List<DictionaryItemItemResponseModel> responseModels = _mapper.MapEnumerable<IDictionaryItem, DictionaryItemItemResponseModel>(dictionaryItems);
@@ -27,12 +27,15 @@ public class MoveDictionaryController : DictionaryControllerBase
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status400BadRequest)]
[ProducesResponseType(typeof(ProblemDetails), StatusCodes.Status404NotFound)]
public async Task<IActionResult> Move(Guid id, MoveDictionaryRequestModel moveDictionaryRequestModel)
public async Task<IActionResult> Move(
CancellationToken cancellationToken,
Guid id,
MoveDictionaryRequestModel moveDictionaryRequestModel)
{
IDictionaryItem? source = await _dictionaryItemService.GetAsync(id);
if (source == null)
{
return DictionaryNotFound();
return DictionaryItemNotFound();
}
Attempt<IDictionaryItem, DictionaryItemOperationStatus> result = await _dictionaryItemService.MoveAsync(
@@ -0,0 +1,22 @@
using Asp.Versioning;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Umbraco.Cms.Api.Management.ViewModels.Tree;
using Umbraco.Cms.Core.Services;
namespace Umbraco.Cms.Api.Management.Controllers.Dictionary.Tree;
[ApiVersion("1.0")]
public class AncestorsDictionaryTreeController : DictionaryTreeControllerBase
{
public AncestorsDictionaryTreeController(IEntityService entityService, IDictionaryItemService dictionaryItemService)
: base(entityService, dictionaryItemService)
{
}
[HttpGet("ancestors")]
[MapToApiVersion("1.0")]
[ProducesResponseType(typeof(IEnumerable<NamedEntityTreeItemResponseModel>), StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerable<NamedEntityTreeItemResponseModel>>> Ancestors(CancellationToken cancellationToken, Guid descendantId)
=> await GetAncestors(descendantId);
}

Some files were not shown because too many files have changed in this diff Show More