diff --git a/Oqtane.Client/Modules/Admin/Files/Edit.razor b/Oqtane.Client/Modules/Admin/Files/Edit.razor new file mode 100644 index 00000000..8ad0f1ca --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Files/Edit.razor @@ -0,0 +1,85 @@ +@namespace Oqtane.Modules.Admin.Files +@inherits ModuleBase +@inject IFolderService FolderService +@inject NavigationManager NavigationManager + + + + + + + + + + +
+ + + +
+ + + +
+ +Cancel +
+
+ + +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Admin; } } + + int FolderId; + string name; + string permissions; + string createdby; + DateTime createdon; + string modifiedby; + DateTime modifiedon; + + PermissionGrid permissiongrid; + + protected override async Task OnInitializedAsync() + { + try + { + FolderId = Int32.Parse(PageState.QueryString["id"]); + Folder folder = await FolderService.GetFolderAsync(FolderId); + if (folder != null) + { + name = folder.Name; + permissions = folder.Permissions; + createdby = folder.CreatedBy; + createdon = folder.CreatedOn; + modifiedby = folder.ModifiedBy; + modifiedon = folder.ModifiedOn; + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading Folder {FolderId} {Error}", FolderId, ex.Message); + AddModuleMessage("Error Loading Module", MessageType.Error); + } + } + + private async Task SaveFolder() + { + try + { + Folder folder = await FolderService.GetFolderAsync(FolderId); + if (folder != null) + { + folder.Permissions = permissiongrid.GetPermissions(); + await FolderService.UpdateFolderAsync(folder); + await logger.LogInformation("Folder Saved {Folder}", folder); + NavigationManager.NavigateTo(NavigateUrl(Reload.Site)); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving Folder {FolderId} {Error}", FolderId, ex.Message); + AddModuleMessage("Error Saving Module", MessageType.Error); + } + } +} diff --git a/Oqtane.Client/Modules/Admin/Jobs/Log.razor b/Oqtane.Client/Modules/Admin/Jobs/Log.razor index bc48f07c..d2177e94 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Log.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Log.razor @@ -8,22 +8,23 @@ } else { - -
- Name - Status - Started - Finished - Notes -
- - @context.Job.Name - @DisplayStatus(context.Job.IsExecuting, context.Succeeded) - @context.StartDate - @context.FinishDate - - -
+ +
+ Name + Status + Started + Finished +
+ + @context.Job.Name + @DisplayStatus(context.Job.IsExecuting, context.Succeeded) + @context.StartDate + @context.FinishDate + + + @context.Notes + +
} @code { diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index 4af77908..654f292a 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -5,6 +5,10 @@ @inject IUserService UserService @inject IServiceProvider ServiceProvider +@if (Message != "") +{ + +} ... @@ -30,6 +34,8 @@ +

+
@@ -37,14 +43,35 @@ @code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } - public string Username { get; set; } = ""; - public string Password { get; set; } = ""; - public bool Remember { get; set; } = false; + string ReturnUrl = ""; + public string Message = ""; + public MessageType Type = MessageType.Info; + public string Username = ""; + public string Password = ""; + public bool Remember = false; + + protected override void OnInitialized() + { + if (PageState.QueryString.ContainsKey("returnurl")) + { + ReturnUrl = PageState.QueryString["returnurl"]; + } + if (PageState.QueryString.ContainsKey("verified")) + { + if (PageState.QueryString["verified"] == "1") + { + Message = "User Account Verified Successfully. You Can Now Login With Your Username And Password Below."; + } + else + { + Message = "User Account Could Not Be Verified. Please Contact Your Administrator For Further Instructions."; + Type = MessageType.Warning; + } + } + } private async Task Login() { - string ReturnUrl = PageState.QueryString["returnurl"]; - var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider)); if (authstateprovider == null) { @@ -61,12 +88,12 @@ var interop = new Interop(jsRuntime); string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken"); var fields = new { __RequestVerificationToken = antiforgerytoken, username = Username, password = Password, remember = Remember, returnurl = ReturnUrl }; - await interop.SubmitForm("/login/", fields); + await interop.SubmitForm("/pages/login/", fields); } else { await logger.LogInformation("Login Failed For Username {Username}", Username); - AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive.", MessageType.Error); + AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Email Verification When They Initially Created.", MessageType.Error); } } else @@ -86,14 +113,36 @@ else { await logger.LogInformation("Login Failed For Username {Username}", Username); - AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive.", MessageType.Error); + AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Verification When They Are Initially Created So You May Wish To Check Your Email.", MessageType.Error); } } } private void Cancel() { - string ReturnUrl = PageState.QueryString["returnurl"]; NavigationManager.NavigateTo(ReturnUrl); } + + private async Task Forgot() + { + if (Username != "") + { + User user = await UserService.GetUserAsync(Username, PageState.Site.SiteId); + if (user != null) + { + await UserService.ForgotPasswordAsync(user); + Message = "Please Check The Email Address Associated To Your User Account For A Password Reset Notification"; + } + else + { + Message = "User Does Not Exist"; + Type = MessageType.Warning; + } + } + else + { + Message = "Please Enter The Username Related To Your Account And Then Click The Forgot Password Option"; + } + StateHasChanged(); + } } diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index 96f56640..40b59b89 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -3,6 +3,11 @@ @inject NavigationManager NavigationManager @inject IUserService UserService +@if (Message != "") +{ + +} +
@@ -13,43 +18,62 @@
- - + +
- +
+ + +
+
+ + +
+
@code { public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } + string Message = "Please Note That Registration Requires A Valid Email Address In Order To Verify Your Identity"; string Username = ""; string Password = ""; + string Confirm = ""; string Email = ""; + string DisplayName = ""; - private async Task RegisterUser() + private async Task Register() { try { - if (Username != "" && Password != "" && Email != "") + Message = ""; + if (Username != "" && Password != "" && Confirm != "" && Email != "") { - User user = new User(); - user.SiteId = PageState.Site.SiteId; - user.Username = Username; - user.DisplayName = Username; - user.Email = Email; - user.Password = Password; - user = await UserService.AddUserAsync(user); - - if (user != null) + if (Password == Confirm) { - await logger.LogInformation("User Created {Username} {Email}", Username, Email); - NavigationManager.NavigateTo(NavigateUrl("")); + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Username; + user.DisplayName = (DisplayName == "" ? Username : DisplayName); + user.Email = Email; + user.Password = Password; + user = await UserService.AddUserAsync(user); + + if (user != null) + { + await logger.LogInformation("User Created {Username} {Email}", Username, Email); + AddModuleMessage("User Account Created. Please Check Your Email For Verification Instructions.", MessageType.Info); + } + else + { + await logger.LogError("Error Adding User {Username} {Email}", Username, Email); + AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + } } else { - await logger.LogError("Error Adding User {Username} {Email}", Username, Email); - AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); } } else diff --git a/Oqtane.Client/Modules/Admin/Reset/Index.razor b/Oqtane.Client/Modules/Admin/Reset/Index.razor new file mode 100644 index 00000000..5117ca90 --- /dev/null +++ b/Oqtane.Client/Modules/Admin/Reset/Index.razor @@ -0,0 +1,89 @@ +@namespace Oqtane.Modules.Admin.Reset +@inherits ModuleBase +@inject NavigationManager NavigationManager +@inject IUserService UserService + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ +@code { + public override SecurityAccessLevel SecurityAccessLevel { get { return SecurityAccessLevel.Anonymous; } } + + string Username = ""; + string Password = ""; + string Confirm = ""; + + protected override void OnInitialized() + { + if (PageState.QueryString.ContainsKey("name") && PageState.QueryString.ContainsKey("token")) + { + Username = PageState.QueryString["name"]; + } + else + { + NavigationManager.NavigateTo(NavigateUrl("")); + } + } + + private async Task Reset() + { + try + { + if (Username != "" && Password != "" && Confirm != "") + { + if (Password == Confirm) + { + User user = new User(); + user.SiteId = PageState.Site.SiteId; + user.Username = Username; + user.DisplayName = Username; + user.Password = Password; + user = await UserService.ResetPasswordAsync(user, PageState.QueryString["token"]); + + if (user != null) + { + await logger.LogInformation("User Password Reset {Username}", Username); + NavigationManager.NavigateTo(NavigateUrl("login")); + } + else + { + await logger.LogError("Error Resetting User Password {Username}", Username); + AddModuleMessage("Error Resetting User Password. Please Ensure Password Meets Complexity Requirements.", MessageType.Error); + } + } + else + { + AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + } + } + else + { + AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning); + } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Resetting User Password {Username} {Error}", Username, ex.Message); + AddModuleMessage("Error Resetting User Password", MessageType.Error); + } + } + + private void Cancel() + { + NavigationManager.NavigateTo(NavigateUrl("")); + } +} diff --git a/Oqtane.Client/Modules/Admin/Sites/Add.razor b/Oqtane.Client/Modules/Admin/Sites/Add.razor index 66a7d303..5c1532cb 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Add.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Add.razor @@ -101,7 +101,7 @@ else - + @@ -143,7 +143,7 @@ else urls = PageState.Alias.Name; themes = ThemeService.GetThemeTypes(PageState.Themes); containers = ThemeService.GetContainerTypes(PageState.Themes); - username = PageState.User.Username; + username = Constants.HostUser; } private async void TenantChanged(ChangeEventArgs e) diff --git a/Oqtane.Client/Modules/Admin/Sites/Edit.razor b/Oqtane.Client/Modules/Admin/Sites/Edit.razor index b870e57d..42c0e108 100644 --- a/Oqtane.Client/Modules/Admin/Sites/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Sites/Edit.razor @@ -4,6 +4,7 @@ @inject ISiteService SiteService @inject IAliasService AliasService @inject IThemeService ThemeService +@inject ISettingService SettingService @if (themes == null) { @@ -11,92 +12,141 @@ } else { - - - - - - - -
- - - -
- - -