Archive meeting workflow and screenshot changes

This commit is contained in:
2026-05-27 12:55:19 +02:00
parent 2422236ef7
commit 12832dde84
48 changed files with 3041 additions and 43 deletions
@@ -30,6 +30,10 @@ public sealed class NoopMeetingWorkflowEngine : IMeetingWorkflowEngine
public sealed class MeetingWorkflowEngine : IMeetingWorkflowEngine
{
private static readonly Regex EmailAddressPattern = new(
@"(?<![A-Za-z0-9.!#$%&'*+/=?^_`{|}~-])(?<local>[A-Za-z0-9.!#$%&'*+/=?^_`{|}~-]+)@(?<domain>(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,63})(?![A-Za-z0-9-])",
RegexOptions.Compiled | RegexOptions.CultureInvariant | RegexOptions.IgnoreCase);
private static readonly string[] ParameterNames =
[
"meeting.attendees.count",
@@ -252,17 +256,65 @@ public sealed class MeetingWorkflowEngine : IMeetingWorkflowEngine
string template,
MeetingWorkflowTemplateModel model)
{
if (!template.Contains('@', StringComparison.Ordinal))
if (!ContainsRazorTemplateSyntax(template))
{
return template;
}
return await razorEngine.CompileRenderStringAsync(
Guid.NewGuid().ToString("N"),
template,
EscapeEmailAddressAtSigns(template),
model);
}
private static bool ContainsRazorTemplateSyntax(string value)
{
if (!value.Contains('@', StringComparison.Ordinal))
{
return false;
}
var emailAtSigns = EmailAddressPattern
.Matches(value)
.Select(match => match.Index + match.Value.IndexOf('@', StringComparison.Ordinal))
.ToHashSet();
for (var index = 0; index < value.Length; index++)
{
if (value[index] != '@')
{
continue;
}
if (index + 1 < value.Length && value[index + 1] == '@')
{
index++;
continue;
}
if (emailAtSigns.Contains(index))
{
continue;
}
return true;
}
return false;
}
private static string EscapeEmailAddressAtSigns(string value)
{
if (!value.Contains('@', StringComparison.Ordinal))
{
return value;
}
return EmailAddressPattern.Replace(
value,
match => match.Value.Replace("@", "@@", StringComparison.Ordinal));
}
private static bool SetProperty(
MeetingNote meeting,
string? property,