diff --git a/DataImport.EdFi/Api/Resources/LocalEducationAgenciesApi.cs b/DataImport.EdFi/Api/Resources/LocalEducationAgenciesApi.cs index 25c9896e..82bd3b7b 100644 --- a/DataImport.EdFi/Api/Resources/LocalEducationAgenciesApi.cs +++ b/DataImport.EdFi/Api/Resources/LocalEducationAgenciesApi.cs @@ -4,7 +4,6 @@ // See the LICENSE and NOTICES files in the project root for more information. using System; -using System.Collections.Generic; using DataImport.Common.ExtensionMethods; using DataImport.EdFi.Models.Resources; using RestSharp; diff --git a/DataImport.Web.Tests/Services/EdFiV311Tests.cs b/DataImport.Web.Tests/Services/EdFiV311Tests.cs index e0c8e788..6854f77d 100644 --- a/DataImport.Web.Tests/Services/EdFiV311Tests.cs +++ b/DataImport.Web.Tests/Services/EdFiV311Tests.cs @@ -34,7 +34,8 @@ public EdFiServiceV311Tss(ISwaggerMetadataFetcher metadataFetcher) GetEncryptionKeyResolver(), A.Fake(), metadataFetcher, - A.Fake()) + A.Fake(), + null) { } diff --git a/DataImport.Web.Tests/Services/Swagger/SwaggerMetadataFetcherTests.cs b/DataImport.Web.Tests/Services/Swagger/SwaggerMetadataFetcherTests.cs index 2fae93dc..8013b780 100644 --- a/DataImport.Web.Tests/Services/Swagger/SwaggerMetadataFetcherTests.cs +++ b/DataImport.Web.Tests/Services/Swagger/SwaggerMetadataFetcherTests.cs @@ -25,9 +25,9 @@ public SwaggerMetadataFetcherTss(IEnumerable swaggerM { } - public new async Task GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection) + public new async Task GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, ApiSection apiSection) { - return await base.GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, tenant, context, apiSection); + return await base.GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, apiSection); } } @@ -54,7 +54,7 @@ public void ShouldThrowIfNoHandlersAvailable() .Setup("https://someapiurl/metadata/resources/api-docs", testDocument); var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty) + sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25) .ShouldThrow() .Message.ShouldBe("No handler available to process Swagger document"); } @@ -72,7 +72,7 @@ public async Task Should_support_Suite2() // Act var sut = new SwaggerMetadataFetcherTss(null, null); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(version260Url, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(version260Url, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -106,7 +106,7 @@ public async Task Should_support_Suite3_Version311_in_Sandbox_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -146,7 +146,7 @@ public async Task Should_support_Suite3_Version510_in_Sandbox_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -179,7 +179,7 @@ public async Task Should_support_Suite3_in_Version311_SharedInstance_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -219,7 +219,7 @@ public async Task Should_support_Suite3_Version510_in_SharedInstance_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -252,7 +252,7 @@ public async Task Should_support_Suite3_Version311_in_YearSpecific_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -293,7 +293,7 @@ public async Task Should_support_Suite3_Version510_in_YearSpecific_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -332,7 +332,7 @@ public async Task Should_support_Suite3_Version52_in_InstanceYearSpecific_mode() // Act var sut = new SwaggerMetadataFetcherTss(null, swaggerClientMock); - var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, string.Empty, string.Empty, apiSection); + var baseDocumentUrl = await sut.GetSwaggerBaseDocumentUrl(versionUrl, apiVersion, apiSection); // Assert baseDocumentUrl.ShouldBe( @@ -385,7 +385,7 @@ public async Task ShouldHandleV1Point2Document() var processors = GetMetadataProcessors(swaggerClientMock); var sut = new SwaggerMetadataFetcherTss(processors, swaggerClientMock); - var resources = (await sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty)).ToList(); + var resources = (await sut.GetMetadata("https://someapiurl/api/v2.0/2018", OdsApiV25)).ToList(); resources.Count.ShouldBe(3); resources.Any(e => e.Path == "/student").ShouldBeTrue(); resources.Any(e => e.Path == "/studentAssessments").ShouldBeTrue(); @@ -438,7 +438,7 @@ public async Task ShouldHandleUrlWithExtraApiInPath() var processors = GetMetadataProcessors(swaggerClientMock); var sut = new SwaggerMetadataFetcherTss(processors, swaggerClientMock); - var resources = (await sut.GetMetadata("https://someapiurl/v2/api/api/v2.0/2018", OdsApiV25, string.Empty, string.Empty)).ToList(); + var resources = (await sut.GetMetadata("https://someapiurl/v2/api/api/v2.0/2018", OdsApiV25)).ToList(); resources.Count.ShouldBe(3); } diff --git a/DataImport.Web/Services/ConfigurationService.cs b/DataImport.Web/Services/ConfigurationService.cs index fe6e19da..fd98b928 100644 --- a/DataImport.Web/Services/ConfigurationService.cs +++ b/DataImport.Web/Services/ConfigurationService.cs @@ -40,7 +40,7 @@ public async Task FillSwaggerMetadata(ApiServer apiServer) IEnumerable swaggerResources; try { - swaggerResources = await _swaggerMetadataFetcher.GetMetadata(apiServer.Url, apiServer.ApiVersion.Version, apiServer.Tenant, apiServer.Context); + swaggerResources = await _swaggerMetadataFetcher.GetMetadata(apiServer.Url, apiServer.ApiVersion.Version); } catch (OdsApiServerException e) { diff --git a/DataImport.Web/Services/EdFiServiceV25.cs b/DataImport.Web/Services/EdFiServiceV25.cs index 98ea17e8..baff54c4 100644 --- a/DataImport.Web/Services/EdFiServiceV25.cs +++ b/DataImport.Web/Services/EdFiServiceV25.cs @@ -8,6 +8,7 @@ using DataImport.Common.Helpers; using DataImport.EdFi; using DataImport.Models; +using Microsoft.Extensions.Options; using RestSharp; using System; using System.Threading.Tasks; @@ -18,13 +19,14 @@ public class EdFiServiceV25 : EdFiServiceBase { private readonly IOAuthRequestWrapper _oauthRequestWrapper; private readonly string _encryptionKey; + private readonly IOptions _options; - public EdFiServiceV25(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, IOAuthRequestWrapper oauthRequestWrapper) + public EdFiServiceV25(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, IOAuthRequestWrapper oauthRequestWrapper, IOptions options) : base(mapper, dbContext) { _encryptionKey = encryptionKeyResolver.GetEncryptionKey(); - _oauthRequestWrapper = oauthRequestWrapper ?? throw new ArgumentNullException(nameof(oauthRequestWrapper)); + _options = options; } public override bool CanHandle(string apiVersion) => apiVersion.IsOdsV2(); @@ -35,6 +37,10 @@ protected override IRestClient EstablishApiClient(ApiServer apiServer) var options = new RestClientOptions(); options.Authenticator = new BearerTokenAuthenticator(tokenRetriever); options.BaseUrl = new Uri(apiServer?.Url); + if (_options.Value.IgnoresCertificateErrors) + { + options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; + } return new RestClient(options); } diff --git a/DataImport.Web/Services/EdFiServiceV311.cs b/DataImport.Web/Services/EdFiServiceV311.cs index 2ca158d2..cadc3377 100644 --- a/DataImport.Web/Services/EdFiServiceV311.cs +++ b/DataImport.Web/Services/EdFiServiceV311.cs @@ -9,6 +9,7 @@ using DataImport.EdFi; using DataImport.Models; using DataImport.Web.Services.Swagger; +using Microsoft.Extensions.Options; using RestSharp; using System; using System.Collections.Generic; @@ -22,13 +23,15 @@ public class EdFiServiceV311 : EdFiServiceBase private readonly Dictionary _yearSpecificYearCache = new Dictionary(); private readonly IOAuthRequestWrapper _oauthRequestWrapper; private string _encryptionKey; + private readonly IOptions _options; - public EdFiServiceV311(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, ISwaggerMetadataFetcher metadataFetcher, IOAuthRequestWrapper oauthRequestWrapper) + public EdFiServiceV311(DataImportDbContext dbContext, IEncryptionKeyResolver encryptionKeyResolver, IMapper mapper, ISwaggerMetadataFetcher metadataFetcher, IOAuthRequestWrapper oauthRequestWrapper, IOptions options) : base(mapper, dbContext) { _metadataFetcher = metadataFetcher; _oauthRequestWrapper = oauthRequestWrapper ?? throw new ArgumentNullException(nameof(oauthRequestWrapper)); _encryptionKey = encryptionKeyResolver.GetEncryptionKey(); + _options = options; } private string EncryptionKey @@ -47,6 +50,10 @@ protected override IRestClient EstablishApiClient(ApiServer apiServer) var options = new RestClientOptions(); options.Authenticator = new BearerTokenAuthenticator(tokenRetriever); options.BaseUrl = new Uri(apiServer?.Url); + if (_options.Value.IgnoresCertificateErrors) + { + options.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; + } return new RestClient(options); } diff --git a/DataImport.Web/Services/Swagger/ISwaggerMetadataFetcher.cs b/DataImport.Web/Services/Swagger/ISwaggerMetadataFetcher.cs index 92745f70..9eb1e5f0 100644 --- a/DataImport.Web/Services/Swagger/ISwaggerMetadataFetcher.cs +++ b/DataImport.Web/Services/Swagger/ISwaggerMetadataFetcher.cs @@ -10,7 +10,7 @@ namespace DataImport.Web.Services.Swagger { public interface ISwaggerMetadataFetcher { - Task> GetMetadata(string apiUrl, string apiVersion, string tenant, string context); + Task> GetMetadata(string apiUrl, string apiVersion); Task GetTokenUrl(string apiUrl, string apiVersion, string tenant, string context); Task GetAuthUrl(string apiUrl, string apiVersion, string tenant, string context); Task InferOdsApiVersion(string apiUrl); diff --git a/DataImport.Web/Services/Swagger/SwaggerMetadataFetcher.cs b/DataImport.Web/Services/Swagger/SwaggerMetadataFetcher.cs index 513c7da7..732ecbc1 100644 --- a/DataImport.Web/Services/Swagger/SwaggerMetadataFetcher.cs +++ b/DataImport.Web/Services/Swagger/SwaggerMetadataFetcher.cs @@ -24,10 +24,10 @@ public SwaggerMetadataFetcher(IEnumerable swaggerMeta _swaggerWebClient = swaggerWebClient; } - public async Task> GetMetadata(string apiUrl, string apiVersion, string tenant, string context) + public async Task> GetMetadata(string apiUrl, string apiVersion) { - var (resourcesSwaggerDocument, resourcesHandler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources); - var (descriptorsSwaggerDocument, descriptorsHandler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Descriptors); + var (resourcesSwaggerDocument, resourcesHandler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources); + var (descriptorsSwaggerDocument, descriptorsHandler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Descriptors); var resources = await resourcesHandler.GetMetadata(resourcesSwaggerDocument, ApiSection.Resources); var descriptors = await descriptorsHandler.GetMetadata(descriptorsSwaggerDocument, ApiSection.Descriptors); @@ -37,7 +37,7 @@ public async Task> GetMetadata(string apiUrl, strin public async Task GetTokenUrl(string apiUrl, string apiVersion, string tenant, string context) { - var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources); + var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources); if (!string.IsNullOrEmpty(apiVersion) && apiVersion.StartsWith("7.")) { @@ -49,7 +49,7 @@ public async Task GetTokenUrl(string apiUrl, string apiVersion, string t public async Task GetAuthUrl(string apiUrl, string apiVersion, string tenant, string context) { - var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, tenant, context, ApiSection.Resources); + var (swaggerDocument, handler) = await GetSwaggerDocument(apiUrl, apiVersion, ApiSection.Resources); return handler.GetAuthUrl(swaggerDocument); } @@ -161,9 +161,9 @@ public async Task InferOdsApiVersion(string apiUrl) } } - private async Task<(JObject swaggerDocument, ISwaggerMetadataProcessor swaggerMetadataProcessor)> GetSwaggerDocument(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection) + private async Task<(JObject swaggerDocument, ISwaggerMetadataProcessor swaggerMetadataProcessor)> GetSwaggerDocument(string apiUrl, string apiVersion, ApiSection apiSection) { - var baseUrl = await GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, tenant, context, apiSection); + var baseUrl = await GetSwaggerBaseDocumentUrl(apiUrl, apiVersion, apiSection); var rawApis = await _swaggerWebClient.DownloadString(baseUrl); @@ -185,7 +185,7 @@ public async Task InferOdsApiVersion(string apiUrl) return (swaggerDocument, handler); } - protected async Task GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, string tenant, string context, ApiSection apiSection) + protected async Task GetSwaggerBaseDocumentUrl(string apiUrl, string apiVersion, ApiSection apiSection) { if (apiVersion.IsOdsV2()) { @@ -195,30 +195,7 @@ protected async Task GetSwaggerBaseDocumentUrl(string apiUrl, string api else if (apiVersion.IsOdsV3()) { var baseUrl = Common.Helpers.UrlUtility.RemoveAfterLastInstanceOf(apiUrl.Trim(), "/data/"); - - string path; - if (!string.IsNullOrEmpty(tenant) && string.IsNullOrEmpty(context)) - { - // MultiTenant Environment - path = $"{tenant}/data/v3"; - } - else if (!string.IsNullOrEmpty(context) && string.IsNullOrEmpty(tenant)) - { - // SingleTenant with ODS Context Routes Environment - path = $"{context}/data/v3"; - } - else if (!string.IsNullOrEmpty(context) && !string.IsNullOrEmpty(tenant)) - { - // MultiTenant with ODS Context Routes Environments - path = $"{tenant}/{context}/data/v3"; - } - else - { - // SingleTenant and Sandbox Environments - path = "data/v3"; - } - - return $"{baseUrl}/metadata/{path}/{apiSection.ToMetadataRoutePart()}/swagger.json"; + return $"{baseUrl}/metadata/data/v3/{apiSection.ToMetadataRoutePart()}/swagger.json"; } else {