30 lines
1.4 KiB
C#
30 lines
1.4 KiB
C#
using System.Text.RegularExpressions;
|
|
using FluentValidation;
|
|
|
|
namespace TeleWave.Application.Broadcast.Bumpers;
|
|
|
|
public sealed partial class UpdateBumperTemplateCommandValidator
|
|
: AbstractValidator<UpdateBumperTemplateCommand>
|
|
{
|
|
public UpdateBumperTemplateCommandValidator()
|
|
{
|
|
RuleFor(x => x.Name).NotEmpty().MaximumLength(64);
|
|
|
|
// Цвета уходят в строку ffmpeg-фильтра без экранирования — допускаем только безопасный формат
|
|
// (0xRRGGBB[AA], #RRGGBB[AA] или имя цвета), чтобы исключить инъекцию синтаксиса фильтра.
|
|
RuleFor(x => x.BackgroundColor).Must(BeSafeColor).WithMessage(ColorMessage);
|
|
RuleFor(x => x.BackgroundColor2).Must(BeSafeColor).WithMessage(ColorMessage);
|
|
RuleFor(x => x.AccentColor).Must(BeSafeColor).WithMessage(ColorMessage);
|
|
RuleFor(x => x.TextColor).Must(BeSafeColor).WithMessage(ColorMessage);
|
|
}
|
|
|
|
private const string ColorMessage =
|
|
"Цвет должен быть в формате 0xRRGGBB, #RRGGBB или именем (например white).";
|
|
|
|
private static bool BeSafeColor(string? value) =>
|
|
!string.IsNullOrWhiteSpace(value) && ColorRegex().IsMatch(value);
|
|
|
|
[GeneratedRegex(@"^((0x|#)?[0-9A-Fa-f]{6}([0-9A-Fa-f]{2})?|[A-Za-z]{2,20}(@[0-9]?\.?[0-9]+)?)$")]
|
|
private static partial Regex ColorRegex();
|
|
}
|