Skip to content

Commit

Permalink
Merge pull request #135 from intuit/DiscoveryUpdates
Browse files Browse the repository at this point in the history
Discovery updates
  • Loading branch information
nimisha84 authored Jul 2, 2020
2 parents ec9a236 + 8ee7a66 commit 0c409c4
Show file tree
Hide file tree
Showing 19 changed files with 1,163 additions and 57 deletions.
4 changes: 2 additions & 2 deletions IPPDotNetDevKitCSV3/Code/Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
<PackageIcon>$(MSBuildThisFileDirectory)logo.png</PackageIcon>
<OutputPath>$(SolutionDir)artifacts\bin</OutputPath>
<Copyright>Copyright © 2019 Intuit, Inc.</Copyright>
<AssemblyVersion>12.1.0.0</AssemblyVersion>
<FileVersion>12.1.0.0</FileVersion>
<AssemblyVersion>13.0.0.0</AssemblyVersion>
<FileVersion>13.0.0.0</FileVersion>
<Company>Intuit</Company>
<AppendTargetFrameworkToOutputPath>true</AppendTargetFrameworkToOutputPath>
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -178,7 +178,7 @@
<value>Please specify a valid directory path.</value>
</data>
<data name="DefaultMinorVersionValue" xml:space="preserve">
<value>51</value>
<value>52</value>
</data>
<data name="ArgumentCannotBeGreaterThanBaseline" xml:space="preserve">
<value>The specified argument {0} cannot be greater than its ceiling value of {1}.</value>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -165,13 +165,19 @@ internal IdsException ParseResponseAndThrowException(WebException webException,

// ServiceUnavailable: 503
case HttpStatusCode.ServiceUnavailable:
idsException = new IdsException(statusCodeDescription, statusCode.ToString(CultureInfo.InvariantCulture), webException.Source, new EndpointNotFoundException("Call to the endpoint returned a 503- Service Unavailable response"));
break;
// InternalServerError: 500
case HttpStatusCode.InternalServerError:
idsException = new IdsException(statusCodeDescription, statusCode.ToString(CultureInfo.InvariantCulture), webException.Source, new EndpointNotFoundException("Call to the endpoint returned a 500 - Internal Server Error response"));
break;
// Forbidden: 403
case HttpStatusCode.Forbidden:
idsException = new IdsException(statusCodeDescription, statusCode.ToString(CultureInfo.InvariantCulture), webException.Source, new EndpointNotFoundException("Call to the endpoint returned a 403 - Forbidden response"));
break;
// NotFound: 404
case HttpStatusCode.NotFound:
idsException = new IdsException(statusCodeDescription, statusCode.ToString(CultureInfo.InvariantCulture), webException.Source, new EndpointNotFoundException());
idsException = new IdsException(statusCodeDescription, statusCode.ToString(CultureInfo.InvariantCulture), webException.Source, new EndpointNotFoundException("Call to the endpoint returned a 404 - Endpoint not found response"));
break;
// Throttle Exceeded: 429
case (HttpStatusCode)429:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<PackageId>IppDotNetSdkForQuickBooksApiV3</PackageId>
<AssemblyName>IppDotNetSdkForQuickBooksApiV3</AssemblyName>
<DocumentationFile>$(BaseOutputPath)$(AssemblyName).xml</DocumentationFile>
<MainVersion>12.1.0.0</MainVersion>
<MainVersion>13.0.0.0</MainVersion>
<!--<PackageVersionSuffix>stable</PackageVersionSuffix>-->
<!--<Version>$(MainVersion)-$(PackageVersionSuffix)</Version>-->
<Version>$(MainVersion)</Version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,23 +126,25 @@ public DiscoveryClient(AppEnvironment appEnvironment)


}
else if (appEnvironment == AppEnvironment.E2EProduction)
{
discoveryUrl = OidcConstants.Discovery.E2EProdDiscoveryEndpoint;
discoveryAuthority = OidcConstants.Discovery.E2EAuthority;
}
else if (appEnvironment == AppEnvironment.E2ESandbox)
{
discoveryUrl = OidcConstants.Discovery.E2ESandboxDiscoveryEndpoint;
discoveryAuthority = OidcConstants.Discovery.E2EAuthority;
}
else

//else if (appEnvironment == AppEnvironment.E2EProduction)
//{
// discoveryUrl = OidcConstants.Discovery.E2EProdDiscoveryEndpoint;
// discoveryAuthority = OidcConstants.Discovery.E2EAuthority;
//}
//else if (appEnvironment == AppEnvironment.E2ESandbox)
//{
// discoveryUrl = OidcConstants.Discovery.E2ESandboxDiscoveryEndpoint;
// discoveryAuthority = OidcConstants.Discovery.E2EAuthority;
//}
else //everything else defaults to sandbox env
{
discoveryUrl = OidcConstants.Discovery.SandboxDiscoveryEndpoint;
discoveryAuthority = OidcConstants.Discovery.ProdAuthority;
}


url = discoveryAuthority + discoveryUrl;
url = discoveryAuthority + discoveryUrl;
Url = url;
_client = new HttpClient(handler);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,21 +39,21 @@ public void SetAuthority(string authority = OidcConstants.Discovery.IssuerUrl)
public void SetAuthority(AppEnvironment appEnvironment)
{
string authority = "";
if (appEnvironment == AppEnvironment.Production)
if (appEnvironment == AppEnvironment.Production|| appEnvironment == AppEnvironment.Sandbox)
{
authority = OidcConstants.Discovery.IssuerUrl;
}
else if (appEnvironment == AppEnvironment.E2EProduction)
{
authority = OidcConstants.Discovery.IssuerUrlE2E;
}
else if (appEnvironment == AppEnvironment.E2ESandbox)
{
authority = OidcConstants.Discovery.IssuerUrlE2E;
}
//else if (appEnvironment == AppEnvironment.E2EProduction)
//{
// authority = OidcConstants.Discovery.IssuerUrlE2E;
//}
//else if (appEnvironment == AppEnvironment.E2ESandbox)
//{
// authority = OidcConstants.Discovery.IssuerUrlE2E;
//}
else
{
authority = OidcConstants.Discovery.IssuerUrl;
authority = "";//ignore authority validation for all other env
}
Authority = authority;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,11 @@ private string Validate(DiscoveryPolicy policy = null)
if (policy.ValidateIssuerName)
{
if (string.IsNullOrWhiteSpace(Issuer)) return "Issuer name is missing";

var isValid = ValidateIssuerName(Issuer.RemoveTrailingSlash(), policy.Authority.RemoveTrailingSlash());
if (!isValid) return "Issuer name does not match authority: " + Issuer;
if (Issuer == OidcConstants.Discovery.IssuerUrl)//do this check only for prod/sandbox url as partners may test with e2e
{
var isValid = ValidateIssuerName(Issuer.RemoveTrailingSlash(), policy.Authority.RemoveTrailingSlash());
if (!isValid) return "Issuer name does not match authority: " + Issuer;
}
}

var error = ValidateEndpoints(Json, policy);
Expand Down Expand Up @@ -162,7 +164,7 @@ public bool ValidateIssuerName(string issuer, string authority)
/// <param name="json">json</param>
/// <param name="policy">policy</param>
/// <returns>bool</returns>
public string ValidateEndpoints(JObject json, DiscoveryPolicy policy)
public string ValidateEndpoints(JObject json, DiscoveryPolicy policy)//policy for later use
{
//var authorityHost = new Uri(policy.Authority).Authority;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ public OAuth2Client(string clientID, string clientSecret, string redirectURI, st
}
catch (System.Exception ex)
{
ApplicationEnvironment = AppEnvironment.Default;
ApplicationEnvironment = AppEnvironment.Custom;
DiscoveryUrl = environment;
}

Expand All @@ -250,31 +250,83 @@ public OAuth2Client(string clientID, string clientSecret, string redirectURI, st


DiscoveryDoc = GetDiscoveryDoc();


}



/// <summary>
/// Gets Discovery Doc
/// </summary>
/// <returns></returns>
public DiscoveryResponse GetDiscoveryDoc()
{

DiscoveryClient discoveryClient;
if (ApplicationEnvironment == AppEnvironment.Default || ApplicationEnvironment == AppEnvironment.Custom)
{
discoveryClient = new DiscoveryClient(DiscoveryUrl);
}
else
{
discoveryClient = new DiscoveryClient(ApplicationEnvironment);
}
DiscoveryResponse discoveryResponse = discoveryClient.Get();
if(discoveryResponse.IsError==true)
{
throw new System.Exception(discoveryResponse.Error);
}

return discoveryResponse;
}


DiscoveryClient discoveryClient;
if (ApplicationEnvironment == AppEnvironment.Default)
/// <summary>
/// Get Authorization Url
/// </summary>
/// <param name="scopes"></param>
/// <param name="CSRFToken"></param>
/// <returns></returns>
public string GetAuthorizationURL(List<string> scopes, string CSRFToken)
{
if (string.IsNullOrEmpty(DiscoveryDoc.AuthorizeEndpoint))
{
discoveryClient = new DiscoveryClient(DiscoveryUrl);
throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty.");
}
else
AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
{
discoveryClient = new DiscoveryClient(ApplicationEnvironment);
ShowInfoLogs = true;
}
return discoveryClient.Get();
//Intialize Logger
AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForRollingFile: this.EnableSerilogRequestResponseLoggingForRollingFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile);


string scopeValue = "";
for (var index = 0; index < scopes.Count; index++)
{
scopeValue += scopes[index] + " ";
}
scopeValue = scopeValue.TrimEnd();
this.CSRFToken = CSRFToken;

//builiding authorization request
string authorizationRequest = string.Format("{0}?client_id={1}&response_type=code&scope={2}&redirect_uri={3}&state={4}",
DiscoveryDoc.AuthorizeEndpoint,
ClientID,
Uri.EscapeDataString(scopeValue),
Uri.EscapeDataString(RedirectURI),
CSRFToken);

//Logging authorization request
AdvancedLogger.Log("Logging AuthorizationRequest:" + authorizationRequest);

return authorizationRequest;
}


/// <summary>
/// Get Authorization Url
/// </summary>
Expand All @@ -283,6 +335,10 @@ public DiscoveryResponse GetDiscoveryDoc()
/// <returns></returns>
public string GetAuthorizationURL(List<OidcScopes> scopes, string CSRFToken)
{
if (string.IsNullOrEmpty(DiscoveryDoc.AuthorizeEndpoint))
{
throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty.");
}
AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand Down Expand Up @@ -322,6 +378,11 @@ public string GetAuthorizationURL(List<OidcScopes> scopes, string CSRFToken)
/// <returns></returns>
public string GetAuthorizationURL(List<OidcScopes> scopes)
{
if(string.IsNullOrEmpty(DiscoveryDoc.AuthorizeEndpoint))
{
throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty.");
}

AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand Down Expand Up @@ -485,6 +546,12 @@ public string GetAuthorizationURL(List<OidcScopes> scopes)
/// <returns></returns>
public async Task<TokenResponse> GetBearerTokenAsync(string code, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(DiscoveryDoc.TokenEndpoint))
{
AdvancedLogger.Log("Discovery Call failed.BearerToken Endpoint is empty.");
return new TokenResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. BearerToken Endpoint is empty.");
}

AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand All @@ -509,6 +576,12 @@ public string GetAuthorizationURL(List<OidcScopes> scopes)
/// <returns></returns>
public async Task<TokenResponse> RefreshTokenAsync(string refreshToken, object extra = null, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(DiscoveryDoc.TokenEndpoint))
{
AdvancedLogger.Log("Discovery Call failed. RefreshToken Endpoint is empty.");
return new TokenResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. RefreshToken Endpoint is empty.");
}

AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand All @@ -531,6 +604,12 @@ public string GetAuthorizationURL(List<OidcScopes> scopes)
/// <returns></returns>
public async Task<TokenRevocationResponse> RevokeTokenAsync(string accessOrRefreshToken, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(DiscoveryDoc.RevocationEndpoint))
{
AdvancedLogger.Log("Discovery Call failed. RevokeToken Endpoint is empty.");
return new TokenRevocationResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. RevokeToken Endpoint is empty.");
}

AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand All @@ -557,6 +636,12 @@ public string GetAuthorizationURL(List<OidcScopes> scopes)
/// <returns></returns>
public async Task<UserInfoResponse> GetUserInfoAsync(string accessToken, CancellationToken cancellationToken = default(CancellationToken))
{
if (string.IsNullOrEmpty(DiscoveryDoc.UserInfoEndpoint))
{
AdvancedLogger.Log("Discovery Call failed. UserInfo Endpoint is empty.");
return new UserInfoResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. UserInfo Endpoint is empty.");
}

AdvancedLoggerEnabled = true;
//Set internal property to track only informational -intuit_tid based logs
if (EnableAdvancedLoggerInfoMode == true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,10 +151,21 @@ public TimeSpan Timeout
response = await Client.SendAsync(request, cancellationToken).ConfigureAwait(false);

HttpResponseHeaders headers = response.Headers;
string intuit_tid = response.Headers.GetValues("intuit_tid").FirstOrDefault();


if (response.StatusCode == HttpStatusCode.OK || response.StatusCode == HttpStatusCode.BadRequest)
{
string intuit_tid;
IEnumerable<string> values;
if (headers.TryGetValues("intuit_tid", out values))
{
intuit_tid = values.First();
}
else
{
intuit_tid = "None";
}

var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);//errorDetail can be added here if required for BadRequest.
if (OAuth2Client.AdvancedLoggerEnabled != false)
{
Expand Down Expand Up @@ -182,9 +193,9 @@ public TimeSpan Timeout
if (OAuth2Client.AdvancedLoggerEnabled != false)
{
if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode
OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode);
OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode);
else
OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail);
OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail);

}
return new TokenResponse(response.StatusCode, response.ReasonPhrase + ": " + errorDetail);
Expand All @@ -194,9 +205,9 @@ public TimeSpan Timeout
if (OAuth2Client.AdvancedLoggerEnabled != false)
{
if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode
OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode);
OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode);
else
OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase);
OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase);

}
return new TokenResponse(response.StatusCode, response.ReasonPhrase);
Expand Down
Loading

0 comments on commit 0c409c4

Please sign in to comment.