public ABaseController(IConfiguration config, IDbSettingsReader settings, ILogger logger) : base() { this.Settings = settings; this.Config = config; this.Views = new ViewNames(); this.Logger = logger; this.Controllers = new ControllerNames { DashboardController = Settings.GetAppDashboardControllerName(), MyProfileController = Settings.GetAppMyProfileControllerName(), AccountController = Settings.GetAccountControllerName(), UninstallController = Settings.GetAppUninstallControllerName() }; this.VersionInfo = new Versions() { AppVersion = settings.GetAppVersion(), FrameWorkVersion = AppSettingsAccessor.GetFrameWorkBuildNumber(), DataSeederFrameworkVersion = Settings.GetDataSeederFrameworkVersion() }; }
public void OnAuthorization(AuthorizationFilterContext filterContext) { //already logged in by Identity now check subscription if (filterContext.Result == null) { _Logger.LogInformation("Starting subscription check."); var context = filterContext.HttpContext; _Logger.LogInformation("Getting current user."); AppUser currentUser = _UserCache.GetLoggedOnUser().Result; if (currentUser == null) { _Logger.LogError("User must be logged on before checking subscription.Redirecting to login page."); //throw new Exception("Subscription check must be done on logged on user. But current user is found null."); filterContext.Result = new RedirectToActionResult(ACCOUNT_ACTIONS.Login.ToString(), _Settings.GetAccountControllerName(), new { }); } else { _Logger.LogInformation($"Current user is '{currentUser.MyShopifyDomain}'"); //admin must have access token atleast if (currentUser.ShopIsConnected == false /*&& !currentUser.IsAdmin*/) { _Logger.LogWarning($"User '{currentUser.MyShopifyDomain}' has no shopify access token. Charge status check cannot be done on diconnected shop.Redirecting to '{_Settings.GetShopifyControllerName()}/{SHOPIFY_ACTIONS.HandShake.ToString()}'."); filterContext.Result = _CreateRedirectResult(_Settings.GetShopifyControllerName(), SHOPIFY_ACTIONS.HandShake.ToString()); } //billing connected or disconnected, for admin it is never checked else if (currentUser.BillingIsConnected == false && !currentUser.IsAdmin) { _Logger.LogWarning($"User '{currentUser.MyShopifyDomain}' billing charge id is null.Charge status check cannot be done on null charge id.Redirecting to '{_Settings.GetShopifyControllerName()}/{SHOPIFY_ACTIONS.ChoosePlan.ToString()}'."); filterContext.Result = _CreateRedirectResult(_Settings.GetShopifyControllerName(), SHOPIFY_ACTIONS.ChoosePlan.ToString()); } else { ShopifyRecurringChargeObject chargeStatus = null; //for admin user if no billing charge id all good, but if theres one then we will look into it if (currentUser.IsAdmin) { _Logger.LogInformation($"Skipping charge status check because user '{currentUser.MyShopifyDomain}' is admin."); chargeStatus = new ShopifyRecurringChargeObject() { Status = SHOPIFY_CHARGE_STATUS.active.ToString() }; } else { _Logger.LogInformation($"Checking charge status for user '{currentUser.MyShopifyDomain}'."); try { chargeStatus = Task.Run(() => _ShopifyApi.GetRecurringChargeAsync(currentUser.MyShopifyDomain, currentUser.ShopifyAccessToken, currentUser.ShopifyChargeId.Value)).Result; } catch (Exception ex) { _Logger.LogError($"Error occurred duing GetRecurringChargeAsync() call.{ex.Message}.{ex.StackTrace}"); throw ex; } } if (chargeStatus.Status == SHOPIFY_CHARGE_STATUS.accepted.ToString() || chargeStatus.Status == SHOPIFY_CHARGE_STATUS.active.ToString()) { _Logger.LogInformation($"Require subscription passed for user '{currentUser.MyShopifyDomain}'"); } else { _Emailer.InActiveChargeIdDetectedAsync(currentUser, chargeStatus.Status); if (chargeStatus.Status == SHOPIFY_CHARGE_STATUS.declined.ToString() || chargeStatus.Status == SHOPIFY_CHARGE_STATUS.expired.ToString() || chargeStatus.Status == SHOPIFY_CHARGE_STATUS.pending.ToString()) { _Logger.LogWarning($"Require subscription did not pass for user '{currentUser.MyShopifyDomain}'"); _Logger.LogWarning($"User '{currentUser.MyShopifyDomain}' has declined/expired/pending charge status."); _Logger.LogWarning($"Unsetting charge info for user '{currentUser.MyShopifyDomain}'."); UserDbServiceHelper.UnSetUserChargeInfo(_UserDbService, currentUser.Id); _Logger.LogWarning($"Removing user '{currentUser.MyShopifyDomain}' from cache."); _UserCache.ClearLoggedOnUser();//resset cache so that next try makes BillingIsConnected = false var handShakeAction = SHOPIFY_ACTIONS.HandShake.ToString(); _Logger.LogWarning($"Redirecting user '{currentUser.MyShopifyDomain}' to '{_Settings.GetShopifyControllerName()}/{handShakeAction}'."); filterContext.Result = _CreateRedirectResult(_Settings.GetShopifyControllerName(), handShakeAction); } else if (chargeStatus.Status == SHOPIFY_CHARGE_STATUS.frozen.ToString()) { _Logger.LogError($"User '{currentUser.MyShopifyDomain}' has frozen shopify store account. Throwing error."); throw new UnauthorizedAccessException("Your shopify account is frozen.Once shopify unfreezes your store account you will be able to use this app again."); } } } } } }
public void OnAuthorization(AuthorizationFilterContext context) { _Logger.LogInformation($"Started checking requirement {_Requirement.ToString()}"); if (context.Result == null) { _Logger.LogInformation("Getting current user."); var user = _UserCache.GetLoggedOnUser().Result; if (user == null) { _Logger.LogWarning("User must be logged on before checking subscription.Redirecting to login page."); context.Result = new RedirectToActionResult(ACCOUNT_ACTIONS.Login.ToString(), _Settings.GetAccountControllerName(), new { }); } else { _Logger.LogInformation($"Current user is '{user.MyShopifyDomain}'"); if (user.PlanId.HasValue == false) { _Logger.LogError($"Current user '{user.MyShopifyDomain}' doesn't have any valid plan.Throwing error."); throw new Exception("Your account is not associated with any valid plan.Contact Support."); } else { bool requirementMet = false; if (_PlanReader[user.PlanId.Value] == null) { _Logger.LogError($"Current user '{user.MyShopifyDomain}' plan id ='{user.PlanId.Value}' is not found in the loaded plans list."); throw new Exception($"Current user '{user.MyShopifyDomain}' plan id ='{user.PlanId.Value}' is not found in the loaded plans list."); } else if (_PlanReader[user.PlanId.Value].IsDev) { _Logger.LogInformation("Plan requirement is waved because user has DEV plan."); requirementMet = true; } else { if (user.PlanId.Value != _Requirement.PlanId) { _Logger.LogWarning($"User '{user.MyShopifyDomain}' doesn't have required plan id = '{_Requirement.PlanId}'."); } else { PlanAppModel userPlan = _PlanReader[user.PlanId.Value]; _Logger.LogInformation($"User '{user.MyShopifyDomain}' has plan id = '{userPlan.Id}' and name = '{userPlan.Name}'"); if (_Requirement.OptionName != null && _Requirement.ExpectedValue != null) { if (_PlanReader[userPlan.Id, _Requirement.OptionName]?.OptionValue == _Requirement.ExpectedValue) { requirementMet = true; _Logger.LogInformation($"User '{user.MyShopifyDomain}' has valid plan '{userPlan.Name}' and valid value = '{_Requirement.ExpectedValue}' for option = '{_Requirement.OptionName}'."); } else { _Logger.LogWarning($"User '{user.MyShopifyDomain}' plan = '{userPlan.Name}' doesn't have expected value for option ='{_Requirement.OptionName}'."); } } else { _Logger.LogInformation($" User '{user.MyShopifyDomain}' hsa required plan."); requirementMet = true; } } var controller = context.RouteData.Values["controller"]; var action = context.RouteData.Values["action"]; if (!requirementMet) { _Logger.LogWarning($"User '{user.MyShopifyDomain}' is denied to '{controller}/{action}' route. Redirecting to app dashboard."); context.Result = new RedirectToRouteResult( new RouteValueDictionary() { { "controller", _Settings.GetAppDashboardControllerName() }, { "action", DASHBOARD_ACTIONS.PlanDoesNotAllow.ToString() } }); } else { _Logger.LogInformation($"Requirement met. User '{user.MyShopifyDomain}' is allowed to '{controller}/{action}' route."); } } } } } }