Skip to content

Commit 6098397

Browse files
Merge branch 'main' into feature/DAN-145-prefill-dataset
2 parents 66787d2 + 21c6838 commit 6098397

53 files changed

Lines changed: 2771 additions & 179 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.config/dotnet-tools.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33
"isRoot": true,
44
"tools": {
55
"minver-cli": {
6-
"version": "6.0.0",
6+
"version": "6.1.0",
77
"commands": [
88
"minver"
99
],
1010
"rollForward": false
1111
},
1212
"csharpier": {
13-
"version": "1.2.1",
13+
"version": "1.2.5",
1414
"commands": [
1515
"csharpier"
1616
],

.github/workflows/codeql.yml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ jobs:
4444

4545
# Initializes the CodeQL tools for scanning.
4646
- name: Initialize CodeQL
47-
uses: github/codeql-action/init@d3ced5c96c16c4332e2a61eb6f3649d6f1b20bb8 # v3
47+
uses: github/codeql-action/init@bffd034ab1518ad839a542b8a7356e13a240e076 # v3
4848
with:
4949
languages: ${{ matrix.language }}
5050
queries: security-extended,security-and-quality
@@ -57,7 +57,7 @@ jobs:
5757
# Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java).
5858
# If this step fails, then you should remove it and run the build manually (see below)
5959
- name: Autobuild
60-
uses: github/codeql-action/autobuild@d3ced5c96c16c4332e2a61eb6f3649d6f1b20bb8 # v3
60+
uses: github/codeql-action/autobuild@bffd034ab1518ad839a542b8a7356e13a240e076 # v3
6161

6262
# ℹ️ Command-line programs to run using the OS shell.
6363
# 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun
@@ -70,6 +70,6 @@ jobs:
7070
# ./location_of_script_within_repo/buildscript.sh
7171

7272
- name: Perform CodeQL Analysis
73-
uses: github/codeql-action/analyze@d3ced5c96c16c4332e2a61eb6f3649d6f1b20bb8 # v3
73+
uses: github/codeql-action/analyze@bffd034ab1518ad839a542b8a7356e13a240e076 # v3
7474
with:
7575
category: "/language:${{matrix.language}}"

.github/workflows/test-and-analyze-fork.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131
reportgenerator -reports:TestResults/**/coverage.cobertura.xml -targetdir:TestResults/Output/CoverageReport -reporttypes:Cobertura
3232
3333
- name: Archive code coverage results
34-
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5
34+
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6
3535
with:
3636
name: code-coverage-report
3737
path: TestResults/Output/CoverageReport/

.github/workflows/test-and-analyze.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
dotnet-version: |
2121
8.0.x
2222
- name: Set up JDK 11
23-
uses: actions/setup-java@dded0888837ed1f317902acf8a20df0ad188d165 # v5
23+
uses: actions/setup-java@f2beeb24e141e01a676f977032f5a29d81c9e27e # v5
2424
with:
2525
distribution: 'zulu'
2626
java-version: 17

Directory.Packages.props

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
<PackageVersion Include="Altinn.Common.EFormidlingClient" Version="1.3.3" />
1010
<PackageVersion Include="Altinn.Common.PEP" Version="4.2.2" />
1111
<PackageVersion Include="Altinn.Platform.Models" Version="1.6.1" />
12-
<PackageVersion Include="Altinn.Platform.Storage.Interface" Version="4.0.14" />
12+
<PackageVersion Include="Altinn.Platform.Storage.Interface" Version="4.2.1" />
1313
<PackageVersion Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.4.0" />
1414
<PackageVersion Include="Azure.Identity" Version="1.17.1" />
15-
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.4.0" />
16-
<PackageVersion Include="BenchmarkDotNet" Version="0.15.6" />
17-
<PackageVersion Include="BenchmarkDotNet.Diagnostics.dotTrace" Version="0.15.6" />
15+
<PackageVersion Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.5.0" />
16+
<PackageVersion Include="BenchmarkDotNet" Version="0.15.8" />
17+
<PackageVersion Include="BenchmarkDotNet.Diagnostics.dotTrace" Version="0.15.8" />
1818
<PackageVersion Include="Buildalyzer.Workspaces" Version="7.1.0" />
1919
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
20-
<PackageVersion Include="CSharpier.MsBuild" Version="1.2.1" />
20+
<PackageVersion Include="CSharpier.MsBuild" Version="1.2.5" />
2121
<PackageVersion Include="Docker.DotNet" Version="3.125.15" />
2222
<PackageVersion Include="FluentAssertions" Version="7.2.0" />
2323
<PackageVersion Include="JmesPath.Net" Version="1.0.330" />
@@ -34,53 +34,52 @@
3434
<PackageVersion Include="Microsoft.Extensions.Caching.Hybrid" Version="9.10.0" />
3535
<PackageVersion Include="Microsoft.Extensions.Diagnostics.Testing" Version="8.10.0" />
3636
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="8.10.0" />
37-
<PackageVersion Include="Microsoft.FeatureManagement.AspNetCore" Version="4.3.0" />
37+
<PackageVersion Include="Microsoft.FeatureManagement.AspNetCore" Version="4.4.0" />
3838
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
3939
<PackageVersion Include="Microsoft.OpenApi" Version="1.6.28" />
4040
<PackageVersion Include="Microsoft.OpenApi.Readers" Version="1.6.28" />
41-
<PackageVersion Include="MinVer" Version="6.0.0" />
41+
<PackageVersion Include="MinVer" Version="6.1.0" />
4242
<PackageVersion Include="Moq" Version="4.20.72" />
43-
<PackageVersion Include="NetEscapades.EnumGenerators" Version="1.0.0-beta16" />
43+
<PackageVersion Include="NetEscapades.EnumGenerators" Version="1.0.0-beta19" />
4444
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
4545
<PackageVersion Include="Nullable.Extended.Analyzer" Version="1.15.6581" />
46-
<PackageVersion Include="OpenTelemetry" Version="1.13.1" />
47-
<PackageVersion Include="OpenTelemetry.Api" Version="1.13.1" />
48-
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.13.1" />
49-
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.13.1" />
50-
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.13.1" />
51-
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.13.0" />
52-
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.13.0" />
53-
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.13.0" />
46+
<PackageVersion Include="OpenTelemetry" Version="1.14.0" />
47+
<PackageVersion Include="OpenTelemetry.Api" Version="1.14.0" />
48+
<PackageVersion Include="OpenTelemetry.Exporter.InMemory" Version="1.14.0" />
49+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.14.0" />
50+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.14.0" />
51+
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.14.0" />
52+
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.14.0" />
53+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.14.0" />
5454
<PackageVersion Include="PolySharp" Version="1.15.0" />
5555
<PackageVersion Include="Swashbuckle.AspNetCore" Version="9.0.6" />
5656
<PackageVersion Include="System.Formats.Asn1" Version="9.0.11" />
5757
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
58-
<PackageVersion Include="System.Net.Http.Json" Version="10.0.1" />
59-
<PackageVersion Include="Testcontainers" Version="4.8.1" />
58+
<PackageVersion Include="Testcontainers" Version="4.10.0" />
6059
<PackageVersion Include="Verify.AspNetCore" Version="4.0.0" />
6160
<PackageVersion Include="Verify.Moq" Version="2.2.0" />
6261
<PackageVersion Include="Verify.Xunit" Version="30.20.1" />
6362
<PackageVersion Include="Verify.Http" Version="6.6.0" />
64-
<PackageVersion Include="WireMock.Net" Version="1.15.0" />
63+
<PackageVersion Include="WireMock.Net" Version="1.23.0" />
6564
<PackageVersion Include="Verify.SourceGenerators" Version="2.5.0" />
6665
<PackageVersion Include="xunit" Version="2.9.3" />
6766
<PackageVersion Include="xunit.assert" Version="2.9.3" />
6867
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
69-
<PackageVersion Include="Xunit.Combinatorial" Version="1.6.24" />
68+
<PackageVersion Include="Xunit.Combinatorial" Version="1.7.31" />
7069
<PackageVersion Include="System.IO.Hashing" Version="9.0.11" />
71-
<PackageVersion Include="PublicApiGenerator" Version="11.5.1" />
70+
<PackageVersion Include="PublicApiGenerator" Version="11.5.4" />
7271
</ItemGroup>
7372
<ItemGroup>
7473
<!-- Transitive dependecies for JWTCookieAuthentication -->
75-
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.14.0" />
74+
<PackageVersion Include="Microsoft.IdentityModel.Protocols.OpenIdConnect" Version="8.15.0" />
7675
<PackageVersion Include="Microsoft.Rest.ClientRuntime" Version="2.3.24" />
7776
<PackageVersion Include="Microsoft.Rest.ClientRuntime.Azure" Version="3.3.19" />
7877
<PackageVersion Include="System.Text.RegularExpressions" Version="4.3.1" />
7978
<!-- End JWTCookieAuthentication deps -->
8079
</ItemGroup>
8180
<ItemGroup>
82-
<PackageVersion Include="KS.Fiks.Arkiv.Models.V1" Version="1.0.8" />
83-
<PackageVersion Include="KS.Fiks.IO.Client" Version="6.1.1" />
81+
<PackageVersion Include="KS.Fiks.Arkiv.Models.V1" Version="1.0.9" />
82+
<PackageVersion Include="KS.Fiks.IO.Client" Version="6.1.2" />
8483
<PackageVersion Include="Polly.Extensions" Version="8.6.5" />
8584
<PackageVersion Include="Polly.Testing" Version="8.6.5" />
8685
</ItemGroup>

solutions/All.sln

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,5 +119,7 @@ Global
119119
{626CC2E1-1D1D-45A4-B07C-A120BB4EE973} = {D8D6ED6A-EF63-48FC-B267-17FB76C5DD07}
120120
{836CECBF-5518-4276-BE2C-B0F255BF19F2} = {B96EA64C-2F26-42FE-A260-F6A4C6AA48E7}
121121
{0DE9F775-FE1A-4604-B239-4CFE4E105B1D} = {B96EA64C-2F26-42FE-A260-F6A4C6AA48E7}
122+
{B9EF324F-7223-484B-B9BC-C8F705431AE3} = {C5968C89-1529-42F3-B082-DC1184C18395}
123+
{4CCE3E2A-E12C-4382-9089-84A0275478AB} = {B96EA64C-2F26-42FE-A260-F6A4C6AA48E7}
122124
EndGlobalSection
123125
EndGlobal

src/Altinn.App.Analyzers/FormDataWrapper/FormDataWrapperAnalyzer.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ public override void Initialize(AnalysisContext context)
1616

1717
private void CompilationAnalysisAction(CompilationAnalysisContext compilationContext)
1818
{
19+
if (!compilationContext.Options.AnalyzerConfigOptionsProvider.IsAltinnApp())
20+
return;
21+
1922
var appMetadataFiles = compilationContext
2023
.Options.AdditionalFiles.Where(FormDataWrapperUtils.IsApplicationMetadataFile)
2124
.ToList();

src/Altinn.App.Analyzers/FormDataWrapper/FormDataWrapperGenerator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@ public class FormDataWrapperGenerator : IIncrementalGenerator
99
/// <inheritdoc />
1010
public void Initialize(IncrementalGeneratorInitializationContext context)
1111
{
12+
var isAltinnApp = context.AnalyzerConfigOptionsProvider.Select(static (provider, _) => provider.IsAltinnApp());
13+
1214
var rootClasses = context
1315
.AdditionalTextsProvider.Where(FormDataWrapperUtils.IsApplicationMetadataFile)
16+
.Combine(isAltinnApp)
17+
.Where(static tuple => tuple.Right)
18+
.Select(static (tuple, _) => tuple.Left)
1419
.SelectMany(ExtractRootClassesFromAppMetadata);
1520

1621
var modelPathNodesProvider = rootClasses.Combine(context.CompilationProvider).Select(CreateNodeTree);
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Altinn.App.Analyzers;
2+
3+
public static class AnalyzerConfigOptionsProviderExtensions
4+
{
5+
private const string IsAltinnAppProperty = "build_property.IsAltinnApp";
6+
7+
public static bool IsAltinnApp(this AnalyzerConfigOptionsProvider provider)
8+
{
9+
return provider.GlobalOptions.TryGetValue(IsAltinnAppProperty, out var value)
10+
&& string.Equals(value, "true", StringComparison.OrdinalIgnoreCase);
11+
}
12+
}

src/Altinn.App.Api/Controllers/SigningController.cs

Lines changed: 44 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using Altinn.App.Api.Infrastructure.Filters;
22
using Altinn.App.Api.Models;
3+
using Altinn.App.Core.Features;
34
using Altinn.App.Core.Features.Auth;
45
using Altinn.App.Core.Features.Signing.Models;
56
using Altinn.App.Core.Features.Signing.Services;
@@ -8,6 +9,7 @@
89
using Altinn.App.Core.Internal.Data;
910
using Altinn.App.Core.Internal.Instances;
1011
using Altinn.App.Core.Internal.Process;
12+
using Altinn.App.Core.Internal.Process.Elements;
1113
using Altinn.App.Core.Internal.Process.Elements.AltinnExtensionProperties;
1214
using Altinn.Platform.Storage.Interface.Models;
1315
using Microsoft.AspNetCore.Mvc;
@@ -61,6 +63,7 @@ ILogger<SigningController> logger
6163
/// <param name="instanceGuid">unique id to identify the instance</param>
6264
/// <param name="ct">Cancellation token, populated by the framework</param>
6365
/// <param name="language">The currently used language by the user (or null if not available)</param>
66+
/// <param name="taskId">If data should be loaded from a different task than the current one.</param>
6467
/// <returns>An object containing updated signee state</returns>
6568
[HttpGet]
6669
[ProducesResponseType(typeof(SigningStateResponse), StatusCodes.Status200OK)]
@@ -71,7 +74,8 @@ public async Task<IActionResult> GetSigneesState(
7174
[FromRoute] int instanceOwnerPartyId,
7275
[FromRoute] Guid instanceGuid,
7376
CancellationToken ct,
74-
[FromQuery] string? language = null
77+
[FromQuery] string? language = null,
78+
[FromQuery] string? taskId = null
7579
)
7680
{
7781
Instance instance = await _instanceClient.GetInstance(app, org, instanceOwnerPartyId, instanceGuid);
@@ -84,24 +88,24 @@ public async Task<IActionResult> GetSigneesState(
8488
instanceOwnerPartyId
8589
);
8690

87-
string? taskId = instance.Process.CurrentTask.ElementId;
88-
InstanceDataUnitOfWork cachedDataMutator = await _instanceDataUnitOfWorkInitializer.Init(
89-
instance,
90-
taskId,
91-
language
92-
);
93-
94-
if (instance.Process.CurrentTask.AltinnTaskType != "signing")
91+
string? finalTaskId = taskId ?? instance.Process?.CurrentTask?.ElementId;
92+
if (string.IsNullOrEmpty(finalTaskId) || !VerifyIsSigningTask(finalTaskId))
9593
{
9694
return NotSigningTask();
9795
}
9896

97+
IInstanceDataAccessor instanceDataAccessor = await _instanceDataUnitOfWorkInitializer.Init(
98+
instance,
99+
finalTaskId,
100+
language
101+
);
102+
99103
AltinnSignatureConfiguration signingConfiguration =
100-
(_processReader.GetAltinnTaskExtension(instance.Process.CurrentTask.ElementId)?.SignatureConfiguration)
104+
(_processReader.GetAltinnTaskExtension(finalTaskId)?.SignatureConfiguration)
101105
?? throw new ApplicationConfigException("Signing configuration not found in AltinnTaskExtension");
102106

103107
List<SigneeContext> signeeContexts = await _signingService.GetSigneeContexts(
104-
cachedDataMutator,
108+
instanceDataAccessor,
105109
signingConfiguration,
106110
ct
107111
);
@@ -165,6 +169,7 @@ .. signeeContexts
165169
/// <param name="instanceGuid">unique id to identify the instance</param>
166170
/// <param name="ct">Cancellation token, populated by the framework</param>
167171
/// <param name="language">The currently used language by the user (or null if not available)</param>
172+
/// <param name="taskId">If data should be loaded from a different task than the current one.</param>
168173
/// <returns>An object containing a list of organizations that the user can sign on behalf of</returns>
169174
[HttpGet("organizations")]
170175
[ProducesResponseType(typeof(SigningAuthorizedOrganizationsResponse), StatusCodes.Status200OK)]
@@ -176,25 +181,26 @@ public async Task<IActionResult> GetAuthorizedOrganizations(
176181
[FromRoute] int instanceOwnerPartyId,
177182
[FromRoute] Guid instanceGuid,
178183
CancellationToken ct,
179-
[FromQuery] string? language = null
184+
[FromQuery] string? language = null,
185+
[FromQuery] string? taskId = null
180186
)
181187
{
182188
Instance instance = await _instanceClient.GetInstance(app, org, instanceOwnerPartyId, instanceGuid);
183189

184-
string? taskId = instance.Process.CurrentTask.ElementId;
185-
InstanceDataUnitOfWork cachedDataMutator = await _instanceDataUnitOfWorkInitializer.Init(
186-
instance,
187-
taskId,
188-
language
189-
);
190-
191-
if (instance.Process.CurrentTask.AltinnTaskType != "signing")
190+
string? finalTaskId = taskId ?? instance.Process?.CurrentTask?.ElementId;
191+
if (string.IsNullOrEmpty(finalTaskId) || !VerifyIsSigningTask(finalTaskId))
192192
{
193193
return NotSigningTask();
194194
}
195195

196+
IInstanceDataAccessor instanceDataAccessor = await _instanceDataUnitOfWorkInitializer.Init(
197+
instance,
198+
finalTaskId,
199+
language
200+
);
201+
196202
AltinnSignatureConfiguration signingConfiguration =
197-
(_processReader.GetAltinnTaskExtension(instance.Process.CurrentTask.ElementId)?.SignatureConfiguration)
203+
(_processReader.GetAltinnTaskExtension(finalTaskId)?.SignatureConfiguration)
198204
?? throw new ApplicationConfigException("Signing configuration not found in AltinnTaskExtension");
199205

200206
Authenticated currentAuth = _authenticationContext.Current;
@@ -211,7 +217,7 @@ public async Task<IActionResult> GetAuthorizedOrganizations(
211217
}
212218

213219
List<OrganizationSignee> authorizedOrganizations = await _signingService.GetAuthorizedOrganizationSignees(
214-
cachedDataMutator,
220+
instanceDataAccessor,
215221
signingConfiguration,
216222
userId.Value,
217223
ct
@@ -241,6 +247,7 @@ public async Task<IActionResult> GetAuthorizedOrganizations(
241247
/// <param name="instanceOwnerPartyId">unique id of the party that this the owner of the instance</param>
242248
/// <param name="instanceGuid">unique id to identify the instance</param>
243249
/// <param name="language">The currently used language by the user (or null if not available)</param>
250+
/// <param name="taskId">If data should be loaded from a different task than the current one.</param>
244251
/// <returns>An object containing the documents to be signed</returns>
245252
[HttpGet("data-elements")]
246253
[ProducesResponseType(typeof(SigningDataElementsResponse), StatusCodes.Status200OK)]
@@ -250,18 +257,20 @@ public async Task<IActionResult> GetDataElements(
250257
[FromRoute] string app,
251258
[FromRoute] int instanceOwnerPartyId,
252259
[FromRoute] Guid instanceGuid,
253-
[FromQuery] string? language = null
260+
[FromQuery] string? language = null,
261+
[FromQuery] string? taskId = null
254262
)
255263
{
256264
Instance instance = await _instanceClient.GetInstance(app, org, instanceOwnerPartyId, instanceGuid);
257265

258-
if (instance.Process.CurrentTask.AltinnTaskType != "signing")
266+
string? finalTaskId = taskId ?? instance.Process?.CurrentTask?.ElementId;
267+
if (string.IsNullOrEmpty(finalTaskId) || !VerifyIsSigningTask(finalTaskId))
259268
{
260269
return NotSigningTask();
261270
}
262271

263272
AltinnSignatureConfiguration? signingConfiguration =
264-
(_processReader.GetAltinnTaskExtension(instance.Process.CurrentTask.ElementId)?.SignatureConfiguration)
273+
(_processReader.GetAltinnTaskExtension(finalTaskId)?.SignatureConfiguration)
265274
?? throw new ApplicationConfigException("Signing configuration not found in AltinnTaskExtension");
266275

267276
List<DataElement> dataElements =
@@ -282,13 +291,22 @@ .. instance
282291
return Ok(response);
283292
}
284293

294+
private bool VerifyIsSigningTask(string taskId)
295+
{
296+
List<ProcessTask> allTasks = _processReader.GetProcessTasks();
297+
ProcessTask? processTask = allTasks.FirstOrDefault(t => t.Id == taskId);
298+
299+
return processTask?.ExtensionElements?.TaskExtension?.TaskType == "signing";
300+
}
301+
285302
private BadRequestObjectResult NotSigningTask()
286303
{
287304
return BadRequest(
288305
new ProblemDetails
289306
{
290307
Title = "Not a signing task",
291-
Detail = "This endpoint is only callable while the current task is a signing task.",
308+
Detail =
309+
$"This endpoint is only callable while the current task is a signing task, or when taskId query param is set to a signing task's ID.",
292310
Status = StatusCodes.Status400BadRequest,
293311
}
294312
);

0 commit comments

Comments
 (0)