From 40c8466959ef4205eee4f215d6c021df36cde752 Mon Sep 17 00:00:00 2001 From: Martin Gunnerud Date: Fri, 8 Mar 2024 12:10:59 +0100 Subject: [PATCH 1/3] bugfix: equality check resource name with exact filename, not filename.Contains new identifier --- .../Controllers/ResourceAdminController.cs | 4 ++-- .../Services/Implementation/RepositorySI.cs | 18 ++++++++---------- .../Services/Interfaces/IRepository.cs | 4 ++-- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/backend/src/Designer/Controllers/ResourceAdminController.cs b/backend/src/Designer/Controllers/ResourceAdminController.cs index fb358f2d363..3860b834f76 100644 --- a/backend/src/Designer/Controllers/ResourceAdminController.cs +++ b/backend/src/Designer/Controllers/ResourceAdminController.cs @@ -253,7 +253,7 @@ public async Task UpdateResource(string org, string id, [FromBody] [HttpPost] [Route("designer/api/{org}/resources/addresource")] - public async Task> AddResource(string org, [FromBody] ServiceResource resource) + public async Task AddResource(string org, [FromBody] ServiceResource resource) { resource.HasCompetentAuthority = await GetCompetentAuthorityFromOrg(org); return _repository.AddServiceResource(org, resource); @@ -267,7 +267,7 @@ public async Task ImportResource(string org, string serviceCode, i ServiceResource resource = await _resourceRegistry.GetServiceResourceFromService(serviceCode, serviceEdition, environment.ToLower()); resource.Identifier = resourceId; _repository.AddServiceResource(org, resource); - XacmlPolicy policy = await _resourceRegistry.GetXacmlPolicy(serviceCode, serviceEdition, resource.Identifier, environment.ToLower()); + XacmlPolicy policy = await _resourceRegistry.GetXacmlPolicy(serviceCode, serviceEdition, resource.Identifier, environment.ToLower()); await _repository.SavePolicy(org, repository, resource.Identifier, policy); return Ok(resource); } diff --git a/backend/src/Designer/Services/Implementation/RepositorySI.cs b/backend/src/Designer/Services/Implementation/RepositorySI.cs index 489c31a0275..8c53c1aec9e 100644 --- a/backend/src/Designer/Services/Implementation/RepositorySI.cs +++ b/backend/src/Designer/Services/Implementation/RepositorySI.cs @@ -489,7 +489,7 @@ public ActionResult UpdateServiceResource(string org, string id, ServiceResource return new StatusCodeResult(403); } - public ActionResult AddServiceResource(string org, ServiceResource newResource) + public StatusCodeResult AddServiceResource(string org, ServiceResource newResource) { try { @@ -497,7 +497,7 @@ public ActionResult AddServiceResource(string org, ServiceResource newResource) if (!CheckIfResourceFileAlreadyExists(newResource.Identifier, org, repository)) { string repopath = _settings.GetServicePath(org, repository, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)); - string fullPathOfNewResource = Path.Combine(repopath, newResource.Identifier.AsFileName(), string.Format("{0}_resource.json", newResource.Identifier)); + string fullPathOfNewResource = Path.Combine(repopath, newResource.Identifier.AsFileName(), GetResourceFileName(newResource.Identifier)); string newResourceJson = System.Text.Json.JsonSerializer.Serialize(newResource, _serializerOptions); Directory.CreateDirectory(Path.Combine(repopath, newResource.Identifier.AsFileName())); File.WriteAllText(fullPathOfNewResource, newResourceJson); @@ -518,14 +518,7 @@ public ActionResult AddServiceResource(string org, ServiceResource newResource) public bool CheckIfResourceFileAlreadyExists(string identifier, string org, string repository) { List resourceFiles = GetResourceFiles(org, repository); - foreach (var _ in from FileSystemObject resourceFile in resourceFiles - where resourceFile.Name.Contains(identifier) - select new { }) - { - return true; - } - - return false; + return resourceFiles.Any(resourceFile => resourceFile.Name.ToLower().Equals(GetResourceFileName(identifier).ToLower())); } public ServiceResource GetServiceResourceById(string org, string repository, string identifier) @@ -618,6 +611,11 @@ private List GetResourceFiles(string org, string repository, s return resourceFiles; } + private string GetResourceFileName(string identifier) + { + return string.Format("{0}_resource.json", identifier); + } + private FileSystemObject GetFileSystemObjectForFile(string path) { FileInfo fi = new(path); diff --git a/backend/src/Designer/Services/Interfaces/IRepository.cs b/backend/src/Designer/Services/Interfaces/IRepository.cs index 457f033e6db..ecf84974178 100644 --- a/backend/src/Designer/Services/Interfaces/IRepository.cs +++ b/backend/src/Designer/Services/Interfaces/IRepository.cs @@ -124,8 +124,8 @@ public interface IRepository /// /// The organisation which owns the repository /// The new resource that is to be added to the repository - /// - ActionResult AddServiceResource(string org, ServiceResource newResource); + /// Status code result of resource creation request: 201 if success, or 409 or 400 on error + StatusCodeResult AddServiceResource(string org, ServiceResource newResource); /// /// Checks a resource if it has a policy by checking if a policyfile exists in the same folder as the resourcefile. From 79bbc8316c178308814d33efb9623b43db3c7c6a Mon Sep 17 00:00:00 2001 From: Martin Gunnerud Date: Fri, 8 Mar 2024 12:48:19 +0100 Subject: [PATCH 2/3] formatting --- backend/src/Designer/Controllers/ResourceAdminController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/Designer/Controllers/ResourceAdminController.cs b/backend/src/Designer/Controllers/ResourceAdminController.cs index 3860b834f76..995f7647065 100644 --- a/backend/src/Designer/Controllers/ResourceAdminController.cs +++ b/backend/src/Designer/Controllers/ResourceAdminController.cs @@ -267,7 +267,7 @@ public async Task ImportResource(string org, string serviceCode, i ServiceResource resource = await _resourceRegistry.GetServiceResourceFromService(serviceCode, serviceEdition, environment.ToLower()); resource.Identifier = resourceId; _repository.AddServiceResource(org, resource); - XacmlPolicy policy = await _resourceRegistry.GetXacmlPolicy(serviceCode, serviceEdition, resource.Identifier, environment.ToLower()); + XacmlPolicy policy = await _resourceRegistry.GetXacmlPolicy(serviceCode, serviceEdition, resource.Identifier, environment.ToLower()); await _repository.SavePolicy(org, repository, resource.Identifier, policy); return Ok(resource); } From 57d2cffa7034d20d6d12a25b1228ed96e0c3e284 Mon Sep 17 00:00:00 2001 From: Martin Gunnerud Date: Fri, 8 Mar 2024 13:29:14 +0100 Subject: [PATCH 3/3] bugfix: return error code if error happens when importing resource, before trying to import policy file --- backend/src/Designer/Controllers/ResourceAdminController.cs | 6 +++++- .../ResourceAdminController/ImportResourceTests.cs | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/backend/src/Designer/Controllers/ResourceAdminController.cs b/backend/src/Designer/Controllers/ResourceAdminController.cs index 995f7647065..b85272b80b6 100644 --- a/backend/src/Designer/Controllers/ResourceAdminController.cs +++ b/backend/src/Designer/Controllers/ResourceAdminController.cs @@ -266,7 +266,11 @@ public async Task ImportResource(string org, string serviceCode, i string repository = string.Format("{0}-resources", org); ServiceResource resource = await _resourceRegistry.GetServiceResourceFromService(serviceCode, serviceEdition, environment.ToLower()); resource.Identifier = resourceId; - _repository.AddServiceResource(org, resource); + StatusCodeResult statusCodeResult = _repository.AddServiceResource(org, resource); + if (statusCodeResult.StatusCode != (int)HttpStatusCode.Created) + { + return statusCodeResult; + } XacmlPolicy policy = await _resourceRegistry.GetXacmlPolicy(serviceCode, serviceEdition, resource.Identifier, environment.ToLower()); await _repository.SavePolicy(org, repository, resource.Identifier, policy); return Ok(resource); diff --git a/backend/tests/Designer.Tests/Controllers/ResourceAdminController/ImportResourceTests.cs b/backend/tests/Designer.Tests/Controllers/ResourceAdminController/ImportResourceTests.cs index ec22c2b1b55..addc93816cf 100644 --- a/backend/tests/Designer.Tests/Controllers/ResourceAdminController/ImportResourceTests.cs +++ b/backend/tests/Designer.Tests/Controllers/ResourceAdminController/ImportResourceTests.cs @@ -6,6 +6,7 @@ using Altinn.Authorization.ABAC.Xacml; using Altinn.Studio.Designer.Models; using Designer.Tests.Utils; +using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Testing; using Moq; using Xunit; @@ -34,6 +35,7 @@ public async Task ExportAltinn2Resource() XacmlPolicy policy = AuthorizationUtil.ParsePolicy("resource_registry_delegatableapi.xml"); + RepositoryMock.Setup(r => r.AddServiceResource(It.IsAny(), It.IsAny())).Returns(new StatusCodeResult(201)); ResourceRegistryMock.Setup(r => r.GetServiceResourceFromService(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(serviceResource); ResourceRegistryMock.Setup(r => r.GetXacmlPolicy(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(policy);