public JsonResult GetConfigVar(string name) { string conValue = string.Empty; try { Console.WriteLine("Get Config Variable Start"); string resourceId = HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); HerokuApi.PostlogMessage("Get Config Variable Start", resourceId); if (!string.IsNullOrEmpty(name)) { //Get heroku auth token from session var herokuAuthToken = HttpContext.GetClaimValue(Constants.HEROKU_ACCESS_TOKEN); //Get heroku app name from resources table by resource id var appName = _dedupSettingsRepository.GetHerokuAppName(resourceId); if (!string.IsNullOrEmpty(appName) && !string.IsNullOrEmpty(herokuAuthToken)) { //Get config var value conValue = HerokuApi.GetHerokuAppConfigVarByName(appName, name, herokuAuthToken); } } Console.WriteLine("Get Config Variable Start"); HerokuApi.PostlogMessage("Get Config Variable End", resourceId); } catch (Exception ex) { Console.WriteLine("ERROR: {0}", ex.Message); } return(Json(new { Value = conValue })); }
public async Task <IActionResult> AppConfig() { HerokuAppConfig appConfig = new HerokuAppConfig(); try { Console.WriteLine("Get App Config Start"); string resourceId = HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); HerokuApi.PostlogMessage("Get App Config Start", resourceId); var herokuAuthToken = HttpContext.GetClaimValue(Constants.HEROKU_ACCESS_TOKEN); //Get resource info from resourses table by resource id appConfig.resource = _dedupSettingsRepository.GetResource(resourceId).ToResource(); if (!string.IsNullOrEmpty(herokuAuthToken)) { //Get addons details of the main app appConfig.addons = HerokuApi.GetHerokuAppAddons(appConfig.resource.app_name, herokuAuthToken); //Commented on 24th May, 2020 due to partner auth token not permitted to access ////Get config_vars of the main app //appConfig.config_vars = HerokuApi.GetHerokuAppConfigVars(appConfig.resource.app_name, herokuAuthToken); } Console.WriteLine("Get App Config End"); HerokuApi.PostlogMessage("Get App Config End", resourceId); } catch (Exception ex) { Console.WriteLine("ERROR: {0}", ex.Message); } return(View(await Task.FromResult(appConfig))); }
/// <summary> /// Action: AppLogs /// Description: It is called to get all logs of the main app and assign to ViewBag which will be accessed on view /// </summary> /// <returns></returns> public IActionResult AppLogs(bool tail) { Console.WriteLine("Report-App Logs Inside"); string dbUrl = string.Empty; ViewBag.appLogInfo = string.Empty; try { var resource = _connectorsRepository.GetResource(HttpContext.GetClaimValue(ClaimTypes.NameIdentifier)); if (resource != null) { //Heroku api is using authtoken to call the api //Get log plex url for the main by using app name string log_plex_url = HerokuApi.GetHerokuAppLogUrl(false, resource.app_name, HttpContext.GetClaimValue(Constants.HEROKU_ACCESS_TOKEN), tail); if (!string.IsNullOrEmpty(log_plex_url)) { //Get app logs by using log plex url ViewBag.appLogInfo = HerokuApi.GetHerokuAppLogs(log_plex_url, resource.app_name); } } } catch (Exception ex) { Console.WriteLine("ERROR: {0}", ex.Message); } Console.WriteLine("App Logs Outside"); return(View()); }
/// <summary> /// Method: Add /// Description: It is used to add new resource to resources table when provisioning the addon /// </summary> /// <param name="item"></param> public void Add(Resources item, int expiryInDays, bool isPrivatePlan, HerokuAuthToken authToken) { using (var transaction = _context.Database.BeginTransaction()) { try { //Get vendor app info Console.WriteLine("Get vendor app info starts"); var appInfo = HerokuApi.GetAppInfo(item.app_name, authToken.access_token); Console.WriteLine("Get vendor app info ended"); if (appInfo.IsNull()) { throw new ArgumentNullException("Main app info is null"); } item.app_name = appInfo.name; item.heroku_id = appInfo.id; if (!appInfo.owner.IsNull()) { item.user_email = appInfo.owner.email; } if (appInfo.organization.HasValue) { item.user_organization = appInfo.organization.Value.name; } if (!appInfo.region.IsNull()) { item.region = appInfo.region.name; } if (isPrivatePlan && (!appInfo.space.HasValue || (appInfo.space.HasValue && string.IsNullOrEmpty(appInfo.space.Value.name)))) { throw new Exception(string.Format("The {0} plan is not supported for the user account.", item.plan)); } //set plan expiry date based on plan configured in addon_plans.json which is in app root item.expired_at = DateTime.UtcNow.AddDays(expiryInDays); _context.Resources.Add(item); AuthTokens authTokens = authToken.ToAuthToken(); _context.AuthTokens.Add(authTokens); _context.SaveChanges(); transaction.Commit(); //Update addon app config-var if (!authToken.IsNull()) { var task = HerokuApi.UpdateVendorAppConfigVarByResourceId(item.uuid, authToken.access_token); task.Wait(); } } catch (Exception ex) { Console.WriteLine("Error: {0}", ex.Message); transaction.Rollback(); throw; } } }
/// <summary> /// Method: Add /// Description: It is used to add new resource to resources table when provisioning the addon /// </summary> /// <param name="item"></param> public void Add(Resources item, OauthGrant?oauthGrant) { using (var transaction = _context.Database.BeginTransaction()) { try { Console.WriteLine("Resource: " + JsonConvert.SerializeObject(item)); Console.WriteLine("Resource add starts"); _context.Resources.Add(item); Console.WriteLine("Resource add ended"); HerokuAuthToken authToken = default(HerokuAuthToken); if (oauthGrant.HasValue) { Console.WriteLine("Auth-Token get starts"); authToken = HerokuApi.GetAddonAccessTokenSync(oauthGrant.Value.code, oauthGrant.Value.type); if (!authToken.IsNull()) { Console.WriteLine("Auth-Token=> {0}:{1}", authToken.access_token, authToken.refresh_token); } else { throw new ArgumentNullException("Heroku access token not able to get"); } Console.WriteLine("Auth-Token get ended"); } else { Console.WriteLine("OAuth-Grant is null"); throw new ArgumentNullException("OAuth-Grant is null"); } authToken.auth_id = item.uuid; PartnerAuthTokens pAuthToken = authToken.ToPartnerAuthToken(); pAuthToken.oauth_code = oauthGrant.Value.code; pAuthToken.oauth_type = oauthGrant.Value.type; pAuthToken.oauth_expired_in = DateTime.Now.AddSeconds(280); Console.WriteLine("AuthToken: " + JsonConvert.SerializeObject(pAuthToken)); Console.WriteLine("AuthToken add starts"); _context.PartnerAuthTokens.Add(pAuthToken); Console.WriteLine("AuthToken add ended"); _context.SaveChanges(); transaction.Commit(); if (!authToken.IsNull()) { var task = HerokuApi.AddUpdateMainAppConfigByResourceId(item.uuid, authToken.access_token); task.Wait(); } } catch (Exception ex) { transaction.Rollback(); throw ex; } } }
public async Task <ActionResult> refreshtoken(string returnUrl = "") { Console.WriteLine("Login Controller- refreshtoken"); //Get heroku auth token HerokuAuthToken authToken = await HerokuApi.GetAddonAccessToken(HttpContext.GetClaimValue(Constants.HEROKU_REFRESH_TOKEN), AuthGrantType.refresh_token).ConfigureAwait(false); if (authToken.IsNull()) { return(RedirectToAction("herokuauth", "login", new { returnUrl = HttpUtility.UrlEncode(returnUrl) })); } else { //assign current resourceId as auth_id authToken.auth_id = HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); //update heroku auth token var partnerAuthToken = authToken.ToPartnerAuthToken(); partnerAuthToken = _partnerAuthTokenRepository.Add(partnerAuthToken); if (partnerAuthToken.Resource != null) { var claims = new List <Claim>(); claims.Add(new Claim(ClaimTypes.NameIdentifier, partnerAuthToken.Resource.uuid)); claims.Add(new Claim(ClaimTypes.Version, partnerAuthToken.Resource.plan.ToString())); claims.Add(new Claim(ClaimTypes.Country, partnerAuthToken.Resource.region)); if (!string.IsNullOrEmpty(partnerAuthToken.Resource.user_email)) { claims.Add(new Claim(Constants.HEROKU_USER_EMAIL, partnerAuthToken.Resource.user_email)); } if (!string.IsNullOrEmpty(partnerAuthToken.Resource.app_name)) { claims.Add(new Claim(Constants.HEROKU_MAIN_APP_NAME, partnerAuthToken.Resource.app_name)); } claims.Add(new Claim(Constants.HEROKU_ACCESS_TOKEN, partnerAuthToken.access_token)); claims.Add(new Claim(Constants.HEROKU_REFRESH_TOKEN, partnerAuthToken.refresh_token)); claims.Add(new Claim(Constants.HEROKU_AUTH_USERID, partnerAuthToken.user_id)); if (partnerAuthToken.expires_in.HasValue) { claims.Add(new Claim(Constants.HEROKU_TOKEN_EXPIREDIN, partnerAuthToken.expires_in.Value.ToString())); } HttpContext.AddUpdateClaims(claims); } } //redirect to url if (string.IsNullOrEmpty(returnUrl) || (!string.IsNullOrEmpty(returnUrl) && (returnUrl.Contains("localhost")) || !Uri.IsWellFormedUriString(returnUrl, UriKind.RelativeOrAbsolute))) { return(RedirectToAction("index", "home")); } else { //Redirect to home page return(Redirect(HttpUtility.UrlDecode(returnUrl))); } }
public async Task <IViewComponentResult> InvokeAsync() { AccountInfo accInfo = null; var herokuAuthToken = HttpContext.Session.GetString("herokuAuthToken"); if (!string.IsNullOrEmpty(herokuAuthToken)) { accInfo = HerokuApi.GetAccountInfo(herokuAuthToken); } return(View("~/Components/Account/Index.cshtml", accInfo)); }
public void Init() { instance = new HerokuApi(); }
public async Task <ActionResult> Index(string returnUrl = "") { Console.WriteLine("Login Controller- Index"); string resourceId = HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); if (string.IsNullOrEmpty(resourceId)) { TempData["httpStatusCode"] = HttpStatusCode.Unauthorized; TempData["errorMessage"] = "You are not authenticated due to heroku auth token not accessed."; return(RedirectToAction("forbidden", "home")); } HerokuAuthToken authToken = default(HerokuAuthToken); OauthGrant oathGrant = default(OauthGrant); var partnerAuthToken = _partnerAuthTokenRepository.Find(resourceId); if (partnerAuthToken == null || (partnerAuthToken != null && (partnerAuthToken.expires_in == DateTime.MinValue || (partnerAuthToken.expires_in != DateTime.MinValue && partnerAuthToken.expires_in?.AddSeconds(-300) < DateTime.Now)))) { oathGrant = await HerokuApi.GetOauthGrant(resourceId).ConfigureAwait(false); if (oathGrant.IsNull()) { TempData["httpStatusCode"] = HttpStatusCode.Unauthorized; TempData["errorMessage"] = "You are not authenticated due to heroku auth token not accessed."; return(RedirectToAction("forbidden", "home")); } //update heroku auth token partnerAuthToken = oathGrant.ToPartnerAuthToken(resourceId); partnerAuthToken = _partnerAuthTokenRepository.Add(partnerAuthToken); //Get heroku auth token authToken = await HerokuApi.GetAddonAccessToken(partnerAuthToken.oauth_code, partnerAuthToken.oauth_type).ConfigureAwait(false); if (authToken.IsNull()) { Response.StatusCode = (int)HttpStatusCode.Unauthorized; TempData["httpStatusCode"] = HttpStatusCode.Unauthorized; TempData["errorMessage"] = "You are not authenticated due to heroku auth token not received."; return(RedirectToAction("forbidden", "home")); } //assign current resourceId as auth_id authToken.auth_id = resourceId; partnerAuthToken = authToken.ToPartnerAuthToken(); if (partnerAuthToken != null) { //update heroku auth token partnerAuthToken = _partnerAuthTokenRepository.Add(partnerAuthToken); } } if (partnerAuthToken == null) { Response.StatusCode = (int)HttpStatusCode.Unauthorized; TempData["httpStatusCode"] = HttpStatusCode.Unauthorized; TempData["errorMessage"] = "You are not authenticated due to heroku auth token not received."; return(RedirectToAction("forbidden", "home")); } else if (partnerAuthToken.Resource != null) { var claims = new List <Claim>(); claims.Add(new Claim(ClaimTypes.NameIdentifier, partnerAuthToken.Resource.uuid)); claims.Add(new Claim(ClaimTypes.Version, partnerAuthToken.Resource.plan.ToString())); claims.Add(new Claim(ClaimTypes.Country, partnerAuthToken.Resource.region)); if (!string.IsNullOrEmpty(partnerAuthToken.Resource.user_email)) { claims.Add(new Claim(Constants.HEROKU_USER_EMAIL, partnerAuthToken.Resource.user_email)); } if (!string.IsNullOrEmpty(partnerAuthToken.Resource.app_name)) { claims.Add(new Claim(Constants.HEROKU_MAIN_APP_NAME, partnerAuthToken.Resource.app_name)); } claims.Add(new Claim(Constants.HEROKU_ACCESS_TOKEN, partnerAuthToken.access_token)); claims.Add(new Claim(Constants.HEROKU_REFRESH_TOKEN, partnerAuthToken.refresh_token)); claims.Add(new Claim(Constants.HEROKU_AUTH_USERID, partnerAuthToken.user_id)); if (partnerAuthToken.expires_in.HasValue) { claims.Add(new Claim(Constants.HEROKU_TOKEN_EXPIREDIN, partnerAuthToken.expires_in.Value.ToString())); } HttpContext.AddUpdateClaims(claims); } //redirect to url if (string.IsNullOrEmpty(returnUrl) || (!string.IsNullOrEmpty(returnUrl) && (returnUrl.Contains("localhost")) || !Uri.IsWellFormedUriString(returnUrl, UriKind.RelativeOrAbsolute))) { return(RedirectToAction("index", "home")); } else { //Redirect to home page return(Redirect(HttpUtility.UrlDecode(returnUrl))); } }
/// <summary> /// ActionFilter: OnActionExecuting /// Description: It is used to check current user role where admin or owner for allowing user to access resources based on role. /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); if (string.IsNullOrEmpty(context.HttpContext.GetClaimValue(Dedup.Common.Constants.HEROKU_MAIN_APP_NAME))) { //local variables var claims = new List <Claim>(); string orgId = string.Empty; string appId = string.Empty; string authToken = string.Empty; string resourceId = string.Empty; //get resourceId resourceId = context.HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); //get heroku auth token authToken = context.HttpContext.GetClaimValue(Dedup.Common.Constants.HEROKU_ACCESS_TOKEN); //get app id using resourceId appId = HerokuApi.GetHerokuAppIdByAddonId(context.HttpContext.GetClaimValue(ClaimTypes.NameIdentifier), authToken).Result; if (!string.IsNullOrEmpty(appId)) { //get app info using app id AppInfo appInfo = HerokuApi.GetAppInfo(appId, authToken); if (appInfo.IsNull()) { claims = null; authToken = null; Console.WriteLine("UPF-appInfo is null by {0}", resourceId); context.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "home", action = "forbidden" })); return; } claims.Add(new Claim(Dedup.Common.Constants.HEROKU_MAIN_APP_NAME, appInfo.name)); claims.Add(new Claim(Dedup.Common.Constants.HEROKU_MAIN_APP_ID, appInfo.id)); if (appInfo.organization.HasValue) { orgId = appInfo.organization?.id; claims.Add(new Claim(Dedup.Common.Constants.HEROKU_ORG_ID, appInfo.organization?.id)); claims.Add(new Claim(Dedup.Common.Constants.HEROKU_ORG_NAME, appInfo.organization?.name)); } var resourceEntity = _resourcesRepository.Find(resourceId); if (resourceEntity != null) { bool isUpdate = false; if (!appInfo.name.Equals(resourceEntity.app_name, StringComparison.OrdinalIgnoreCase)) { resourceEntity.app_name = appInfo.name; isUpdate = true; } if (!appInfo.id.Equals(resourceEntity.heroku_id, StringComparison.OrdinalIgnoreCase)) { resourceEntity.heroku_id = appInfo.id; isUpdate = true; } if (!appInfo.owner.IsNull() && !appInfo.owner.email.Equals(resourceEntity.user_email, StringComparison.OrdinalIgnoreCase)) { resourceEntity.user_email = appInfo.owner.email; isUpdate = true; } if (appInfo.organization.HasValue && !appInfo.organization.Value.name.Equals(resourceEntity.user_organization, StringComparison.OrdinalIgnoreCase)) { resourceEntity.user_organization = appInfo.organization?.name; isUpdate = true; } if (isUpdate) { _resourcesRepository.UpdateAppAndUserInfo(resourceEntity); } } //update user identity if (claims != null && claims.Count() > 0) { context.HttpContext.AddUpdateClaims(claims); } } claims = null; } }
/// <summary> /// Action: GetAccountInfoAsync /// Description: It is used to get the current user name of heroku account /// </summary> /// <returns></returns> private async Task <string> GetAccountInfoAsync() { try { var resourceId = HttpContext.GetClaimValue(ClaimTypes.NameIdentifier); if (!string.IsNullOrEmpty(resourceId)) { //validate account by resource id var resources = _resourcesRepository.Find(resourceId); if (resources != null) { //Update name/email in resource table based on resource-id if null if (string.IsNullOrEmpty(resources.user_organization) || string.IsNullOrEmpty(resources.user_name) || string.IsNullOrEmpty(resources.user_email)) { //Get heroku auth token var herokuAuthToken = HttpContext.GetClaimValue(Constants.HEROKU_ACCESS_TOKEN); if (!string.IsNullOrEmpty(herokuAuthToken)) { if (string.IsNullOrEmpty(resources.user_email) || string.IsNullOrEmpty(resources.app_name)) { //Get app info using heroku api var appInfo = HerokuApi.GetVendorAppInfoByResourceId(resources.uuid); if (!appInfo.IsNull()) { if (string.IsNullOrEmpty(resources.app_name)) { resources.app_name = appInfo.name; } if (string.IsNullOrEmpty(resources.user_email)) { resources.user_email = appInfo.owner_email; } } } if (!string.IsNullOrEmpty(resources.app_name) && string.IsNullOrEmpty(resources.user_organization)) { //Get app info using heroku api var appInfo = HerokuApi.GetAppInfo(resources.app_name, herokuAuthToken); if (!appInfo.IsNull()) { if (string.IsNullOrEmpty(resources.user_organization) && appInfo.organization.HasValue) { resources.user_organization = ((AppOrganization)appInfo.organization).name; } } } if (string.IsNullOrEmpty(resources.user_name)) { //Get username using heroku api var accInfo = HerokuApi.GetAccountInfo(herokuAuthToken); if (!accInfo.IsNull()) { //Assign user name resources.user_name = accInfo.name; } } //Update user organization/name/email _resourcesRepository.Update(resources); } } var claims = new List <Claim>(); if (!string.IsNullOrEmpty(resources.user_name) && HttpContext.GetClaimValue(ClaimTypes.Name) != resources.user_name) { claims.Add(new Claim(ClaimTypes.Name, resources.user_name)); } if (!string.IsNullOrEmpty(resources.user_email) && HttpContext.GetClaimValue(ClaimTypes.Email) != resources.user_email) { claims.Add(new Claim(ClaimTypes.Email, resources.user_email)); } if (claims != null && claims.Count > 0) { HttpContext.AddUpdateClaims(claims); } return(await Task.FromResult(HttpContext.GetClaimValue(ClaimTypes.Name))); } } } catch (Exception ex) { if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == Environments.Development) { _logger.LogError(ex.Message, ex); } else { Console.WriteLine("ERROR: {0}", ex.Message); } } return(await Task.FromResult(string.Empty)); }