Merge remote-tracking branch 'origin/v13/dev' into v14/dev

# Conflicts:
#	Directory.Build.props
#	build/azure-pipelines.yml
#	src/Umbraco.Cms.Api.Common/DependencyInjection/UmbracoBuilderAuthExtensions.cs
#	src/Umbraco.Cms.Api.Common/OpenApi/SwaggerRouteTemplatePipelineFilter.cs
#	src/Umbraco.Cms.Api.Common/Security/Paths.cs
#	src/Umbraco.Cms.Api.Delivery/Controllers/Security/MemberController.cs
#	src/Umbraco.Cms.Api.Delivery/DependencyInjection/UmbracoBuilderExtensions.cs
#	src/Umbraco.Cms.Api.Delivery/Handlers/InitializeMemberApplicationNotificationHandler.cs
#	src/Umbraco.Cms.Api.Delivery/Handlers/RevokeMemberAuthenticationTokensNotificationHandler.cs
#	src/Umbraco.Cms.Api.Delivery/Security/MemberApplicationManager.cs
#	src/Umbraco.Cms.Api.Delivery/Services/RequestMemberAccessService.cs
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoBackOffice/Default.cshtml
#	src/Umbraco.Cms.StaticAssets/umbraco/UmbracoLogin/Index.cshtml
#	src/Umbraco.Core/Constants-OAuthClaims.cs
#	src/Umbraco.Core/Constants-OAuthClientIds.cs
#	src/Umbraco.Core/DeliveryApi/IApiContentQueryProvider.cs
#	src/Umbraco.Core/DeliveryApi/IApiContentQueryService.cs
#	src/Umbraco.Core/DeliveryApi/IRequestMemberAccessService.cs
#	src/Umbraco.Core/DeliveryApi/NoopRequestMemberAccessService.cs
#	src/Umbraco.Core/Models/DeliveryApi/ProtectedAccess.cs
#	src/Umbraco.Core/Services/ITagService.cs
#	src/Umbraco.Core/Services/UserService.cs
#	src/Umbraco.Infrastructure/Security/IMemberApplicationManager.cs
#	src/Umbraco.Infrastructure/Security/OpenIdDictApplicationManagerBase.cs
#	src/Umbraco.Web.BackOffice/Controllers/BackOfficeController.cs
#	src/Umbraco.Web.BackOffice/Controllers/MediaController.cs
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/HelpPanel/systemInformation.spec.ts
#	tests/Umbraco.Tests.AcceptanceTest/tests/DefaultConfig/Login/login.spec.ts
#	version.json
This commit is contained in:
Bjarke Berg
2023-10-26 09:48:05 +02:00
310 changed files with 10182 additions and 3660 deletions

View File

@@ -19,6 +19,7 @@ We also encourage community members to feel free to comment on others' pull requ
* [What can I contribute?](#what-can-i-contribute)
+ [Making larger changes](#making-larger-changes)
+ [Pull request or package?](#pull-request-or-package)
+ [Unwanted changes](#unwanted-changes)
+ [Ownership and copyright](#ownership-and-copyright)
- [Finding your first issue: Up for grabs](#finding-your-first-issue-up-for-grabs)
- [Making your changes](#making-your-changes)
@@ -69,6 +70,25 @@ If you're unsure about whether your changes belong in the core Umbraco CMS or if
If it doesnt fit in CMS right now, we will likely encourage you to make it into a package instead. A package is a great way to check out popularity of a feature, learn how people use it, validate good usability and fix bugs. Eventually, a package could "graduate" to be included in the CMS.
#### Unwanted changes
While most changes are welcome, there are certain types of changes that are discouraged and might get your pull request refused.
Of course this will depend heavily on the specific change, but please take the following examples in mind.
- **Breaking changes (code and/or behavioral) 💥** - sometimes it can be a bit hard to know if a change is breaking or not. Fortunately, if it relates to code, the build will fail and warn you.
- **Large refactors 🤯** - the larger the refactor, the larger the probability of introducing new bugs/issues.
- **Changes to obsolete code and/or property editors ✍️**
- **Adding new config options 🦾** - while having more flexibility is (most of the times) better, having too many options can also become overwhelming/confusing, especially if there are other (good/simple) ways to achieve it.
- **Whitespace changes 🫥** - while some of our files might not follow the formatting/whitespace rules (mostly old ones), changing several of them in one go would cause major merge conflicts with open pull requests or other work in progress. Do feel free to fix these when you are working on another issue/feature and end up "touching" those files!
- **Adding new extension/helper methods ✋** - keep in mind that more code also means more to maintain, so if a helper is only meaningful for a few, it might not be worth adding it to the core.
While these are only a few examples, it is important to ask yourself these questions before making a pull request:
- How many will benefit from this change?
- Are there other ways to achieve this? And if so, how do they compare?
- How maintainable is the change?
- What would be the effort to test it properly?
- Do the benefits outweigh the risks?
#### Ownership and copyright
It is your responsibility to make sure that you're allowed to share the code you're providing us. For example, you should have permission from your employer or customer to share code.

1
.github/README.md vendored
View File

@@ -4,6 +4,7 @@
[![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)
[![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)

View File

@@ -38,8 +38,8 @@
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="Nerdbank.GitVersioning" Version="3.5.119" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.406" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="Nerdbank.GitVersioning" Version="3.6.133" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.507" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="Umbraco.Code" Version="2.0.0" PrivateAssets="all" IsImplicitlyDefined="true" />
<PackageReference Include="Umbraco.GitVersioning.Extensions" Version="0.2.0" PrivateAssets="all" IsImplicitlyDefined="true" />
</ItemGroup>

View File

@@ -43,7 +43,7 @@ parameters:
default: ' '
variables:
nodeVersion: 18.16.0
nodeVersion: 20
dotnetVersion: 8.x
dotnetIncludePreviewVersions: true
solution: umbraco.sln
@@ -72,6 +72,7 @@ stages:
submodules: true
- task: NodeTool@0
displayName: Use Node.js $(nodeVersion)
retryCountOnTaskFailure: 3
inputs:
versionSpec: $(nodeVersion)
- task: Cache@2
@@ -84,9 +85,9 @@ stages:
path: $(npm_config_cache)
- script: npm ci --no-fund --no-audit --prefer-offline
workingDirectory: src/Umbraco.Web.UI.Client
displayName: Run npm ci
displayName: Run npm ci (Backoffice)
- task: gulp@0
displayName: Run gulp build
displayName: Run gulp build (Backoffice)
inputs:
gulpFile: src/Umbraco.Web.UI.Client/gulpfile.js
targets: coreBuild
@@ -111,29 +112,12 @@ stages:
command: restore
projects: $(solution)
- task: DotNetCoreCLI@2
displayName: Run dotnet build
name: build
displayName: Run dotnet build and generate NuGet packages
inputs:
command: build
projects: $(solution)
arguments: '--configuration $(buildConfiguration) --no-restore -p:ContinuousIntegrationBuild=true'
- script: |
version="$(Build.BuildNumber)"
echo "Version: $version"
major="$(echo $version | cut -d '.' -f 1)"
echo "Major version: $major"
echo "##vso[task.setvariable variable=majorVersion;isOutput=true]$major"
displayName: Set major version
name: determineMajorVersion
- script: dotnet pack $(solution) --configuration $(buildConfiguration) --no-build --property:PackageOutputPath=$(Build.ArtifactStagingDirectory)/nupkg
displayName: Run dotnet pack
- script: |
sha="$(Build.SourceVersion)"
sha=${sha:0:7}
buildnumber="$(Build.BuildNumber)_$(Build.BuildId)_$sha"
echo "##vso[build.updatebuildnumber]$buildnumber"
displayName: Update build number
arguments: '--configuration $(buildConfiguration) --no-restore --property:ContinuousIntegrationBuild=true --property:GeneratePackageOnBuild=true --property:PackageOutputPath=$(Build.ArtifactStagingDirectory)/nupkg'
- task: PublishPipelineArtifact@1
displayName: Publish nupkg
inputs:
@@ -146,11 +130,11 @@ stages:
artifactName: build_output
- stage: Build_Docs
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.buildApiDocs}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.buildApiDocs}}))
displayName: Prepare API Documentation
dependsOn: Build
variables:
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['determineMajorVersion.majorVersion'] ]
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ]
jobs:
# C# API Reference
# - job:
@@ -286,6 +270,8 @@ stages:
- stage: Integration
displayName: Integration Tests
dependsOn: Build
variables:
releaseTestFilter: eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True')
jobs:
# Integration Tests (SQLite)
- job:
@@ -320,7 +306,7 @@ stages:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQLite - $(Agent.OS)
${{ if or( parameters.forceReleaseTestFilter, startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')) }}:
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) ${{parameters.integrationNonReleaseTestFilter}}'
@@ -334,7 +320,7 @@ stages:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQLite - $(Agent.OS)
${{ if or( parameters.forceReleaseTestFilter, startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')) }}:
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}'
@@ -345,7 +331,7 @@ stages:
# Integration Tests (SQL Server)
- job:
timeoutInMinutes: 120
condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.sqlServerIntegrationTests}})
condition: or(eq(stageDependencies.Build.A.outputs['build.NBGV_PublicRelease'], 'True'), ${{parameters.sqlServerIntegrationTests}})
displayName: Integration Tests (SQL Server)
strategy:
matrix:
@@ -385,7 +371,7 @@ stages:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQL Server - $(Agent.OS)
${{ if or( parameters.forceReleaseTestFilter, startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')) }}:
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.integrationNonReleaseTestFilter}}'
@@ -400,7 +386,7 @@ stages:
command: test
projects: '**/*.Tests.Integration.csproj'
testRunTitle: Integration Tests SQL Server - $(Agent.OS)
${{ if or( parameters.forceReleaseTestFilter, startsWith(variables['Build.SourceBranch'], 'refs/heads/release/')) }}:
${{ if or(variables.releaseTestFilter, parameters.forceReleaseTestFilter) }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationReleaseTestFilter}}'
${{ else }}:
arguments: '--configuration $(buildConfiguration) --no-build ${{parameters.nonWindowsIntegrationNonReleaseTestFilter}}'
@@ -457,6 +443,7 @@ stages:
# path: $(Build.SourcesDirectory)/tests/Umbraco.Tests.AcceptanceTest/misc/nupkg
# - task: NodeTool@0
# displayName: Use Node.js $(nodeVersion)
# retryCountOnTaskFailure: 3
# inputs:
# versionSpec: $(nodeVersion)
# - task: Cache@2
@@ -561,7 +548,7 @@ stages:
- Unit
- Integration
# - E2E # TODO: Enable when stable.
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.myGetDeploy}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.myGetDeploy}}))
jobs:
- job:
displayName: Push to pre-release feed
@@ -584,7 +571,7 @@ stages:
dependsOn:
- Deploy_MyGet
- Build_Docs
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.nuGetDeploy}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.nuGetDeploy}}))
jobs:
- job:
displayName: Push to NuGet
@@ -607,12 +594,12 @@ stages:
pool:
vmImage: 'windows-latest' # Apparently AzureFileCopy is windows only :(
variables:
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['determineMajorVersion.majorVersion'] ]
umbracoMajorVersion: $[ stageDependencies.Build.A.outputs['build.NBGV_VersionMajor'] ]
displayName: Upload API Documentation
dependsOn:
- Build
- Deploy_MyGet # Change to "Deploy_Nuget" after release of v14
condition: and(succeeded(), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ${{parameters.uploadApiDocs}}))
condition: and(succeeded(), or(eq(dependencies.Build.outputs['A.build.NBGV_PublicRelease'], 'True'), ${{parameters.uploadApiDocs}}))
jobs:
# - job:
# displayName: Upload C# Docs

View File

@@ -1,5 +1,6 @@
name: Nightly_$(TeamProject)_$(Build.DefinitionName)_$(SourceBranchName)_$(Date:yyyyMMdd)$(Rev:.r)
pr: none
trigger: none
schedules:

View File

@@ -1,4 +1,6 @@
using Microsoft.Extensions.DependencyInjection;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Tokens;
using Umbraco.Cms.Api.Common.Security;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.DependencyInjection;
@@ -50,14 +52,6 @@ public static class UmbracoBuilderAuthExtensions
.RequireProofKeyForCodeExchange()
.AllowRefreshTokenFlow();
// Register the encryption and signing credentials.
// - see https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html
options
// TODO: use actual certificates here, see docs above
.AddDevelopmentEncryptionCertificate()
.AddDevelopmentSigningCertificate()
.DisableAccessTokenEncryption();
// Register the ASP.NET Core host and configure for custom authentication endpoint.
options
.UseAspNetCore()
@@ -79,6 +73,19 @@ public static class UmbracoBuilderAuthExtensions
// and https://learn.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-7.0
// for more information
options.UseDataProtection();
// Register encryption and signing credentials to protect tokens.
// Note that for tokens generated/validated using ASP.NET Core Data Protection,
// a separate key ring is used, distinct from the credentials discussed in
// https://documentation.openiddict.com/configuration/encryption-and-signing-credentials.html
// More details can be found here: https://github.com/openiddict/openiddict-core/issues/1892#issuecomment-1737308506
// "When using ASP.NET Core Data Protection to generate opaque tokens, the signing and encryption credentials
// registered via Add*Key/Certificate() are not used". But since OpenIddict requires the registration of such,
// we can generate random keys per instance without them taking effect.
// - see also https://github.com/openiddict/openiddict-core/issues/1231
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
})
// Register the OpenIddict validation components.

View File

@@ -12,8 +12,8 @@
<PackageReference Include="Asp.Versioning.Mvc" Version="7.0.1" />
<PackageReference Include="Asp.Versioning.Mvc.ApiExplorer" Version="7.0.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="OpenIddict.Abstractions" Version="4.7.0" />
<PackageReference Include="OpenIddict.AspNetCore" Version="4.7.0" />
<PackageReference Include="OpenIddict.Abstractions" Version="4.9.0" />
<PackageReference Include="OpenIddict.AspNetCore" Version="4.9.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,5 +1,6 @@
using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Routing;
using Microsoft.Extensions.DependencyInjection;
using Umbraco.Cms.Api.Common.DependencyInjection;
using Umbraco.Cms.Api.Delivery.Accessors;
@@ -7,6 +8,7 @@ using Umbraco.Cms.Api.Delivery.Configuration;
using Umbraco.Cms.Api.Delivery.Handlers;
using Umbraco.Cms.Api.Delivery.Json;
using Umbraco.Cms.Api.Delivery.Rendering;
using Umbraco.Cms.Api.Delivery.Routing;
using Umbraco.Cms.Api.Delivery.Security;
using Umbraco.Cms.Api.Delivery.Services;
using Umbraco.Cms.Core;
@@ -57,6 +59,9 @@ public static class UmbracoBuilderExtensions
builder.AddNotificationAsyncHandler<MemberDeletedNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
builder.AddNotificationAsyncHandler<AssignedMemberRolesNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
builder.AddNotificationAsyncHandler<RemovedMemberRolesNotification, RevokeMemberAuthenticationTokensNotificationHandler>();
// FIXME: remove this when Delivery API V1 is removed
builder.Services.AddSingleton<MatcherPolicy, DeliveryApiItemsEndpointsMatcherPolicy>();
return builder;
}
}

View File

@@ -0,0 +1,56 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.Routing.Matching;
using Umbraco.Cms.Api.Delivery.Controllers.Content;
using Umbraco.Cms.Api.Delivery.Controllers.Media;
namespace Umbraco.Cms.Api.Delivery.Routing;
// FIXME: remove this when Delivery API V1 is removed
internal sealed class DeliveryApiItemsEndpointsMatcherPolicy : MatcherPolicy, IEndpointSelectorPolicy
{
public override int Order => 100;
public bool AppliesToEndpoints(IReadOnlyList<Endpoint> endpoints)
{
for (var i = 0; i < endpoints.Count; i++)
{
ControllerActionDescriptor? controllerActionDescriptor = endpoints[i].Metadata.GetMetadata<ControllerActionDescriptor>();
if (IsByIdsController(controllerActionDescriptor) || IsByRouteController(controllerActionDescriptor))
{
return true;
}
}
return false;
}
public Task ApplyAsync(HttpContext httpContext, CandidateSet candidates)
{
var hasIdQueryParameter = httpContext.Request.Query.ContainsKey("id");
for (var i = 0; i < candidates.Count; i++)
{
ControllerActionDescriptor? controllerActionDescriptor = candidates[i].Endpoint?.Metadata.GetMetadata<ControllerActionDescriptor>();
if (IsByIdsController(controllerActionDescriptor))
{
candidates.SetValidity(i, hasIdQueryParameter);
}
else if (IsByRouteController(controllerActionDescriptor))
{
candidates.SetValidity(i, hasIdQueryParameter is false);
}
}
return Task.CompletedTask;
}
private static bool IsByIdsController(ControllerActionDescriptor? controllerActionDescriptor)
=> IsControllerType<ByIdsContentApiController>(controllerActionDescriptor) || IsControllerType<ByIdsMediaApiController>(controllerActionDescriptor);
private static bool IsByRouteController(ControllerActionDescriptor? controllerActionDescriptor)
=> IsControllerType<ByRouteContentApiController>(controllerActionDescriptor) || IsControllerType<ByPathMediaApiController>(controllerActionDescriptor);
private static bool IsControllerType<T>(ControllerActionDescriptor? controllerActionDescriptor)
=> controllerActionDescriptor?.MethodInfo.DeclaringType == typeof(T);
}

View File

@@ -49,6 +49,7 @@ public sealed class ImageSharpImageUrlGenerator : IImageUrlGenerator
/// Initializes a new instance of the <see cref="ImageSharpImageUrlGenerator" /> class.
/// </summary>
/// <param name="supportedImageFileTypes">The supported image file types/extensions.</param>
/// <param name="options">The ImageSharp middleware options.</param>
/// <param name="requestAuthorizationUtilities">Contains helpers that allow authorization of image requests.</param>
/// <remarks>
/// This constructor is only used for testing.

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-rc.1.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-rc.2.*" />
</ItemGroup>
<ItemGroup>

View File

@@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-rc.1.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-rc.2.*" />
</ItemGroup>
<ItemGroup>

View File

@@ -22,7 +22,7 @@ internal class SqlServerEFCoreDistributedLockingMechanism<T> : IDistributedLocki
private readonly Lazy<IEFCoreScopeAccessor<T>> _scopeAccessor; // Hooray it's a circular dependency.
/// <summary>
/// Initializes a new instance of the <see cref="SqlServerDistributedLockingMechanism" /> class.
/// Initializes a new instance of the <see cref="SqlServerEFCoreDistributedLockingMechanism{T}"/> class.
/// </summary>
public SqlServerEFCoreDistributedLockingMechanism(
ILogger<SqlServerEFCoreDistributedLockingMechanism<T>> logger,

View File

@@ -10,6 +10,10 @@
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-rc.1.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0-rc.1.*" />
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="4.7.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.0-rc.2.*" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.0-rc.2.*"/>
<PackageReference Include="OpenIddict.EntityFrameworkCore" Version="4.9.0" />
</ItemGroup>
<ItemGroup>

View File

@@ -5,7 +5,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.0-rc.1.*" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="8.0.0-rc.2.*" />
</ItemGroup>
<ItemGroup>

View File

@@ -43,6 +43,8 @@
<Target Name="BuildBelle">
<Exec WorkingDirectory="$(ProjectDir)..\Umbraco.Web.UI.Client\" Command="npm ci --no-fund --no-audit --prefer-offline" />
<Exec WorkingDirectory="$(ProjectDir)..\Umbraco.Web.UI.Client\" Command="npm run build:skip-tests" />
<Exec WorkingDirectory="$(ProjectDir)..\Umbraco.Web.UI.Login\" Command="npm ci --no-fund --no-audit --prefer-offline" />
<Exec WorkingDirectory="$(ProjectDir)..\Umbraco.Web.UI.Login\" Command="npm run build" />
</Target>
<Target Name="BuildBackOffice">

View File

@@ -56,15 +56,6 @@
@await Html.BareMinimumServerVariablesScriptAsync(backOfficeServerVariables)
<script type="text/javascript">
document.angularReady = function (app) {
@await Html.AngularValueExternalLoginInfoScriptAsync(externalLogins, ViewData.GetExternalSignInProviderErrors()!)
@Html.AngularValueResetPasswordCodeInfoScript(ViewData[ViewDataExtensions.TokenPasswordResetCode]!)
}
</script>
@*And finally we can load in our angular app*@
<script type="text/javascript" src="lib/lazyload-js/LazyLoad.min.js"></script>
<script src="@Url.GetUrlWithCacheBust("Application", "BackOffice", null!, hostingEnvironment, umbracoVersion, runtimeMinifier)"></script>

View File

@@ -35,7 +35,7 @@ public abstract class CacheRefresherBase<TNotification> : ICacheRefresher
public abstract string Name { get; }
/// <summary>
/// Gets the <see cref="ICacheRefresherNotificationFactory" /> for <see cref="TNotification" />
/// Gets the <see cref="ICacheRefresherNotificationFactory" /> for <typeparamref name="TNotification"/>.
/// </summary>
protected ICacheRefresherNotificationFactory NotificationFactory { get; }

View File

@@ -14,7 +14,7 @@ public abstract class JsonCacheRefresherBase<TNotification, TJsonPayload> : Cach
where TNotification : CacheRefresherNotification
{
/// <summary>
/// Initializes a new instance of the <see cref="JsonCacheRefresherBase{TInstanceType}" />.
/// Initializes a new instance of the <see cref="JsonCacheRefresherBase{TNotification, TJsonPayload}"/> class.
/// </summary>
protected JsonCacheRefresherBase(
AppCaches appCaches,

View File

@@ -37,7 +37,7 @@ public class EventClearingObservableCollection<TValue> : ObservableCollection<TV
}
/// <summary>
/// Clears all event handlers for the <see cref="CollectionChanged" /> event
/// Clears all event handlers for the <see cref="INotifyCollectionChanged.CollectionChanged" /> event.
/// </summary>
public void ClearCollectionChangedEvents() => _changed = null;

View File

@@ -1,4 +1,4 @@
using System.Collections.ObjectModel;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
namespace Umbraco.Cms.Core.Collections;
@@ -84,7 +84,7 @@ public class ObservableDictionary<TKey, TValue> : ObservableCollection<TValue>,
}
/// <summary>
/// Clears all <see cref="CollectionChanged" /> event handlers
/// Clears all <see cref="INotifyCollectionChanged.CollectionChanged" /> event handlers
/// </summary>
public void ClearCollectionChangedEvents() => _changed = null;

View File

@@ -1,3 +1,4 @@
using System.Reflection;
using Umbraco.Cms.Core.Semver;
namespace Umbraco.Cms.Core.Configuration;

View File

@@ -8,7 +8,7 @@ namespace Umbraco.Cms.Core.Configuration.Models;
[UmbracoOptions(Constants.Configuration.ConfigIndexing)]
public class IndexingSettings
{
private const bool StaticExplicitlyIndexEachNestedProperty = true;
private const bool StaticExplicitlyIndexEachNestedProperty = false;
/// <summary>
/// Gets or sets a value for whether each nested property should have it's own indexed value. Requires a rebuild of indexes when changed.

View File

@@ -17,6 +17,7 @@ public class SecuritySettings
internal const bool StaticHideDisabledUsersInBackOffice = false;
internal const bool StaticAllowPasswordReset = true;
internal const bool StaticAllowEditInvariantFromNonDefault = false;
internal const bool StaticAllowConcurrentLogins = false;
internal const string StaticAuthCookieName = "UMB_UCONTEXT";
internal const string StaticAllowedUserNameCharacters =
@@ -109,4 +110,10 @@ public class SecuritySettings
[Obsolete("Use ContentSettings.AllowEditFromInvariant instead")]
[DefaultValue(StaticAllowEditInvariantFromNonDefault)]
public bool AllowEditInvariantFromNonDefault { get; set; } = StaticAllowEditInvariantFromNonDefault;
/// <summary>
/// Gets or sets a value indicating whether to allow concurrent logins.
/// </summary>
[DefaultValue(StaticAllowConcurrentLogins)]
public bool AllowConcurrentLogins { get; set; } = StaticAllowConcurrentLogins;
}

View File

@@ -53,7 +53,7 @@ public static partial class Constants
public static readonly char[] Comma = { ',' };
/// <summary>
/// Char array containing only &
/// Char array containing only &amp;
/// </summary>
public static readonly char[] Ampersand = { '&' };
@@ -88,7 +88,7 @@ public static partial class Constants
public static readonly char[] QuestionMark = { '?' };
/// <summary>
/// Char array containing ? &
/// Char array containing ? &amp;
/// </summary>
public static readonly char[] QuestionMarkAmpersand = { '?', '&' };

View File

@@ -54,6 +54,7 @@ public static partial class Constants
public const string BackOfficeArea = "UmbracoBackOffice"; // Used for area routes of non-api controllers
public const string BackOfficeApiArea = "UmbracoApi"; // Same name as v8 so all routing remains the same
public const string BackOfficeTreeArea = "UmbracoTrees"; // Same name as v8 so all routing remains the same
public const string BackOfficeLoginArea = "UmbracoLogin"; // Used for area routes of non-api controllers for login
}
public static class Routing

View File

@@ -33,8 +33,8 @@ public class DelegateEqualityComparer<T> : IEqualityComparer<T>
/// <returns>
/// true if the specified objects are equal; otherwise, false.
/// </returns>
/// <param name="x">The first object of type <paramref name="T" /> to compare.</param>
/// <param name="y">The second object of type <paramref name="T" /> to compare.</param>
/// <param name="x">The first object of type <typeparamref name="T"/> to compare.</param>
/// <param name="y">The second object of type <typeparamref name="T"/> to compare.</param>
public bool Equals(T? x, T? y) => _equals.Invoke(x, y);
/// <summary>

View File

@@ -1,4 +1,4 @@
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.DeliveryApi;
namespace Umbraco.Cms.Core.DeliveryApi;
@@ -38,7 +38,7 @@ public interface IApiContentQueryProvider
ProtectedAccess protectedAccess,
bool preview,
int skip,
int take);
int take) => new();
/// <summary>
/// Returns a selector option that can be applied to fetch "all content" (i.e. if a selector option is not present when performing a search).

View File

@@ -22,5 +22,6 @@ public interface IApiContentQueryService
/// <param name="take">The amount of items to take.</param>
/// <param name="protectedAccess">Defines the limitations for querying protected content.</param>
/// <returns>A paged model of item ids that are returned after applying the search queries in an attempt.</returns>
Attempt<PagedModel<Guid>, ApiContentQueryOperationStatus> ExecuteQuery(string? fetch, IEnumerable<string> filters, IEnumerable<string> sorts, ProtectedAccess protectedAccess, int skip, int take);
Attempt<PagedModel<Guid>, ApiContentQueryOperationStatus> ExecuteQuery(string? fetch, IEnumerable<string> filters, IEnumerable<string> sorts, ProtectedAccess protectedAccess, int skip, int take)
=> default;
}

View File

@@ -6,7 +6,7 @@ using Umbraco.Cms.Core.Models.PublishedContent;
namespace Umbraco.Extensions;
/// <summary>
/// Provides extension methods to the <see cref="IFactory" /> class.
/// Provides extension methods to the <see cref="IServiceProvider" /> class.
/// </summary>
public static class ServiceProviderExtensions
{
@@ -28,7 +28,7 @@ public static class ServiceProviderExtensions
/// <summary>
/// Creates an instance of a service, with arguments.
/// </summary>
/// <param name="serviceProvider">The <see cref="IServiceProvider" /></param>
/// <param name="serviceProvider">The <see cref="IServiceProvider" />.</param>
/// <param name="type">The type of the instance.</param>
/// <param name="args">Named arguments.</param>
/// <returns>An instance of the specified type.</returns>

View File

@@ -158,6 +158,12 @@
<key alias="morePublishingOptions">Više opcija za objavljivanje</key>
<key alias="submitChanges">Pošalji</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Mediji je izbrisan</key>
<key alias="move">Mediji premješten</key>
<key alias="copy">Mediji kopiran</key>
<key alias="save">Mediji spremljen</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Pregled za</key>
<key alias="delete">Sadržaj je izbrisan</key>
@@ -2653,7 +2659,7 @@ Da upravljate svojom web lokacijom, jednostavno otvorite Umbraco backoffice i po
</key>
<key alias="learningBaseDescription">
<![CDATA[
<p>Želite savladati Umbraco? Provedite nekoliko minuta učeći neke najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a <a href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener"> Umbraco Learning Base Youtube kanal</a>. Ovdje možete pronaći gomilu video materijala koji pokriva mnoge aspekte Umbraco-a.</p>
<p>Želite savladati Umbraco? Provedite nekoliko minuta učeći neke najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a <a class="btn-link -underline" href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener"> Umbraco Learning Base Youtube kanal</a>. Ovdje možete pronaći gomilu video materijala koji pokriva mnoge aspekte Umbraco-a.</p>
]]>
</key>
<key alias="getStarted">Za početak</key>

View File

@@ -151,6 +151,12 @@
<key alias="confirmActionConfirm">Potvrdit</key>
<key alias="morePublishingOptions">Další možnosti publikování</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Média smazán</key>
<key alias="move">Média přesunut</key>
<key alias="copy">Média zkopírován</key>
<key alias="save">Média uložen</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Zobrazení pro</key>
<key alias="delete">Obsah smazán</key>

File diff suppressed because it is too large Load Diff

View File

@@ -157,6 +157,12 @@
<key alias="morePublishingOptions">Flere publiseringsmuligheder</key>
<key alias="submitChanges">Indsæt</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Brugeren har slettet medie</key>
<key alias="move">Brugeren har flyttet medie</key>
<key alias="copy">Brugeren har kopieret medie</key>
<key alias="save">Brugeren har gemt medie</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">For</key>
<key alias="delete">Brugeren har slettet indholdet</key>
@@ -828,6 +834,7 @@
<key alias="sort">Sortér</key>
<key alias="status">Status</key>
<key alias="submit">Indsend</key>
<key alias="success">Succes</key>
<key alias="type">Type</key>
<key alias="typeToSearch">Skriv for at søge...</key>
<key alias="under">under</key>
@@ -1016,6 +1023,7 @@
<key alias="instruction">Log ind nedenfor</key>
<key alias="signInWith">Log ind med</key>
<key alias="timeout">Din session er udløbet</key>
<key alias="userFailedLogin">Ups! Vi kunne ikke logge dig ind. Tjek at dit brugernavn og adgangskode er korrekt og prøv igen.</key>
<key alias="bottomText">
<![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">umbraco.com</a></p> ]]></key>
<key alias="forgottenPassword">Glemt adgangskode?</key>

View File

@@ -159,6 +159,12 @@
<key alias="morePublishingOptions">Mehr Veröffentlichungs Optionen</key>
<key alias="submitChanges">Senden</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Medie gelöscht</key>
<key alias="move">Medie verschoben</key>
<key alias="copy">Medie kopiert</key>
<key alias="save">Medie gesichert</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Anzeigen als</key>
<key alias="delete">Inhalt gelöscht</key>

View File

@@ -159,6 +159,12 @@
<key alias="morePublishingOptions">More publishing options</key>
<key alias="submitChanges">Submit</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media deleted</key>
<key alias="move">Media moved</key>
<key alias="copy">Media copied</key>
<key alias="save">Media saved</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Viewing for</key>
<key alias="delete">Content deleted</key>
@@ -1069,6 +1075,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="instruction">Log in below</key>
<key alias="signInWith">Sign in with</key>
<key alias="timeout">Session timed out</key>
<key alias="userFailedLogin">Oops! We couldn't log you in. Please check your credentials and try again.</key>
<key alias="bottomText">
<![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">Umbraco.com</a></p> ]]></key>
<key alias="forgottenPassword">Forgotten password?</key>
@@ -2520,6 +2527,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="addImageCaption">Add image caption</key>
<key alias="searchContentTree">Search content tree</key>
<key alias="maxAmount">Maximum amount</key>
<key alias="expandChildItems">Expand child items for</key>
<key alias="openContextNode">Open context node for</key>
</area>
<area alias="references">
<key alias="tabName">References</key>
@@ -2672,7 +2681,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
</key>
<key alias="learningBaseDescription">
<![CDATA[
<p>Want to master Umbraco? Spend a few minutes learning some best practices by visiting <a href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener">the Umbraco Learning Base Youtube channel</a>. Here you can find a bunch of video material covering many aspects of Umbraco.</p>
<p>Want to master Umbraco? Spend a few minutes learning some best practices by visiting <a class="btn-link -underline" href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener">the Umbraco Learning Base Youtube channel</a>. Here you can find a bunch of video material covering many aspects of Umbraco.</p>
]]>
</key>
<key alias="getStarted">To get you started</key>

View File

@@ -160,6 +160,12 @@
<key alias="morePublishingOptions">More publishing options</key>
<key alias="submitChanges">Submit</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media deleted</key>
<key alias="move">Media moved</key>
<key alias="copy">Media copied</key>
<key alias="save">Media saved</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Viewing for</key>
<key alias="delete">Content deleted</key>
@@ -1098,6 +1104,7 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="instruction">Log in below</key>
<key alias="signInWith">Sign in with</key>
<key alias="timeout">Session timed out</key>
<key alias="userFailedLogin">Oops! We couldn't log you in. Please check your credentials and try again.</key>
<key alias="bottomText">
<![CDATA[<p style="text-align:right;">&copy; 2001 - %0% <br /><a href="https://umbraco.com" style="text-decoration: none" target="_blank" rel="noopener">Umbraco.com</a></p> ]]></key>
<key alias="forgottenPassword">Forgotten password?</key>
@@ -1195,6 +1202,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
</body>
</html>
]]> </key>
<key alias="mfaSecurityCodeSubject">Umbraco: Security Code</key>
<key alias="mfaSecurityCodeMessage">Your security code is: %0%</key>
<key alias="2faTitle">One last step</key>
<key alias="2faText">You have enabled 2-factor authentication and must verify your identity.</key>
<key alias="2faMultipleText">Please choose a 2-factor provider</key>
@@ -2624,6 +2633,8 @@ To manage your website, simply open the Umbraco backoffice and start adding cont
<key alias="addImageCaption">Add image caption</key>
<key alias="searchContentTree">Search content tree</key>
<key alias="maxAmount">Maximum amount</key>
<key alias="expandChildItems">Expand child items for</key>
<key alias="openContextNode">Open context node for</key>
</area>
<area alias="references">
<key alias="tabName">References</key>

View File

@@ -150,6 +150,12 @@
<key alias="confirmActionConfirm">Confirmer</key>
<key alias="morePublishingOptions">Options de publication supplémentaires</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media supprimé</key>
<key alias="move">Media déplacé</key>
<key alias="copy">Media copié</key>
<key alias="save">Media sauvegardé</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Aperçu pour</key>
<key alias="delete">Contenu supprimé</key>

View File

@@ -158,6 +158,12 @@
<key alias="morePublishingOptions">Više opcija za objavljivanje</key>
<key alias="submitChanges">Pošalji</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Mediji je obrisan</key>
<key alias="move">Mediji premješten</key>
<key alias="copy">Mediji kopiran</key>
<key alias="save">Mediji spremljen</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Pregled za</key>
<key alias="delete">Sadržaj je obrisan</key>
@@ -2610,7 +2616,7 @@ Da bi upravljali svojom web lokacijom, jednostavno otvorite Umbraco backoffice i
</key>
<key alias="learningBaseDescription">
<![CDATA[
<p>Želite savladati Umbraco? Provedite nekoliko minuta učeći najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a <a href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener"> Umbraco Learning Base Youtube kanal</a>. Ovdje možete pronaći gomilu video materijala koji pokriva mnoge aspekte Umbraco-a.</p>
<p>Želite savladati Umbraco? Provedite nekoliko minuta učeći najbolje prakse gledajući jedan od ovih videozapisa o korištenju Umbraco-a <a class="btn-link -underline" href="https://www.youtube.com/c/UmbracoLearningBase" target="_blank" rel="noopener"> Umbraco Learning Base Youtube kanal</a>. Ovdje možete pronaći gomilu video materijala koji pokriva mnoge aspekte Umbraco-a.</p>
]]>
</key>
<key alias="getStarted">Za početak</key>

View File

@@ -163,6 +163,12 @@
<key alias="submitChanges">Invia</key>
<key alias="submitChangesAndClose">Invia e chiudi</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media eliminato</key>
<key alias="move">Media spostato</key>
<key alias="copy">Media copiato</key>
<key alias="save">Media salvato</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Visualizzazione per</key>
<key alias="delete">Contenuto eliminato</key>

View File

@@ -112,6 +112,12 @@
zijn op de huidige node, tenzij een domein hieronder ook van toepassing is.]]></key>
<key alias="setDomains">Domeinen</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media verwijderd</key>
<key alias="move">Media verplaatst</key>
<key alias="copy">Media gekopieerd</key>
<key alias="save">Media bewaard</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Tonen voor</key>
<key alias="delete">Inhoud verwijderd</key>
@@ -537,6 +543,7 @@
</area>
<area alias="dictionary">
<key alias="noItems">Er zijn geen woordenboekitems.</key>
<key alias="noItemsFound">Er zijn geen woordenboekitems gevonden.</key>
<key alias="createNew">Woordenboekitem aanmaken</key>
</area>
<area alias="dictionaryItem">
@@ -738,7 +745,7 @@
<key alias="history">Geschiedenis</key>
<key alias="icon">Icoon</key>
<key alias="id">Id</key>
<key alias="import">Import</key>
<key alias="import">Importeren</key>
<key alias="excludeFromSubFolders">Alleen in deze map zoeken</key>
<key alias="info">Info</key>
<key alias="innerMargin">Binnenste marge</key>

View File

@@ -67,6 +67,12 @@
<key alias="setLanguageHelp"><![CDATA[Sätt kulturen för noder under aktuell nod,<br /> eller ärv kulturen från föregående noder. Appliceras även<br />
på befintlig nod.]]></key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Media raderat</key>
<key alias="move">Media flyttat</key>
<key alias="copy">Media kopierat</key>
<key alias="save">Media sparat</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Visar för</key>
<key alias="delete">Innehållet raderat</key>
@@ -103,6 +109,12 @@
<key alias="blockHasChanges">Du har gjort ändringar i detta innehåll. Är du säker på att du vill ta bort dem?</key>
<key alias="confirmCancelBlockCreationHeadline">Ignorera skapandet</key>
<key alias="confirmCancelBlockCreationMessage"><![CDATA[Är du säker på att du vill avbryta skapandet?]]></key>
<key alias="areaValidationEntriesShort"><![CDATA[<strong>%0%</strong> måste vara närvarande åtminstone <strong>%2%</strong> time(s).]]></key>
<key alias="areaValidationEntriesExceed"><![CDATA[<strong>%0%</strong> måste maximalt finnas <strong>%3%</strong> time(s).]]></key>
</area>
<area alias="validation">
<key alias="entriesShort"><![CDATA[Minsta %0% poster, kräver <strong>%1%</strong> mer.]]></key>
<key alias="entriesExceed"><![CDATA[Max %0% poster, <strong>%1%</strong> för många.]]></key>
</area>
<area alias="blueprints">
<key alias="createBlueprintFrom"><![CDATA[Skapa en ny innehållsmall för <em>%0%</em>]]></key>
@@ -240,6 +252,60 @@
<key alias="memberIntro">Komma igång</key>
<key alias="formsInstall">Installera Umbraco Forms</key>
</area>
<area alias="visuallyHiddenTexts">
<key alias="goBack">Backa</key>
<key alias="activeListLayout">Aktiv layout:</key>
<key alias="jumpTo">Hoppa till</key>
<key alias="group">grupp</key>
<key alias="passed">godkänd</key>
<key alias="warning">varning</key>
<key alias="failed">underkänd</key>
<key alias="suggestion">förslag</key>
<key alias="checkPassed">Godkänd</key>
<key alias="checkFailed">Underkänd</key>
<key alias="openBackofficeSearch">Öppna sökfunktion (backoffice)</key>
<key alias="openCloseBackofficeHelp">Öppna/stäng hjälpfunktion</key>
<key alias="openCloseBackofficeProfileOptions">Öppna/stäng personliga inställningar</key>
<key alias="assignDomainDescription">Redigera språk och värdnamn för %0%</key>
<key alias="createDescription">Skapa en ny nod under %0%</key>
<key alias="protectDescription">Ändra behörigheter för %0%</key>
<key alias="rightsDescription">Redigera behörigheter för %0%</key>
<key alias="sortDescription">Ändra sortering av %0%</key>
<key alias="createblueprintDescription">Skapa innehållsmall baserad på %0%</key>
<key alias="openContextMenu">Öppna kontextmeny för </key>
<key alias="currentLanguage">Aktuellt språk</key>
<key alias="switchLanguage">Byt språk till</key>
<key alias="createNewFolder">Skapa ny mapp</key>
<key alias="newPartialView">Del av vy</key>
<key alias="newPartialViewMacro">Del av vy (makro)</key>
<key alias="newMember">Medlem</key>
<key alias="newDataType">Datatyp</key>
<key alias="redirectDashboardSearchLabel">Sök bland omdirigeringar</key>
<key alias="userGroupSearchLabel">Sök bland användargrupper</key>
<key alias="userSearchLabel">Sök bland användare</key>
<key alias="createItem">Skapa post</key>
<key alias="create">Skapa</key>
<key alias="edit">Redigera</key>
<key alias="name">Namn</key>
<key alias="addNewRow">Lägg till ny rad</key>
<key alias="tabExpand">Visa fler alternativ</key>
<key alias="searchOverlayTitle">Sök i Umbraco backoffice</key>
<key alias="searchOverlayDescription">Sök efter innehåll, media etc i hela Umbraco.</key>
<key alias="searchInputDescription">När det finns automatförslag, använd pil upp eller ner, eller använd tabbtangenten. Använd enter för att välja.
</key>
<key alias="path">Sökväg:</key>
<key alias="foundIn">Hittad i</key>
<key alias="hasTranslation">Har översättning</key>
<key alias="noTranslation">Saknar översättning</key>
<key alias="dictionaryListCaption">Post i ordlista</key>
<key alias="contextMenuDescription">Välj ett av alternativen för att redigera noden.</key>
<key alias="contextDialogDescription">Utför %0% på noden %1%</key>
<key alias="addImageCaption">Lägg till bildtext</key>
<key alias="searchContentTree">Sök i innehållsträdet</key>
<key alias="maxAmount">Maximalt värde</key>
<key alias="expandChildItems">Visa underliggande noder för</key>
<key alias="openContextNode">Öppna kontext för</key>
</area>
<area alias="prompt">
<key alias="stay">Stanna</key>
<key alias="discardChanges">Ignorera ändringar</key>

View File

@@ -156,6 +156,12 @@
<key alias="morePublishingOptions">Daha fazla yayınlama seçeneği</key>
<key alias="submitChanges">Gönder</key>
</area>
<area alias="auditTrailsMedia">
<key alias="delete">Medya silindi</key>
<key alias="move">Medya taşındı</key>
<key alias="copy">Medya kopyalandı</key>
<key alias="save">Medya kaydedildi</key>
</area>
<area alias="auditTrails">
<key alias="atViewingFor">Görüntüleniyor</key>
<key alias="delete">İçerik silindi</key>

View File

@@ -167,7 +167,7 @@ public static class ExpressionHelper
}
/// <summary>
/// Gets a <see cref="MethodInfo" /> from an <see cref="Expression{Action{T}}" /> provided it refers to a method call.
/// Gets a <see cref="MethodInfo" /> from an <see cref="Expression{TDelegate}"/> of <see cref="Action{T}"/> provided it refers to a method call.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="fromExpression">From expression.</param>
@@ -254,7 +254,7 @@ public static class ExpressionHelper
}
/// <summary>
/// Gets a <see cref="MemberInfo" /> from an <see cref="Expression{Func{T, TReturn}}" /> provided it refers to member
/// Gets a <see cref="MemberInfo" /> from an <see cref="Expression{TDelegate}" /> of <see cref="Func{T, TReturn}"/> provided it refers to member
/// access.
/// </summary>
/// <typeparam name="T"></typeparam>

View File

@@ -320,6 +320,8 @@ public static class ContentExtensions
/// Stores a file.
/// </summary>
/// <param name="content"><see cref="IContentBase" />A content item.</param>
/// <param name="mediaFileManager">The media file manager.</param>
/// <param name="contentTypeBaseServiceProvider">The content type base service provider.</param>
/// <param name="propertyTypeAlias">The property alias.</param>
/// <param name="filename">The name of the file.</param>
/// <param name="filestream">A stream containing the file data.</param>

View File

@@ -11,7 +11,7 @@ using Umbraco.Cms.Core;
namespace Umbraco.Extensions;
/// <summary>
/// Extension methods for Dictionary & ConcurrentDictionary
/// Extension methods for Dictionary &amp; ConcurrentDictionary.
/// </summary>
public static class DictionaryExtensions
{
@@ -254,7 +254,7 @@ public static class DictionaryExtensions
/// <summary>
/// Converts a dictionary object to a query string representation such as:
/// firstname=shannon&lastname=deminick
/// firstname=shannon&amp;lastname=deminick.
/// </summary>
/// <param name="d"></param>
/// <returns></returns>

View File

@@ -353,7 +353,8 @@ public static class EnumerableExtensions
/// <summary>
/// Transforms an enumerable.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="TSource"></typeparam>
/// <typeparam name="TTarget"></typeparam>
/// <param name="source"></param>
/// <param name="transform"></param>
/// <returns></returns>

View File

@@ -1253,7 +1253,7 @@ public static class PublishedContentExtensions
/// </returns>
/// <remarks>
/// This is the same as calling
/// <see cref="Umbraco.Web.PublishedContentExtensions.AncestorOrSelf(IPublishedContent, int)" /> with <c>maxLevel</c>
/// <see cref="AncestorOrSelf(IPublishedContent, int)" /> with <c>maxLevel</c>
/// set to 1.
/// </remarks>
public static IPublishedContent Root(this IPublishedContent content) => content.AncestorOrSelf(1);
@@ -1270,7 +1270,7 @@ public static class PublishedContentExtensions
/// </returns>
/// <remarks>
/// This is the same as calling
/// <see cref="Umbraco.Web.PublishedContentExtensions.AncestorOrSelf{T}(IPublishedContent, int)" /> with
/// <see cref="AncestorOrSelf{T}(IPublishedContent, int)" /> with
/// <c>maxLevel</c> set to 1.
/// </remarks>
public static T? Root<T>(this IPublishedContent content)

View File

@@ -134,27 +134,6 @@ public static class PublishedElementExtensions
#endregion
#region CheckVariation
/// <summary>
/// Method to check if VariationContext culture differs from culture parameter, if so it will update the VariationContext for the PublishedValueFallback.
/// </summary>
/// <param name="publishedValueFallback">The requested PublishedValueFallback.</param>
/// <param name="culture">The requested culture.</param>
/// <param name="segment">The requested segment.</param>
/// <returns></returns>
private static void EventuallyUpdateVariationContext(IPublishedValueFallback publishedValueFallback, string? culture, string? segment)
{
IVariationContextAccessor? variationContextAccessor = publishedValueFallback.VariationContextAccessor;
//If there is a difference in requested culture and the culture that is set in the VariationContext, it will pick wrong localized content.
//This happens for example using links to localized content in a RichText Editor.
if (!string.IsNullOrEmpty(culture) && variationContextAccessor?.VariationContext?.Culture != culture)
{
variationContextAccessor!.VariationContext = new VariationContext(culture, segment);
}
}
#endregion
#region Value<T>
/// <summary>
@@ -195,8 +174,6 @@ public static class PublishedElementExtensions
{
IPublishedProperty? property = content.GetProperty(alias);
EventuallyUpdateVariationContext(publishedValueFallback, culture, segment);
// if we have a property, and it has a value, return that value
if (property != null && property.HasValue(culture, segment))
{

View File

@@ -28,7 +28,7 @@ public static class RequestHandlerSettingsExtension
return RequestHandlerSettings.DefaultCharCollection;
}
/// Merges CharCollection and UserDefinedCharCollection, prioritizing UserDefinedCharCollection.
// Merges CharCollection and UserDefinedCharCollection, prioritizing UserDefinedCharCollection.
return MergeUnique(requestHandlerSettings.UserDefinedCharCollection, RequestHandlerSettings.DefaultCharCollection);
}

View File

@@ -194,7 +194,7 @@ public static class StringExtensions
/// <returns></returns>
/// <remarks>
/// This methods ensures that the resulting URL is structured correctly, that there's only one '?' and that things are
/// delimited properly with '&'
/// delimited properly with '&amp;'
/// </remarks>
public static string AppendQueryStringToUrl(this string url, params string[] queryStrings)
{

View File

@@ -28,7 +28,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -51,7 +51,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -74,7 +74,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -102,7 +102,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -130,7 +130,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -153,7 +153,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -176,7 +176,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>
@@ -203,7 +203,7 @@ public static class XmlExtensions
/// <remarks>
/// <para>
/// If
/// <param name="variables" />
/// <paramref name="variables" />
/// is <c>null</c>, or is empty, or contains only one single
/// value which itself is <c>null</c>, then variables are ignored.
/// </para>

View File

@@ -121,7 +121,6 @@ public sealed class MediaFileManager
/// <param name="content"></param>
/// <param name="mediaFilePath">The file path if a file was found</param>
/// <param name="propertyTypeAlias"></param>
/// <param name="variationContextAccessor"></param>
/// <param name="culture"></param>
/// <param name="segment"></param>
/// <returns></returns>

View File

@@ -22,14 +22,14 @@ public class UniqueMediaPathScheme : IMediaPathScheme
/// <inheritdoc />
/// <remarks>
/// <para>
/// Returning null so that <see cref="MediaFileSystem.DeleteMediaFiles" /> does *not*
/// Returning null so that <see cref="MediaFileManager.DeleteMediaFiles(IEnumerable{string})" /> does *not*
/// delete any directory. This is because the above shortening of the Guid to 8 chars
/// means we're increasing the risk of collision, and we don't want to delete files
/// belonging to other media items.
/// </para>
/// <para>
/// And, at the moment, we cannot delete directory "only if it is empty" because of
/// race conditions. We'd need to implement locks in <see cref="MediaFileSystem" /> for
/// race conditions. We'd need to implement locks in <see cref="MediaFileManager" /> for
/// this.
/// </para>
/// </remarks>

View File

@@ -113,7 +113,7 @@ public class DisposableTimer : DisposableObjectSlim
/// <summary>
/// Disposes resources.
/// </summary>
/// <remarks>Overrides abstract class <see cref="DisposableObject" /> which handles required locking.</remarks>
/// <remarks>Overrides abstract class <see cref="DisposableObjectSlim" /> which handles required locking.</remarks>
protected override void DisposeResources()
{
Stopwatch.Stop();

View File

@@ -141,7 +141,7 @@ public sealed class ProfilingLogger : IProfilingLogger
public void LogTrace(string messageTemplate, params object[] propertyValues)
=> Logger.LogTrace(messageTemplate, propertyValues);
///<inheritdoc>/>
///<inheritdoc/>
public bool IsEnabled(LogLevel logLevel)
{
switch (logLevel)

View File

@@ -15,7 +15,7 @@ public interface IEmbedProvider
/// <summary>
/// A collection of querystring request parameters to append to the API URL
/// </summary>
/// <example>?key=value&key2=value2</example>
/// <example>?key=value&amp;key2=value2</example>
Dictionary<string, string> RequestParams { get; }
string? GetMarkup(string url, int maxWidth = 0, int maxHeight = 0);

View File

@@ -20,9 +20,7 @@ namespace Umbraco.Cms.Core.Models.Blocks
/// <param name="content">The content.</param>
/// <param name="settingsUdi">The settings UDI.</param>
/// <param name="settings">The settings.</param>
/// <param name="rowSpan">The number of rows to span</param>
/// <param name="columnSpan">The number of columns to span</param>
/// <exception cref="System.ArgumentNullException">contentUdi
/// <exception cref="ArgumentNullException">contentUdi
/// or
/// content</exception>
public BlockGridItem(Udi contentUdi, IPublishedElement content, Udi settingsUdi, IPublishedElement settings)
@@ -114,8 +112,6 @@ namespace Umbraco.Cms.Core.Models.Blocks
/// <param name="content">The content.</param>
/// <param name="settingsUdi">The settings UDI.</param>
/// <param name="settings">The settings.</param>
/// <param name="rowSpan">The number of rows to span</param>
/// <param name="columnSpan">The number of columns to span</param>
public BlockGridItem(Udi contentUdi, T content, Udi settingsUdi, IPublishedElement settings)
: base(contentUdi, content, settingsUdi, settings)
{
@@ -147,8 +143,6 @@ namespace Umbraco.Cms.Core.Models.Blocks
/// <param name="content">The content.</param>
/// <param name="settingsUdi">The settings udi.</param>
/// <param name="settings">The settings.</param>
/// <param name="rowSpan">The number of rows to span</param>
/// <param name="columnSpan">The number of columns to span</param>
public BlockGridItem(Udi contentUdi, TContent content, Udi settingsUdi, TSettings settings)
: base(contentUdi, content, settingsUdi, settings)
{

View File

@@ -44,7 +44,8 @@ public interface IBlockReference<TSettings> : IBlockReference
/// <summary>
/// Represents a data item reference with content and settings for a Block editor implementation.
/// </summary>
/// <typeparam name="TSettings">The type of the content.</typeparam>
/// <typeparam name="TContent">The type of the content.</typeparam>
/// <typeparam name="TSettings">The type of the settings.</typeparam>
public interface IBlockReference<TContent, TSettings> : IBlockReference<TSettings>
{
/// <summary>

View File

@@ -59,6 +59,7 @@ public static class ContentRepositoryExtensions
/// </summary>
/// <param name="content"></param>
/// <param name="date"></param>
/// <param name="publishing"></param>
/// <remarks>
/// This is so that in an operation where (for example) 2 languages are updates like french and english, it is possible
/// that

View File

@@ -182,7 +182,6 @@ public sealed class CultureImpact
/// </summary>
/// <param name="culture">The culture code.</param>
/// <param name="isDefault">A value indicating whether the culture is the default culture.</param>
/// <param name="allowEditInvariantFromNonDefault">A value indicating if publishing invariant properties from non-default language.</param>
[Obsolete("Use ICultureImpactService instead.")]
public static CultureImpact Explicit(string? culture, bool isDefault)
{
@@ -211,7 +210,6 @@ public sealed class CultureImpact
/// <param name="culture">The culture code.</param>
/// <param name="isDefault">A value indicating whether the culture is the default culture.</param>
/// <param name="content">The content item.</param>
/// <param name="allowEditInvariantFromNonDefault">A value indicating if publishing invariant properties from non-default language.</param>
/// <remarks>
/// <para>Validates that the culture is compatible with the variation.</para>
/// </remarks>

View File

@@ -10,6 +10,7 @@ public interface IMediaUrlGenerator
/// </summary>
/// <param name="propertyEditorAlias">The property editor alias</param>
/// <param name="value">The value of the property</param>
/// <param name="mediaPath">The media path</param>
/// <returns>
/// True if a media path was returned
/// </returns>

View File

@@ -58,7 +58,7 @@ public class Media : ContentBase, IMedia
/// <summary>
/// Changes the <see cref="IMediaType" /> for the current Media object
/// </summary>
/// <param name="contentType">New MediaType for this Media</param>
/// <param name="mediaType">New MediaType for this Media</param>
/// <remarks>Leaves PropertyTypes intact after change</remarks>
internal void ChangeContentType(IMediaType mediaType) => ChangeContentType(mediaType, false);
@@ -66,7 +66,7 @@ public class Media : ContentBase, IMedia
/// Changes the <see cref="IMediaType" /> for the current Media object and removes PropertyTypes,
/// which are not part of the new MediaType.
/// </summary>
/// <param name="contentType">New MediaType for this Media</param>
/// <param name="mediaType">New MediaType for this Media</param>
/// <param name="clearProperties">Boolean indicating whether to clear PropertyTypes upon change</param>
internal void ChangeContentType(IMediaType mediaType, bool clearProperties)
{

View File

@@ -3,7 +3,7 @@ using Umbraco.Cms.Core.Models.Entities;
namespace Umbraco.Cms.Core.Models.Membership;
/// <summary>
/// Represents an <see cref="IContent" /> -> user group & permission key value pair collection
/// Represents an <see cref="IContent" /> -> user group &amp; permission key value pair collection
/// </summary>
/// <remarks>
/// This implements <see cref="IEntity" /> purely so it can be used with the repository layer which is why it's

View File

@@ -1,7 +1,7 @@
namespace Umbraco.Cms.Core.Models.Membership;
/// <summary>
/// Represents an entity -&gt; user group & permission key value pair collection
/// Represents an entity -&gt; user group &amp; permission key value pair collection
/// </summary>
public class EntityPermissionSet
{
@@ -20,7 +20,7 @@ public class EntityPermissionSet
public virtual int EntityId { get; }
/// <summary>
/// The key/value pairs of user group id & single permission
/// The key/value pairs of user group id &amp; single permission
/// </summary>
public EntityPermissionCollection PermissionsSet { get; }

View File

@@ -5,7 +5,6 @@ namespace Umbraco.Cms.Core.Models;
/// <summary>
/// Represents a paged result for a model collection
/// </summary>
/// <typeparam name="T"></typeparam>
[DataContract(Name = "pagedCollection", Namespace = "")]
public abstract class PagedResult
{

View File

@@ -3,7 +3,7 @@ using Umbraco.Cms.Core.Cache;
namespace Umbraco.Cms.Core.Models.PublishedContent;
/// <summary>
/// Implements <see cref="IVariationContextAccessor" /> on top of <see cref="IHttpContextAccessor" />.
/// Implements <see cref="IVariationContextAccessor" /> on top of <see cref="IRequestCache" />.
/// </summary>
public class HttpContextVariationContextAccessor : IVariationContextAccessor
{

View File

@@ -5,6 +5,7 @@ namespace Umbraco.Cms.Core.Models.PublishedContent;
/// </summary>
public interface IPublishedValueFallback
{
[Obsolete("Scheduled for removal in v14")]
/// <summary>
/// VariationContextAccessor that is not required to be implemented, therefore throws NotImplementedException as default.
/// </summary>

View File

@@ -20,6 +20,7 @@ public class PublishedValueFallback : IPublishedValueFallback
_variationContextAccessor = variationContextAccessor;
}
[Obsolete("Scheduled for removal in v14")]
public IVariationContextAccessor VariationContextAccessor { get { return _variationContextAccessor; } }
/// <inheritdoc />

View File

@@ -6,7 +6,9 @@ namespace Umbraco.Cms.Core.Models;
/// Represents a range with a minimum and maximum value.
/// </summary>
/// <typeparam name="T">The type of the minimum and maximum values.</typeparam>
/// <seealso cref="IEquatable{Range{T}}" />
/// <remarks>
/// See also <see cref="IEquatable{T}"/> of <see cref="Range{T}"/>
/// </remarks>
public class Range<T> : IEquatable<Range<T>>
where T : IComparable<T>
{

View File

@@ -0,0 +1,15 @@
namespace Umbraco.Cms.Core.Models;
/// <summary>
/// Option to set the color of a uui-button element.
/// </summary>
/// <remarks>
/// See the UUI documentation for more details: https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors.
/// </remarks>
public enum UuiButtonColor
{
Default,
Positive,
Warning,
Danger
}

View File

@@ -0,0 +1,16 @@
namespace Umbraco.Cms.Core.Models;
/// <summary>
/// Option to set the look of a uui-button element.
/// </summary>
/// <remarks>
/// See the UUI documentation for more details: https://uui.umbraco.com/?path=/story/uui-button--looks-and-colors.
/// </remarks>
public enum UuiButtonLook
{
Default,
Primary,
Secondary,
Outline,
Placeholder
}

View File

@@ -24,7 +24,6 @@ public sealed class ContentPublishedNotification : EnumerableObjectNotification<
public ContentPublishedNotification(IEnumerable<IContent> target, EventMessages messages, bool includeDescendants)
: base(target, messages) => IncludeDescendants = includeDescendants;
/// </summary>
public IEnumerable<IContent> PublishedEntities => Target;
public bool IncludeDescendants { get; }

View File

@@ -3,7 +3,7 @@ using System.Text;
namespace Umbraco.Cms.Core.Notifications;
/// <summary>
/// Contains event data for the <see cref="ModelBindingException" /> event.
/// Contains event data for the <see cref="T:Umbraco.Cms.Web.Common.ModelBinders.ModelBindingException" /> event.
/// </summary>
public class ModelBindingErrorNotification : INotification
{

View File

@@ -1,10 +1,10 @@
namespace Umbraco.Cms.Core.Notifications;
/// <summary>
/// Notification that occurs at the very end of the Umbraco boot process (after all <see cref="IComponent" />s are
/// Notification that occurs at the very end of the Umbraco boot process (after all <see cref="Composing.IComponent" />s are
/// initialized).
/// </summary>
/// <seealso cref="Umbraco.Cms.Core.Notifications.IUmbracoApplicationLifetimeNotification" />
/// <seealso cref="IUmbracoApplicationLifetimeNotification" />
public class UmbracoApplicationStartingNotification : IUmbracoApplicationLifetimeNotification
{
/// <summary>

View File

@@ -2,9 +2,9 @@ namespace Umbraco.Cms.Core.Notifications;
/// <summary>
/// Notification that occurs when Umbraco is shutting down (after all <see cref="IComponent" />s are terminated).
/// Notification that occurs when Umbraco is shutting down (after all <see cref="Composing.IComponent" />s are terminated).
/// </summary>
/// <seealso cref="Umbraco.Cms.Core.Notifications.IUmbracoApplicationLifetimeNotification" />
/// <seealso cref="IUmbracoApplicationLifetimeNotification" />
public class UmbracoApplicationStoppingNotification : IUmbracoApplicationLifetimeNotification
{
/// <summary>

View File

@@ -22,7 +22,7 @@ public interface IPackageInstallation
/// <summary>
/// Reads the package xml and returns the <see cref="CompiledPackage" /> model
/// </summary>
/// <param name="packageFile"></param>
/// <param name="packageXmlFile"></param>
/// <returns></returns>
CompiledPackage ReadPackage(XDocument? packageXmlFile);
}

View File

@@ -3,7 +3,7 @@ using Umbraco.Cms.Core.Models;
namespace Umbraco.Cms.Core.Persistence.Repositories;
/// <summary>
/// Represents a repository for <see cref="ICacheInstruction" /> entities.
/// Represents a repository for <see cref="CacheInstruction" /> entities.
/// </summary>
public interface ICacheInstructionRepository : IRepository
{

View File

@@ -36,9 +36,8 @@ public interface IDocumentRepository : IContentRepository<int, IContent>, IReadR
/// Gets <see cref="IContent" /> objects having an expiration date before (lower than, or equal to) a specified date.
/// </summary>
/// <remarks>
/// The content returned from this method may be culture variant, in which case the resulting
/// <see cref="IContent.ContentSchedule" /> should be queried
/// for which culture(s) have been scheduled.
/// The content returned from this method may be culture variant, in which case you can use
/// <see cref="Umbraco.Extensions.ContentExtensions.GetStatus(IContent, ContentScheduleCollection, string?)" /> to get the status for a specific culture.
/// </remarks>
IEnumerable<IContent> GetContentForExpiration(DateTime date);
@@ -46,9 +45,8 @@ public interface IDocumentRepository : IContentRepository<int, IContent>, IReadR
/// Gets <see cref="IContent" /> objects having a release date before (lower than, or equal to) a specified date.
/// </summary>
/// <remarks>
/// The content returned from this method may be culture variant, in which case the resulting
/// <see cref="IContent.ContentSchedule" /> should be queried
/// for which culture(s) have been scheduled.
/// The content returned from this method may be culture variant, in which case you can use
/// <see cref="Umbraco.Extensions.ContentExtensions.GetStatus(IContent, ContentScheduleCollection, string?)" /> to get the status for a specific culture.
/// </remarks>
IEnumerable<IContent> GetContentForRelease(DateTime date);

View File

@@ -5,7 +5,7 @@ namespace Umbraco.Cms.Core.PropertyEditors;
/// <summary>
/// Provides a default implementation for
/// <see ref="IPropertyIndexValueFactory">, returning a single field to index containing the property value.
/// <see ref="IPropertyIndexValueFactory" />, returning a single field to index containing the property value.
/// </summary>
public class DefaultPropertyIndexValueFactory : IPropertyIndexValueFactory
{

View File

@@ -17,7 +17,7 @@ public class VoidEditor : DataEditor
/// Initializes a new instance of the <see cref="VoidEditor" /> class.
/// </summary>
/// <param name="aliasSuffix">An optional alias suffix.</param>
/// <param name="loggerFactory">A logger factory.</param>
/// <param name="dataValueEditorFactory">A data value editor factory.</param>
/// <remarks>
/// The default alias of the editor is "Umbraco.Void". When a suffix is provided,
/// it is appended to the alias. Eg if the suffix is "Foo" the alias is "Umbraco.Void.Foo".
@@ -39,7 +39,7 @@ public class VoidEditor : DataEditor
/// <summary>
/// Initializes a new instance of the <see cref="VoidEditor" /> class.
/// </summary>
/// <param name="loggerFactory">A logger factory.</param>
/// <param name="dataValueEditorFactory">A data value editor factory.</param>
/// <remarks>The alias of the editor is "Umbraco.Void".</remarks>
public VoidEditor(
IDataValueEditorFactory dataValueEditorFactory)

View File

@@ -19,7 +19,7 @@ public interface IPublishedContentCache : IPublishedCache
/// </para>
/// <para>
/// If
/// <param name="hideTopLevelNode" />
/// <paramref name="hideTopLevelNode" />
/// is <c>null</c> then the settings value is used.
/// </para>
/// <para>The value of <paramref name="preview" /> overrides defaults.</para>
@@ -40,7 +40,7 @@ public interface IPublishedContentCache : IPublishedCache
/// </para>
/// <para>
/// If
/// <param name="hideTopLevelNode" />
/// <paramref name="hideTopLevelNode" />
/// is <c>null</c> then the settings value is used.
/// </para>
/// <para>Considers published or unpublished content depending on defaults.</para>

View File

@@ -47,7 +47,6 @@ public class DefaultUrlProvider : IUrlProvider
/// <summary>
/// Gets the other URLs of a published content.
/// </summary>
/// <param name="umbracoContextAccessor">The Umbraco context.</param>
/// <param name="id">The published content id.</param>
/// <param name="current">The current absolute URL.</param>
/// <returns>The other URLs for the published content.</returns>

View File

@@ -1,5 +1,6 @@
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.Routing;
@@ -101,7 +102,7 @@ public interface IPublishedRequest
/// This flag is based on previous Umbraco versions but it is not clear how this flag can be set by developers
/// since
/// collission checking only occurs in the back office which is launched by
/// <see cref="IPublishedRouter.TryRouteRequestAsync(IPublishedRequestBuilder)" />
/// <see cref="PublishedRouter.TryRouteRequest(IPublishedRequestBuilder)" />
/// for which events do not execute.
/// </para>
/// <para>

View File

@@ -2,6 +2,7 @@ using System.Globalization;
using System.Net;
using Umbraco.Cms.Core.Models;
using Umbraco.Cms.Core.Models.PublishedContent;
using Umbraco.Extensions;
namespace Umbraco.Cms.Core.Routing;
@@ -162,7 +163,7 @@ public interface IPublishedRequestBuilder
/// This flag is based on previous Umbraco versions but it is not clear how this flag can be set by developers
/// since
/// collission checking only occurs in the back office which is launched by
/// <see cref="IPublishedRouter.TryRouteRequestAsync(IPublishedRequestBuilder)" />
/// <see cref="PublishedRouter.TryRouteRequest(IPublishedRequestBuilder)" />
/// for which events do not execute.
/// </para>
/// <para>

View File

@@ -26,6 +26,7 @@ public interface IPublishedRouter
/// Updates the request to use the specified <see cref="IPublishedContent" /> item, or NULL
/// </summary>
/// <param name="request">The request.</param>
/// <param name="publishedContent">The published content.</param>
/// <remarks>
/// <returns>
/// A new <see cref="IPublishedRequest" /> based on values from the original <see cref="IPublishedRequest" />

View File

@@ -21,7 +21,6 @@ namespace Umbraco.Cms.Core.Routing
/// <param name="urlProviders">The list of URL providers.</param>
/// <param name="mediaUrlProviders">The list of media URL providers.</param>
/// <param name="variationContextAccessor">The current variation accessor.</param>
/// <param name="propertyEditorCollection"></param>
public UrlProvider(IUmbracoContextAccessor umbracoContextAccessor, IOptions<WebRoutingSettings> routingSettings, UrlProviderCollection urlProviders, MediaUrlProviderCollection mediaUrlProviders, IVariationContextAccessor variationContextAccessor)
{
_umbracoContextAccessor = umbracoContextAccessor ?? throw new ArgumentNullException(nameof(umbracoContextAccessor));

View File

@@ -6,6 +6,7 @@ public interface ILockingMechanism : IDisposable
/// Read-locks some lock objects lazily.
/// </summary>
/// <param name="instanceId">Instance id of the scope who is requesting the lock</param>
/// <param name="timeout">Timeout for the lock</param>
/// <param name="lockIds">Array of lock object identifiers.</param>
void ReadLock(Guid instanceId, TimeSpan? timeout = null, params int[] lockIds);
@@ -15,6 +16,7 @@ public interface ILockingMechanism : IDisposable
/// Write-locks some lock objects lazily.
/// </summary>
/// <param name="instanceId">Instance id of the scope who is requesting the lock</param>
/// <param name="timeout">Timeout for the lock</param>
/// <param name="lockIds">Array of object identifiers.</param>
void WriteLock(Guid instanceId, TimeSpan? timeout = null, params int[] lockIds);
@@ -24,6 +26,7 @@ public interface ILockingMechanism : IDisposable
/// Eagerly acquires a read-lock
/// </summary>
/// <param name="instanceId"></param>
/// <param name="timeout">Timeout for the lock</param>
/// <param name="lockIds"></param>
void EagerReadLock(Guid instanceId, TimeSpan? timeout = null, params int[] lockIds);
@@ -33,6 +36,7 @@ public interface ILockingMechanism : IDisposable
/// Eagerly acquires a write-lock
/// </summary>
/// <param name="instanceId"></param>
/// <param name="timeout">Timeout for the lock</param>
/// <param name="lockIds"></param>
void EagerWriteLock(Guid instanceId, TimeSpan? timeout = null, params int[] lockIds);

View File

@@ -151,8 +151,6 @@ public class ContentPermissions
/// </summary>
/// <param name="nodeId"></param>
/// <param name="user"></param>
/// <param name="userService"></param>
/// <param name="entityService"></param>
/// <param name="entity">The <see cref="IUmbracoEntity" /> item resolved if one was found for the id</param>
/// <param name="permissionsToCheck"></param>
/// <returns></returns>
@@ -218,9 +216,6 @@ public class ContentPermissions
/// </summary>
/// <param name="nodeId"></param>
/// <param name="user"></param>
/// <param name="userService"></param>
/// <param name="contentService"></param>
/// <param name="entityService"></param>
/// <param name="contentItem">The <see cref="IContent" /> item resolved if one was found for the id</param>
/// <param name="permissionsToCheck"></param>
/// <returns></returns>

View File

@@ -5,7 +5,6 @@ namespace Umbraco.Cms.Core.Security;
/// <summary>
/// An external login provider linked to a user
/// </summary>
/// <typeparam name="TKey">The PK type for the user</typeparam>
public interface IIdentityUserLogin : IEntity, IRememberBeingDirty
{
/// <summary>

View File

@@ -218,10 +218,9 @@ public class LegacyPasswordSecurity
}
/// <summary>
/// Return the hash algorithm to use based on the <see cref="IPasswordConfiguration" />
/// Return the hash algorithm to use based on the provided <paramref name="algorithm"/>.
/// </summary>
/// <param name="algorithm">The hashing algorithm name.</param>
/// <param name="password"></param>
/// <returns></returns>
private HashAlgorithm GetHashAlgorithm(string algorithm)
{

View File

@@ -207,7 +207,7 @@ public class ContentService : RepositoryService, IContentService
/// <summary>
/// Used to bulk update the permissions set for a content item. This will replace all permissions
/// assigned to an entity with a list of user id & permission pairs.
/// assigned to an entity with a list of user id &amp; permission pairs.
/// </summary>
/// <param name="permissionSet"></param>
public void SetPermissions(EntityPermissionSet permissionSet)

View File

@@ -36,7 +36,9 @@ public interface ICacheInstructionService
/// <summary>
/// Processes and then prunes pending database cache instructions.
/// </summary>
/// <param name="released">Flag indicating if process is shutting now and operations should exit.</param>
/// <param name="cacheRefreshers">Cache refreshers.</param>
/// <param name="serverRole">Server role.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <param name="localIdentity">Local identity of the executing AppDomain.</param>
/// <param name="lastPruned">Date of last prune operation.</param>
/// <param name="lastId">Id of the latest processed instruction</param>

View File

@@ -76,12 +76,10 @@ public interface IContentService : IContentServiceBase<IContent>
/// </summary>
IContent? GetById(int id);
new
/// <summary>
/// Gets a document.
/// </summary>
IContent? GetById(Guid key);
new IContent? GetById(Guid key);
/// <summary>
/// Gets publish/unpublish schedule for a content node.
@@ -167,9 +165,8 @@ public interface IContentService : IContentServiceBase<IContent>
/// </summary>
/// <returns>An Enumerable list of <see cref="IContent" /> objects</returns>
/// <remarks>
/// The content returned from this method may be culture variant, in which case the resulting
/// <see cref="IContent.ContentSchedule" /> should be queried
/// for which culture(s) have been scheduled.
/// The content returned from this method may be culture variant, in which case you can use
/// <see cref="Umbraco.Extensions.ContentExtensions.GetStatus(IContent, ContentScheduleCollection, string?)" /> to get the status for a specific culture.
/// </remarks>
IEnumerable<IContent> GetContentForExpiration(DateTime date);
@@ -178,9 +175,8 @@ public interface IContentService : IContentServiceBase<IContent>
/// </summary>
/// <returns>An Enumerable list of <see cref="IContent" /> objects</returns>
/// <remarks>
/// The content returned from this method may be culture variant, in which case the resulting
/// <see cref="IContent.ContentSchedule" /> should be queried
/// for which culture(s) have been scheduled.
/// The content returned from this method may be culture variant, in which case you can use
/// <see cref="Umbraco.Extensions.ContentExtensions.GetStatus(IContent, ContentScheduleCollection, string?)" /> to get the status for a specific culture.
/// </remarks>
IEnumerable<IContent> GetContentForRelease(DateTime date);

View File

@@ -35,7 +35,7 @@ public interface IExternalLoginWithKeyService : IService
/// <summary>
/// Saves the external login tokens associated with the user
/// </summary>
/// <param name="userId">
/// <param name="userOrMemberKey">
/// The user or member key associated with the logins
/// </param>
/// <param name="tokens"></param>

View File

@@ -90,9 +90,6 @@ public interface IMediaService : IContentServiceBase<IMedia>
/// <param name="pageIndex">Page number</param>
/// <param name="pageSize">Page size</param>
/// <param name="totalRecords">Total records query would return without paging</param>
/// <param name="orderBy">Field to order by</param>
/// <param name="orderDirection">Direction to order by</param>
/// <param name="orderBySystemField">Flag to indicate when ordering by system field</param>
/// <param name="filter"></param>
/// <param name="ordering"></param>
/// <returns>An Enumerable list of <see cref="IContent" /> objects</returns>

View File

@@ -178,7 +178,7 @@ public interface IMemberService : IMembershipMemberService
/// </summary>
/// <remarks>If no alias is supplied then the count for all Member will be returned</remarks>
/// <param name="memberTypeAlias">Optional alias for the MemberType when counting number of Members</param>
/// <returns><see cref="System.int" /> with number of Members</returns>
/// <returns><see cref="int" /> with number of Members</returns>
int Count(string? memberTypeAlias = null);
/// <summary>
@@ -204,7 +204,7 @@ public interface IMemberService : IMembershipMemberService
/// <summary>
/// Gets a Member by its integer id
/// </summary>
/// <param name="id"><see cref="System.int" /> Id</param>
/// <param name="id"><see cref="int" /> Id</param>
/// <returns>
/// <see cref="IMember" />
/// </returns>
@@ -287,7 +287,7 @@ public interface IMemberService : IMembershipMemberService
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.string" /> Value to match</param>
/// <param name="value"><see cref="string" /> Value to match</param>
/// <param name="matchType">
/// The type of match to make as <see cref="StringPropertyMatchType" />. Default is
/// <see cref="StringPropertyMatchType.Exact" />
@@ -304,7 +304,7 @@ public interface IMemberService : IMembershipMemberService
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.int" /> Value to match</param>
/// <param name="value"><see cref="int" /> Value to match</param>
/// <param name="matchType">
/// The type of match to make as <see cref="StringPropertyMatchType" />. Default is
/// <see cref="StringPropertyMatchType.Exact" />
@@ -318,7 +318,7 @@ public interface IMemberService : IMembershipMemberService
/// Gets a list of Members based on a property search
/// </summary>
/// <param name="propertyTypeAlias">Alias of the PropertyType to search for</param>
/// <param name="value"><see cref="System.bool" /> Value to match</param>
/// <param name="value"><see cref="bool" /> Value to match</param>
/// <returns>
/// <see cref="IEnumerable{IMember}" />
/// </returns>

View File

@@ -48,7 +48,7 @@ public interface IMembershipMemberService<T> : IService
/// but that is how MS have made theirs so we'll follow that principal.
/// </remarks>
/// <param name="countType"><see cref="MemberCountType" /> to count by</param>
/// <returns><see cref="System.int" /> with number of Members or Users for passed in type</returns>
/// <returns><see cref="int" /> with number of Members or Users for passed in type</returns>
int GetCount(MemberCountType countType);
/// <summary>

View File

@@ -12,14 +12,14 @@ public interface IPackagingService : IService
/// <summary>
/// Returns a <see cref="CompiledPackage" /> result from an umbraco package file (zip)
/// </summary>
/// <param name="packageFile"></param>
/// <param name="packageXml"></param>
/// <returns></returns>
CompiledPackage GetCompiledPackageInfo(XDocument packageXml);
/// <summary>
/// Installs the data, entities, objects contained in an umbraco package file (zip)
/// </summary>
/// <param name="packageFile"></param>
/// <param name="packageXmlFile"></param>
/// <param name="userId"></param>
InstallationSummary InstallCompiledPackageData(FileInfo packageXmlFile, int userId = Constants.Security.SuperUserId);

View File

@@ -168,7 +168,8 @@ public interface IRelationService : IService
/// <param name="relationTypeId"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalChildren"></param>
/// <param name="totalRecords"></param>
/// <param name="ordering"></param>
/// <returns></returns>
IEnumerable<IRelation> GetPagedByRelationTypeId(int relationTypeId, long pageIndex, int pageSize, out long totalRecords, Ordering? ordering = null);/// <summary>
@@ -225,6 +226,7 @@ public interface IRelationService : IService
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalChildren"></param>
/// <param name="entityTypes"></param>
/// <returns>An enumerable list of <see cref="IUmbracoEntity" /></returns>
IEnumerable<IUmbracoEntity> GetPagedParentEntitiesByChildId(int id, long pageIndex, int pageSize, out long totalChildren, params UmbracoObjectTypes[] entityTypes);
@@ -235,6 +237,7 @@ public interface IRelationService : IService
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="totalChildren"></param>
/// <param name="entityTypes"></param>
/// <returns>An enumerable list of <see cref="IUmbracoEntity" /></returns>
IEnumerable<IUmbracoEntity> GetPagedChildEntitiesByParentId(int id, long pageIndex, int pageSize, out long totalChildren, params UmbracoObjectTypes[] entityTypes);

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