Skip to content

Commit

Permalink
Merge pull request #14 from nizanrosh/feature/multiple-app-urls
Browse files Browse the repository at this point in the history
Added support for multiple aws accounts
  • Loading branch information
nizanrosh committed Feb 19, 2023
2 parents 575f123 + 588cb1e commit eb52190
Show file tree
Hide file tree
Showing 5 changed files with 33 additions and 11 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<VersionPrefix>1.3.2</VersionPrefix>
<VersionPrefix>1.4.0</VersionPrefix>
<LangVersion>latest</LangVersion>

<Authors>Nizan Rosh</Authors>
Expand Down
1 change: 1 addition & 0 deletions src/main/Okta.Aws.Cli/Cli/SelectArgumentHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ protected override Task HandleInternal(string[] args, CancellationToken cancella
var arnMappings = _arnMappingsService.GetArnMappings();
var selections = GetSelections(profiles.Keys, arnMappings);

Prompt.ColorSchema.Select = ConsoleColor.Yellow;
var selection = Prompt.Select("Select a profile (use arrow keys)", selections);
var invertedArnMappings = arnMappings.ToDictionary(x => x.Value, x => x.Key);
if (invertedArnMappings.TryGetValue(selection, out var mapping))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,15 @@
namespace Okta.Aws.Cli.Okta.Abstractions
{
[DataContract]
public class AppLinks
public class AppLink
{
[DataMember(Name = "linkUrl")]
public string? LinkUrl { get; set; }

[DataMember(Name = "appName")]
public string? AppName { get; set; }

[DataMember(Name = "label")]
public string? Label { get; set; }
}
}
34 changes: 26 additions & 8 deletions src/main/Okta.Aws.Cli/Okta/OktaApiClient.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System.Net;
using System.Net.Http.Json;
using System.Security;
using Kurukuru;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
Expand All @@ -8,6 +9,7 @@
using Okta.Aws.Cli.Constants;
using Okta.Aws.Cli.Okta.Abstractions;
using Okta.Aws.Cli.Okta.Constants;
using Sharprompt;

namespace Okta.Aws.Cli.Okta;

Expand All @@ -28,6 +30,19 @@ public OktaApiClient(ILogger<OktaApiClient> logger, IConfiguration configuration
}

public async Task<string> GetSamlHtml(string sessionToken, CancellationToken cancellationToken)
{
var userSettings = _configuration.GetSection(nameof(UserSettings)).Get<UserSettings>();

var sessionId = await LogIn(sessionToken, cancellationToken);
var appUrl = IsAppUrlValid(userSettings.AppUrl) ? userSettings.AppUrl : await GetAppUrl(sessionId, cancellationToken);
ArgumentNullException.ThrowIfNull(appUrl, nameof(appUrl));

var html = await GetHtml(sessionId, userSettings.OktaDomain!, appUrl, cancellationToken);

return html;
}

private async Task<string> LogIn(string sessionToken, CancellationToken cancellationToken)
{
var spinner = new Spinner("Logging in...");
spinner.SymbolSucceed = new SymbolDefinition("V", "V");
Expand All @@ -39,14 +54,10 @@ public async Task<string> GetSamlHtml(string sessionToken, CancellationToken can
var userSettings = _configuration.GetSection(nameof(UserSettings)).Get<UserSettings>();

var sessionId = await GetSessionId(sessionToken, userSettings.OktaDomain!, cancellationToken);
var appUrl = IsAppUrlValid(userSettings.AppUrl) ? userSettings.AppUrl : await GetAppUrl(sessionId, cancellationToken);
ArgumentNullException.ThrowIfNull(appUrl, nameof(appUrl));

var html = await GetHtml(sessionId, userSettings.OktaDomain!, appUrl, cancellationToken);


spinner.Succeed();

return html;
return sessionId;
}
catch (Exception)
{
Expand Down Expand Up @@ -80,9 +91,16 @@ private async Task<string> GetSessionId(string sessionToken, string oktaDomain,
var response = await _httpClient.SendAsync(httpRequest, cancellationToken);
var content = await response.Content.ReadAsStringAsync(cancellationToken);

var appLinks = JsonConvert.DeserializeObject<AppLinks[]>(content);
var appLinks = JsonConvert.DeserializeObject<AppLink[]>(content);

var appUrls = appLinks.Where(al => al.AppName == AppNames.Amazon).ToArray();
if (!appUrls.Any()) return null;

if (appUrls.Length == 1) return appUrls.First().LinkUrl;

return appLinks.FirstOrDefault(al => al.AppName == AppNames.Amazon)?.LinkUrl;
Prompt.ColorSchema.Select = ConsoleColor.Yellow;
var selection = Prompt.Select("Select app url:", appUrls, textSelector: al => $"{al.Label} ({al.LinkUrl})");
return selection.LinkUrl;
}

private async Task<string> GetHtml(string sessionId, string oktaDomain, string appUrl, CancellationToken cancellationToken)
Expand Down
2 changes: 1 addition & 1 deletion src/main/Okta.Aws.Cli/Okta/Saml/SamlExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public SamlResponse ExtractSamlFromHtml(string html)
var response = await httpClient.SendAsync(httpRequest);
var content = await response.Content.ReadAsStringAsync();

var appLinks = JsonConvert.DeserializeObject<AppLinks[]>(content);
var appLinks = JsonConvert.DeserializeObject<AppLink[]>(content);

return appLinks?.FirstOrDefault(al => al.AppName == AppNames.Amazon)?.LinkUrl;
}
Expand Down

0 comments on commit eb52190

Please sign in to comment.