diff --git a/ODPC.Server/Authentication/AuthenticationExtensions.cs b/ODPC.Server/Authentication/AuthenticationExtensions.cs index 866fc50..88c78f8 100644 --- a/ODPC.Server/Authentication/AuthenticationExtensions.cs +++ b/ODPC.Server/Authentication/AuthenticationExtensions.cs @@ -106,7 +106,8 @@ public static void AddAuth(this IServiceCollection services, Action }); } services.AddAuthorizationBuilder() - .AddPolicy(AdminPolicy.Name, policy => policy.RequireRole(authOptions.AdminRole)); + .AddPolicy(AdminPolicy.Name, policy => policy.RequireRole(authOptions.AdminRole)) + .AddFallbackPolicy("LoggedIn", policy => policy.RequireAuthenticatedUser()); services.AddDistributedMemoryCache(); services.AddOpenIdConnectAccessTokenManagement(); } diff --git a/ODPC.Server/Features/Documenten/DocumentDownload/DocumentDownloadResult.cs b/ODPC.Server/Features/Documenten/DocumentDownload/DocumentDownloadResult.cs index a09221f..227d307 100644 --- a/ODPC.Server/Features/Documenten/DocumentDownload/DocumentDownloadResult.cs +++ b/ODPC.Server/Features/Documenten/DocumentDownload/DocumentDownloadResult.cs @@ -10,8 +10,13 @@ public async Task ExecuteResultAsync(ActionContext context) var response = context.HttpContext.Response; var token = context.HttpContext.RequestAborted; + var config = context.HttpContext.RequestServices.GetRequiredService(); using var client = context.HttpContext.RequestServices.GetRequiredService().Create(reason); - using var httpResponse = await client.GetAsync(path, HttpCompletionOption.ResponseContentRead, token); ; + var timeoutInMinutes = int.TryParse(config["DOWNLOAD_TIMEOUT_MINUTES"], out var m) + ? m + : 10; + client.Timeout = TimeSpan.FromMinutes(timeoutInMinutes); + using var httpResponse = await client.GetAsync(path, HttpCompletionOption.ResponseHeadersRead, token); response.StatusCode = (int)httpResponse.StatusCode; response.Headers.ContentLength = httpResponse.Content.Headers.ContentLength; diff --git a/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelController.cs b/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelController.cs deleted file mode 100644 index 7142424..0000000 --- a/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelController.cs +++ /dev/null @@ -1,38 +0,0 @@ -using Microsoft.AspNetCore.Mvc; -using ODPC.Apis.Odrc; - -namespace ODPC.Features.Documenten.UploadBestandsdeel -{ - [ApiController] - [DisableRequestSizeLimit] - [RequestFormLimits(MultipartBodyLengthLimit = long.MaxValue)] - public class UploadBestandsdeelController(IOdrcClientFactory clientFactory) : ControllerBase - { - [HttpPut("api/{version}/documenten/{docUuid:guid}/bestandsdelen/{partUuid:guid}")] - public async Task Put(string version, Guid docUuid, Guid partUuid, CancellationToken token) - { - var form = await Request.ReadFormAsync(token); - - if (form.Files.Count == 0) - { - return BadRequest("No file uploaded"); - } - - var file = form.Files[0]; - var content = new MultipartFormDataContent(); - var fileContent = new StreamContent(file.OpenReadStream()); - - content.Add(fileContent, "inhoud", file.FileName); - - using var client = clientFactory.Create("Upload bestandsdeel"); - - var url = $"/api/{version}/documenten/{docUuid}/bestandsdelen/{partUuid}"; - - using var response = await client.PutAsync(url, content, token); - - response.EnsureSuccessStatusCode(); - - return NoContent(); - } - } -} diff --git a/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelEndpoint.cs b/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelEndpoint.cs new file mode 100644 index 0000000..b6ee498 --- /dev/null +++ b/ODPC.Server/Features/Documenten/UploadBestandsdeel/UploadBestandsdeelEndpoint.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNetCore.Mvc; +using ODPC.Apis.Odrc; + +namespace ODPC.Features.Documenten.UploadBestandsdeel +{ + public class UploadBestandsdeelEndpoint + { + public static void Map(IEndpointRouteBuilder builder) => builder.MapPut( + "api/{version}/documenten/{docUuid:guid}/bestandsdelen/{partUuid:guid}", + async (HttpRequest request, IOdrcClientFactory clientFactory, IConfiguration config, CancellationToken token) => + { + using var client = clientFactory.Create("Upload bestandsdeel"); + var timeoutInMinutes = int.TryParse(config["UPLOAD_TIMEOUT_MINUTES"], out var m) + ? m + : 10; + client.Timeout = TimeSpan.FromMinutes(timeoutInMinutes); + + using var content = new StreamContent(request.Body); + content.Headers.Add("Content-Type", request.Headers.ContentType.AsEnumerable()); + content.Headers.ContentLength = request.Headers.ContentLength; + + using var requestMessage = new HttpRequestMessage(HttpMethod.Put, request.Path); + requestMessage.Content = content; + using var response = await client.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, token); + + response.EnsureSuccessStatusCode(); + return Results.NoContent(); + }) + .WithMetadata(new DisableRequestSizeLimitAttribute()); + } +} diff --git a/ODPC.Server/Program.cs b/ODPC.Server/Program.cs index 076d028..61ade71 100644 --- a/ODPC.Server/Program.cs +++ b/ODPC.Server/Program.cs @@ -3,6 +3,7 @@ using ODPC.Authentication; using ODPC.Data; using ODPC.Features; +using ODPC.Features.Documenten.UploadBestandsdeel; using Serilog; using Serilog.Events; using Serilog.Formatting.Json; @@ -61,10 +62,11 @@ string GetRequiredConfig(string key) app.UseAuthorization(); - app.MapControllers().RequireAuthorization(); + app.MapControllers(); app.MapOdpcAuthEndpoints(); app.MapHealthChecks("/healthz").AllowAnonymous(); + UploadBestandsdeelEndpoint.Map(app); app.MapFallbackToIndexHtml(); await using (var scope = app.Services.CreateAsyncScope()) diff --git a/ODPC.Server/appsettings.json b/ODPC.Server/appsettings.json index 719933c..538afca 100644 --- a/ODPC.Server/appsettings.json +++ b/ODPC.Server/appsettings.json @@ -19,5 +19,7 @@ "OIDC_ID_CLAIM_TYPE": "", "ODRC_BASE_URL": "", "ODRC_API_KEY": "", - "OIDC_ADMIN_ROLE": "" + "OIDC_ADMIN_ROLE": "", + "UPLOAD_TIMEOUT_MINUTES": "", + "DOWNLOAD_TIMEOUT_MINUTES": "" } \ No newline at end of file diff --git a/README.md b/README.md index 28018e0..5991aa8 100644 --- a/README.md +++ b/README.md @@ -18,19 +18,21 @@ Als je een specifieke versie van het image van ODRC wil vastpinnen, zet je dit i ## Omgevingsvariabelen -| Variabele | Uitleg | -| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `POSTGRES_DB` | Naam van de database bij ODPC | -| `POSTGRES_USER` | Gebruikersnaam voor toegang van ODPC tot de DB | -| `POSTGRES_PASSWORD` | Wachtwoord van de Postgres user | -| `POSTGRES_HOST` | Hostnaam van de Postgres database server | -| `POSTGRES_PORT` | Poort om verbinding te maken met de Postgres database server | -| `OIDC_AUTHORITY` | URL van de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `https://login.microsoftonline.com/ce1a3f2d-2265-4517-a8b4-3e4f381461ab/v2.0`
| -| `OIDC_CLIENT_ID` | Voor toegang tot de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `54f66f54-71e5-45f1-8634-9158c41f602a`
| -| `OIDC_CLIENT_SECRET` | Secret voor de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `VM2B!ccnebNe.M*gxH63*NXc8iTiAGhp`
| -| `OIDC_ROLE_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de rollen van de ingelogde gebruiker staan.
(default waarde is `roles`) | -| `OIDC_ADMIN_ROLE` | De waarde van de role claim in het JWT token van de OpenID Connect Provider voor beheerders
Meer informatie Bijvoorbeeld: `odpc-admin`
| -| `OIDC_ID_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de unieke identificatie van de ingelogde gebruiker staat.
(default waarde is `preferred_username` met een fallback op `email`) | -| `OIDC_NAME_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de volledige naam van de ingelogde gebruiker staat
(default waarde is `name`) | -| `ODRC_BASE_URL` | De base url van de ODRC (Registratiecomponent) waarmee gekoppeld moet worden.
Meer informatie Bijvoorbeeld: `https://odrc.mijn-gemeente.nl`
| -| `ODRC_API_KEY` | De geheime sleutel voor de ODRC (Registratiecomponent) waarmee gekoppeld moet worden.
Meer informatie Bijvoorbeeld: `VM2B!ccnebNe.M*gxH63*NXc8iTiAGhp`
| +| Variabele | Uitleg | +| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `POSTGRES_DB` | Naam van de database bij ODPC | +| `POSTGRES_USER` | Gebruikersnaam voor toegang van ODPC tot de DB | +| `POSTGRES_PASSWORD` | Wachtwoord van de Postgres user | +| `POSTGRES_HOST` | Hostnaam van de Postgres database server | +| `POSTGRES_PORT` | Poort om verbinding te maken met de Postgres database server | +| `OIDC_AUTHORITY` | URL van de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `https://login.microsoftonline.com/ce1a3f2d-2265-4517-a8b4-3e4f381461ab/v2.0`
| +| `OIDC_CLIENT_ID` | Voor toegang tot de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `54f66f54-71e5-45f1-8634-9158c41f602a`
| +| `OIDC_CLIENT_SECRET` | Secret voor de OpenID Connect Identity Provider
Meer informatie Bijvoorbeeld: `VM2B!ccnebNe.M*gxH63*NXc8iTiAGhp`
| +| `OIDC_ROLE_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de rollen van de ingelogde gebruiker staan.
(default waarde is `roles`) | +| `OIDC_ADMIN_ROLE` | De waarde van de role claim in het JWT token van de OpenID Connect Provider voor beheerders
Meer informatie Bijvoorbeeld: `odpc-admin`
| +| `OIDC_ID_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de unieke identificatie van de ingelogde gebruiker staat.
(default waarde is `preferred_username` met een fallback op `email`) | +| `OIDC_NAME_CLAIM_TYPE` | De naam van de claim in het JWT token van de OpenID Connect Provider waarin de volledige naam van de ingelogde gebruiker staat
(default waarde is `name`) | +| `ODRC_BASE_URL` | De base url van de ODRC (Registratiecomponent) waarmee gekoppeld moet worden.
Meer informatie Bijvoorbeeld: `https://odrc.mijn-gemeente.nl`
| +| `ODRC_API_KEY` | De geheime sleutel voor de ODRC (Registratiecomponent) waarmee gekoppeld moet worden.
Meer informatie Bijvoorbeeld: `VM2B!ccnebNe.M*gxH63*NXc8iTiAGhp`
| +| `UPLOAD_TIMEOUT_MINUTES` | Het aantal minuten dat het uploaden van bestanden maximaal mag duren.
(default waarde is `10`) | +| `DOWNLOAD_TIMEOUT_MINUTES` | Het aantal minuten dat het downloaden van bestanden maximaal mag duren.
(default waarde is `10`) |