diff --git a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs index d34aa575..bc1d4780 100644 --- a/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs +++ b/Oqtane.Client/Extensions/OqtaneServiceCollectionExtensions.cs @@ -49,7 +49,6 @@ namespace Microsoft.Extensions.DependencyInjection services.AddScoped(); services.AddScoped(); services.AddScoped(); - services.AddScoped(); return services; } diff --git a/Oqtane.Client/Modules/Admin/Api/Edit.razor b/Oqtane.Client/Modules/Admin/Api/Edit.razor deleted file mode 100644 index e451fec8..00000000 --- a/Oqtane.Client/Modules/Admin/Api/Edit.razor +++ /dev/null @@ -1,75 +0,0 @@ -@namespace Oqtane.Modules.Admin.Apis -@inherits ModuleBase -@inject IApiService ApiService -@inject NavigationManager NavigationManager -@inject IStringLocalizer Localizer -@inject IStringLocalizer SharedLocalizer - -
-
- -
- -
-
-
-
- @if (_permissions != null) - { - - } -
-
- -@SharedLocalizer["Cancel"] - -@code { - private string _entityname; - private string _permissionnames; - private string _permissions; - -#pragma warning disable 649 - private PermissionGrid _permissionGrid; -#pragma warning restore 649 - - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - - protected override async Task OnInitializedAsync() - { - try - { - _entityname = PageState.QueryString["entity"]; - var api = await ApiService.GetApiAsync(PageState.Site.SiteId, _entityname); - if (api != null) - { - var apis = await ApiService.GetApisAsync(PageState.Site.SiteId); - _permissionnames = apis.SingleOrDefault(item => item.EntityName == _entityname).Permissions; - _permissions = api.Permissions; - } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading API {EntityName} {Error}", _entityname, ex.Message); - AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error); - } - } - - private async Task SaveModuleDefinition() - { - try - { - var api = new Api(); - api.SiteId = PageState.Site.SiteId; - api.EntityName = _entityname; - api.Permissions = _permissionGrid.GetPermissions(); - await ApiService.UpdateApiAsync(api); - await logger.LogInformation("API Saved {Api}", api); - NavigationManager.NavigateTo(NavigateUrl()); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Saving Api {EntityName} {Error}", _entityname, ex.Message); - AddModuleMessage(Localizer["Error.Module.Save"], MessageType.Error); - } - } -} diff --git a/Oqtane.Client/Modules/Admin/Api/Index.razor b/Oqtane.Client/Modules/Admin/Api/Index.razor deleted file mode 100644 index 539a8479..00000000 --- a/Oqtane.Client/Modules/Admin/Api/Index.razor +++ /dev/null @@ -1,36 +0,0 @@ -@namespace Oqtane.Modules.Admin.Apis -@inherits ModuleBase -@inject IApiService ApiService -@inject IStringLocalizer Localizer -@inject IStringLocalizer SharedLocalizer - -@if (_apis == null) -{ -

@SharedLocalizer["Loading"]

-} -else -{ - -
-   - @Localizer["Entity"] - @Localizer["Permissions"] -
- - - @context.EntityName - @context.Permissions - -
-} - -@code { - private List _apis; - - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - - protected override async Task OnParametersSetAsync() - { - _apis = await ApiService.GetApisAsync(PageState.Site.SiteId); - } -} diff --git a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor index 97127ba3..e491042a 100644 --- a/Oqtane.Client/Modules/Admin/Dashboard/Index.razor +++ b/Oqtane.Client/Modules/Admin/Dashboard/Index.razor @@ -20,13 +20,16 @@ @code { - private List _pages; + private List _pages; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; - protected override void OnInitialized() - { - var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin"); - _pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId).ToList(); + protected override void OnInitialized() + { + var admin = PageState.Pages.FirstOrDefault(item => item.Path == "admin"); + if (admin != null) + { + _pages = PageState.Pages.Where(item => item.ParentId == admin?.PageId).ToList(); + } } } diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index 65e99da5..e003128e 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -131,7 +131,7 @@ else moduleDefinition = await ModuleDefinitionService.CreateModuleDefinitionAsync(moduleDefinition); var settings = await SettingService.GetModuleSettingsAsync(ModuleState.ModuleId); - SettingService.SetSetting(settings, "ModuleDefinitionName", moduleDefinition.ModuleDefinitionName); + settings = SettingService.SetSetting(settings, "ModuleDefinitionName", moduleDefinition.ModuleDefinitionName); await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); GetLocation(); diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index de004f44..bd0cd704 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -157,7 +157,8 @@ } - +
+ diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 23db89db..144a4dad 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -148,7 +148,8 @@ -

+
+
} @@ -189,7 +190,8 @@
} - +
+ diff --git a/Oqtane.Client/Modules/Admin/Profiles/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/Profiles/ModuleInfo.cs new file mode 100644 index 00000000..03793b1b --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Profiles/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Documentation; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Modules.Admin.Profiles +{ + [PrivateApi("Mark this as private, since it's not very useful in the public docs")] + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "Profiles", + Description = "Manage Profiles", + Categories = "Admin", + Version = Constants.Version, + PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit},{EntityNames.Profile}:{PermissionNames.Write}:{RoleNames.Admin}" + }; + } +} diff --git a/Oqtane.Client/Modules/Admin/Roles/Add.razor b/Oqtane.Client/Modules/Admin/Roles/Add.razor index f20a721d..9116cfe7 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Add.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Add.razor @@ -42,7 +42,7 @@ private string _description = string.Empty; private string _isautoassigned = "False"; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; private async Task SaveRole() { diff --git a/Oqtane.Client/Modules/Admin/Roles/Edit.razor b/Oqtane.Client/Modules/Admin/Roles/Edit.razor index b217acce..3da2f6ad 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Edit.razor @@ -49,7 +49,7 @@ private string _modifiedby; private DateTime _modifiedon; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; protected override async Task OnInitializedAsync() { diff --git a/Oqtane.Client/Modules/Admin/Roles/Index.razor b/Oqtane.Client/Modules/Admin/Roles/Index.razor index 2bb4ac87..6677548d 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Index.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Index.razor @@ -10,7 +10,7 @@ } else { - +
@@ -20,9 +20,9 @@ else @SharedLocalizer["Name"]
- - - + + + @context.Name
@@ -31,7 +31,7 @@ else @code { private List _roles; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; protected override async Task OnParametersSetAsync() { diff --git a/Oqtane.Client/Modules/Admin/Roles/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/Roles/ModuleInfo.cs new file mode 100644 index 00000000..d97310e8 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Roles/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Documentation; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Modules.Admin.Roles +{ + [PrivateApi("Mark this as private, since it's not very useful in the public docs")] + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "Roles", + Description = "Manage Roles", + Categories = "Admin", + Version = Constants.Version, + PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit},{EntityNames.Role}:{PermissionNames.Write}:{RoleNames.Admin},{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}" + }; + } +} diff --git a/Oqtane.Client/Modules/Admin/Roles/Users.razor b/Oqtane.Client/Modules/Admin/Roles/Users.razor index 359bc113..d0eb0aac 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Users.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Users.razor @@ -23,13 +23,7 @@ else
- +
@@ -64,7 +58,7 @@ else @context.EffectiveDate @context.ExpiryDate - + @@ -75,81 +69,96 @@ else } @code { - private ElementReference form; - private bool validated = false; + private ElementReference form; + private bool validated = false; - private int roleid; - private string name = string.Empty; - private List users; - private int userid = -1; - private DateTime? effectivedate = null; - private DateTime? expirydate = null; - private List userroles; + private int roleid; + private string name = string.Empty; + private AutoComplete user; + private DateTime? effectivedate = null; + private DateTime? expirydate = null; + private List userroles; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; - protected override async Task OnInitializedAsync() - { - try - { - roleid = Int32.Parse(PageState.QueryString["id"]); - Role role = await RoleService.GetRoleAsync(roleid); - name = role.Name; - users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Registered); - await GetUserRoles(); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading Users {Error}", ex.Message); - AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error); - } - } + protected override async Task OnInitializedAsync() + { + try + { + roleid = Int32.Parse(PageState.QueryString["id"]); + Role role = await RoleService.GetRoleAsync(roleid); + name = role.Name; + await GetUserRoles(); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Users {Error}", ex.Message); + AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error); + } + } - private async Task GetUserRoles() - { - try - { - userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, name); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading User Roles {RoleId} {Error}", roleid, ex.Message); - AddModuleMessage(Localizer["Error.User.LoadRole"], MessageType.Error); - } - } + private async Task> GetUsers(string filter) + { + try + { + var users = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, RoleNames.Registered); + return users.Where(item => item.User.DisplayName.Contains(filter, StringComparison.OrdinalIgnoreCase)) + .ToDictionary(item => item.UserId.ToString(), item => item.User.DisplayName); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Users {filter} {Error}", filter, ex.Message); + AddModuleMessage(Localizer["Error.User.Load"], MessageType.Error); + } + return new Dictionary(); + } - private async Task SaveUserRole() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - try - { - if (userid != -1) - { - var userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault(); - if (userrole != null) - { - userrole.EffectiveDate = effectivedate; - userrole.ExpiryDate = expirydate; - await UserRoleService.UpdateUserRoleAsync(userrole); - } - else - { - userrole = new UserRole(); - userrole.UserId = userid; - userrole.RoleId = roleid; - userrole.EffectiveDate = effectivedate; - userrole.ExpiryDate = expirydate; + private async Task GetUserRoles() + { + try + { + userroles = await UserRoleService.GetUserRolesAsync(PageState.Site.SiteId, name); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading User Roles {RoleId} {Error}", roleid, ex.Message); + AddModuleMessage(Localizer["Error.User.LoadRole"], MessageType.Error); + } + } - await UserRoleService.AddUserRoleAsync(userrole); - } + private async Task SaveUserRole() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + try + { + if (!string.IsNullOrEmpty(user.Key) && int.TryParse(user.Key, out int userid)) + { + var userrole = userroles.Where(item => item.UserId == userid && item.RoleId == roleid).FirstOrDefault(); + if (userrole != null) + { + userrole.EffectiveDate = effectivedate; + userrole.ExpiryDate = expirydate; + await UserRoleService.UpdateUserRoleAsync(userrole); + } + else + { + userrole = new UserRole(); + userrole.UserId = userid; + userrole.RoleId = roleid; + userrole.EffectiveDate = effectivedate; + userrole.ExpiryDate = expirydate; - await logger.LogInformation("User Assigned To Role {UserRole}", userrole); - AddModuleMessage(Localizer["Success.User.AssignedRole"], MessageType.Success); - await GetUserRoles(); - StateHasChanged(); + await UserRoleService.AddUserRoleAsync(userrole); + } + + await logger.LogInformation("User Assigned To Role {UserRole}", userrole); + AddModuleMessage(Localizer["Success.User.AssignedRole"], MessageType.Success); + await GetUserRoles(); + user.Clear(); + StateHasChanged(); } else { diff --git a/Oqtane.Client/Modules/Admin/Site/Index.razor b/Oqtane.Client/Modules/Admin/Site/Index.razor index 367d31de..47fec6f3 100644 --- a/Oqtane.Client/Modules/Admin/Site/Index.razor +++ b/Oqtane.Client/Modules/Admin/Site/Index.razor @@ -602,12 +602,12 @@ try { var settings = await SettingService.GetSiteSettingsAsync(PageState.Site.SiteId); - SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); - SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); - SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); - SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); - SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); - SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); + settings = SettingService.SetSetting(settings, "SMTPHost", _smtphost, true); + settings = SettingService.SetSetting(settings, "SMTPPort", _smtpport, true); + settings = SettingService.SetSetting(settings, "SMTPSSL", _smtpssl, true); + settings = SettingService.SetSetting(settings, "SMTPUsername", _smtpusername, true); + settings = SettingService.SetSetting(settings, "SMTPPassword", _smtppassword, true); + settings = SettingService.SetSetting(settings, "SMTPSender", _smtpsender, true); await SettingService.UpdateSiteSettingsAsync(settings, PageState.Site.SiteId); await logger.LogInformation("Site SMTP Settings Saved"); diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 54b53348..a56235ef 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -305,7 +305,14 @@ else } private string GetProfileValue(string SettingName, string DefaultValue) - => SettingService.GetSetting(settings, SettingName, DefaultValue); + { + string value = SettingService.GetSetting(settings, SettingName, DefaultValue); + if (value.Contains("]")) + { + value = value.Substring(value.IndexOf("]") + 1); + } + return value; + } private async Task Save() { diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index ee0fdc8e..3eb37216 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -104,7 +104,7 @@ private Dictionary settings; private string category = string.Empty; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; protected override async Task OnInitializedAsync() { @@ -121,8 +121,15 @@ } } - private string GetProfileValue(string SettingName, string DefaultValue) - => SettingService.GetSetting(settings, SettingName, DefaultValue); + private string GetProfileValue(string SettingName, string DefaultValue) + { + string value = SettingService.GetSetting(settings, SettingName, DefaultValue); + if (value.Contains("]")) + { + value = value.Substring(value.IndexOf("]") + 1); + } + return value; + } private async Task SaveUser() { diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index 6fffed9c..e4a23e6d 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -174,7 +174,7 @@ else private string deletedby; private DateTime? deletedon; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; protected override async Task OnParametersSetAsync() { @@ -223,7 +223,14 @@ else } private string GetProfileValue(string SettingName, string DefaultValue) - => SettingService.GetSetting(settings, SettingName, DefaultValue); + { + string value = SettingService.GetSetting(settings, SettingName, DefaultValue); + if (value.Contains("]")) + { + value = value.Substring(value.IndexOf("]") + 1); + } + return value; + } private async Task SaveUser() { diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 13d67f4f..40124c61 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -20,7 +20,7 @@ else
- +
@@ -41,21 +41,21 @@ else - + - + - + @context.User.Username @((MarkupString)string.Format("{1}", @context.User.Email, @context.User.DisplayName)) - @string.Format("{0:dd-MMM-yyyy HH:mm:ss}", context.User.LastLoginOn) + @((context.User.LastLoginOn != DateTime.MinValue) ? string.Format("{0:dd-MMM-yyyy HH:mm:ss}", context.User.LastLoginOn) : "") - - + +
@@ -406,7 +406,7 @@ else private string _lifetime; private string _token; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.View; protected override async Task OnInitializedAsync() { @@ -456,7 +456,8 @@ else _togglesecret = SharedLocalizer["ShowPassword"]; _issuer = SettingService.GetSetting(settings, "JwtOptions:Issuer", PageState.Uri.Scheme + "://" + PageState.Alias.Name); _audience = SettingService.GetSetting(settings, "JwtOptions:Audience", ""); - _lifetime = SettingService.GetSetting(settings, "JwtOptions:Lifetime", "20"); } + _lifetime = SettingService.GetSetting(settings, "JwtOptions:Lifetime", "20"); + } } private async Task LoadUsersAsync(bool load) @@ -522,7 +523,7 @@ else private async Task UpdateUserSettingsAsync() { Dictionary settings = await SettingService.GetUserSettingsAsync(PageState.User.UserId); - SettingService.SetSetting(settings, settingSearch, _search); + settings = SettingService.SetSetting(settings, settingSearch, _search); await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); } diff --git a/Oqtane.Client/Modules/Admin/Users/ModuleInfo.cs b/Oqtane.Client/Modules/Admin/Users/ModuleInfo.cs new file mode 100644 index 00000000..bd3918e1 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Users/ModuleInfo.cs @@ -0,0 +1,19 @@ +using Oqtane.Documentation; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Modules.Admin.Users +{ + [PrivateApi("Mark this as private, since it's not very useful in the public docs")] + public class ModuleInfo : IModule + { + public ModuleDefinition ModuleDefinition => new ModuleDefinition + { + Name = "Users", + Description = "Manage Users", + Categories = "Admin", + Version = Constants.Version, + PermissionNames = $"{PermissionNames.View},{PermissionNames.Edit},{EntityNames.User}:{PermissionNames.Write}:{RoleNames.Admin},{EntityNames.UserRole}:{PermissionNames.Write}:{RoleNames.Admin}" + }; + } +} diff --git a/Oqtane.Client/Modules/Admin/Users/Roles.razor b/Oqtane.Client/Modules/Admin/Users/Roles.razor index 0fcc3229..9135a9f6 100644 --- a/Oqtane.Client/Modules/Admin/Users/Roles.razor +++ b/Oqtane.Client/Modules/Admin/Users/Roles.razor @@ -63,7 +63,7 @@ else @context.EffectiveDate @context.ExpiryDate - + @@ -79,7 +79,7 @@ else private string expirydate = string.Empty; private List userroles; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Edit; protected override async Task OnInitializedAsync() { diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor index 9fdb0d31..4fcdc5ac 100644 --- a/Oqtane.Client/Modules/Controls/PermissionGrid.razor +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -17,8 +17,8 @@ @Localizer["Role"] @foreach (PermissionString permission in _permissions) { - @Localizer[permission.PermissionName] - } + @((MarkupString)GetPermissionName(permission).Replace(" ", "
")) + } @foreach (Role role in _roles) { @@ -28,7 +28,7 @@ { var p = permission; - + } @@ -66,7 +66,7 @@ { var p = permission; - + } @@ -129,10 +129,25 @@ _permissions = new List(); - foreach (string permissionname in _permissionnames.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries)) + foreach (string permissionname in _permissionnames.Split(',', StringSplitOptions.RemoveEmptyEntries)) { - // initialize with admin role - _permissions.Add(new PermissionString { PermissionName = permissionname, Permissions = RoleNames.Admin }); + // permission names can be in the form of "EntityName:PermissionName:Roles" + if (permissionname.Contains(":")) + { + var segments = permissionname.Split(':'); + if (segments.Length == 3) + { + if (!segments[2].Contains(RoleNames.Admin)) + { + segments[2] = RoleNames.Admin + ";" + segments[2]; // ensure admin access + } + _permissions.Add(new PermissionString { EntityName = segments[0], PermissionName = segments[1], Permissions = segments[2] }); + } + } + else + { + _permissions.Add(new PermissionString { EntityName = EntityName, PermissionName = permissionname, Permissions = RoleNames.Admin }); + } } if (!string.IsNullOrEmpty(Permissions)) @@ -140,14 +155,15 @@ // populate permissions foreach (PermissionString permissionstring in UserSecurity.GetPermissionStrings(Permissions)) { - if (_permissions.Find(item => item.PermissionName == permissionstring.PermissionName) != null) + int index = _permissions.FindIndex(item => item.EntityName == permissionstring.EntityName && item.PermissionName == permissionstring.PermissionName); + if (index != -1) { - _permissions[_permissions.FindIndex(item => item.PermissionName == permissionstring.PermissionName)].Permissions = permissionstring.Permissions; + _permissions[index].Permissions = permissionstring.Permissions; } if (permissionstring.Permissions.Contains("[")) { - foreach (string user in permissionstring.Permissions.Split(new char[] { '[' }, StringSplitOptions.RemoveEmptyEntries)) + foreach (string user in permissionstring.Permissions.Split('[', StringSplitOptions.RemoveEmptyEntries)) { if (user.Contains("]")) { @@ -163,6 +179,16 @@ } } + private string GetPermissionName(PermissionString permission) + { + var permissionname = Localizer[permission.PermissionName].ToString(); + if (!string.IsNullOrEmpty(EntityName)) + { + permissionname += " " + Localizer[permission.EntityName].ToString(); + } + return permissionname; + } + private bool? GetPermissionValue(string permissions, string securityKey) { if ((";" + permissions + ";").Contains(";" + "!" + securityKey + ";")) @@ -182,8 +208,24 @@ } } - private bool GetPermissionDisabled(string roleName) - => (roleName == RoleNames.Admin && !UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) ? true : false; + private bool GetPermissionDisabled(string entityName, string permissionName, string roleName) + { + if (roleName == RoleNames.Admin && !UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) + { + return true; + } + else + { + if (entityName != EntityName && !UserSecurity.IsAuthorized(PageState.User, RoleNames.Admin)) + { + return true; + } + else + { + return false; + } + } + } private async Task> GetUsers(string filter) { @@ -209,14 +251,15 @@ _user.Clear(); } - private void PermissionChanged(bool? value, string permissionName, string securityId) + private void PermissionChanged(bool? value, string entityName, string permissionName, string securityId) { var selected = value; - var permission = _permissions.Find(item => item.PermissionName == permissionName); - if (permission != null) + int index = _permissions.FindIndex(item => item.EntityName == entityName && item.PermissionName == permissionName); + if (index != -1) { - var ids = permission.Permissions.Split(';').ToList(); + var permission = _permissions[index]; + var ids = permission.Permissions.Split(';').ToList(); ids.Remove(securityId); // remove grant permission ids.Remove("!" + securityId); // remove deny permission @@ -232,7 +275,7 @@ break; // permission not specified } - _permissions[_permissions.FindIndex(item => item.PermissionName == permissionName)].Permissions = string.Join(";", ids.ToArray()); + _permissions[index].Permissions = string.Join(";", ids.ToArray()); } } @@ -245,9 +288,9 @@ private void ValidatePermissions() { PermissionString permission; - for (int i = 0; i < _permissions.Count; i++) + for (int index = 0; index < _permissions.Count; index++) { - permission = _permissions[i]; + permission = _permissions[index]; List ids = permission.Permissions.Split(';', StringSplitOptions.RemoveEmptyEntries).ToList(); ids.Remove("!" + RoleNames.Everyone); // remove deny all users ids.Remove("!" + RoleNames.Unauthenticated); // remove deny unauthenticated @@ -263,7 +306,7 @@ } } permission.Permissions = string.Join(";", ids.ToArray()); - _permissions[i] = permission; + _permissions[index] = permission; } } } diff --git a/Oqtane.Client/Modules/ModuleBase.cs b/Oqtane.Client/Modules/ModuleBase.cs index 77ad0423..42963461 100644 --- a/Oqtane.Client/Modules/ModuleBase.cs +++ b/Oqtane.Client/Modules/ModuleBase.cs @@ -315,15 +315,10 @@ namespace Oqtane.Modules { int pageId = ModuleState.PageId; int moduleId = ModuleState.ModuleId; - int? userId = null; - if (PageState.User != null) - { - userId = PageState.User.UserId; - } string category = GetType().AssemblyQualifiedName; string feature = Utilities.GetTypeNameLastSegment(category, 1); - await LoggingService.Log(alias, pageId, moduleId, userId, category, feature, function, level, exception, message, args); + await LoggingService.Log(alias, pageId, moduleId, PageState.User?.UserId, category, feature, function, level, exception, message, args); } public class Logger diff --git a/Oqtane.Client/Resources/Modules/Admin/Roles/Users.resx b/Oqtane.Client/Resources/Modules/Admin/Roles/Users.resx index e85706e7..99a8f2fa 100644 --- a/Oqtane.Client/Resources/Modules/Admin/Roles/Users.resx +++ b/Oqtane.Client/Resources/Modules/Admin/Roles/Users.resx @@ -1,4 +1,4 @@ - +