Сделать валидацию tenant-id в ModelPool платформонезависимой
ci / build-test (push) Failing after 13m48s

GetInvalidFileNameChars() на Linux пропускает обратный слеш и точки —
GetOrCreate_InvalidTenantId_Throws падал в CI на ubuntu. Заменено на явный
белый список: ASCII-буквы/цифры плюс '-' и '_'. CI поймал первый
кроссплатформенный баг —mission accomplished.
This commit is contained in:
Rustam Khalimov
2026-09-11 21:20:18 +03:00
parent 85d70fa307
commit e61b744028
+3 -4
View File
@@ -13,8 +13,6 @@ public sealed class ModelPool : IDisposable
// Верхняя граница длины tenant-id (защита пути; реальные id заметно короче). // Верхняя граница длины tenant-id (защита пути; реальные id заметно короче).
private const int MaxTenantIdLength = 128; private const int MaxTenantIdLength = 128;
private static readonly char[] InvalidTenantCharacters = Path.GetInvalidFileNameChars();
private readonly MlOptions _options; private readonly MlOptions _options;
private readonly ConcurrentDictionary<string, TenantModel> _models = new(StringComparer.Ordinal); private readonly ConcurrentDictionary<string, TenantModel> _models = new(StringComparer.Ordinal);
@@ -76,8 +74,9 @@ public sealed class ModelPool : IDisposable
throw new ArgumentException($"tenant-id длиннее {MaxTenantIdLength} символов.", nameof(tenantId)); throw new ArgumentException($"tenant-id длиннее {MaxTenantIdLength} символов.", nameof(tenantId));
} }
if (tenantId.IndexOfAny(InvalidTenantCharacters) >= 0 // Имя файла модели должно быть портируемым между ОС: разделители пути («/», «\»)
|| tenantId.Contains("..", StringComparison.Ordinal)) // валидны на Linux, поэтому проверяем явный белый список, а не GetInvalidFileNameChars.
if (tenantId.Any(c => !char.IsAsciiLetterOrDigit(c) && c is not '-' and not '_'))
{ {
throw new ArgumentException("tenant-id содержит недопустимые для имени файла символы.", nameof(tenantId)); throw new ArgumentException("tenant-id содержит недопустимые для имени файла символы.", nameof(tenantId));
} }