Session Console and Internals.
This commit is contained in:
@@ -10,6 +10,7 @@ using Sarand.BusinessMgr.Net.Standard.Base.Bus.Control;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Consoles;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Core;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.Mgr.Control;
|
||||
using Sarand.BusinessMgr.Net.Standard.Dbas.App;
|
||||
using Sarand.BusinessMgr.Net.Standard.Dbas.Consoles;
|
||||
using Sarand.BusinessMgr.Web.Portal.Consoles;
|
||||
using Sarand.BusinessMgr.Web.Portal.Helpers;
|
||||
@@ -40,30 +41,21 @@ namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
|
||||
// Session contexts.
|
||||
private static ushort sessionContextIdx_Next = 100;
|
||||
private class SessionContextData
|
||||
/// <summary>Core BusinessMgr database instance profile.</summary>
|
||||
private class SessionContextData_Control
|
||||
{
|
||||
public SessionContextData(SbmSessionContext_Web sessionContext)
|
||||
public SessionContextData_Control(SbmSessionContext_Web sessionContext, SysId controlOwnerId, SysId controlRepositoryId)
|
||||
{
|
||||
SessionContext = sessionContext;
|
||||
this.SessionContext = sessionContext;
|
||||
this.ControlOwnerId = controlOwnerId;
|
||||
this.ControlRepositoryId = controlRepositoryId;
|
||||
}
|
||||
public SbmSessionContext_Web SessionContext { get; }
|
||||
public HashSet<string> RepositoryContexts { get; } = new HashSet<string>();
|
||||
public ISacsDatabase BusMgrDatabase { get; set; }
|
||||
public virtual SbmInstanceConfig InstanceConfig => null;
|
||||
// Control database properties.
|
||||
public bool IsControl { get { return SysId.IsValid(ControlOwnerId) && SysId.IsValid(ControlRepositoryId); } }
|
||||
public SysId ControlOwnerId { get; protected set; }
|
||||
public SysId ControlRepositoryId { get; protected set; }
|
||||
}
|
||||
private class SessionContextData_Control : SessionContextData
|
||||
{
|
||||
public SessionContextData_Control(SbmSessionContext_Web sessionContext, SysId controlOwnerId, SysId controlRepositoryId) : base(sessionContext)
|
||||
{
|
||||
this.ControlOwnerId = controlOwnerId;
|
||||
this.ControlRepositoryId = controlRepositoryId;
|
||||
}
|
||||
// Instance configuration - Instance specific Application rules etc.
|
||||
private SbmInstanceConfig instanceConfig = null;
|
||||
public override SbmInstanceConfig InstanceConfig
|
||||
public SbmInstanceConfig InstanceConfig
|
||||
{
|
||||
get
|
||||
{
|
||||
@@ -72,8 +64,15 @@ namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
return instanceConfig;
|
||||
}
|
||||
}
|
||||
// Instance ~persistant data.
|
||||
private SbmInstanceDataCache_Dbas instanceDataCache;
|
||||
public SbmInstanceDataCache_Dbas InstanceDataCache { get { if (instanceDataCache == null) { instanceDataCache = new SbmInstanceDataCache_Dbas(SessionContext); } return instanceDataCache; } }
|
||||
// Control database properties.
|
||||
public bool IsControl { get { return SysId.IsValid(ControlOwnerId) && SysId.IsValid(ControlRepositoryId); } }
|
||||
public SysId ControlOwnerId { get; }
|
||||
public SysId ControlRepositoryId { get; }
|
||||
}
|
||||
private readonly Dictionary<int, SessionContextData> sessionContexts = new Dictionary<int, SessionContextData>();
|
||||
private readonly Dictionary<int, SessionContextData_Control> sessionContexts = new Dictionary<int, SessionContextData_Control>();
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
@@ -146,16 +145,26 @@ namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
{
|
||||
return sessionContexts.GetValue(sessionContext.Index, null)?.InstanceConfig;
|
||||
}
|
||||
// Instance data cache.
|
||||
public override SbmInstanceDataCache GetInstanceDataCache(SbmSessionContext sessionContext)
|
||||
{
|
||||
return sessionContexts.GetValue(sessionContext.Index, null)?.InstanceDataCache;
|
||||
}
|
||||
// Organisation configuration.
|
||||
public override SbmOrganisationConfig GetOrganisationConfig(ISbmUserOrganisationContext userContext)
|
||||
{
|
||||
return new SbmOrganisationConfig_Dbas(userContext, GetInstanceDataCache(userContext.SessionContext));
|
||||
}
|
||||
// Email configuration.
|
||||
public override SbmEmailConfig EmailConfig { get { return emailConfigs.Values.ToList().getConfigForSession(AppConfig); } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Create Consoles.
|
||||
public override SaReferenceDataConsole CreateReferenceDataConsole(ISbmUserContext_Core userContext)
|
||||
public override SaReferenceDataConsole CreateReferenceDataConsole(ISbmUserOrganisationContext userContext)
|
||||
{
|
||||
return new SbmReferenceDataConsole_Portal(userContext);
|
||||
}
|
||||
public override SbmEmailConsole CreateEmailConsole(ISbmUserContext_Core userContext)
|
||||
public override SbmEmailConsole CreateEmailConsole(ISbmUserOrganisationContext userContext)
|
||||
{
|
||||
return new SbmEmailConsole_Portal(EmailConfig);
|
||||
}
|
||||
@@ -224,12 +233,12 @@ namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
private SessionContextData PopulateControlSessionContext(String repositoryContext)
|
||||
private SessionContextData_Control PopulateControlSessionContext(String repositoryContext)
|
||||
{
|
||||
if (StringUtil.IsBlank(repositoryContext)) return null;
|
||||
|
||||
// Check whether context already exists in cache.
|
||||
SessionContextData sessionContextData = sessionContexts.Values.FirstOrDefault(sc => sc.IsControl && sc.RepositoryContexts.ContainsCI(repositoryContext));
|
||||
SessionContextData_Control sessionContextData = sessionContexts.Values.FirstOrDefault(sc => sc.IsControl && sc.RepositoryContexts.ContainsCI(repositoryContext));
|
||||
using (DisposableCollection<IDisposable> disposables = new DisposableCollection<IDisposable>())
|
||||
{
|
||||
SbmcInstanceMgr controlInstanceMgr = SbmGlobals_Web.System.CreateControlInstanceMgr();
|
||||
|
||||
@@ -22,7 +22,7 @@ using Sarand.BusinessMgr.Net.Standard.Base.Mgr;
|
||||
namespace Sarand.BusinessMgr.Web.Portal.App
|
||||
{
|
||||
//=======================================================================
|
||||
public class SbmSessionData_Portal : SbmSessionData_Web, ISbmUserContext_Core
|
||||
public class SbmSessionData_Portal : SbmSessionData_Web, ISbmUserOrganisationContext
|
||||
{
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Consoles
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// Construction.
|
||||
public SbmReferenceDataConsole_Portal(ISbmUserContext_Core userContext) :
|
||||
public SbmReferenceDataConsole_Portal(ISbmUserOrganisationContext userContext) :
|
||||
base(userContext)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
|
||||
/// <summary>Portal session data</summary>
|
||||
protected SbmSessionData_Portal SessionData_Portal { get { return SessionData as SbmSessionData_Portal; } }
|
||||
public override ISbmUserContext_Core UserContext_Core { get { return SessionData_Portal; } }
|
||||
public override ISbmUserOrganisationContext UserContext_Core { get { return SessionData_Portal; } }
|
||||
/// <summary>
|
||||
/// Session data deserialisation.
|
||||
/// </summary>
|
||||
@@ -84,7 +84,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
/// <para>- Open user session - store details against Sesion Data.</para>
|
||||
/// <para>- Set 'Keep logged in' cookie if required.</para>
|
||||
/// </summary>
|
||||
protected bool SignUserIn(ISbmUserContext_Core userContext, String repositoryContext, SaSecurityConsole securityConsoleForUser, SbmAccountMgr accountMgrForUser, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> supervisedOrganisations, SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation, bool keepLoggedIn, ref String errorMessage)
|
||||
protected bool SignUserIn(SbmInternals internalsForUser, String repositoryContext, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser, List<SysIdString> supervisedOrganisations, SbmAssociation associationOrganisation, SbmAffiliate affiliateOrganisation, bool keepLoggedIn, ref String errorMessage)
|
||||
{
|
||||
// Validate Security Item and Affiliate, just in case - should have been done before arriving here!
|
||||
if (securityItemUser == null)
|
||||
@@ -135,28 +135,28 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
securityItemUser.LastLogin = DateTime.Now;
|
||||
securityItemUser.InvalidLoginCount = 0;
|
||||
securityItemUser.LastInvalidLoginAt = DateTime.MinValue;
|
||||
if (!securityConsoleForUser.UpdateSecurityItem(securityItemUser, DbUpdateInfo))
|
||||
if (!internalsForUser.SecurityConsole.UpdateSecurityItem(securityItemUser, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update security item for {securityItemUser.EmailAddress}: {securityConsoleForUser.ErrorStateMessage}");
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update security item for {securityItemUser.EmailAddress}: {internalsForUser.SecurityConsole.ErrorStateMessage}");
|
||||
errorMessage = Localiser["security.msg.signin.invalid"];
|
||||
return false;
|
||||
}
|
||||
|
||||
// Update affiliate.
|
||||
affiliateUser.KeepLoggedIn_Portal = keepLoggedIn;
|
||||
if (!accountMgrForUser.UpdateAffiliate(affiliateUser, DbUpdateInfo))
|
||||
if (!internalsForUser.AccountMgr.UpdateAffiliate(affiliateUser, DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update affiliate for {securityItemUser.EmailAddress}: {accountMgrForUser.ErrorStateMessage}");
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to update affiliate for {securityItemUser.EmailAddress}: {internalsForUser.AccountMgr.ErrorStateMessage}");
|
||||
errorMessage = Localiser["security.msg.signin.invalid"];
|
||||
return false;
|
||||
}
|
||||
SaLogger.Info($"{SysUtil.Fn} User session opened for {securityItemUser.EmailAddress}", true);
|
||||
|
||||
// Create session.
|
||||
OpenUserSession(userContext.SessionContext, repositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation);
|
||||
OpenUserSession(internalsForUser.SessionContext, repositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation);
|
||||
|
||||
// Configure security profile.
|
||||
SessionData_Portal.SecurityProfile_Core.RefreshProfile(SessionConsole, securityConsoleForUser, securityItemUser.Id, securityConsoleForUser.GetRegisteredRights());
|
||||
SessionData_Portal.SecurityProfile_Core.RefreshProfile(SessionConsole, internalsForUser.SecurityConsole, securityItemUser.Id, internalsForUser.SecurityConsole.GetRegisteredRights());
|
||||
}
|
||||
|
||||
// Send the 'Keep Logged In' cookie if requested.
|
||||
@@ -268,13 +268,12 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
{
|
||||
// Consoles and Managers must be associated with the specific context.
|
||||
SbmUserContext_Web userContext = new SbmUserContext_Web(sessionContext);
|
||||
using (SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext))
|
||||
using (SbmAccountMgr accountMgrForUser = App.System.CreateAccountMgr(userContext))
|
||||
using (SbmInternals internalsForUser = new SbmInternals(userContext))
|
||||
{
|
||||
using (SaSecurityItem securityItemUser = securityConsoleForUser.GetUserByEmail(keepLoggedInParams.EmailAddress))
|
||||
using (SbmAffiliate affiliateUser = accountMgrForUser.GetAffiliateById(keepLoggedInParams.AffiliateIdUser))
|
||||
using (SbmAssociation associationOrganisation = accountMgrForUser.GetAssociationById(keepLoggedInParams.AssociationIdOrganisation))
|
||||
using (SbmAffiliate affiliateOrganisation = accountMgrForUser.GetAffiliateById(associationOrganisation?.AffiliateIdOwner ?? null))
|
||||
using (SaSecurityItem securityItemUser = internalsForUser.SecurityConsole.GetUserByEmail(keepLoggedInParams.EmailAddress))
|
||||
using (SbmAffiliate affiliateUser = internalsForUser.AccountMgr.GetAffiliateById(keepLoggedInParams.AffiliateIdUser))
|
||||
using (SbmAssociation associationOrganisation = internalsForUser.AccountMgr.GetAssociationById(keepLoggedInParams.AssociationIdOrganisation))
|
||||
using (SbmAffiliate affiliateOrganisation = internalsForUser.AccountMgr.GetAffiliateById(associationOrganisation?.AffiliateIdOwner ?? null))
|
||||
{
|
||||
if (securityItemUser != null && affiliateUser != null && associationOrganisation != null && affiliateOrganisation != null)
|
||||
{
|
||||
@@ -282,9 +281,9 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers
|
||||
{
|
||||
if (affiliateUser.IsStatusCurrent)
|
||||
{
|
||||
List<SysIdString> supervisedOrganisations = accountMgrForUser.GetAffiliatesSupervisedBy(affiliateUser.Id);
|
||||
List<SysIdString> supervisedOrganisations = internalsForUser.AccountMgr.GetAffiliatesSupervisedBy(affiliateUser.Id);
|
||||
String errorMessage = "";
|
||||
if (SignUserIn(userContext, keepLoggedInParams.RepositoryContext, securityConsoleForUser, accountMgrForUser, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, true, ref errorMessage))
|
||||
if (SignUserIn(internalsForUser, keepLoggedInParams.RepositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, true, ref errorMessage))
|
||||
{
|
||||
SaLogger.Info(logPrefix + " 'Keep Logged In' cookie found." + logSuffix);
|
||||
return true;
|
||||
|
||||
@@ -99,29 +99,25 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
|
||||
using (DisposableCollection<IDisposable> disposables = new DisposableCollection<IDisposable>())
|
||||
{
|
||||
|
||||
// Account manager.
|
||||
SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext);
|
||||
disposables.Add(securityConsoleForUser);
|
||||
SbmAccountMgr accountMgrForUser = SbmGlobals_Web.System.CreateAccountMgr(userContext);
|
||||
disposables.Add(accountMgrForUser);
|
||||
SbmInternals internalsForUser = new SbmInternals(userContext);
|
||||
disposables.Add(internalsForUser);
|
||||
|
||||
// User's security item.
|
||||
SaSecurityItem securityItemUser = GetSecurityItemForSignin(userContext, securityConsoleForUser, model);
|
||||
SaSecurityItem securityItemUser = GetSecurityItemForSignin(userContext, internalsForUser.SecurityConsole, model);
|
||||
disposables.Add(securityItemUser);
|
||||
if (securityItemUser == null)
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Failed to retrieve Security Item. Database: {busMgrDatabase.DatabaseName}. Email: {model.EmailAddress}.");
|
||||
return false;
|
||||
}
|
||||
if (!securityConsoleForUser.PasswordMatches(securityItemUser, model.Password, userContext.DbUpdateInfo))
|
||||
if (!internalsForUser.SecurityConsole.PasswordMatches(securityItemUser, model.Password, userContext.DbUpdateInfo))
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} Supplied password doesn't match Security Item. Database: {busMgrDatabase.DatabaseName}. Email: {model.EmailAddress}.");
|
||||
return false;
|
||||
}
|
||||
|
||||
// User's affiliate.
|
||||
SbmAffiliate affiliateUser = GetAffiliateForSignin(accountMgrForUser, model, securityItemUser);
|
||||
SbmAffiliate affiliateUser = GetAffiliateForSignin(internalsForUser.AccountMgr, model, securityItemUser);
|
||||
disposables.Add(affiliateUser);
|
||||
if (affiliateUser == null)
|
||||
{
|
||||
@@ -130,7 +126,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
}
|
||||
|
||||
// User's supervised organisations.
|
||||
List<SysIdString> supervisedOrganisations = accountMgrForUser.GetAffiliatesSupervisedBy(affiliateUser.Id);
|
||||
List<SysIdString> supervisedOrganisations = internalsForUser.AccountMgr.GetAffiliatesSupervisedBy(affiliateUser.Id);
|
||||
if (supervisedOrganisations.IsEmpty())
|
||||
{
|
||||
SaLogger.Warn($"{SysUtil.Fn} User has no supervised organisations. Database: {busMgrDatabase.DatabaseName}. Email: {model.EmailAddress}.");
|
||||
@@ -139,7 +135,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
userContext.RefreshUser(securityItemUser, affiliateUser, supervisedOrganisations);
|
||||
|
||||
// User's organisation association.
|
||||
SbmAssociation associationOrganisation = GetOrganisationAssociationForSignIn(accountMgrForUser, model, userContext);
|
||||
SbmAssociation associationOrganisation = GetOrganisationAssociationForSignIn(internalsForUser.AccountMgr, model, userContext);
|
||||
disposables.Add(associationOrganisation);
|
||||
if (associationOrganisation == null)
|
||||
{
|
||||
@@ -148,7 +144,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
}
|
||||
|
||||
// User's organisation affiliate.
|
||||
SbmAffiliate affiliateOrganisation = accountMgrForUser.GetAffiliateById(associationOrganisation?.AffiliateIdOwner ?? null);
|
||||
SbmAffiliate affiliateOrganisation = internalsForUser.AccountMgr.GetAffiliateById(associationOrganisation?.AffiliateIdOwner ?? null);
|
||||
disposables.Add(affiliateOrganisation);
|
||||
if (affiliateOrganisation == null)
|
||||
{
|
||||
@@ -157,7 +153,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
}
|
||||
|
||||
// Initialise user session.
|
||||
if (SignUserIn(userContext, model.RepositoryContext, securityConsoleForUser, accountMgrForUser, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, model.KeepMeSignedIn, ref errorMessage))
|
||||
if (SignUserIn(internalsForUser, model.RepositoryContext, securityItemUser, affiliateUser, supervisedOrganisations, associationOrganisation, affiliateOrganisation, model.KeepMeSignedIn, ref errorMessage))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@@ -398,12 +394,11 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
{
|
||||
// Consoles and Managers must be associated with the specific context.
|
||||
SbmUserContext_Web userContext = new SbmUserContext_Web(sessionContext);
|
||||
using (SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext))
|
||||
using (SbmAccountMgr accountMgrForUser = App.System.CreateAccountMgr(userContext))
|
||||
using (SbmInternals internalsForUser = new SbmInternals(userContext))
|
||||
{
|
||||
// Retrieve user details and validate email address.
|
||||
securityItemUser = securityConsoleForUser.GetSecurityItemById(SaSecurity.ItemType.User, storePasswordParams.SecurityItemId);
|
||||
affiliateUser = accountMgrForUser.GetAffiliateById(storePasswordParams.AffiliateId);
|
||||
securityItemUser = internalsForUser.SecurityConsole.GetSecurityItemById(SaSecurity.ItemType.User, storePasswordParams.SecurityItemId);
|
||||
affiliateUser = internalsForUser.AccountMgr.GetAffiliateById(storePasswordParams.AffiliateId);
|
||||
if (storePasswordParams.IsValid(securityItemUser, affiliateUser))
|
||||
{
|
||||
sessionContextForUser = sessionContext;
|
||||
@@ -525,40 +520,35 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
SbmUserContext_Web userContext = new SbmUserContext_Web(sessionContext);
|
||||
|
||||
// Get user security item and affiliate.
|
||||
using (SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext))
|
||||
using (SbmInternals internalsForUser = new SbmInternals(userContext))
|
||||
using (SaSecurityItem securityItemUser = internalsForUser.SecurityConsole.GetUserByEmail(model.EmailAddress))
|
||||
{
|
||||
using (SaSecurityItem securityItemUser = securityConsoleForUser.GetUserByEmail(model.EmailAddress))
|
||||
if (securityItemUser != null)
|
||||
{
|
||||
if (securityItemUser != null)
|
||||
using (SbmAffiliate affiliateUser = internalsForUser.AccountMgr.GetAffiliateByUserId(securityItemUser.Id))
|
||||
{
|
||||
using (SbmAccountMgr accountMgrForUser = App.System.CreateAccountMgr(userContext))
|
||||
if (affiliateUser != null)
|
||||
{
|
||||
using (SbmAffiliate affiliateUser = accountMgrForUser.GetAffiliateByUserId(securityItemUser.Id))
|
||||
if (affiliateUser.Status == SaStatus.Current || affiliateUser.IsStatusActive)
|
||||
{
|
||||
if (affiliateUser != null)
|
||||
{
|
||||
if (affiliateUser.Status == SaStatus.Current || affiliateUser.IsStatusActive)
|
||||
{
|
||||
SbmEmailConsole emailConsole = App.CreateEmailConsole(userContext);
|
||||
SbmEmailConsole emailConsole = App.CreateEmailConsole(userContext);
|
||||
|
||||
// Send password request email.
|
||||
SaEmailData emailData = new SaEmailData();
|
||||
emailData.Config = App.EmailConfig;
|
||||
emailData.AddressesTo.Add(model.EmailAddress);
|
||||
emailData.Subject = Localiser["security.caption.request.password"];
|
||||
PopulateRequestPasswordEmailBody(emailConsole, userContext, emailData, securityItemUser, affiliateUser);
|
||||
if (emailConsole.SendEmail(emailData))
|
||||
SaLogger.Info($"{SysUtil.Fn} Password request email sent to {model.EmailAddress}.", true);
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Failed to send password request email to {model.EmailAddress}.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - affiliate is not active");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - affiliate does not exist. UserId: {SysId.ToString(securityItemUser.Id)}.");
|
||||
// Send password request email.
|
||||
SaEmailData emailData = new SaEmailData();
|
||||
emailData.Config = App.EmailConfig;
|
||||
emailData.AddressesTo.Add(model.EmailAddress);
|
||||
emailData.Subject = Localiser["security.caption.request.password"];
|
||||
PopulateRequestPasswordEmailBody(emailConsole, userContext, emailData, securityItemUser, affiliateUser);
|
||||
if (emailConsole.SendEmail(emailData))
|
||||
SaLogger.Info($"{SysUtil.Fn} Password request email sent to {model.EmailAddress}.", true);
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Failed to send password request email to {model.EmailAddress}.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - affiliate is not active");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - affiliate does not exist. UserId: {SysId.ToString(securityItemUser.Id)}.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - security item does not exist.");
|
||||
}
|
||||
else SaLogger.Warn($"{SysUtil.Fn} Unable to send password request email to {model.EmailAddress} - security item does not exist.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -567,7 +557,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
responseData.SuccessMsg = Localiser["security.msg.request.password.email.sent"];
|
||||
return Json(responseData);
|
||||
}
|
||||
private void PopulateRequestPasswordEmailBody(SbmEmailConsole emailConsole, ISbmUserContext_Core userContext, SaEmailData emailData, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser)
|
||||
private void PopulateRequestPasswordEmailBody(SbmEmailConsole emailConsole, ISbmUserOrganisationContext userContext, SaEmailData emailData, SaSecurityItem securityItemUser, SbmAffiliate affiliateUser)
|
||||
{
|
||||
// Will need to handle culture (language/country) as and when introduced.
|
||||
emailData.MessageBody = SbmResourceHelper.GetResourceText(SbmResourceHelper.TextResource.Email_RequestPassword_Html);
|
||||
|
||||
@@ -82,11 +82,10 @@ namespace Sarand.BusinessMgr.Web.Portal.Controllers.Security
|
||||
{
|
||||
// Consoles and Managers must be associated with the specific context.
|
||||
SbmUserContext_Web userContext = new SbmUserContext_Web(sessionContext);
|
||||
using (SaSecurityConsole securityConsoleForUser = App.CreateSecurityConsole(userContext))
|
||||
using (SbmAccountMgr accountMgrForUser = App.System.CreateAccountMgr(userContext))
|
||||
using (SbmInternals internalsForUser = new SbmInternals(userContext))
|
||||
{
|
||||
using (SaSecurityItem securityItemUser = securityConsoleForUser.GetUserByEmail(changePasswordParams.EmailAddress))
|
||||
using (SbmAffiliate affiliateUser = accountMgrForUser.GetAffiliateById(changePasswordParams.AffiliateId))
|
||||
using (SaSecurityItem securityItemUser = internalsForUser.SecurityConsole.GetUserByEmail(changePasswordParams.EmailAddress))
|
||||
using (SbmAffiliate affiliateUser = internalsForUser.AccountMgr.GetAffiliateById(changePasswordParams.AffiliateId))
|
||||
{
|
||||
if (securityItemUser != null && affiliateUser != null)
|
||||
{
|
||||
|
||||
@@ -620,7 +620,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models.Commodities
|
||||
// Asset.
|
||||
|
||||
// Asset category.
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.AllowAssets))
|
||||
if (!SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
|
||||
config.Field.Hide.Add($"{ItemField.AssetCategory}");
|
||||
|
||||
//---------------------------------------------------------------
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using Microsoft.AspNetCore.Mvc.Rendering;
|
||||
using NPOI.SS.Formula.Functions;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.App;
|
||||
using Sarand.BusinessMgr.Net.Core.Web.Models;
|
||||
using Sarand.BusinessMgr.Net.Standard.Base.App;
|
||||
@@ -27,7 +28,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
//-------------------------------------------------------------------
|
||||
// Properties.
|
||||
public SbmSessionData_Portal SessionData_Portal { get { return SessionData as SbmSessionData_Portal; } }
|
||||
public override ISbmUserContext_Core UserContext_Core { get { return SessionData_Portal; } }
|
||||
public override ISbmUserOrganisationContext UserContext_Core { get { return SessionData_Portal; } }
|
||||
public String OrganisationName { get { return SessionData_Portal?.Organisation?.DisplayName ?? ""; } }
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
@@ -66,23 +67,34 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
public void PopulateMenu()
|
||||
{
|
||||
Menu = new MenuData();
|
||||
if (SessionConsole.UserContext == null) return;
|
||||
|
||||
// Contacts.
|
||||
MenuItemData contactsItem = new MenuItemData() { Caption = @Localiser["label.contacts"] };
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.contacts"], Page = "Contacts" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.customers"], Page = "Customers" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.suppliers"], Page = "Suppliers" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.associations"], Page = "Associations" });
|
||||
if (SessionConsole.AllowOption(Sbm.ConfigOption.Contacts))
|
||||
{
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.contacts"], Page = "Contacts" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.customers"], Page = "Customers" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.suppliers"], Page = "Suppliers" });
|
||||
contactsItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.associations"], Page = "Associations" });
|
||||
}
|
||||
if (contactsItem.Options.Any())
|
||||
Menu.Items.Add(contactsItem);
|
||||
|
||||
// Commodities.
|
||||
MenuItemData commoditiesItem = new MenuItemData() { Caption = @Localiser["label.commodities"] };
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.commodities"], Page = "Commodity" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.asset.categories"], Page = "Assets/AssetCategory" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.assets"], Page = "Assets/Asset" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicle.classes"], Page = "Assets/VehicleClass" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.vehicles"], Page = "Assets/Vehicle" });
|
||||
if (SessionConsole.AllowOption(Sbm.ConfigOption.Commodities))
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.commodities"], Page = "Commodity" });
|
||||
if (SessionConsole.AllowOption(Sbm.ConfigOption.Assets))
|
||||
{
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.asset.categories"], Page = "Assets/AssetCategory" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.assets"], Page = "Assets/Asset" });
|
||||
if (SessionConsole.AllowOption(Sbm.ConfigOption.Vehicles))
|
||||
{
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["caption.vehicle.classes"], Page = "Assets/VehicleClass" });
|
||||
commoditiesItem.Options.Add(new MenuOptionData() { Caption = @Localiser["label.vehicles"], Page = "Assets/Vehicle" });
|
||||
}
|
||||
}
|
||||
if (commoditiesItem.Options.Any())
|
||||
Menu.Items.Add(commoditiesItem);
|
||||
|
||||
@@ -95,7 +107,7 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// View reference data.
|
||||
// View reference data - Contacts.
|
||||
|
||||
/// <summary>
|
||||
/// List of Affiliate Types for filter dropdown.
|
||||
@@ -125,6 +137,78 @@ namespace Sarand.BusinessMgr.Web.Portal.Models
|
||||
return new SelectList(associationTypes, "Code", "Desc");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// View reference data - Transactions.
|
||||
|
||||
/// <summary>
|
||||
/// List of Transaction Types for filter dropdown.
|
||||
/// </summary>
|
||||
public IEnumerable<SelectListItem> GetTransactionTypeCodesForFilterSelect()
|
||||
{
|
||||
List<TypeCodeDesc> transactionTypes = new List<TypeCodeDesc>();
|
||||
transactionTypes.Add(Sbm.TransactionType.Any, "", Localiser["label.any"]);
|
||||
foreach (TypeCodeDesc transactionType in GetCodesOfType(Sbm.SystemCode.TransactionType))
|
||||
{
|
||||
if (!SessionConsole.AllowTransactionType((Sbm.TransactionType)transactionType.Type)) continue;
|
||||
String description = SessionConsole.GetOwnerOption_Caption(Sbm.TransTypeToOrgOption((Sbm.TransactionType)transactionType.Type), Localiser.GetTransactionTypeCaption((Sbm.TransactionType)transactionType.Type));
|
||||
transactionTypes.Add(transactionType.Type, transactionType.Code, description);
|
||||
}
|
||||
return new SelectList(transactionTypes, "Code", "Desc");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List of Transaction Types for form dropdown.
|
||||
/// </summary>
|
||||
public IEnumerable<SelectListItem> GetTransactionTypeCodesForDropdown()
|
||||
{
|
||||
List<TypeCodeDesc> transactionTypes = new List<TypeCodeDesc>();
|
||||
foreach (TypeCodeDesc transactionType in GetCodesOfType(Sbm.SystemCode.TransactionType))
|
||||
{
|
||||
if (!SessionConsole.AllowTransactionType((Sbm.TransactionType)transactionType.Type)) continue;
|
||||
String description = SessionConsole.GetOwnerOption_Caption(Sbm.TransTypeToOrgOption((Sbm.TransactionType)transactionType.Type), Localiser.GetTransactionTypeCaption((Sbm.TransactionType)transactionType.Type));
|
||||
transactionTypes.Add(transactionType.Type, transactionType.Code, description);
|
||||
}
|
||||
return new SelectList(transactionTypes, "Code", "Desc");
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
// View reference data - Commodities.
|
||||
|
||||
/// <summary>
|
||||
/// List of Commodity Types for filter dropdown.
|
||||
/// </summary>
|
||||
public IEnumerable<SelectListItem> GetCommodityTypeCodesForFilterSelect()
|
||||
{
|
||||
List<TypeCodeDesc> commodityTypes = new List<TypeCodeDesc>();
|
||||
commodityTypes.Add(Sbm.CommodityType.Any, "", Localiser["label.any"]);
|
||||
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
|
||||
{
|
||||
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(ConfigOption.Assets)) continue;
|
||||
commodityTypes.Add(commodityType);
|
||||
}
|
||||
return new SelectList(commodityTypes, "Code", "Desc");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// List of Commodity Types for form dropdown.
|
||||
/// </summary>
|
||||
public IEnumerable<SelectListItem> GetCommodityTypeCodesForDropdown()
|
||||
{
|
||||
List<TypeCodeDesc> commodityTypes = new List<TypeCodeDesc>();
|
||||
foreach (TypeCodeDesc commodityType in GetCodesOfType(Sbm.SystemCode.CommodityType))
|
||||
{
|
||||
if (commodityType.Type == (int)Sbm.CommodityType.Asset && !SessionConsole.AllowOption(ConfigOption.Assets)) continue;
|
||||
commodityTypes.Add(commodityType);
|
||||
}
|
||||
return new SelectList(commodityTypes, "Code", "Desc");
|
||||
}
|
||||
|
||||
// ToDo - Organisation Option - Show Column:
|
||||
// case Sbm.SystemCode.OrgOption_ShowColumn:
|
||||
// if (code.Type == (int) Sbm.OrgOption_ShowColumn.Transaction_ContactArea)
|
||||
// Desc = "Transaction: " + sessionConsole.GetAttributeCaption(SbmDbDfn.ColumnIdx.Association_ContactAreaCode, "Contact area");
|
||||
|
||||
|
||||
//-------------------------------------------------------------------
|
||||
}
|
||||
//=======================================================================
|
||||
|
||||
Reference in New Issue
Block a user