diff --git a/SaxoniteCoreWebAdmin/Admin/Consoles/SaxConsoleHelper_WebAdmin.cs b/SaxoniteCoreWebAdmin/Admin/Consoles/SaxConsoleHelper_WebAdmin.cs index 63ee562..faef30a 100644 --- a/SaxoniteCoreWebAdmin/Admin/Consoles/SaxConsoleHelper_WebAdmin.cs +++ b/SaxoniteCoreWebAdmin/Admin/Consoles/SaxConsoleHelper_WebAdmin.cs @@ -28,7 +28,8 @@ namespace Saxonite.Net.Core.Web.Admin.Consoles public override SaxDataCacheConsole GetDataCacheConsole(SaxSessionContext sessionContext) { String fn = GetType().Name + ".GetDataCacheConsole"; - throw new NotSupportedException(fn + " Data Cache Console not supported in Admin app."); + //throw new NotSupportedException(fn + " Data Cache Console not supported in Admin app."); + return null; } //------------------------------------------------------------------- diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/SaxController_Admin.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/SaxController_Admin.cs index 242b97d..6fe7a39 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/SaxController_Admin.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/SaxController_Admin.cs @@ -70,14 +70,21 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers // 'Keep logged in' can be switched off by the application configuration. keepLoggedIn = App.AppConfig.Security.SignIn.KeepLoggedIn.Allowed && keepLoggedIn; - // Log user in. - userAccount.KeepLoggedIn_Admin = keepLoggedIn; - userAccount.LastLoginAt = DateTime.Now; - userAccount.InvalidLoginCount = 0; - userAccount.LastInvalidLoginAt = DateTime.MinValue; - if (!AccountMgr.UpdateUserAccount(userAccount, DbUpdateInfo)) + // Log user in - Admin details stored against System Admin role. + SaxUserRole userRole = userRoles.Find(item => item.UserRole == Sax.UserRole.SystemAdmin); + if (userRole == null) { - SaLogger.Warn(fn + " Failed to update account for " + userAccount.EmailAddress + ": " + AccountMgr.ErrorStateMessage); + SaLogger.Warn(fn + " System Admin role not found for " + userAccount.EmailAddress); + errorMessage = Localiser["security.msg.signin.invalid"]; + return false; + } + userRole.KeepLoggedIn = keepLoggedIn; + userRole.LastLoginAt = DateTime.Now; + userRole.InvalidLoginCount = 0; + userRole.LastInvalidLoginAt = DateTime.MinValue; + if (!AccountMgr.UpdateUserRole(userRole, DbUpdateInfo)) + { + SaLogger.Warn(fn + " Failed to update Admin user role for " + userAccount.EmailAddress + ": " + AccountMgr.ErrorStateMessage); errorMessage = Localiser["security.msg.signin.invalid"]; return false; } @@ -87,7 +94,7 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers OpenUserSession(SessionContext, userAccount, userRoles); // Send the 'Keep Logged In' cookie if requested. - if (userAccount.KeepLoggedIn_Admin) + if (userRole.KeepLoggedIn) SetKeepLoggedInCookie(); return true; diff --git a/SaxoniteCoreWebAdmin/Admin/Controllers/UserController-Ajax.cs b/SaxoniteCoreWebAdmin/Admin/Controllers/UserController-Ajax.cs index 583eabc..a96de50 100644 --- a/SaxoniteCoreWebAdmin/Admin/Controllers/UserController-Ajax.cs +++ b/SaxoniteCoreWebAdmin/Admin/Controllers/UserController-Ajax.cs @@ -30,7 +30,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers public String RegionNameProvince { get; set; } public int UserRoleCount { get; set; } public bool? SystemAdmin { get; set; } = null; - public String LastLoginAt { get; set; } + public String LastOnlineLoginAt { get; set; } + public String LastAdminLoginAt { get; set; } } private class UserData_Full : UserData_List { @@ -50,9 +51,13 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers data.RegionNameProvince = model.GetRegionName(user.RegionIdProvince); data.UserRoleCount = userRoles?.GetUserRolesByStatus(SaStatus.Active).Count ?? 0; data.SystemAdmin = (userRoles != null && userRoles.Exists(item => item.UserRole == Sax.UserRole.SystemAdmin) ? true : (bool?)null); - data.LastLoginAt = model.FormatDateTimeForDisplay(user.LastLoginAt); + data.LastOnlineLoginAt = model.FormatDateTimeForDisplay(user.LastLoginAt); data.StatusCode = user.StatusCode; data.StatusDesc = user.StatusDesc; + // System Admin role. + SaxUserRole userRole_SystemAdmin = userRoles.Find(item => item.UserRole == Sax.UserRole.SystemAdmin); + if (userRole_SystemAdmin != null) + data.LastAdminLoginAt = model.FormatDateTimeForDisplay(userRole_SystemAdmin.LastLoginAt); } private void PopulateUserResponseData(SaxModel_Admin model, UserData_Full data, SaxUserAccount user, List userRoles) { @@ -138,13 +143,14 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers ColumnDfn colUserRoleCount = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.UserRoleCount); ColumnDfn colSystemAdminUser = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.SystemAdminUser); ColumnDfn colLastLogin = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastLoginAt); + ColumnDfn colAdminLastLogin = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.LastAdminLoginAt); ColumnDfn colStatus = AccountMgr.GetUserAccountColumnDfn(SaxUserAccount.Column.Status); List columns = new List() { colId, colEmail, colTitle, colFirstName, colLastName, colCountryName, colProvinceName, colUserRoleCount, colSystemAdminUser, - colLastLogin, colStatus + colLastLogin, colAdminLastLogin, colStatus }; // Query items. @@ -164,7 +170,8 @@ namespace Saxonite.Net.Core.Web.Admin.Controllers RegionNameProvince = values.GetString(colProvinceName.DataName), UserRoleCount = StringUtil.ToInt(values.GetString(colUserRoleCount.DataName)), SystemAdmin = StringUtil.ToBool(values.GetString(colSystemAdminUser.DataName)), - LastLoginAt = model.FormatDateTimeForDisplay(values.GetDateTime(colLastLogin.DataName)), + LastOnlineLoginAt = model.FormatDateTimeForDisplay(values.GetDateTime(colLastLogin.DataName)), + LastAdminLoginAt = model.FormatDateTimeForDisplay(values.GetDateTime(colAdminLastLogin.DataName)), StatusCode = values.GetString(colStatus.DataName), StatusDesc = SacsSystem.GetStatusDescForCode(values.GetString(colStatus.DataName)) }; diff --git a/SaxoniteCoreWebAdmin/Views/User/Index.cshtml b/SaxoniteCoreWebAdmin/Views/User/Index.cshtml index ba143b0..a236052 100644 --- a/SaxoniteCoreWebAdmin/Views/User/Index.cshtml +++ b/SaxoniteCoreWebAdmin/Views/User/Index.cshtml @@ -134,12 +134,13 @@
-
Last login:
+
Online: 
+
-
Roles:
-
-
+
Roles:
+
Admin: 
+
diff --git a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css index 8383757..90c75b4 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css +++ b/SaxoniteCoreWebAdmin/wwwroot/css/sax-data.css @@ -280,8 +280,8 @@ .sax-panel-item > .sax-content { - margin: 4px 8px; - padding: 4px 4px; + margin: 4px 8px 2px 8px; + padding: 2px 2px; } .sax-panel-item .sax-note diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js index dbbee90..3093ee9 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-org.js @@ -109,7 +109,7 @@ } op.showSelectFilterSport = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, items: op.data.sports, fnCallback: op.onFilterSportSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, itemId: $('.FilterOrganisationSportId', $frm.filter).val(), items: op.data.sports, fnCallback: op.onFilterSportSelected }); } op.onFilterSportSelected = function (spt) { @@ -144,7 +144,7 @@ } op.showSelectOrgSport = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, items: op.data.sports, fnCallback: op.onOrgSportSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, itemId: $('.OrganisationSportId', $frm.org).val(), items: op.data.sports, fnCallback: op.onOrgSportSelected }); } op.onOrgSportSelected = function (spt) { @@ -167,7 +167,7 @@ } op.showSelectFilterRegion = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectFilterRegion, items: op.data.regions, fnCallback: op.onFilterRegionSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectFilterRegion, itemId: $('.FilterOrganisationRegionId', $frm.filter).val(), items: op.data.regions, fnCallback: op.onFilterRegionSelected }); } op.onFilterRegionSelected = function (rgn) { @@ -203,7 +203,7 @@ } op.showSelectOrgRegion = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegion, items: op.data.regions, fnCallback: op.onOrgRegionSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegion, itemId: $('.OrganisationRegionIdCountry', $frm.org).val(), items: op.data.regions, fnCallback: op.onOrgRegionSelected }); } op.onOrgRegionSelected = function (rgn) { diff --git a/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr.js b/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr.js index b8cb43b..748bb7e 100644 --- a/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr.js +++ b/SaxoniteCoreWebAdmin/wwwroot/js/sax-usr.js @@ -65,8 +65,10 @@ $('.UserRegionNameProvince', $item).text(item.regionNameProvince); $('.UserRoleCount', $item).text(item.userRoleCount); $('.UserRoles', $item).toggle(!!item.userRoleCount); - $('.UserLastLoginAt', $item).text(item.lastLoginAt); - $('.UserLastLogin', $item).toggle(!!item.lastLoginAt); + $('.UserLastOnlineLoginAt', $item).text(item.lastOnlineLoginAt); + $('.UserLastOnlineLogin', $item).toggle(!!item.lastOnlineLoginAt); + $('.UserLastAdminLoginAt', $item).text(item.lastAdminLoginAt); + $('.UserLastAdminLogin', $item).toggle(!!item.lastAdminLoginAt); $('.StatusDesc', $item).text(item.statusDesc).addClass('sax-status-' + item.statusCode.toLowerCase()); $('.sax-caption .sax-action').toggleClass('sax-action', !item.deleted); let $mnu = $('ul.sax-dropdown-menu', $item); @@ -129,7 +131,7 @@ } sax.showSelectFilterSport = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, items: sax.data.sports, fnCallback: sax.onFilterSportSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectSport, itemId: $('.FilterUserSportId', $frm.filter).val(), items: sax.data.sports, fnCallback: sax.onFilterSportSelected }); } sax.onFilterSportSelected = function (spt) { @@ -171,7 +173,7 @@ } sax.showSelectFilterRegion = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectFilterRegion, items: sax.data.regions, fnCallback: sax.onFilterRegionSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectFilterRegion, itemId: $('.FilterUserRegionId', $frm.filter).val(), items: sax.data.regions, fnCallback: sax.onFilterRegionSelected }); } sax.onFilterRegionSelected = function (rgn) { @@ -193,7 +195,7 @@ } sax.showSelectRegionCountry = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegionCountry, items: sax.data.regions, fnCallback: sax.onRegionCountrySelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegionCountry, itemId: $('.UserRegionIdCountry', $frm.user).val(), items: sax.data.regions, fnCallback: sax.onRegionCountrySelected }); } sax.onRegionCountrySelected = function (rgn) { @@ -215,7 +217,7 @@ } sax.showSelectRegionProvince = function () { - sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegionProvince, items: sax.data.regions, fnCallback: sax.onRegionProvinceSelected }); + sax.data.selectItem.fn.selectItem({ caption: sax.dlg.title.selectRegionProvince, itemId: $('.UserRegionIdProvince', $frm.user).val(), items: sax.data.regions, fnCallback: sax.onRegionProvinceSelected }); } sax.onRegionProvinceSelected = function (rgn) { diff --git a/SaxoniteCoreWebOnline/Online/Controllers/SaxController_Online.cs b/SaxoniteCoreWebOnline/Online/Controllers/SaxController_Online.cs index 3f065dd..ef30a14 100644 --- a/SaxoniteCoreWebOnline/Online/Controllers/SaxController_Online.cs +++ b/SaxoniteCoreWebOnline/Online/Controllers/SaxController_Online.cs @@ -74,7 +74,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers keepLoggedIn = App.AppConfig.Security.SignIn.KeepLoggedIn.Allowed && keepLoggedIn; // Log user in. - userAccount.KeepLoggedIn_Online = keepLoggedIn; + userAccount.KeepLoggedIn = keepLoggedIn; userAccount.LastLoginAt = DateTime.Now; userAccount.InvalidLoginCount = 0; userAccount.LastInvalidLoginAt = DateTime.MinValue; @@ -91,7 +91,7 @@ namespace Saxonite.Net.Core.Web.Online.Controllers RefreshSessionProfileSports(); // Send the 'Keep Logged In' cookie if requested. - if (userAccount.KeepLoggedIn_Online) + if (userAccount.KeepLoggedIn) SetKeepLoggedInCookie(); return true; diff --git a/SaxoniteCoreWebOnline/Views/Security/ChangePassword.cshtml b/SaxoniteCoreWebOnline/Views/Security/ChangePassword.cshtml index 55b37ca..16e674b 100644 --- a/SaxoniteCoreWebOnline/Views/Security/ChangePassword.cshtml +++ b/SaxoniteCoreWebOnline/Views/Security/ChangePassword.cshtml @@ -12,7 +12,7 @@
- @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmChangePassword", @class = "sax-form" })) + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmChangePassword", @class = "sax-form", @onsubmit = "return false;" })) { @if (!Model.RequestPasswordMode) diff --git a/SaxoniteCoreWebOnline/Views/Security/RequestPassword.cshtml b/SaxoniteCoreWebOnline/Views/Security/RequestPassword.cshtml index b1a2a5c..edde393 100644 --- a/SaxoniteCoreWebOnline/Views/Security/RequestPassword.cshtml +++ b/SaxoniteCoreWebOnline/Views/Security/RequestPassword.cshtml @@ -11,7 +11,7 @@
- @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequestPassword", @class = "sax-form" })) + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmRequestPassword", @class = "sax-form", @onsubmit = "return false;" })) {
diff --git a/SaxoniteCoreWebOnline/Views/Security/Signin.cshtml b/SaxoniteCoreWebOnline/Views/Security/Signin.cshtml index e54fe74..1e88e8e 100644 --- a/SaxoniteCoreWebOnline/Views/Security/Signin.cshtml +++ b/SaxoniteCoreWebOnline/Views/Security/Signin.cshtml @@ -12,7 +12,7 @@
- @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSignIn", @class = "sax-form" })) + @using (@Html.BeginForm(FormMethod.Post, new { @id = "frmSignIn", @class = "sax-form", @onsubmit = "return false;" })) {
@@ -46,7 +46,6 @@
@Html.CheckBoxFor(model => model.KeepMeSignedIn, new { @id = "chkKeepMeSignedIn" }) -   @Localiser["label.keep.signed.in"]
diff --git a/SaxoniteCoreWebOnline/wwwroot/js/sax-security.js b/SaxoniteCoreWebOnline/wwwroot/js/sax-security.js index 25aaf84..d8389ec 100644 --- a/SaxoniteCoreWebOnline/wwwroot/js/sax-security.js +++ b/SaxoniteCoreWebOnline/wwwroot/js/sax-security.js @@ -71,16 +71,19 @@ //-------------------------------------------------------------- $(function () { + sax.$frm.signIn = $('#frmSignIn'); $(':input:enabled:visible:first').focus(); $('#ifEmailAddress,#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm').on('input', function () { sax.clearControlError(this); }); - $('#frmChangePassword #ifPassword').on('keyup', sax.doScorePassword); - sax.$prgPasswordStrength = $('#frmChangePassword #prgPasswordStrength').progressbar({ 'max': 5 }); - $('#ifEmailAddress,#ifPassword', $('#frmSignIn')).on('keypress', function (e) { if (e.which == 13) sax.doSignin(); }); - $('#frmSignIn #pbSignIn').on('click', function () { sax.doSignin(); }); - $('#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm', $('#frmChangePassword')).on('keypress', function (e) { if (e.which == 13) sax.doChangePassword(); }); - $('#frmChangePassword #pbChangePassword').on('click', function () { sax.doChangePassword(); }); - $('#ifEmailAddress', $('#frmRequestPassword')).on('keypress', function (e) { if (e.which == 13) sax.doRequestPassword(); }); - $('#frmRequestPassword #pbRequestPassword').on('click', function () { sax.doRequestPassword(); }); + sax.$frm.signIn.on('keypress', '#ifEmailAddress,#ifPassword,#chkKeepMeSignedIn', function (e) { if (e.which == 13 && $('#ifEmailAddress', sax.$frm.signIn).val() && $('#ifPassword', sax.$frm.signIn).val()) sax.doSignin(); }); + sax.$frm.signIn.on('click', '#pbSignIn', function () { sax.doSignin(); }).on('keypress', '#pbSignIn', function (e) { if (e.which == 13) sax.doSignin(); }); + sax.$frm.changePassword = $('#frmChangePassword'); + sax.$frm.changePassword.on('keypress', '#ifPasswordCurrent,#ifPassword,#ifPasswordConfirm', function (e) { if (e.which == 13) sax.doChangePassword(); }); + sax.$frm.changePassword.on('keyup', '#ifPassword', sax.doScorePassword); + sax.$prgPasswordStrength = $('#prgPasswordStrength', sax.$frm.changePassword).progressbar({ 'max': 5 }); + sax.$frm.changePassword.on('click', '#pbChangePassword', function () { sax.doChangePassword(); }).on('keypress', '#pbChangePassword', function (e) { if (e.which == 13) sax.doChangePassword(); }); + sax.$frm.reqPword = $('#frmRequestPassword'); + sax.$frm.reqPword.on('keypress', '#ifEmailAddress', function (e) { if (e.which == 13) sax.doRequestPassword(); }); + sax.$frm.reqPword.on('click', '#pbRequestPassword', function () { sax.doRequestPassword(); }); }); }(window, window.document)); diff --git a/SaxoniteStandardBase/Base/App/Sax-Version.cs b/SaxoniteStandardBase/Base/App/Sax-Version.cs index fc5a2a1..763045c 100644 --- a/SaxoniteStandardBase/Base/App/Sax-Version.cs +++ b/SaxoniteStandardBase/Base/App/Sax-Version.cs @@ -18,7 +18,7 @@ namespace Saxonite.Net.Standard.Base.App //------------------------------------------------------------------- public static class Version { - private static String version { get; } = "1.2.4.1"; + private static String version { get; } = "1.2.4.2"; // Retrieve version. public static String GetFullVersion () { return version; } public static String GetAppVersion () diff --git a/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs b/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs index 84f584c..5881d6e 100644 --- a/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs +++ b/SaxoniteStandardBase/Base/App/SaxDbDfn_Core.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Base.App { @@ -306,6 +306,9 @@ namespace Saxonite.Base.App UserRole_Id, UserRole_UserAccountId, UserRole_UserRoleCode, + UserRole_LastLoginAt, + UserRole_LastInvalidLoginAt, + UserRole_InvalidLoginCount, UserRole_Notes, UserRole_Flags, UserRole_Status, @@ -365,7 +368,7 @@ namespace Saxonite.Base.App //------------------------------------------------------------------- // Data members. private static readonly int tableCount = 18; - private static readonly int columnCount = 318; + private static readonly int columnCount = 321; private static ulong maxTextLen = 0; //------------------------------------------------------------------- @@ -819,6 +822,9 @@ namespace Saxonite.Base.App new ColumnDfn(15,"Id",5,-5,true,19), new ColumnDfn(15,"UserAccountId",4,4,false,10), new ColumnDfn(15,"UserRoleCode",0,12,false,16), + new ColumnDfn(15,"LastLoginAt",9,93,false,16), + new ColumnDfn(15,"LastInvalidLoginAt",9,93,false,16), + new ColumnDfn(15,"InvalidLoginCount",3,5,false,5), new ColumnDfn(15,"Notes",0,-9,false,2000), new ColumnDfn(15,"Flags",3,5,false,5), new ColumnDfn(15,"Status",0,12,false,3), diff --git a/SaxoniteStandardBase/Base/App/SaxSessionData.cs b/SaxoniteStandardBase/Base/App/SaxSessionData.cs index 4067b71..72058af 100644 --- a/SaxoniteStandardBase/Base/App/SaxSessionData.cs +++ b/SaxoniteStandardBase/Base/App/SaxSessionData.cs @@ -75,9 +75,15 @@ namespace Saxonite.Net.Standard.Base.App UserAccountId = userAccount.Id; RefreshUserData(userAccount); if (sessionContext.Application == Sax.Application.Admin) - KeepLoggedIn = userAccount.KeepLoggedIn_Admin; + { + // Admin 'Keep logged in' recorded against System Admin user role. + SaxUserRole userRole = userRoles.Find(item => item.UserRole == Sax.UserRole.SystemAdmin); + if (userRole != null) + KeepLoggedIn = userRole.KeepLoggedIn; + } else if (sessionContext.Application == Sax.Application.Online) - KeepLoggedIn = userAccount.KeepLoggedIn_Online; + // Online 'Keep logged in' recorded against System Admin user role. + KeepLoggedIn = userAccount.KeepLoggedIn; else Debugger.Break(); if (userRoles != null) diff --git a/SaxoniteStandardBase/Base/Bus/SaxUserAccount.cs b/SaxoniteStandardBase/Base/Bus/SaxUserAccount.cs index 74f2489..6fb980a 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxUserAccount.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxUserAccount.cs @@ -48,6 +48,11 @@ namespace Saxonite.Net.Standard.Base.Bus // Associated data. UserRoleCount, SystemAdminUser, + LastAdminLoginOn, + LastAdminLoginAt, + LastInvalidAdminLoginOn, + LastInvalidAdminLoginAt, + InvalidAdminLoginCount, // Common. Notes, Flags, @@ -453,17 +458,11 @@ namespace Saxonite.Net.Standard.Base.Bus //------------------------------------------------------------------- // Flags - positions 1-16 available. - public Byte Flag_KeepLoggedIn_Admin { get; } = 0x1; - public Byte Flag_KeepLoggedIn_Online { get; } = 0x2; - public bool KeepLoggedIn_Admin + public Byte Flag_KeepLoggedIn { get; } = 0x1; + public bool KeepLoggedIn { - get { return GetFlag(Flag_KeepLoggedIn_Admin); } - set { SetFlag(Flag_KeepLoggedIn_Admin, value); } - } - public bool KeepLoggedIn_Online - { - get { return GetFlag(Flag_KeepLoggedIn_Online); } - set { SetFlag(Flag_KeepLoggedIn_Online, value); } + get { return GetFlag(Flag_KeepLoggedIn); } + set { SetFlag(Flag_KeepLoggedIn, value); } } //------------------------------------------------------------------- diff --git a/SaxoniteStandardBase/Base/Bus/SaxUserRole.cs b/SaxoniteStandardBase/Base/Bus/SaxUserRole.cs index 427b5e0..1540a4a 100644 --- a/SaxoniteStandardBase/Base/Bus/SaxUserRole.cs +++ b/SaxoniteStandardBase/Base/Bus/SaxUserRole.cs @@ -21,6 +21,12 @@ namespace Saxonite.Net.Standard.Base.Bus UserAccountId, UserRole, UserRole_Desc, + // Login - Admin for System user. + LastLoginOn, + LastLoginAt, + LastInvalidLoginOn, + LastInvalidLoginAt, + InvalidLoginCount, // User. User_EmailAddress, User_DisplayName, @@ -44,6 +50,10 @@ namespace Saxonite.Net.Standard.Base.Bus { public SysId UserAccountId { get; set; } public Sax.UserRole UserRole { get; set; } + // Login. + public DateTime LastLoginAt { get; set; } = DateTime.MinValue; + public DateTime LastInvalidLoginAt { get; set; } = DateTime.MinValue; + public short InvalidLoginCount { get; set; } } //------------------------------------------------------------------- @@ -68,11 +78,31 @@ namespace Saxonite.Net.Standard.Base.Bus get { return data.UserRole; } set { CheckChanged((int)data.UserRole, (int)value); data.UserRole = value; } } + // Login. + public DateTime LastLoginAt + { + get { return data.LastLoginAt; } + set { CheckChanged(data.LastLoginAt, value); data.LastLoginAt = value; } + } + public DateTime LastInvalidLoginAt + { + get { return data.LastInvalidLoginAt; } + set { CheckChanged(data.LastInvalidLoginAt, value); data.LastInvalidLoginAt = value; } + } + public short InvalidLoginCount + { + get { return data.InvalidLoginCount; } + set { CheckChanged(data.InvalidLoginCount, value); data.InvalidLoginCount = value; } + } // Population. internal void PopulateFrom(Data data) { UserAccountId = data.UserAccountId; UserRole = data.UserRole; + // Login. + LastLoginAt = data.LastLoginAt; + LastInvalidLoginAt = data.LastInvalidLoginAt; + InvalidLoginCount = data.InvalidLoginCount; base.PopulateFrom(data); } public Data Clone() @@ -90,6 +120,10 @@ namespace Saxonite.Net.Standard.Base.Bus // Identifies the field that has invalid data. public ValidValue UserAccountId { get; set; } = ValidValue.Valid; public ValidValue UserRole { get; set; } = ValidValue.Valid; + // Login. + public ValidValue LastLogin { get; set; } = ValidValue.Valid; + public ValidValue LastInvalidLogin { get; set; } = ValidValue.Valid; + public ValidValue InvalidLoginCount { get; set; } = ValidValue.Valid; } //------------------------------------------------------------------- @@ -164,8 +198,32 @@ namespace Saxonite.Net.Standard.Base.Bus protected set { data.UserRole = value; } } + // Login - Admin application for System Admin role. + public DateTime LastLoginAt + { + get { return data.LastLoginAt; } + set { data.LastLoginAt = value; } + } + public DateTime LastInvalidLoginAt + { + get { return data.LastInvalidLoginAt; } + set { data.LastInvalidLoginAt = value; } + } + public short InvalidLoginCount + { + get { return data.InvalidLoginCount; } + set { data.InvalidLoginCount = value; } + } + //------------------------------------------------------------------- // Flags - positions 1-16 available. + // Keep logged in - Admin application for System Admin role. + public Byte Flag_KeepLoggedIn { get; } = 0x1; + public bool KeepLoggedIn + { + get { return GetFlag(Flag_KeepLoggedIn); } + set { SetFlag(Flag_KeepLoggedIn, value); } + } //------------------------------------------------------------------- // A s s o c i a t e d D a t a diff --git a/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserRole.cs b/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserRole.cs index 367fc93..72cf8a6 100644 --- a/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserRole.cs +++ b/SaxoniteStandardBase/Base/Mgr/SaxAccountMgr-UserRole.cs @@ -2,6 +2,7 @@ using Sarand.Net.Standard.Base.Bus; using Sarand.Net.Standard.Base.Core; using Sarand.Net.Standard.Base.Dbas; +using Sarand.Net.Standard.Base.Utils; using Saxonite.Base.App; using Saxonite.Net.Standard.Base.App; using Saxonite.Net.Standard.Base.Bus; @@ -91,6 +92,32 @@ namespace Saxonite.Net.Standard.Base.Mgr return SetErrorState("User Role must be specified"); } + // Login - Admin application for System users. + if (errField.LastLogin != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.LastLoginAt)) + { + if (data.UserRole != Sax.UserRole.SystemAdmin) + { + errField.LastLogin = SacsHierarchyItem.ValidValue.Invalid; + return SetErrorState("Last Login can only be set for System Admin role"); + } + } + if (errField.LastInvalidLogin != SacsHierarchyItem.ValidValue.Ignore && DateUtil.IsValid(data.LastInvalidLoginAt)) + { + if (data.UserRole != Sax.UserRole.SystemAdmin) + { + errField.LastLogin = SacsHierarchyItem.ValidValue.Invalid; + return SetErrorState("Last Invalid Login can only be set for System Admin role"); + } + } + if (errField.InvalidLoginCount != SacsHierarchyItem.ValidValue.Ignore && data.InvalidLoginCount > 0) + { + if (data.UserRole != Sax.UserRole.SystemAdmin) + { + errField.LastLogin = SacsHierarchyItem.ValidValue.Invalid; + return SetErrorState("Invalid Login Count can only be set for System Admin role"); + } + } + //--------------------------------------------------------------- // Common properties. if (errField.Notes != SacsHierarchyItem.ValidValue.Ignore && !IsValidValue(data.Notes, "notes", (long)SaxDbDfn_Core.GetColTextLen(SaxDbDfn_Core.ColumnIdx.UserRole_Notes))) diff --git a/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs index cc7f38d..e411825 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ActivityIndex_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs index b4d427f..7ece62c 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Article_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs index 4e2f245..9bf4dfd 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemAddress_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs index 71487a4..a8943c9 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemImage_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs index 35896d4..e6f29f4 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/ItemSport_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs index 50edb49..e010dc3 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/OrganisationEvent_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs index 9e08e93..edf7ea0 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/OrganisationOpportunity_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs index e497567..a365e55 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Organisation_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs index f780d82..db93cae 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Region_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs index 1965f0b..2378ead 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/Sport_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs index e554233..6a470ab 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserAccount_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs index 8d476ab..5031bcd 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserActivity_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs index c0ba09a..0b4dee0 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserOnline_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs index 9ba95a3..1afa969 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserOrganisation_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs index ba3f968..9a4ca6d 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserRole_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { @@ -22,6 +22,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal public ColumnDataInt64 _Id { get; } = new ColumnDataInt64("Id", true); public ColumnDataInt32 _UserAccountId { get; } = new ColumnDataInt32("UserAccountId"); public ColumnDataString _UserRoleCode { get; } = new ColumnDataString("UserRoleCode"); + public ColumnDataDateTime _LastLoginAt { get; } = new ColumnDataDateTime("LastLoginAt"); + public ColumnDataDateTime _LastInvalidLoginAt { get; } = new ColumnDataDateTime("LastInvalidLoginAt"); + public ColumnDataInt16 _InvalidLoginCount { get; } = new ColumnDataInt16("InvalidLoginCount"); public ColumnDataString _Notes { get; } = new ColumnDataString("Notes"); public ColumnDataInt16 _Flags { get; } = new ColumnDataInt16("Flags"); public ColumnDataString _Status { get; } = new ColumnDataString("Status"); @@ -40,6 +43,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal "Id", "UserAccountId", "UserRoleCode", + "LastLoginAt", + "LastInvalidLoginAt", + "InvalidLoginCount", "Notes", "Flags", "Status", @@ -84,6 +90,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal public Int64 _Id { get { return Cols._Id.Value; } set { Cols._Id.Value = value; } } public Int32 _UserAccountId { get { return Cols._UserAccountId.Value; } set { Cols._UserAccountId.Value = value; } } public String _UserRoleCode { get { return Cols._UserRoleCode.Value; } set { Cols._UserRoleCode.Value = value; } } + public DateTime _LastLoginAt { get { return Cols._LastLoginAt.Value; } set { Cols._LastLoginAt.Value = value; } } + public DateTime _LastInvalidLoginAt { get { return Cols._LastInvalidLoginAt.Value; } set { Cols._LastInvalidLoginAt.Value = value; } } + public Int16 _InvalidLoginCount { get { return Cols._InvalidLoginCount.Value; } set { Cols._InvalidLoginCount.Value = value; } } public String _Notes { get { return Cols._Notes.Value; } set { Cols._Notes.Value = value; } } public Int16 _Flags { get { return Cols._Flags.Value; } set { Cols._Flags.Value = value; } } public String _Status { get { return Cols._Status.Value; } set { Cols._Status.Value = value; } } @@ -117,6 +126,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal _Id = GetFieldInt64(dbDataReader, "Id", _Id); _UserAccountId = GetFieldInt32(dbDataReader, "UserAccountId", _UserAccountId); _UserRoleCode = GetFieldString(dbDataReader, "UserRoleCode", _UserRoleCode); + _LastLoginAt = GetFieldDateTime(dbDataReader, "LastLoginAt", _LastLoginAt); + _LastInvalidLoginAt = GetFieldDateTime(dbDataReader, "LastInvalidLoginAt", _LastInvalidLoginAt); + _InvalidLoginCount = GetFieldInt16(dbDataReader, "InvalidLoginCount", _InvalidLoginCount); _Notes = GetFieldString(dbDataReader, "Notes", _Notes); _Flags = GetFieldInt16(dbDataReader, "Flags", _Flags); _Status = GetFieldString(dbDataReader, "Status", _Status); @@ -149,6 +161,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal dbCommand.Parameters.Clear(); if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("UserRoleCode")) AddCommandParameter(dbCommand, "@UserRoleCode", _UserRoleCode); + if (columnNames.ContainsCI("LastLoginAt")) AddCommandParameter(dbCommand, "@LastLoginAt", _LastLoginAt); + if (columnNames.ContainsCI("LastInvalidLoginAt")) AddCommandParameter(dbCommand, "@LastInvalidLoginAt", _LastInvalidLoginAt); + if (columnNames.ContainsCI("InvalidLoginCount")) AddCommandParameter(dbCommand, "@InvalidLoginCount", _InvalidLoginCount); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status); @@ -196,6 +211,9 @@ namespace Saxonite.Net.Standard.Dbas.Internal dbCommand.Parameters.Clear(); if (columnNames.ContainsCI("UserAccountId")) AddCommandParameter(dbCommand, "@UserAccountId", _UserAccountId); if (columnNames.ContainsCI("UserRoleCode")) AddCommandParameter(dbCommand, "@UserRoleCode", _UserRoleCode); + if (columnNames.ContainsCI("LastLoginAt")) AddCommandParameter(dbCommand, "@LastLoginAt", _LastLoginAt); + if (columnNames.ContainsCI("LastInvalidLoginAt")) AddCommandParameter(dbCommand, "@LastInvalidLoginAt", _LastInvalidLoginAt); + if (columnNames.ContainsCI("InvalidLoginCount")) AddCommandParameter(dbCommand, "@InvalidLoginCount", _InvalidLoginCount); if (columnNames.ContainsCI("Notes")) AddCommandParameter(dbCommand, "@Notes", _Notes); if (columnNames.ContainsCI("Flags")) AddCommandParameter(dbCommand, "@Flags", _Flags); if (columnNames.ContainsCI("Status")) AddCommandParameter(dbCommand, "@Status", _Status); diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs index c511922..334a49d 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSession_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs index bf589d2..4800912 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSportExperience_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs b/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs index 816ae6b..d60a5be 100644 --- a/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs +++ b/SaxoniteStandardDbas/Dbas/Internal/UserSport_Db.cs @@ -9,7 +9,7 @@ using System.Data.Common; using System.Linq; //--------------------------------------------------------------------------- -// Code generated by Sarand Database Utilities Fri 4-Mar-2022 15:28:05 +// Code generated by Sarand Database Utilities Mon 7-Mar-2022 10:06:56 //--------------------------------------------------------------------------- namespace Saxonite.Net.Standard.Dbas.Internal { diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserAccount.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserAccount.cs index 246dcdb..d77e762 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserAccount.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserAccount.cs @@ -286,13 +286,15 @@ namespace Saxonite.Net.Standard.Dbas.Mgr // Item column definitions. private static readonly String aliasUserAccount = "UsrAct"; private static readonly String aliasUserAccount_Region_Country = "UsrAct_Ctr"; - private static readonly String prefixUserAccount_Region_Country = "UsrAct_Ctr_"; + private static readonly String prefixUserAccount_Region_Country = aliasUserAccount_Region_Country + "_"; private static readonly String aliasUserAccount_Region_Province = "UsrAct_Prv"; - private static readonly String prefixUserAccount_Region_Province = "UsrAct_Prv_"; + private static readonly String prefixUserAccount_Region_Province = aliasUserAccount_Region_Province + "_"; + private static readonly String aliasUserAccount_UserRole_SysAdmin = "UsrAct_UsrRol_SysAdm"; + private static readonly String prefixUserAccount_UserRole_SysAdmin = aliasUserAccount_UserRole_SysAdmin + "_"; private static readonly String aliasUserAccount_UserSport = "UsrAct_UsrSpt"; - //private static readonly String prefixUserAccount_UserSport = "UsrAct_UsrSpt_"; + //private static readonly String prefixUserAccount_UserSport = aliasUserAccount_UserSport + "_"; private static readonly String aliasUserAccount_UserRole = "UsrAct_UsrRol"; - //private static readonly String prefixUserAccount_UserRole = "UsrAct_UsrRol_"; + //private static readonly String prefixUserAccount_UserRole = aliasUserAccount_UserRole + "_"; private static readonly String colUserAccount_UserRoleCount = "UsrAct_RoleCount"; private static readonly String colUserAccount_SystemAdminRole = "UsrAct_SystemAdminRole"; private void SetUserAccountColDfn @@ -409,6 +411,26 @@ namespace Saxonite.Net.Standard.Dbas.Mgr columnDfn.DataName = colUserAccount_SystemAdminRole; columnDfn.ReadOnly = true; break; + case SaxUserAccount.Column.LastAdminLoginOn: + SetUserAccountColDfn(columnDfn, "Last Admin login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.Date, aliasUserAccount_UserRole_SysAdmin, prefixUserAccount_UserRole_SysAdmin); + columnDfn.ReadOnly = true; + break; + case SaxUserAccount.Column.LastAdminLoginAt: + SetUserAccountColDfn(columnDfn, "Last Admin login", 120, SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasUserAccount_UserRole_SysAdmin, prefixUserAccount_UserRole_SysAdmin); + columnDfn.ReadOnly = true; + break; + case SaxUserAccount.Column.LastInvalidAdminLoginOn: + SetUserAccountColDfn(columnDfn, "Last invalid Admin login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt, ColumnAlignment.Center, DataValue.DataType.Date, aliasUserAccount_UserRole_SysAdmin, prefixUserAccount_UserRole_SysAdmin); + columnDfn.ReadOnly = true; + break; + case SaxUserAccount.Column.LastInvalidAdminLoginAt: + SetUserAccountColDfn(columnDfn, "Last invalid Admin login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt, ColumnAlignment.Center, DataValue.DataType.DateTime, aliasUserAccount_UserRole_SysAdmin, prefixUserAccount_UserRole_SysAdmin); + columnDfn.ReadOnly = true; + break; + case SaxUserAccount.Column.InvalidAdminLoginCount: + SetUserAccountColDfn(columnDfn, "Invalid Admin logins", 80, SaxDbDfn_Core.ColumnIdx.UserRole_InvalidLoginCount, ColumnAlignment.Center, DataValue.DataType.Long, aliasUserAccount_UserRole_SysAdmin, prefixUserAccount_UserRole_SysAdmin); + columnDfn.ReadOnly = true; + break; //----------------------------------------------------------- // Common properties. @@ -738,9 +760,13 @@ namespace Saxonite.Net.Standard.Dbas.Mgr bool hasProvinceRegionCols = columns.HasId(SaxUserAccount.Column.RegionProvince_Name); if (columns.HasId(SaxUserAccount.Column.RegionIdProvince) || hasProvinceRegionCols) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_RegionIdProvince, aliasUserAccount)); - // Security. + // Login. if (columns.HasId(SaxUserAccount.Column.LastLoginOn) || columns.HasId(SaxUserAccount.Column.LastLoginAt)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_LastLoginAt, aliasUserAccount)); + if (columns.HasId(SaxUserAccount.Column.LastInvalidLoginOn) || columns.HasId(SaxUserAccount.Column.LastInvalidLoginAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_LastInvalidLoginAt, aliasUserAccount)); + if (columns.HasId(SaxUserAccount.Column.InvalidLoginCount)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_InvalidLoginCount, aliasUserAccount)); // Common properties. if (columns.HasId(SaxUserAccount.Column.Notes)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_Notes, aliasUserAccount)); @@ -781,6 +807,23 @@ namespace Saxonite.Net.Standard.Dbas.Mgr query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasUserAccount_Region_Province), prefixUserAccount_Region_Province + SaxDbDfn_Core.GetColumnName(col, false)); } + //--------------------------------------------------------------------- + // System Admin User Role. + if (columns.Exists(item => SaxDbDfn_Core.GetTableForColumn((SaxDbDfn_Core.ColumnIdx)item.DbColumn) == SaxDbDfn_Core.TableIdx.UserRole)) + { + DbQueryJoin joinSysAdmin = new DbQueryJoin(DbJoinType.LeftOuter); + joinSysAdmin.Table = new StringPair(SaxDbDfn_Core.GetTableName(SaxDbDfn_Core.TableIdx.UserRole), aliasUserAccount_UserRole_SysAdmin); + joinSysAdmin.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_UserAccountId, aliasUserAccount_UserRole_SysAdmin) + "=" + SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserAccount_Id, aliasUserAccount)); + joinSysAdmin.Filters.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_UserRoleCode, aliasUserAccount_UserRole_SysAdmin) + "='" + UserRoleCodes.GetCodeForType(Sax.UserRole.SystemAdmin) + "'"); + query.Joins.Add(joinSysAdmin); + List cols = new List(); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt); + cols.Add(SaxDbDfn_Core.ColumnIdx.UserRole_InvalidLoginCount); + foreach (var col in cols) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(col, aliasUserAccount_UserRole_SysAdmin), prefixUserAccount_UserRole_SysAdmin + SaxDbDfn_Core.GetColumnName(col, false)); + } + //--------------------------------------------------------------------- // User Role count. if (columns.HasId(SaxUserAccount.Column.UserRoleCount)) diff --git a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserRole.cs b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserRole.cs index 8a69a22..41e6469 100644 --- a/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserRole.cs +++ b/SaxoniteStandardDbas/Dbas/Mgr/SaxAccountMgr_Dbas-UserRole.cs @@ -214,6 +214,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr dbUserRole._Id = SysId.ToLong(userRole.Id); dbUserRole._UserAccountId = SysId.ToInt(userRole.UserAccountId); dbUserRole._UserRoleCode = UserRoleCodes.GetCodeForType(userRole.UserRole); + // Login. + dbUserRole._LastLoginAt = userRole.LastLoginAt; + dbUserRole._LastInvalidLoginAt = userRole.LastInvalidLoginAt; + dbUserRole._InvalidLoginCount = userRole.InvalidLoginCount; // Common. dbUserRole._Notes = userRole.Notes; dbUserRole._Status = SacsSystem.GetStatusCode(userRole.Status); @@ -233,6 +237,10 @@ namespace Saxonite.Net.Standard.Dbas.Mgr //userRole.Id = new SysId(dbUserRole._Id); //userRole.UserAccountId = new SysId(dbUserRole._UserAccountId); //userRole.UserRole = (Sax.UserRole)UserRoles.GetTypeForCode(dbUserRole._UserRoleCode); + // Login. + userRole.LastLoginAt = dbUserRole._LastLoginAt; + userRole.LastInvalidLoginAt = dbUserRole._LastInvalidLoginAt; + userRole.InvalidLoginCount = dbUserRole._InvalidLoginCount; // Common. userRole.Notes = dbUserRole._Notes; userRole.Status = SacsSystem.GetStatusForCode(dbUserRole._Status); @@ -282,6 +290,29 @@ namespace Saxonite.Net.Standard.Dbas.Mgr columnDfn.ReadOnly = true; break; + //------------------------------------------------------- + // Login. + case SaxUserRole.Column.LastLoginOn: + SetUserRoleColDfn(columnDfn, "Last login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.Date); + columnDfn.ReadOnly = true; + break; + case SaxUserRole.Column.LastLoginAt: + SetUserRoleColDfn(columnDfn, "Last login", 120, SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt, ColumnAlignment.Center, DataValue.DataType.DateTime); + columnDfn.ReadOnly = true; + break; + case SaxUserRole.Column.LastInvalidLoginOn: + SetUserRoleColDfn(columnDfn, "Last invalid login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt, ColumnAlignment.Center, DataValue.DataType.Date); + columnDfn.ReadOnly = true; + break; + case SaxUserRole.Column.LastInvalidLoginAt: + SetUserRoleColDfn(columnDfn, "Last invalid login", 100, SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt, ColumnAlignment.Center, DataValue.DataType.DateTime); + columnDfn.ReadOnly = true; + break; + case SaxUserRole.Column.InvalidLoginCount: + SetUserRoleColDfn(columnDfn, "Invalid logins", 80, SaxDbDfn_Core.ColumnIdx.UserRole_InvalidLoginCount, ColumnAlignment.Center, DataValue.DataType.Long); + columnDfn.ReadOnly = true; + break; + //------------------------------------------------------- // User. case SaxUserRole.Column.User_EmailAddress: @@ -494,6 +525,13 @@ namespace Saxonite.Net.Standard.Dbas.Mgr query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_UserAccountId, aliasUserRole)); if (columns.HasId(SaxUserRole.Column.UserRole) || columns.HasId(SaxUserRole.Column.UserRole_Desc)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_UserRoleCode, aliasUserRole)); + // Login. + if (columns.HasId(SaxUserRole.Column.LastLoginOn) || columns.HasId(SaxUserRole.Column.LastLoginAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_LastLoginAt, aliasUserRole)); + if (columns.HasId(SaxUserRole.Column.LastInvalidLoginOn) || columns.HasId(SaxUserRole.Column.LastInvalidLoginAt)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_LastInvalidLoginAt, aliasUserRole)); + if (columns.HasId(SaxUserRole.Column.InvalidLoginCount)) + query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_InvalidLoginCount, aliasUserRole)); // Common properties. if (columns.HasId(SaxUserRole.Column.Notes)) query.Columns.Add(SaxDbDfn_Core.GetColumnNameQual(SaxDbDfn_Core.ColumnIdx.UserRole_Notes, aliasUserRole)); diff --git a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml index 1702b91..2702dcb 100644 --- a/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml +++ b/SaxoniteStandardDbas/Resources/Database/SaxDbDfn_Core.xml @@ -5764,6 +5764,57 @@ dbo UserRole
4 + LastLoginAt + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + + + + dbo + UserRole
+ 5 + LastInvalidLoginAt + DateTime + + 93 + smalldatetime + false + 16 + 16 + 0 + Nullable + true + +
+ + dbo + UserRole
+ 6 + InvalidLoginCount + SmallInt + + 5 + smallint + false + 5 + 2 + 0 + Nullable + true + +
+ + dbo + UserRole
+ 7 Notes VarChar @@ -5780,7 +5831,7 @@ dbo UserRole
- 5 + 8 Flags SmallInt @@ -5797,7 +5848,7 @@ dbo UserRole
- 6 + 9 Status VarChar @@ -5814,7 +5865,7 @@ dbo UserRole
- 7 + 10 CreateOn DateTime @@ -5831,7 +5882,7 @@ dbo UserRole
- 8 + 11 CreateBy Int @@ -5848,7 +5899,7 @@ dbo UserRole
- 9 + 12 CreateHost VarChar @@ -5865,7 +5916,7 @@ dbo UserRole
- 10 + 13 UpdateOn DateTime @@ -5882,7 +5933,7 @@ dbo UserRole
- 11 + 14 UpdateBy Int @@ -5899,7 +5950,7 @@ dbo UserRole
- 12 + 15 UpdateHost VarChar @@ -6887,7 +6938,7 @@ false false 1 - 2 + 3 false