Skip to content

Commit 53ce122

Browse files
authored
Users/tarazou/merge hot fix (#1449)
## Why make this change? - Closes this issue referenced here #1423. Additional issue related to this change #597 - This is the change that included in the March hotfix but doesn't have in main. ## What is this change? - Add check for Cosmos to fail if field permission gets passed in the config. ## How was this tested? - [x] Integration Tests - [x] Unit Tests
1 parent e29a3f0 commit 53ce122

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

src/Service.Tests/Configuration/ConfigurationTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,23 @@ public async Task TestInvalidConfigurationAtRuntime()
300300
Assert.AreEqual(HttpStatusCode.BadRequest, postResult.StatusCode);
301301
}
302302

303+
[TestMethod("Validates containing field permission in configuration returns a bad request."), TestCategory(TestCategory.COSMOSDBNOSQL)]
304+
public async Task TestInvalidConfigurationWithFieldPermission()
305+
{
306+
TestServer server = new(Program.CreateWebHostFromInMemoryUpdateableConfBuilder(Array.Empty<string>()));
307+
HttpClient httpClient = server.CreateClient();
308+
309+
ConfigurationPostParameters config = GetCosmosConfigurationParameters();
310+
config = config with
311+
{
312+
Configuration = "{\"$schema\":\"dab.draft.schema.json\",\"data-source\":{\"database-type\":\"cosmosdb_nosql\",\"options\":{\"database\":\"graphqldb\",\"schema\":\"schema.gql\"}},\"entities\":{\"Planet\":{\"source\":\"graphqldb.planet\",\"graphql\":{\"type\":{\"singular\":\"Planet\",\"plural\":\"Planets\"}},\"permissions\":[{\"role\":\"anonymous\",\"actions\":[{\"action\":\"read\",\"fields\":{\"include\":[\"*\"],\"exclude\":[]}}]}]}}}"
313+
};
314+
315+
HttpResponseMessage postResult =
316+
await httpClient.PostAsync("/configuration", JsonContent.Create(config));
317+
Assert.AreEqual(HttpStatusCode.BadRequest, postResult.StatusCode);
318+
}
319+
303320
[TestMethod("Validates a failure in one of the config updated handlers returns a bad request."), TestCategory(TestCategory.COSMOSDBNOSQL)]
304321
public async Task TestSettingFailureConfigurations()
305322
{

src/Service/Services/MetadataProviders/CosmosSqlMetadataProvider.cs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
using System.Collections.Generic;
66
using System.Diagnostics.CodeAnalysis;
77
using System.IO.Abstractions;
8+
using System.Text.Json;
89
using System.Threading.Tasks;
10+
using Azure.DataApiBuilder.Auth;
911
using Azure.DataApiBuilder.Config;
1012
using Azure.DataApiBuilder.Service.Configurations;
1113
using Azure.DataApiBuilder.Service.Exceptions;
@@ -53,9 +55,44 @@ public CosmosSqlMetadataProvider(RuntimeConfigProvider runtimeConfigProvider, IF
5355
subStatusCode: DataApiBuilderException.SubStatusCodes.ErrorInInitialization);
5456
}
5557

58+
foreach (Entity entity in _runtimeConfig.Entities.Values)
59+
{
60+
CheckFieldPermissionsForEntity(entity);
61+
}
62+
5663
_cosmosDb = cosmosDb;
5764
}
5865

66+
public void CheckFieldPermissionsForEntity(Entity entity)
67+
{
68+
foreach (PermissionSetting permission in entity.Permissions)
69+
{
70+
string role = permission.Role;
71+
RoleMetadata roleToOperation = new();
72+
object[] Operations = permission.Operations;
73+
foreach (JsonElement operationElement in Operations)
74+
{
75+
if (operationElement.ValueKind is JsonValueKind.String)
76+
{
77+
continue;
78+
}
79+
else
80+
{
81+
// If not a string, the operationObj is expected to be an object that can be deserialized into PermissionOperation
82+
// object.
83+
if (RuntimeConfig.TryGetDeserializedJsonString(operationElement.ToString(), out PermissionOperation? operationObj, null!)
84+
&& operationObj is not null && operationObj.Fields is not null)
85+
{
86+
throw new DataApiBuilderException(
87+
message: "Invalid runtime configuration, CosmosDB_NoSql currently doesn't support field level authorization.",
88+
statusCode: System.Net.HttpStatusCode.BadRequest,
89+
subStatusCode: DataApiBuilderException.SubStatusCodes.BadRequest);
90+
}
91+
}
92+
}
93+
}
94+
}
95+
5996
/// <inheritdoc />
6097
public string GetDatabaseObjectName(string entityName)
6198
{

0 commit comments

Comments
 (0)