V17: Update to dotnet 10 (#20007)
* Update dotnet version * Update packages * Fix System.Linq.Async breaking change * Fix #19867 * Update template.json * Set LTS version to 17 * Update dockerfile
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net9.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Company>Umbraco HQ</Company>
|
<Company>Umbraco HQ</Company>
|
||||||
<Authors>Umbraco</Authors>
|
<Authors>Umbraco</Authors>
|
||||||
<Copyright>Copyright © Umbraco $([System.DateTime]::Today.ToString('yyyy'))</Copyright>
|
<Copyright>Copyright © Umbraco $([System.DateTime]::Today.ToString('yyyy'))</Copyright>
|
||||||
|
|||||||
@@ -7,37 +7,38 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.7.115" />
|
<GlobalPackageReference Include="Nerdbank.GitVersioning" Version="3.7.115" />
|
||||||
<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
<GlobalPackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
||||||
<GlobalPackageReference Include="Umbraco.Code" Version="2.3.0" />
|
<GlobalPackageReference Include="Umbraco.Code" Version="2.4.0" />
|
||||||
<GlobalPackageReference Include="Umbraco.GitVersioning.Extensions" Version="0.2.0" />
|
<GlobalPackageReference Include="Umbraco.GitVersioning.Extensions" Version="0.2.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- Microsoft packages -->
|
<!-- Microsoft packages -->
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.13.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.13.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.13.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.13.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.13.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Data.Sqlite" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.FileProviders.Embedded" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.FileProviders.Physical" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Identity.Core" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Identity.Stores" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Options" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.4" />
|
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="10.0.0-preview.7.25380.108" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Hybrid" Version="9.4.0" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Hybrid" Version="9.8.0" />
|
||||||
|
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<!-- Umbraco packages -->
|
<!-- Umbraco packages -->
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
@@ -86,18 +87,18 @@
|
|||||||
<!-- Take top-level depedendency on Azure.Identity, because Microsoft.EntityFrameworkCore.SqlServer depends on a vulnerable version -->
|
<!-- Take top-level depedendency on Azure.Identity, because Microsoft.EntityFrameworkCore.SqlServer depends on a vulnerable version -->
|
||||||
<PackageVersion Include="Azure.Identity" Version="1.13.2" />
|
<PackageVersion Include="Azure.Identity" Version="1.13.2" />
|
||||||
<!-- Microsoft.EntityFrameworkCore.SqlServer brings in a vulnerable version of System.Runtime.Caching -->
|
<!-- Microsoft.EntityFrameworkCore.SqlServer brings in a vulnerable version of System.Runtime.Caching -->
|
||||||
<PackageVersion Include="System.Runtime.Caching" Version="9.0.4" />
|
<PackageVersion Include="System.Runtime.Caching" Version="10.0.0-preview.7.25380.108" />
|
||||||
<!-- Dazinator.Extensions.FileProviders brings in a vulnerable version of System.Net.Http -->
|
<!-- Dazinator.Extensions.FileProviders brings in a vulnerable version of System.Net.Http -->
|
||||||
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
|
<PackageVersion Include="System.Net.Http" Version="4.3.4" />
|
||||||
<!-- Examine brings in a vulnerable version of System.Security.Cryptography.Xml -->
|
<!-- Examine brings in a vulnerable version of System.Security.Cryptography.Xml -->
|
||||||
<PackageVersion Include="System.Security.Cryptography.Xml" Version="9.0.4" />
|
<PackageVersion Include="System.Security.Cryptography.Xml" Version="10.0.0-preview.7.25380.108" />
|
||||||
<!-- Dazinator.Extensions.FileProviders and MiniProfiler.AspNetCore.Mvc brings in a vulnerable version of System.Text.RegularExpressions -->
|
<!-- Dazinator.Extensions.FileProviders and MiniProfiler.AspNetCore.Mvc brings in a vulnerable version of System.Text.RegularExpressions -->
|
||||||
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
|
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
|
||||||
<!-- OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer brings in a vulnerable version of Microsoft.IdentityModel.JsonWebTokens -->
|
<!-- OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer brings in a vulnerable version of Microsoft.IdentityModel.JsonWebTokens -->
|
||||||
<!-- Take top-level depedendency on Microsoft.IdentityModel.JsonWebTokens, because OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer depends on a vulnerable version -->
|
<!-- Take top-level depedendency on Microsoft.IdentityModel.JsonWebTokens, because OpenIddict.AspNetCore, Npoco.SqlServer and Microsoft.EntityFrameworkCore.SqlServer depends on a vulnerable version -->
|
||||||
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.8.0" />
|
<PackageVersion Include="Microsoft.IdentityModel.JsonWebTokens" Version="8.8.0" />
|
||||||
<!-- Azure.Identity, Microsoft.EntityFrameworkCore.SqlServer and Dazinator.Extensions.FileProviders brings in a legacy version of System.Text.Encodings.Web -->
|
<!-- Azure.Identity, Microsoft.EntityFrameworkCore.SqlServer and Dazinator.Extensions.FileProviders brings in a legacy version of System.Text.Encodings.Web -->
|
||||||
<PackageVersion Include="System.Text.Encodings.Web" Version="9.0.4" />
|
<PackageVersion Include="System.Text.Encodings.Web" Version="10.0.0-preview.7.25380.108" />
|
||||||
<!-- NPoco.SqlServer brings in a vulnerable version of Microsoft.Data.SqlClient -->
|
<!-- NPoco.SqlServer brings in a vulnerable version of Microsoft.Data.SqlClient -->
|
||||||
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.0.1" />
|
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.0.1" />
|
||||||
<!-- Examine.Lucene brings in a vulnerable version of Lucene.Net.Replicator -->
|
<!-- Examine.Lucene brings in a vulnerable version of Lucene.Net.Replicator -->
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "9.0.100",
|
"version": "10.0.100-preview.7.25380.108",
|
||||||
"rollForward": "latestFeature",
|
"rollForward": "latestFeature",
|
||||||
"allowPrerelease": false
|
"allowPrerelease": false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<Title>Umbraco CMS - Delivery API</Title>
|
<Title>Umbraco CMS - Delivery API</Title>
|
||||||
<Description>Contains the presentation layer for the Umbraco CMS Delivery API.</Description>
|
<Description>Contains the presentation layer for the Umbraco CMS Delivery API.</Description>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!--
|
<!--
|
||||||
TODO: Fix and remove overrides:
|
TODO: Fix and remove overrides:
|
||||||
@@ -12,12 +12,18 @@
|
|||||||
-->
|
-->
|
||||||
<WarningsNotAsErrors>$(WarningsNotAsErrors),ASP0019,CS0618,CS0612</WarningsNotAsErrors>
|
<WarningsNotAsErrors>$(WarningsNotAsErrors),ASP0019,CS0618,CS0612</WarningsNotAsErrors>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Umbraco.Cms.Api.Common\Umbraco.Cms.Api.Common.csproj" />
|
<ProjectReference Include="..\Umbraco.Cms.Api.Common\Umbraco.Cms.Api.Common.csproj" />
|
||||||
<ProjectReference Include="..\Umbraco.Web.Common\Umbraco.Web.Common.csproj" />
|
<ProjectReference Include="..\Umbraco.Web.Common\Umbraco.Web.Common.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="System.Linq.Async">
|
||||||
|
<ExcludeAssets>compile</ExcludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
|
<AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
|
||||||
<_Parameter1>Umbraco.Tests.UnitTests</_Parameter1>
|
<_Parameter1>Umbraco.Tests.UnitTests</_Parameter1>
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using Microsoft.AspNetCore.DataProtection;
|
|||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
|
using Microsoft.Net.Http.Headers;
|
||||||
using Umbraco.Cms.Api.Management.Security;
|
using Umbraco.Cms.Api.Management.Security;
|
||||||
using Umbraco.Cms.Core;
|
using Umbraco.Cms.Core;
|
||||||
using Umbraco.Cms.Core.Configuration.Models;
|
using Umbraco.Cms.Core.Configuration.Models;
|
||||||
@@ -219,10 +220,44 @@ public class ConfigureBackOfficeCookieOptions : IConfigureNamedOptions<CookieAut
|
|||||||
}
|
}
|
||||||
|
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
},
|
||||||
|
// FIXME: We want to change this over to using an attribute on the backoffice controllers
|
||||||
|
// See this for more: https://github.com/dotnet/aspnetcore/issues/63093#issuecomment-3201530217
|
||||||
|
OnRedirectToLogin = context =>
|
||||||
|
{
|
||||||
|
if (IsXhr(context.Request))
|
||||||
|
{
|
||||||
|
context.Response.Headers.Location = context.RedirectUri;
|
||||||
|
context.Response.StatusCode = 401;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.Response.Redirect(context.RedirectUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
},
|
||||||
|
OnRedirectToAccessDenied = context =>
|
||||||
|
{
|
||||||
|
if (IsXhr(context.Request))
|
||||||
|
{
|
||||||
|
context.Response.Headers.Location = context.RedirectUri;
|
||||||
|
context.Response.StatusCode = 403;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
context.Response.Redirect(context.RedirectUri);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool IsXhr(HttpRequest request) =>
|
||||||
|
string.Equals(request.Query[HeaderNames.XRequestedWith], "XMLHttpRequest", StringComparison.Ordinal) ||
|
||||||
|
string.Equals(request.Headers.XRequestedWith, "XMLHttpRequest", StringComparison.Ordinal);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Ensures the ticket is renewed if the <see cref="SecuritySettings.KeepUserLoggedIn" /> is set to true
|
/// 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
|
/// and the current request is for the get user seconds endpoint
|
||||||
|
|||||||
@@ -28,6 +28,12 @@
|
|||||||
<PackageReference Include="Swashbuckle.AspNetCore" />
|
<PackageReference Include="Swashbuckle.AspNetCore" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="System.Linq.Async">
|
||||||
|
<ExcludeAssets>compile</ExcludeAssets>
|
||||||
|
</PackageReference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Umbraco.PublishedCache.HybridCache\Umbraco.PublishedCache.HybridCache.csproj" />
|
<ProjectReference Include="..\Umbraco.PublishedCache.HybridCache\Umbraco.PublishedCache.HybridCache.csproj" />
|
||||||
<ProjectReference Include="..\Umbraco.Cms.Api.Common\Umbraco.Cms.Api.Common.csproj" />
|
<ProjectReference Include="..\Umbraco.Cms.Api.Common\Umbraco.Cms.Api.Common.csproj" />
|
||||||
|
|||||||
@@ -61,6 +61,9 @@
|
|||||||
<PackageReference Include="Serilog.Sinks.Async" />
|
<PackageReference Include="Serilog.Sinks.Async" />
|
||||||
<PackageReference Include="Serilog.Sinks.File" />
|
<PackageReference Include="Serilog.Sinks.File" />
|
||||||
<PackageReference Include="Serilog.Sinks.Map" />
|
<PackageReference Include="Serilog.Sinks.Map" />
|
||||||
|
<PackageReference Include="System.Linq.Async">
|
||||||
|
<ExcludeAssets>compile</ExcludeAssets>
|
||||||
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
<Project Sdk="Microsoft.NET.Sdk.Razor">
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net9.0</TargetFramework>
|
<TargetFramework>net10.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<AddRazorSupportForMvc Condition="'$(SupportPagesAndViews)' == 'True'">true</AddRazorSupportForMvc>
|
<AddRazorSupportForMvc Condition="'$(SupportPagesAndViews)' == 'True'">true</AddRazorSupportForMvc>
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"condition": "(UmbracoRelease == 'LTS')",
|
"condition": "(UmbracoRelease == 'LTS')",
|
||||||
"value": "13.10.0"
|
"value": "17.0.0"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -116,11 +116,11 @@
|
|||||||
"cases": [
|
"cases": [
|
||||||
{
|
{
|
||||||
"condition": "(UmbracoRelease == 'Latest')",
|
"condition": "(UmbracoRelease == 'Latest')",
|
||||||
"value": "net9.0"
|
"value": "net10.0"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"condition": "(UmbracoRelease == 'LTS')",
|
"condition": "(UmbracoRelease == 'LTS')",
|
||||||
"value": "net8.0"
|
"value": "net10.0"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS base
|
FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base
|
||||||
USER $APP_UID
|
USER $APP_UID
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
EXPOSE 8081
|
EXPOSE 8081
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
|
||||||
ARG BUILD_CONFIGURATION=Release
|
ARG BUILD_CONFIGURATION=Release
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
COPY ["UmbracoProject/UmbracoProject.csproj", "UmbracoProject/"]
|
COPY ["UmbracoProject/UmbracoProject.csproj", "UmbracoProject/"]
|
||||||
|
|||||||
Reference in New Issue
Block a user