diff --git a/src/ml-service/Deal.Ml/Model/ModelPool.cs b/src/ml-service/Deal.Ml/Model/ModelPool.cs index 8a560cb..2282a48 100644 --- a/src/ml-service/Deal.Ml/Model/ModelPool.cs +++ b/src/ml-service/Deal.Ml/Model/ModelPool.cs @@ -13,8 +13,6 @@ public sealed class ModelPool : IDisposable // Верхняя граница длины tenant-id (защита пути; реальные id заметно короче). private const int MaxTenantIdLength = 128; - private static readonly char[] InvalidTenantCharacters = Path.GetInvalidFileNameChars(); - private readonly MlOptions _options; private readonly ConcurrentDictionary _models = new(StringComparer.Ordinal); @@ -76,8 +74,9 @@ public sealed class ModelPool : IDisposable 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)); }