Почистить комментарии от упоминаний процесса

Удалены <remarks>, <summary> сжаты до короткой фразы, вырезаны
ссылки на Task/Ruling/этап/python/прототип; //-комментарии со ссылками
на процесс удалены; то же в .proto. Правила обновлены в
docs/spec/Код-стайл-Дейл.md. Строк комментариев 27210 -> ~19100.
This commit is contained in:
Rustam Khalimov
2026-09-11 13:39:39 +03:00
parent 5f5538d33b
commit b053d58335
902 changed files with 3902 additions and 12074 deletions
@@ -10,44 +10,26 @@ using Deal.Grpc.Hosting.Services;
namespace Deal.Grpc.Hosting.Interceptors;
/// <summary>
/// Серверный интерцептор service-token (Ruling 1; общий шаблон трёх Deal-сервисов — C31).
///
/// Каждый RPC Deal-сервиса обязан нести gRPC-metadata «service-token», равный ожидаемому значению
/// из env DEAL_SERVICE_TOKEN (общий токен сервисов в compose, Ruling 12). Отсутствие или
/// несовпадение токена — отказ UNAUTHENTICATED до вызова метода сервиса. Стандартный
/// grpc.health.v1.Health токеном НЕ проверяется: это liveness инфраструктуры (docker healthcheck,
/// Ruling 12), данных тенантов он не отдаёт.
///
/// Fail-closed (замечание ревью Task 2 учтено): если DEAL_SERVICE_TOKEN не задан/пуст — любой
/// Deal-RPC отклоняется всегда. Явный гард обязателен: сравнение строк без него пропустило бы
/// запрос с пустым значением metadata («» == «»), а env-провайдер конфигурации возвращает пустую
/// строку вместо null для незаданного ключа.
///
/// Проверка выполняется для ВСЕХ видов RPC (unary/клиентский/серверный/дуплексный стриминг):
/// метод <see cref="EnsureAuthorized"/> вызывается из каждого handler-а (замечание code-review).
/// Серверный интерцептор service-token.
/// </summary>
public sealed class ServiceTokenInterceptor : Interceptor
{
/// <summary>
/// Ключ gRPC-metadata с токеном сервиса (контракт — README src/contracts).
/// Ключ gRPC-metadata с токеном сервиса
/// </summary>
public const string ServiceTokenMetadataKey = "service-token";
// Префикс методов стандартного gRPC-health, освобождённых от проверки токена.
private const string HealthMethodPrefix = "/grpc.health.v1.Health/";
// Env-ключ ожидаемого токена (только env; ключи/секреты не логируются — Ruling 13).
private const string ServiceTokenEnvKey = "DEAL_SERVICE_TOKEN";
// Деталь отказа — общий текст для трёх сервисов этапа (шаблон T2/T3/T4).
private const string RejectionDetail = "service-token отсутствует или неверен";
private readonly byte[] _expectedTokenBytes;
/// <summary>
/// Создаёт интерцептор. Ожидаемый токен читается из конфигурации (env DEAL_SERVICE_TOKEN)
/// в момент старта хоста; смена токена требует рестарта (как остальной env-конфиг). Токен
/// хранится в UTF-8-байтах для constant-time сравнения (<see cref="CryptographicOperations"/>).
/// Создаёт интерцептор.
/// </summary>
/// <param name="configuration">Конфигурация хоста (env-провайдер WebApplicationBuilder).</param>
public ServiceTokenInterceptor(IConfiguration configuration)