From 1b3f6727648ab69d6cf79674af4b495c6760d985 Mon Sep 17 00:00:00 2001 From: kavics Date: Thu, 25 Aug 2022 08:26:49 +0200 Subject: [PATCH] Fix table writer: avoid array indexing errors. Fix auth test: use typed object instead of dynamic one. (#1778) --- src/OData/Writers/ODataTableWriter.cs | 21 ++++++++++++------- .../AuthenticationTests.cs | 4 ++-- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/OData/Writers/ODataTableWriter.cs b/src/OData/Writers/ODataTableWriter.cs index e4e2cb085..2c66afdf8 100644 --- a/src/OData/Writers/ODataTableWriter.cs +++ b/src/OData/Writers/ODataTableWriter.cs @@ -53,9 +53,7 @@ protected override async Task WriteServiceDocumentAsync(HttpContext httpContext, /// protected override async Task WriteSingleContentAsync(HttpContext httpContext, ODataRequest odataRequest, ODataEntity fields) { - var expansion = this.ODataRequest.Select - .Select(x => x.Split('/')) - .ToDictionary(x=>x[0], x=>x.Skip(1).ToArray()); + var expansion = GetExpansion(); using (var writer = new StringWriter()) { @@ -92,7 +90,10 @@ protected override async Task WriteSingleContentAsync(HttpContext httpContext, O writer.Write(" "); writer.Write(item.Key); writer.Write(""); - WriteValue(writer, Project(item.Value, expansion[item.Key])); + if (expansion.TryGetValue(item.Key, out var exp)) + WriteValue(writer, Project(item.Value, exp)); + else + WriteValue(writer, item.Value); writer.Write("\n"); } } @@ -189,7 +190,11 @@ protected override async Task WriteMultipleContentAsync(HttpContext httpContext, { colIndex = colNames.IndexOf(item.Key); if (colIndex >= 0) - row[colIndex] = Project(item.Value, expansion[colIndex - 1]); + { + row[colIndex] = expansion.TryGetValue(item.Key, out var exp) + ? row[colIndex] = Project(item.Value, exp) + : row[colIndex] = item.Value; + } } writer.Write(" \n"); @@ -242,11 +247,11 @@ private object GetValueInDepth(ODataEntity entity, string[] expansion, int depth return value; } - private string[][] GetExpansion() + private IDictionary GetExpansion() { return this.ODataRequest.Select - .Select(x => x.Split('/').Skip(1).ToArray()) - .ToArray(); + .Select(x => x.Split('/')) + .ToDictionary(x => x[0], x => x.Skip(1).ToArray()); } /// diff --git a/src/Tests/SenseNet.Services.Core.Tests/AuthenticationTests.cs b/src/Tests/SenseNet.Services.Core.Tests/AuthenticationTests.cs index 9e786c505..ee80b2ca9 100644 --- a/src/Tests/SenseNet.Services.Core.Tests/AuthenticationTests.cs +++ b/src/Tests/SenseNet.Services.Core.Tests/AuthenticationTests.cs @@ -33,8 +33,8 @@ public Task Authentication_Validate_Disabled_CSrv() var user = await IdentityOperations.CreateLocalUser(root, context, userName, userName, userName + "@example.com"); // check if the user can log in - dynamic result = IdentityOperations.ValidateCredentials(root, context, "public\\" + userName, userName); - Assert.AreEqual(user.Id, result.id); + var result = IdentityOperations.ValidateCredentials(root, context, "public\\" + userName, userName); + Assert.AreEqual(user.Id, result.Id); // ACTION: disable the user user["Enabled"] = false;