mirror of
https://github.com/bitwarden/server
synced 2025-12-12 06:13:43 +00:00
Alter Integration Template processing to remove keys when encountering null values (#6309)
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using Bit.Core.AdminConsole.Entities;
|
using System.Text.Json;
|
||||||
|
using Bit.Core.AdminConsole.Entities;
|
||||||
using Bit.Core.Entities;
|
using Bit.Core.Entities;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
@@ -23,6 +24,8 @@ public class IntegrationTemplateContext(EventMessage eventMessage)
|
|||||||
public Guid? GroupId => Event.GroupId;
|
public Guid? GroupId => Event.GroupId;
|
||||||
public Guid? PolicyId => Event.PolicyId;
|
public Guid? PolicyId => Event.PolicyId;
|
||||||
|
|
||||||
|
public string EventMessage => JsonSerializer.Serialize(Event);
|
||||||
|
|
||||||
public User? User { get; set; }
|
public User? User { get; set; }
|
||||||
public string? UserName => User?.Name;
|
public string? UserName => User?.Name;
|
||||||
public string? UserEmail => User?.Email;
|
public string? UserEmail => User?.Email;
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
|
|
||||||
using System.Text.Json;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
namespace Bit.Core.AdminConsole.Utilities;
|
namespace Bit.Core.AdminConsole.Utilities;
|
||||||
@@ -20,15 +19,14 @@ public static partial class IntegrationTemplateProcessor
|
|||||||
return TokenRegex().Replace(template, match =>
|
return TokenRegex().Replace(template, match =>
|
||||||
{
|
{
|
||||||
var propertyName = match.Groups[1].Value;
|
var propertyName = match.Groups[1].Value;
|
||||||
if (propertyName == "EventMessage")
|
|
||||||
{
|
|
||||||
return JsonSerializer.Serialize(values);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var property = type.GetProperty(propertyName);
|
var property = type.GetProperty(propertyName);
|
||||||
return property?.GetValue(values)?.ToString() ?? match.Value;
|
|
||||||
|
if (property == null)
|
||||||
|
{
|
||||||
|
return match.Value; // Return unknown keys as keys - i.e. #Key#
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return property?.GetValue(values)?.ToString() ?? "";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
#nullable enable
|
||||||
|
using System.Text.Json;
|
||||||
|
using Bit.Core.AdminConsole.Entities;
|
||||||
|
using Bit.Core.AdminConsole.Models.Data.EventIntegrations;
|
||||||
|
using Bit.Core.Entities;
|
||||||
|
using Bit.Core.Models.Data;
|
||||||
|
using Bit.Test.Common.AutoFixture.Attributes;
|
||||||
|
using Xunit;
|
||||||
|
|
||||||
|
namespace Bit.Core.Test.AdminConsole.Models.Data.EventIntegrations;
|
||||||
|
|
||||||
|
public class IntegrationTemplateContextTests
|
||||||
|
{
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void EventMessage_ReturnsSerializedJsonOfEvent(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage: eventMessage);
|
||||||
|
var expected = JsonSerializer.Serialize(eventMessage);
|
||||||
|
|
||||||
|
Assert.Equal(expected, sut.EventMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void UserName_WhenUserIsSet_ReturnsName(EventMessage eventMessage, User user)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { User = user };
|
||||||
|
|
||||||
|
Assert.Equal(user.Name, sut.UserName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void UserName_WhenUserIsNull_ReturnsNull(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { User = null };
|
||||||
|
|
||||||
|
Assert.Null(sut.UserName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void UserEmail_WhenUserIsSet_ReturnsEmail(EventMessage eventMessage, User user)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { User = user };
|
||||||
|
|
||||||
|
Assert.Equal(user.Email, sut.UserEmail);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void UserEmail_WhenUserIsNull_ReturnsNull(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { User = null };
|
||||||
|
|
||||||
|
Assert.Null(sut.UserEmail);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void ActingUserName_WhenActingUserIsSet_ReturnsName(EventMessage eventMessage, User actingUser)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { ActingUser = actingUser };
|
||||||
|
|
||||||
|
Assert.Equal(actingUser.Name, sut.ActingUserName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void ActingUserName_WhenActingUserIsNull_ReturnsNull(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { ActingUser = null };
|
||||||
|
|
||||||
|
Assert.Null(sut.ActingUserName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void ActingUserEmail_WhenActingUserIsSet_ReturnsEmail(EventMessage eventMessage, User actingUser)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { ActingUser = actingUser };
|
||||||
|
|
||||||
|
Assert.Equal(actingUser.Email, sut.ActingUserEmail);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void ActingUserEmail_WhenActingUserIsNull_ReturnsNull(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { ActingUser = null };
|
||||||
|
|
||||||
|
Assert.Null(sut.ActingUserEmail);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void OrganizationName_WhenOrganizationIsSet_ReturnsDisplayName(EventMessage eventMessage, Organization organization)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { Organization = organization };
|
||||||
|
|
||||||
|
Assert.Equal(organization.DisplayName(), sut.OrganizationName);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Theory, BitAutoData]
|
||||||
|
public void OrganizationName_WhenOrganizationIsNull_ReturnsNull(EventMessage eventMessage)
|
||||||
|
{
|
||||||
|
var sut = new IntegrationTemplateContext(eventMessage) { Organization = null };
|
||||||
|
|
||||||
|
Assert.Null(sut.OrganizationName);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
|
|
||||||
using System.Text.Json;
|
|
||||||
using Bit.Core.AdminConsole.Utilities;
|
using Bit.Core.AdminConsole.Utilities;
|
||||||
using Bit.Core.Models.Data;
|
using Bit.Core.Models.Data;
|
||||||
using Bit.Test.Common.AutoFixture.Attributes;
|
using Bit.Test.Common.AutoFixture.Attributes;
|
||||||
@@ -41,22 +40,12 @@ public class IntegrationTemplateProcessorTests
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Theory, BitAutoData]
|
[Theory, BitAutoData]
|
||||||
public void ReplaceTokens_WithEventMessageToken_ReplacesWithSerializedJson(EventMessage eventMessage)
|
public void ReplaceTokens_WithNullProperty_InsertsEmptyString(EventMessage eventMessage)
|
||||||
{
|
|
||||||
var template = "#EventMessage#";
|
|
||||||
var expected = $"{JsonSerializer.Serialize(eventMessage)}";
|
|
||||||
var result = IntegrationTemplateProcessor.ReplaceTokens(template, eventMessage);
|
|
||||||
|
|
||||||
Assert.Equal(expected, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Theory, BitAutoData]
|
|
||||||
public void ReplaceTokens_WithNullProperty_LeavesTokenUnchanged(EventMessage eventMessage)
|
|
||||||
{
|
{
|
||||||
eventMessage.UserId = null;
|
eventMessage.UserId = null;
|
||||||
|
|
||||||
var template = "Event #Type#, User (id: #UserId#).";
|
var template = "Event #Type#, User (id: #UserId#).";
|
||||||
var expected = $"Event {eventMessage.Type}, User (id: #UserId#).";
|
var expected = $"Event {eventMessage.Type}, User (id: ).";
|
||||||
var result = IntegrationTemplateProcessor.ReplaceTokens(template, eventMessage);
|
var result = IntegrationTemplateProcessor.ReplaceTokens(template, eventMessage);
|
||||||
|
|
||||||
Assert.Equal(expected, result);
|
Assert.Equal(expected, result);
|
||||||
|
|||||||
Reference in New Issue
Block a user