Skip to content

Commit

Permalink
Merge pull request #17 from nizanrosh/patch/saml-exception
Browse files Browse the repository at this point in the history
added try catch to saml extraction
  • Loading branch information
nizanrosh committed Jan 9, 2024
2 parents 0599346 + 59f37cd commit 48539d1
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 16 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.5.0</VersionPrefix>
<VersionPrefix>1.5.1</VersionPrefix>
<LangVersion>latest</LangVersion>

<Authors>Nizan Rosh</Authors>
Expand Down
21 changes: 14 additions & 7 deletions src/main/Okta.Aws.Cli/Okta/OktaApiClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@ public class OktaApiClient : IOktaApiClient
private readonly HttpClient _httpClient;
private readonly OktaHttpClientHandler _httpClientHandler;

public OktaApiClient(ILogger<OktaApiClient> logger, IConfiguration configuration, HttpClient httpClient, OktaHttpClientHandler httpClientHandler)
public OktaApiClient(ILogger<OktaApiClient> logger, IConfiguration configuration, HttpClient httpClient,
OktaHttpClientHandler httpClientHandler)
{
_logger = logger;
_configuration = configuration;
Expand All @@ -37,7 +38,8 @@ public async Task<SamlHtmlResponse> GetSamlHtml(string sessionToken, Cancellatio

if (IsAppUrlValid(userSettings.AppUrl))
{
var validAppUrlSaml = await GetHtml(sessionId, userSettings.OktaDomain!, userSettings.AppUrl!, cancellationToken);
var validAppUrlSaml = await GetHtml(sessionId, userSettings.OktaDomain!, userSettings.AppUrl!,
cancellationToken);
return new SamlHtmlResponse(validAppUrlSaml);
}

Expand All @@ -52,7 +54,8 @@ public async Task<SamlHtmlResponse> GetSamlHtml(string sessionToken, Cancellatio
Prompt.ColorSchema.Select = ConsoleColor.Yellow;
var selection = Prompt.Select("Select app url:", appLinks, textSelector: al => $"{al.Label} ({al.LinkUrl})");

var tasks = new List<Task<string>> {GetHtml(sessionId, userSettings.OktaDomain!, selection.LinkUrl!, cancellationToken)};
var tasks = new List<Task<string>>
{ GetHtml(sessionId, userSettings.OktaDomain!, selection.LinkUrl!, cancellationToken) };

foreach (var appLink in appLinks.Where(al => al.LinkUrl != selection.LinkUrl))
{
Expand Down Expand Up @@ -94,7 +97,8 @@ private async Task<string> GetSessionId(string sessionToken, string oktaDomain,

var sessionRequest = new SessionRequest(sessionToken);

var sessionResponse = await _httpClient.PostAsJsonAsync($"{oktaDomain}/api/v1/sessions", sessionRequest, cancellationToken);
var sessionResponse =
await _httpClient.PostAsJsonAsync($"{oktaDomain}/api/v1/sessions", sessionRequest, cancellationToken);

var sessionContent = await sessionResponse.Content.ReadAsStringAsync(cancellationToken);
var sessionModel = JsonConvert.DeserializeObject<SessionResponse>(sessionContent);
Expand All @@ -107,7 +111,8 @@ private async Task<string> GetSessionId(string sessionToken, string oktaDomain,
{
_logger.LogInformation("Getting aws app url...");

var httpRequest = new HttpRequestMessage(HttpMethod.Get, $"{_configuration[User.Settings.OktaDomain]}/api/v1/users/me/appLinks");
var httpRequest = new HttpRequestMessage(HttpMethod.Get,
$"{_configuration[User.Settings.OktaDomain]}/api/v1/users/me/appLinks");
httpRequest.Headers.Add("Cookie", $"sid={sessionId}");

var response = await _httpClient.SendAsync(httpRequest, cancellationToken);
Expand All @@ -129,7 +134,8 @@ private async Task<string> GetSessionId(string sessionToken, string oktaDomain,
{
_logger.LogInformation("Getting aws app url...");

var httpRequest = new HttpRequestMessage(HttpMethod.Get, $"{_configuration[User.Settings.OktaDomain]}/api/v1/users/me/appLinks");
var httpRequest = new HttpRequestMessage(HttpMethod.Get,
$"{_configuration[User.Settings.OktaDomain]}/api/v1/users/me/appLinks");
httpRequest.Headers.Add("Cookie", $"sid={sessionId}");

var response = await _httpClient.SendAsync(httpRequest, cancellationToken);
Expand All @@ -143,7 +149,8 @@ private async Task<string> GetSessionId(string sessionToken, string oktaDomain,
return awsAppLinks;
}

private async Task<string> GetHtml(string sessionId, string oktaDomain, string appUrl, CancellationToken cancellationToken)
private async Task<string> GetHtml(string sessionId, string oktaDomain, string appUrl,
CancellationToken cancellationToken)
{
_httpClientHandler.CookieContainer.Add(new Uri(oktaDomain), new Cookie("sid", sessionId));

Expand Down
24 changes: 17 additions & 7 deletions src/main/Okta.Aws.Cli/Okta/Saml/SamlExtractor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public SamlResult ExtractSamlFromHtml(SamlHtmlResponse samlHtmlResponse)
private SamlResult GetSamlExtractorResult(SamlHtmlResponse samlHtmlResponse)
{
var selectedSaml = ExtractFromHtml(samlHtmlResponse.SelectedSaml);
ArgumentNullException.ThrowIfNull(selectedSaml, nameof(selectedSaml));

if (samlHtmlResponse.AdditionalSamls == null || !samlHtmlResponse.AdditionalSamls.Any()) return new SamlResult(new Abstractions.Saml(WebUtility.HtmlDecode(selectedSaml)));

Expand All @@ -52,22 +53,31 @@ private SamlResult GetSamlExtractorResult(SamlHtmlResponse samlHtmlResponse)
foreach (var additionalSaml in samlHtmlResponse.AdditionalSamls)
{
var extractedAdditionalSaml = ExtractFromHtml(additionalSaml);
if(string.IsNullOrEmpty(extractedAdditionalSaml)) continue;
additionalSamls.Add(new Abstractions.Saml(WebUtility.HtmlDecode(extractedAdditionalSaml)));
}

return new SamlResult(new Abstractions.Saml(WebUtility.HtmlDecode(selectedSaml)), additionalSamls);
}

private string ExtractFromHtml(string html)
private string? ExtractFromHtml(string html)
{
var doc = new HtmlDocument();
doc.LoadHtml(html);
try
{
var doc = new HtmlDocument();
doc.LoadHtml(html);

var samlAttribute = doc.DocumentNode.SelectNodes("//form//input").FirstOrDefault();
var samlToken = samlAttribute?.GetAttributeValue("value", null);
ArgumentNullException.ThrowIfNull(samlToken, nameof(samlToken));
var samlAttribute = doc.DocumentNode.SelectNodes("//form//input").FirstOrDefault();
var samlToken = samlAttribute?.GetAttributeValue("value", null);
ArgumentNullException.ThrowIfNull(samlToken, nameof(samlToken));

return samlToken;
return samlToken;
}
catch (Exception e)
{
_logger.LogError(e, "Failed extracting SAML from HTML.");
return null;
}
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/main/Okta.Aws.Cli/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"profiles": {
"Okta.Aws.Cli": {
"commandName": "Project",
"commandLineArgs": "run",
"commandLineArgs": "run --debug",
"environmentVariables": {
"DOTNET_ENVIRONMENT": "Development"
}
Expand Down

0 comments on commit 48539d1

Please sign in to comment.