From e61b74402898406300dcd85831cb48ea95389415 Mon Sep 17 00:00:00 2001 From: Rustam Khalimov Date: Fri, 11 Sep 2026 21:20:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8E=20tenant?= =?UTF-8?q?-id=20=D0=B2=20ModelPool=20=D0=BF=D0=BB=D0=B0=D1=82=D1=84=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=BE=D0=BD=D0=B5=D0=B7=D0=B0=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GetInvalidFileNameChars() на Linux пропускает обратный слеш и точки — GetOrCreate_InvalidTenantId_Throws падал в CI на ubuntu. Заменено на явный белый список: ASCII-буквы/цифры плюс '-' и '_'. CI поймал первый кроссплатформенный баг —mission accomplished. --- src/ml-service/Deal.Ml/Model/ModelPool.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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)); }