Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
aff3c5f
Update .NET dependencies
markm77 Mar 26, 2026
9a00943
Update Revolut
markm77 Mar 26, 2026
604974e
Update Barclays
markm77 Mar 26, 2026
031c212
Update .NET dependencies
markm77 Mar 31, 2026
b547a65
Add Wise bank
markm77 Mar 31, 2026
ad1c3dc
[Docs] Update docs
markm77 Mar 31, 2026
58b72b0
Update .NET dependencies
markm77 May 1, 2026
67eb03a
Update Starling
markm77 Apr 14, 2026
f5faa9a
Remove unused bank profile property
markm77 May 5, 2026
5eaa088
Add JsonConverter customisation options for DCR response
markm77 May 5, 2026
f931822
Support explicit scope in certain token endpoint requests
markm77 May 6, 2026
1fd96d5
Add BaseIdTokenProcessingCustomBehaviour and new IdTokenSubClaimType …
markm77 May 6, 2026
fbc8bca
[Test] Add delay setting
markm77 May 6, 2026
3a83b15
Generate JWT signature from unencoded payload when b64 header set to …
markm77 May 7, 2026
57fed85
Add Virgin (Merged APIs) to Nationwide
markm77 May 1, 2026
5b09dec
[Docs] Update docs
markm77 May 7, 2026
470eeb7
Update .NET dependencies
markm77 May 9, 2026
447655a
Update logging providers
markm77 May 10, 2026
b629935
[Test] Use HTML emails
markm77 May 11, 2026
38cd085
[Test] Update xUnit from v2 to v3
markm77 May 9, 2026
4a2e77c
[Test] Change output type to support remote testing with Visual Studio
markm77 May 11, 2026
7b1f662
[Test] Use test framework assertions rather than FluentAssertions
markm77 May 9, 2026
aae9f03
[Test] Update BankTests project
markm77 May 9, 2026
7d97a11
[Test] Use TestOutputLoggerProvider for BankTestingFixture in bank tests
markm77 May 10, 2026
e64663e
Support consent type-specific auth endpoint
markm77 May 10, 2026
b5cf473
Add Zopa bank with PISP (domestic payments) API
markm77 May 10, 2026
51a4c8f
[Docs] Update docs
markm77 May 11, 2026
390a723
Update LinksUrlOperations
markm77 May 24, 2026
45fb2e2
Update Lloyds
markm77 May 24, 2026
99afe33
Update NatWest
markm77 May 24, 2026
d064104
Add ServerError records and use to populate ProblemDetails responses
markm77 May 22, 2026
da1334c
Add ProblemDetails responses for consent not found errors
markm77 May 22, 2026
3316dd8
Make unused Barclays sandbox obsolete
markm77 May 22, 2026
a16b474
Use IssClaim for custom behaviour (re-factor not behaviour change)
markm77 May 22, 2026
ba21c31
Add ProblemDetails responses for ID token validation errors
markm77 May 23, 2026
a881737
Add ProblemDetails responses for external API HTTP request errors
markm77 May 23, 2026
acbd124
Move content out of Web project
markm77 May 23, 2026
68236d5
[Test] Remove GenericHost project dependencies from BankTests project
markm77 May 23, 2026
6cf47db
Improve application start-up logging
markm77 May 23, 2026
d0d7032
Remove GenericHost project dependencies from Web project
markm77 May 24, 2026
61abee8
Update .NET dependencies
markm77 May 24, 2026
387c50b
[Docs] Update docs
markm77 May 24, 2026
e9d1902
Update .NET dependencies
markm77 Jun 12, 2026
5c1263a
[Test] Prepare for removal of old test logging system
markm77 Jun 14, 2026
ae683d2
Replace "pass-through" errors with ExternalApiHttpRequestFailure resp…
markm77 Jun 14, 2026
78ef399
Support exposeSuccessResponseBody for de-serialisation error responses
markm77 Jun 14, 2026
4fcb203
Remove URL filtering for HTTP request errors
markm77 Jun 14, 2026
dba3b0f
Add M&S bank to HSBC
markm77 Jun 14, 2026
149b72b
[Docs] Update docs
markm77 Jun 16, 2026
7cf6f86
Merge upstream/master to sync fork
DanJakeNeal Jul 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/apis/account-and-transaction/openapi-aisp.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Account and Transaction API",
"description": "Account and Transaction API for Open Banking Connector Web App",
"version": "18.2.0"
"version": "20.0.0"
},
"paths": {
"/aisp/account-access-consent-auth-contexts": {
Expand Down
2 changes: 1 addition & 1 deletion docs/apis/auth-contexts/openapi-auth.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Auth Contexts API",
"description": "Auth Contexts API for Open Banking Connector Web App",
"version": "18.2.0"
"version": "20.0.0"
},
"paths": {
"/auth/redirect-delegate": {
Expand Down
12 changes: 9 additions & 3 deletions docs/apis/management/openapi-manage.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Management API",
"description": "Management API for Open Banking Connector Web App",
"version": "18.2.0"
"version": "20.0.0"
},
"paths": {
"/manage/bank-registrations": {
Expand Down Expand Up @@ -730,7 +730,9 @@
"Santander",
"Starling",
"Tide",
"Tsb"
"Tsb",
"Wise",
"Zopa"
],
"type": "string"
},
Expand All @@ -754,6 +756,7 @@
"Hsbc_UkKinetic",
"Hsbc_UkPersonal",
"Hsbc_HsbcNetUk",
"Hsbc_MAndS",
"Lloyds_Sandbox",
"Lloyds_LloydsPersonal",
"Lloyds_LloydsBusiness",
Expand All @@ -766,6 +769,7 @@
"Monzo_Monzo",
"Monzo_Sandbox",
"Nationwide_Nationwide",
"Nationwide_VirginMerged",
"NatWest_NatWestSandbox",
"NatWest_NatWest",
"NatWest_NatWestBankline",
Expand All @@ -790,7 +794,9 @@
"Santander_Corporate",
"Starling_Starling",
"Tide_Tide",
"Tsb_Tsb"
"Tsb_Tsb",
"Wise_Wise",
"Zopa_Zopa"
],
"type": "string",
"description": "Banks for which bank profiles have been created. Called BankProfileEnum to avoid confusion with the associated\r\nclass BankProfile."
Expand Down
2 changes: 1 addition & 1 deletion docs/apis/payment-initiation/openapi-pisp.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Payment Initiation API",
"description": "Payment Initiation API for Open Banking Connector Web App",
"version": "18.2.0"
"version": "20.0.0"
},
"paths": {
"/pisp/domestic-payment-consent-auth-contexts": {
Expand Down
2 changes: 1 addition & 1 deletion docs/apis/variable-recurring-payments/openapi-vrp.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"info": {
"title": "Variable Recurring Payments API",
"description": "Variable Recurring Payments API for Open Banking Connector Web App",
"version": "18.2.0"
"version": "20.0.0"
},
"paths": {
"/vrp/domestic-vrp-consent-auth-contexts": {
Expand Down
12 changes: 7 additions & 5 deletions docs/bank-integrations.md

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ namespace FinnovationLabs.OpenBanking.Library.BankApiModels.Json
/// </summary>
public enum JsonConverterLabel
{
DcrRegIssuedAt,
DcrRegExpirationTime,
DcrRegClientIdIssuedAt,
DcrRegScope,
IdTokenExpirationTimeClaim,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="14.0.0"/>
<PackageReference Include="AutoMapper" Version="16.1.1"/>
<PackageReference Include="FluentValidation" Version="12.1.1"/>
<PackageReference Include="jose-jwt" Version="5.2.0"/>
<PackageReference Include="jose-jwt" Version="5.3.0"/>
<PackageReference Include="Microsoft.Rest.ClientRuntime" Version="2.3.24"/>
<PackageReference Include="Newtonsoft.Json" Version="13.0.4"/>
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,19 @@ public OBClientRegistration1(
/// expressed as seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "iat")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegIssuedAt)]
public DateTimeOffset Iat { get; set; }

/// <summary>
/// Gets or sets the time at which the request expires expressed as
/// seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "exp")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegExpirationTime)]
public DateTimeOffset Exp { get; set; }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,15 +127,19 @@ public OBClientRegistration1(
/// expressed as seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "iat")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegIssuedAt)]
public DateTimeOffset Iat { get; set; }

/// <summary>
/// Gets or sets the time at which the request expires expressed as
/// seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "exp")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegExpirationTime)]
public DateTimeOffset Exp { get; set; }

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,15 +124,19 @@ public OBClientRegistration1()
/// expressed as seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "iat")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegIssuedAt)]
public DateTimeOffset Iat { get; set; }

/// <summary>
/// Gets or sets the time at which the request expires expressed as
/// seconds since 1970-01-01T00:00:00Z as measured in UTC
/// </summary>
[JsonProperty(PropertyName = "exp")]
[JsonConverter(typeof(DateTimeOffsetUnixConverter))]
[JsonConverter(
typeof(DateTimeOffsetUnixConverter),
JsonConverterLabel.DcrRegExpirationTime)]
public DateTimeOffset Exp { get; set; }


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,14 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MongoDB.Driver;
using OpenTelemetry;
using OpenTelemetry.Context.Propagation;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
using TimeProvider = FinnovationLabs.OpenBanking.Library.Connector.Services.TimeProvider;

namespace FinnovationLabs.OpenBanking.Library.Connector.GenericHost.Extensions;
Expand All @@ -27,7 +34,9 @@ public static class ServiceCollectionExtensions
{
public static IServiceCollection AddGenericHostServices(
this IServiceCollection services,
IConfiguration configuration)
IConfiguration configuration,
string? serviceVersion = null,
Action<TracerProviderBuilder>? addAspNetCoreTracingInstrumentation = null)
{
// Add settings groups
services
Expand Down Expand Up @@ -132,6 +141,10 @@ public static IServiceCollection AddGenericHostServices(
// Startup tasks
services.AddHostedService<StartupTasksHostedService>();

// Add OpenTelemetry services
var openTelemetrySettings = GetSettings<OpenTelemetrySettings>(configuration);
services.AddOpenTelemetryServices(serviceVersion, openTelemetrySettings, addAspNetCoreTracingInstrumentation);

return services;
}

Expand Down Expand Up @@ -164,4 +177,153 @@ public static IServiceCollection AddSettingsGroup<TSettings>(this IServiceCollec

return services;
}

public static ILoggingBuilder AddGenericHostLogging(
this ILoggingBuilder loggingBuilder,
IConfiguration configuration,
string? serviceVersion)
{
var openTelemetrySettings = GetSettings<OpenTelemetrySettings>(configuration);
loggingBuilder.AddOpenTelemetryLogging(serviceVersion, openTelemetrySettings);
return loggingBuilder;
}

private static void AddOpenTelemetryServices(
this IServiceCollection services,
string? serviceVersion,
OpenTelemetrySettings openTelemetrySettings,
Action<TracerProviderBuilder>? addAspNetCoreTracingInstrumentation = null)
{
bool useConsoleExporter = openTelemetrySettings.UseConsoleExporter;

ProviderFilter tracingProviderFilter = openTelemetrySettings.Tracing.ProviderFilter;

string? tracingOtlpExporterUrlProcessed = openTelemetrySettings.Tracing.OtlpExporterUrlProcessed;

void ConfigureTracing(TracerProviderBuilder builder)
{
if (tracingProviderFilter.HasFlag(ProviderFilter.HttpClient))
{
builder.AddHttpClientInstrumentation();
}

if (tracingProviderFilter.HasFlag(ProviderFilter.EfCore))
{
builder.AddEntityFrameworkCoreInstrumentation();
}

if (tracingProviderFilter.HasFlag(ProviderFilter.AspNetCore) &&
addAspNetCoreTracingInstrumentation is not null)
{
addAspNetCoreTracingInstrumentation(builder);
}

if (useConsoleExporter)
{
builder.AddConsoleExporter();
}

if (tracingOtlpExporterUrlProcessed is not null)
{
builder.AddOtlpExporter(opt => opt.Endpoint = new Uri(tracingOtlpExporterUrlProcessed));
}
}

string? metricsOtlpExporterUrlProcessed = openTelemetrySettings.Metrics.OtlpExporterUrlProcessed;

void ConfigureMetrics(MeterProviderBuilder builder)
{
//builder.AddMeter("System.Net.Http");
builder.AddMeter("TppReportingMetrics");

if (useConsoleExporter)
{
builder.AddConsoleExporter(
(_, metricReaderOptions) =>
{
metricReaderOptions.PeriodicExportingMetricReaderOptions =
new PeriodicExportingMetricReaderOptions
{
ExportIntervalMilliseconds = openTelemetrySettings.Metrics
.MetricReaderExportIntervalMilliseconds
};
metricReaderOptions.TemporalityPreference =
openTelemetrySettings.Metrics.MetricReaderTemporality;
});
}

if (metricsOtlpExporterUrlProcessed is not null)
{
builder.AddOtlpExporter(
(otlpExporterOptions, metricReaderOptions) =>
{
otlpExporterOptions.Endpoint = new Uri(metricsOtlpExporterUrlProcessed);
metricReaderOptions.PeriodicExportingMetricReaderOptions =
new PeriodicExportingMetricReaderOptions
{
ExportIntervalMilliseconds = openTelemetrySettings.Metrics
.MetricReaderExportIntervalMilliseconds
};
metricReaderOptions.TemporalityPreference =
openTelemetrySettings.Metrics.MetricReaderTemporality;
});
}
}


Sdk.SetDefaultTextMapPropagator(
new CompositeTextMapPropagator(
Array.Empty<TextMapPropagator>())); // See https://github.com/dotnet/runtime/issues/90407

bool anyTracingExporter = openTelemetrySettings.HasAnyTracingExporter;
bool anyMetricsExporter = openTelemetrySettings.HasAnyMetricsExporter;

if (anyTracingExporter || anyMetricsExporter)
{
OpenTelemetryBuilder otelBuilder = services.AddOpenTelemetry()
.ConfigureResource(
resource => resource.AddService(
openTelemetrySettings.ServiceName,
openTelemetrySettings.ServiceNamespace,
serviceVersion,
false,
openTelemetrySettings.ServiceInstanceId));

if (anyTracingExporter)
{
otelBuilder.WithTracing(ConfigureTracing);
}

if (anyMetricsExporter)
{
otelBuilder.WithMetrics(ConfigureMetrics);
}
}
}

private static void AddOpenTelemetryLogging(
this ILoggingBuilder loggingBuilder,
string? serviceVersion,
OpenTelemetrySettings openTelemetrySettings)
{
if (openTelemetrySettings.Logging.OtlpExporterUrlProcessed is not null)
{
loggingBuilder.AddOpenTelemetry(
options =>
{
options
.SetResourceBuilder(
ResourceBuilder.CreateDefault()
.AddService(
openTelemetrySettings.ServiceName,
openTelemetrySettings.ServiceNamespace,
serviceVersion,
false,
openTelemetrySettings.ServiceInstanceId))
.AddOtlpExporter(
otlpExporterOptions => otlpExporterOptions.Endpoint =
new Uri(openTelemetrySettings.Logging.OtlpExporterUrlProcessed));
});
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,19 @@

<ItemGroup>
<PackageReference Include="Google.Cloud.SecretManager.V1" Version="2.7.0"/>
<PackageReference Include="AWSSDK.SimpleSystemsManagement" Version="4.0.7.3"/>
<PackageReference Include="AWSSDK.SSO" Version="4.0.2.16"/>
<PackageReference Include="AWSSDK.SSOOIDC" Version="4.0.3.17"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.14"/>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.14"/>
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.14"/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.14"/>
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.14"/>
<PackageReference Include="AWSSDK.SimpleSystemsManagement" Version="4.0.8.5"/>
<PackageReference Include="AWSSDK.SSO" Version="4.0.3.5"/>
<PackageReference Include="AWSSDK.SSOOIDC" Version="4.0.4.7"/>
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="9.0.17"/>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.17"/>
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.17"/>
<PackageReference Include="Microsoft.Extensions.Logging" Version="9.0.17"/>
<PackageReference Include="Microsoft.Extensions.Options.DataAnnotations" Version="9.0.17"/>
<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.16.0"/>
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.16.0"/>
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.16.0"/>
<PackageReference Include="OpenTelemetry.Instrumentation.EntityFrameworkCore" Version="1.0.0-beta.8"/>
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.15.1"/>
</ItemGroup>

<ItemGroup>
Expand Down
Loading