Skip to content

Commit ef3d83c

Browse files
authored
Move permissions to OC.Localization.Core for consistency (OrchardCMS#18792)
1 parent fef6322 commit ef3d83c

File tree

5 files changed

+81
-85
lines changed

5 files changed

+81
-85
lines changed

src/OrchardCore.Modules/OrchardCore.DataLocalization/AdminMenu.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Microsoft.AspNetCore.Routing;
22
using Microsoft.Extensions.Localization;
3+
using OrchardCore.Localization.Data;
34
using OrchardCore.Navigation;
45

56
namespace OrchardCore.DataLocalization;
@@ -34,7 +35,7 @@ protected override ValueTask BuildAsync(NavigationBuilder builder)
3435
.Add(S["Translations"], S["Translations"].PrefixPosition(), translations => translations
3536
.AddClass("translations")
3637
.Id("translations")
37-
.Permission(Permissions.ViewDynamicTranslations)
38+
.Permission(DataLocalizationPermissions.ViewDynamicTranslations)
3839
.Action(_routeValues["action"].ToString(), _routeValues["controller"].ToString(), _routeValues)
3940
.LocalNav()
4041
)
@@ -51,7 +52,7 @@ protected override ValueTask BuildAsync(NavigationBuilder builder)
5152
.Add(S["Dynamic Translations"], S["Dynamic Translations"].PrefixPosition(), translations => translations
5253
.AddClass("dynamic-translations")
5354
.Id("dynamicTranslations")
54-
.Permission(Permissions.ViewDynamicTranslations)
55+
.Permission(DataLocalizationPermissions.ViewDynamicTranslations)
5556
.Action(_routeValues["action"].ToString(), _routeValues["controller"].ToString(), _routeValues)
5657
.LocalNav()
5758
)

src/OrchardCore.Modules/OrchardCore.DataLocalization/Controllers/AdminController.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public async Task<IActionResult> Index(string culture = null)
7474

7575
public async Task<IActionResult> Statistics()
7676
{
77-
if (!await _authorizationService.AuthorizeAsync(User, Permissions.ViewDynamicTranslations))
77+
if (!await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ViewDynamicTranslations))
7878
{
7979
return Forbid();
8080
}
@@ -87,7 +87,7 @@ public async Task<IActionResult> Statistics()
8787
[HttpGet]
8888
public async Task<IActionResult> GetStrings(string culture)
8989
{
90-
if (!await _authorizationService.AuthorizeAsync(User, Permissions.ViewDynamicTranslations))
90+
if (!await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ViewDynamicTranslations))
9191
{
9292
return Forbid();
9393
}
@@ -105,7 +105,7 @@ public async Task<IActionResult> GetStrings(string culture)
105105
[HttpGet]
106106
public async Task<IActionResult> GetStatisticsJson()
107107
{
108-
if (!await _authorizationService.AuthorizeAsync(User, Permissions.ViewDynamicTranslations))
108+
if (!await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ViewDynamicTranslations))
109109
{
110110
return Forbid();
111111
}
@@ -160,18 +160,18 @@ public async Task<IActionResult> GetAllowedCulturesJson()
160160
private async Task<bool> HasAnyTranslationPermissionAsync()
161161
{
162162
// Check if user has view permission or any edit permission.
163-
if (await _authorizationService.AuthorizeAsync(User, Permissions.ViewDynamicTranslations) ||
164-
await _authorizationService.AuthorizeAsync(User, Permissions.ManageTranslations))
163+
if (await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ViewDynamicTranslations) ||
164+
await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ManageTranslations))
165165
{
166166
return true;
167167
}
168168

169-
// Check culture-specific permissions.
169+
// Check culture-specific DatatLocalizationPermissions.
170170
var supportedCultures = await _localizationService.GetSupportedCulturesAsync();
171171
foreach (var cultureName in supportedCultures)
172172
{
173173
var cultureInfo = CultureInfo.GetCultureInfo(cultureName);
174-
var permission = Permissions.CreateCulturePermission(cultureName, cultureInfo.DisplayName);
174+
var permission = DataLocalizationPermissions.CreateCulturePermission(cultureName, cultureInfo.DisplayName);
175175

176176
if (await _authorizationService.AuthorizeAsync(User, permission))
177177
{
@@ -185,14 +185,14 @@ await _authorizationService.AuthorizeAsync(User, Permissions.ManageTranslations)
185185
private async Task<bool> CanEditCultureAsync(string culture)
186186
{
187187
// ManageTranslations grants access to all cultures.
188-
if (await _authorizationService.AuthorizeAsync(User, Permissions.ManageTranslations))
188+
if (await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ManageTranslations))
189189
{
190190
return true;
191191
}
192192

193193
// Check culture-specific permission.
194194
var cultureInfo = CultureInfo.GetCultureInfo(culture);
195-
var permission = Permissions.CreateCulturePermission(culture, cultureInfo.DisplayName);
195+
var permission = DataLocalizationPermissions.CreateCulturePermission(culture, cultureInfo.DisplayName);
196196

197197
return await _authorizationService.AuthorizeAsync(User, permission);
198198
}
@@ -201,9 +201,9 @@ private async Task<IList<CultureViewModel>> GetAllowedCulturesAsync()
201201
{
202202
var supportedCultures = await _localizationService.GetSupportedCulturesAsync();
203203

204-
var canManageAll = await _authorizationService.AuthorizeAsync(User, Permissions.ManageTranslations);
204+
var canManageAll = await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ManageTranslations);
205205

206-
var canView = await _authorizationService.AuthorizeAsync(User, Permissions.ViewDynamicTranslations);
206+
var canView = await _authorizationService.AuthorizeAsync(User, DataLocalizationPermissions.ViewDynamicTranslations);
207207

208208
var cultures = new List<CultureViewModel>();
209209

@@ -218,7 +218,7 @@ private async Task<IList<CultureViewModel>> GetAllowedCulturesAsync()
218218

219219
if (!canEditCulture)
220220
{
221-
var permission = Permissions.CreateCulturePermission(cultureName, displayName);
221+
var permission = DataLocalizationPermissions.CreateCulturePermission(cultureName, displayName);
222222

223223
canEditCulture = await _authorizationService.AuthorizeAsync(User, permission);
224224
}
Lines changed: 7 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Globalization;
22
using OrchardCore.Localization;
3+
using OrchardCore.Localization.Data;
34
using OrchardCore.Security.Permissions;
45

56
namespace OrchardCore.DataLocalization;
@@ -9,85 +10,20 @@ namespace OrchardCore.DataLocalization;
910
/// </summary>
1011
public sealed class Permissions : IPermissionProvider
1112
{
12-
/// <summary>
13-
/// Read-only permission to view translations and statistics.
14-
/// </summary>
15-
public static readonly Permission ViewDynamicTranslations =
16-
new("ViewDynamicTranslations", "View dynamic translations and statistics");
17-
18-
/// <summary>
19-
/// Permission to manage all dynamic translations.
20-
/// Implies <see cref="ViewDynamicTranslations"/>.
21-
/// </summary>
22-
public static readonly Permission ManageTranslations =
23-
new("ManageTranslations", "Manage all dynamic translations", [ViewDynamicTranslations]);
24-
25-
/// <summary>
26-
/// Legacy permission for managing dynamic localizations.
27-
/// Kept for backward compatibility; use <see cref="ManageTranslations"/> instead.
28-
/// </summary>
29-
public static readonly Permission ManageLocalization =
30-
new("ManageLocalization", "Manage dynamic localizations", [ManageTranslations]);
31-
32-
/// <summary>
33-
/// Template permission for culture-specific translation management.
34-
/// </summary>
35-
private static readonly Permission _manageTranslationsForCulture =
36-
new("ManageTranslations_{0}", "Manage {0} translations", [ManageTranslations, ViewDynamicTranslations]);
37-
38-
private static readonly Dictionary<string, Permission> _culturePermissions = [];
39-
4013
private readonly ILocalizationService _localizationService;
4114

4215
public Permissions(ILocalizationService localizationService)
4316
{
4417
_localizationService = localizationService;
4518
}
4619

47-
/// <summary>
48-
/// Creates a dynamic permission for managing translations in a specific culture.
49-
/// </summary>
50-
/// <param name="cultureName">The culture name (e.g., "fr-FR").</param>
51-
/// <param name="cultureDisplayName">The display name of the culture (e.g., "French (France)").</param>
52-
/// <returns>A permission for managing translations in the specified culture.</returns>
53-
public static Permission CreateCulturePermission(string cultureName, string cultureDisplayName)
54-
{
55-
ArgumentException.ThrowIfNullOrEmpty(cultureName);
56-
57-
if (_culturePermissions.TryGetValue(cultureName, out var existingPermission))
58-
{
59-
return existingPermission;
60-
}
61-
62-
var permission = new Permission(
63-
string.Format(_manageTranslationsForCulture.Name, cultureName),
64-
string.Format(_manageTranslationsForCulture.Description, cultureDisplayName),
65-
_manageTranslationsForCulture.ImpliedBy
66-
)
67-
{
68-
Category = "Data Localization",
69-
};
70-
71-
_culturePermissions[cultureName] = permission;
72-
73-
return permission;
74-
}
75-
76-
/// <summary>
77-
/// Gets the permission name for a specific culture.
78-
/// </summary>
79-
/// <param name="cultureName">The culture name (e.g., "fr-FR").</param>
80-
/// <returns>The permission name (e.g., "ManageTranslations_fr-FR").</returns>
81-
public static string GetCulturePermissionName(string cultureName)
82-
=> string.Format(_manageTranslationsForCulture.Name, cultureName);
83-
8420
public async Task<IEnumerable<Permission>> GetPermissionsAsync()
8521
{
8622
var permissions = new List<Permission>
8723
{
88-
ViewDynamicTranslations,
89-
ManageTranslations,
90-
ManageLocalization,
24+
DataLocalizationPermissions.ViewDynamicTranslations,
25+
DataLocalizationPermissions.ManageTranslations,
26+
DataLocalizationPermissions.ManageLocalization,
9127
};
9228

9329
var supportedCultures = await _localizationService.GetSupportedCulturesAsync();
@@ -99,7 +35,7 @@ public async Task<IEnumerable<Permission>> GetPermissionsAsync()
9935
? cultureInfo.DisplayName
10036
: cultureInfo.NativeName;
10137

102-
permissions.Add(CreateCulturePermission(cultureName, displayName));
38+
permissions.Add(DataLocalizationPermissions.CreateCulturePermission(cultureName, displayName));
10339
}
10440

10541
return permissions;
@@ -110,12 +46,12 @@ public IEnumerable<PermissionStereotype> GetDefaultStereotypes() =>
11046
new PermissionStereotype
11147
{
11248
Name = OrchardCoreConstants.Roles.Administrator,
113-
Permissions = [ManageTranslations],
49+
Permissions = [DataLocalizationPermissions.ManageTranslations],
11450
},
11551
new PermissionStereotype
11652
{
11753
Name = OrchardCoreConstants.Roles.Editor,
118-
Permissions = [ViewDynamicTranslations],
54+
Permissions = [DataLocalizationPermissions.ViewDynamicTranslations],
11955
},
12056
];
12157
}

src/OrchardCore/OrchardCore.Localization.Abstractions/OrchardCore.Localization.Abstractions.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
<ItemGroup>
1919
<ProjectReference Include="..\OrchardCore.Abstractions\OrchardCore.Abstractions.csproj" />
20+
<ProjectReference Include="..\OrchardCore.Infrastructure.Abstractions\OrchardCore.Infrastructure.Abstractions.csproj" />
2021
</ItemGroup>
2122

2223
</Project>
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using OrchardCore.Security.Permissions;
2+
3+
namespace OrchardCore.Localization.Data;
4+
5+
public class DataLocalizationPermissions
6+
{
7+
private static readonly Dictionary<string, Permission> _culturePermissions = [];
8+
private static readonly Permission _manageTranslationsForCulture =
9+
new("ManageTranslations_{0}", "Manage {0} translations", [ManageTranslations, ViewDynamicTranslations]);
10+
11+
/// <summary>
12+
/// Read-only permission to view translations and statistics.
13+
/// </summary>
14+
public static readonly Permission ViewDynamicTranslations =
15+
new("ViewDynamicTranslations", "View dynamic translations and statistics");
16+
17+
/// <summary>
18+
/// Permission to manage all dynamic translations.
19+
/// Implies <see cref="ViewDynamicTranslations"/>.
20+
/// </summary>
21+
public static readonly Permission ManageTranslations =
22+
new("ManageTranslations", "Manage all dynamic translations", [ViewDynamicTranslations]);
23+
24+
/// <summary>
25+
/// Legacy permission for managing dynamic localizations.
26+
/// Kept for backward compatibility; use <see cref="ManageTranslations"/> instead.
27+
/// </summary>
28+
public static readonly Permission ManageLocalization =
29+
new("ManageLocalization", "Manage dynamic localizations", [ManageTranslations]);
30+
31+
/// <summary>
32+
/// Creates a dynamic permission for managing translations in a specific culture.
33+
/// </summary>
34+
/// <param name="cultureName">The culture name (e.g., "fr-FR").</param>
35+
/// <param name="cultureDisplayName">The display name of the culture (e.g., "French (France)").</param>
36+
/// <returns>A permission for managing translations in the specified culture.</returns>
37+
public static Permission CreateCulturePermission(string cultureName, string cultureDisplayName)
38+
{
39+
ArgumentException.ThrowIfNullOrEmpty(cultureName);
40+
41+
if (_culturePermissions.TryGetValue(cultureName, out var existingPermission))
42+
{
43+
return existingPermission;
44+
}
45+
46+
var permission = new Permission(
47+
string.Format(_manageTranslationsForCulture.Name, cultureName),
48+
string.Format(_manageTranslationsForCulture.Description, cultureDisplayName),
49+
_manageTranslationsForCulture.ImpliedBy)
50+
{
51+
Category = "Data Localization",
52+
};
53+
54+
_culturePermissions[cultureName] = permission;
55+
56+
return permission;
57+
}
58+
}

0 commit comments

Comments
 (0)