mirror of
https://github.com/bitwarden/server
synced 2025-12-10 13:23:27 +00:00
* Add template properites for Datadog * Add test and implementation for including User and ActingUser when only the Type is referenced * Refactored database calls to fetch the user details in a single DB call * Refactor to use a dedicated stored procedure for Dapper * Remove TOP 1 from stored procedure * Accept Claude's optimization of SingleOrDefaultAsync to unify Dapper/EF Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com> * Revert earlier change and add TOP 1 back into stored procedure * Change go to GO * Revert back to version that assumes uniqueness, remove TOP 1 --------- Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
77 lines
2.1 KiB
C#
77 lines
2.1 KiB
C#
#nullable enable
|
|
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace Bit.Core.AdminConsole.Utilities;
|
|
|
|
public static partial class IntegrationTemplateProcessor
|
|
{
|
|
[GeneratedRegex(@"#(\w+)#")]
|
|
private static partial Regex TokenRegex();
|
|
|
|
public static string ReplaceTokens(string template, object values)
|
|
{
|
|
if (string.IsNullOrEmpty(template))
|
|
{
|
|
return template;
|
|
}
|
|
var type = values.GetType();
|
|
return TokenRegex().Replace(template, match =>
|
|
{
|
|
var propertyName = match.Groups[1].Value;
|
|
var property = type.GetProperty(propertyName);
|
|
|
|
if (property == null)
|
|
{
|
|
return match.Value; // Return unknown keys as keys - i.e. #Key#
|
|
}
|
|
|
|
return property.GetValue(values)?.ToString() ?? string.Empty;
|
|
});
|
|
}
|
|
|
|
public static bool TemplateRequiresUser(string template)
|
|
{
|
|
if (string.IsNullOrEmpty(template))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return template.Contains("#UserName#", StringComparison.Ordinal)
|
|
|| template.Contains("#UserEmail#", StringComparison.Ordinal)
|
|
|| template.Contains("#UserType#", StringComparison.Ordinal);
|
|
}
|
|
|
|
public static bool TemplateRequiresActingUser(string template)
|
|
{
|
|
if (string.IsNullOrEmpty(template))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return template.Contains("#ActingUserName#", StringComparison.Ordinal)
|
|
|| template.Contains("#ActingUserEmail#", StringComparison.Ordinal)
|
|
|| template.Contains("#ActingUserType#", StringComparison.Ordinal);
|
|
}
|
|
|
|
public static bool TemplateRequiresGroup(string template)
|
|
{
|
|
if (string.IsNullOrEmpty(template))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return template.Contains("#GroupName#", StringComparison.Ordinal);
|
|
}
|
|
|
|
public static bool TemplateRequiresOrganization(string template)
|
|
{
|
|
if (string.IsNullOrEmpty(template))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return template.Contains("#OrganizationName#", StringComparison.Ordinal);
|
|
}
|
|
}
|