Skip to content

Commit 7d50b87

Browse files
authored
Check user permissions when detaching files from a borehole (#1560)
2 parents 4e8035a + 4b392a5 commit 7d50b87

File tree

3 files changed

+18
-3
lines changed

3 files changed

+18
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
### Fixed
1313

1414
- _view-sync_ did not clean up unpublished boreholes.
15+
- User permissions were not checked when detaching files from boreholes.
1516

1617
## v2.1.870 - 2024-09-27
1718

src/api/Controllers/BoreholeFileController.cs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using Microsoft.AspNetCore.Mvc;
55
using Microsoft.EntityFrameworkCore;
66
using System.ComponentModel.DataAnnotations;
7+
using System.Net;
78

89
namespace BDMS.Controllers;
910

@@ -15,13 +16,15 @@ public class BoreholeFileController : ControllerBase
1516
private readonly BdmsContext context;
1617
private readonly BoreholeFileCloudService boreholeFileCloudService;
1718
private readonly ILogger logger;
19+
private readonly IBoreholeLockService boreholeLockService;
1820

19-
public BoreholeFileController(BdmsContext context, ILogger<BoreholeFileController> logger, BoreholeFileCloudService boreholeFileCloudService)
21+
public BoreholeFileController(BdmsContext context, ILogger<BoreholeFileController> logger, BoreholeFileCloudService boreholeFileCloudService, IBoreholeLockService boreholeLockService)
2022
: base()
2123
{
2224
this.logger = logger;
2325
this.boreholeFileCloudService = boreholeFileCloudService;
2426
this.context = context;
27+
this.boreholeLockService = boreholeLockService;
2528
}
2629

2730
/// <summary>
@@ -184,6 +187,12 @@ public async Task<IActionResult> DetachFromBorehole([Required, Range(1, int.MaxV
184187
if (boreholeId == 0) return BadRequest("No boreholeId provided.");
185188
if (boreholeFileId == 0) return BadRequest("No boreholeFileId provided.");
186189

190+
// Check if associated borehole is locked or user has permissions
191+
if (await boreholeLockService.IsBoreholeLockedAsync(boreholeId, HttpContext.GetUserSubjectId()).ConfigureAwait(false))
192+
{
193+
return BadRequest("The borehole is locked by another user or you are missing permissions.");
194+
}
195+
187196
try
188197
{
189198
// Get the file and its borehole files from the database.

tests/Controllers/BoreholeFileControllerTest.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,15 @@ public void TestInitialize()
4646
boreholeFileCloudServiceLoggerMock.Setup(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<EventId>(), It.IsAny<It.IsAnyType>(), It.IsAny<Exception>(), (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()));
4747
boreholeFileCloudService = new BoreholeFileCloudService(context, configuration, boreholeFileCloudServiceLoggerMock.Object, contextAccessorMock.Object, s3ClientMock);
4848

49+
var boreholeLockServiceMock = new Mock<IBoreholeLockService>(MockBehavior.Strict);
50+
boreholeLockServiceMock
51+
.Setup(x => x.IsBoreholeLockedAsync(It.IsAny<int?>(), It.IsAny<string?>()))
52+
.ReturnsAsync(false);
53+
4954
var boreholeFileControllerLoggerMock = new Mock<ILogger<BoreholeFileController>>(MockBehavior.Strict);
5055
boreholeFileControllerLoggerMock.Setup(l => l.Log(It.IsAny<LogLevel>(), It.IsAny<EventId>(), It.IsAny<It.IsAnyType>(), It.IsAny<Exception>(), (Func<It.IsAnyType, Exception, string>)It.IsAny<object>()));
51-
controller = new BoreholeFileController(context, boreholeFileControllerLoggerMock.Object, boreholeFileCloudService);
52-
controller.ControllerContext.HttpContext = new DefaultHttpContext();
56+
controller = new BoreholeFileController(context, boreholeFileControllerLoggerMock.Object, boreholeFileCloudService, boreholeLockServiceMock.Object);
57+
controller.ControllerContext = GetControllerContextAdmin();
5358
}
5459

5560
[TestCleanup]

0 commit comments

Comments
 (0)