From 4c3a767f45764b7f229706be8ad36f04417e9f5d Mon Sep 17 00:00:00 2001 From: bot-backend Date: Fri, 28 Aug 2026 21:56:24 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein/sql):=20=D0=BC=D0=B8=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20274=20=D0=B1=D0=B5=D0=B7=20lock=5Fti?= =?UTF-8?q?meout=20=D1=80=D0=BE=D0=BD=D1=8F=D0=BB=D0=B0=20=D0=B3=D0=B5?= =?UTF-8?q?=D0=B9=D1=82=20#2752?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CREATE INDEX без lock_timeout встаёт в очередь за чужой долгой сессией и уводит за собой запросы приложения. Таблица новая и пустая, но очередь блокировок этого не знает, а гейт check-migration-lock-timeout.py держит правило на каждом PR — и правильно делает. Заодно поправлена шапка миграции: там осталась моя опровергнутая версия, будто ценность в mainPhone и одиннадцати номерах. mainPhone лежит в паспортном блоке рядом с login/passportHost/passportPhones — это номер НАШЕЙ учётки, а не продавца, и собирать его нельзя. Настоящее различие между режимами — author.phoneNumbers (0 без кук, 2 с куками, одинаково на обеих карточках); encryptedPhones в обоих режимах одинаков. Refs #3192 --- .../data/sql/274_yandex_session_cookies.sql | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/tradein-mvp/backend/data/sql/274_yandex_session_cookies.sql b/tradein-mvp/backend/data/sql/274_yandex_session_cookies.sql index 949db244..e3b56240 100644 --- a/tradein-mvp/backend/data/sql/274_yandex_session_cookies.sql +++ b/tradein-mvp/backend/data/sql/274_yandex_session_cookies.sql @@ -1,9 +1,16 @@ -- 274_yandex_session_cookies.sql -- Purpose: Encrypted storage for Yandex.Nedvizhimost browser session cookies. -- Замер на проде (сайдкар, две карточки, вперемежку с/без кук, 2026-08-28): --- авторизованная сессия отдаёт mainPhone=1 и на 11 больше уникальных --- телефонов продавца (90→101 / 89→100) по сравнению с анонимным запросом — --- то есть контакты продавца физически недоступны без валидной сессии. +-- author.phoneNumbers присутствует ТОЛЬКО в авторизованном режиме +-- (0 без кук → 2 с куками, одинаково на обеих карточках), плюс три +-- номера в author.phones сверху. Это контакт продавца с тегом канала +-- и redirectId. +-- NB: mainPhone НЕ собирать — он лежит в паспортном блоке рядом с +-- login/passportHost/passportPhones, то есть это номер НАШЕЙ учётки, +-- а не продавца. Первая версия этого замера приняла его за данные +-- объявления; счётчики по конкретным полям это опровергли. +-- encryptedPhones одинаков в обоих режимах (54) — зашифрованные токены +-- отдаются всегда, различие не в них. -- Uses pgcrypto pgp_sym_encrypt for AES encryption at rest (зеркалит -- 027_cian_session_cookies.sql / 174_domclick_session_cookies.sql). -- Dependencies: @@ -20,10 +27,16 @@ -- числового id аккаунта, доступного из cookie-дампа; используем произвольную -- текстовую метку аккаунта, которую задаёт оператор при заливке дампа. -- --- Sources: issue #3192 (Yandex session cookies — mainPhone/contact reveal) +-- Sources: issue #3192 (Yandex session cookies — author.phoneNumbers reveal) BEGIN; +-- #2752: без lock_timeout CREATE INDEX встанет в очередь за чужой долгой +-- сессией и уведёт за собой запросы приложения — таблица новая и пустая, но +-- очередь блокировок этого не знает. Гейт check-migration-lock-timeout.py +-- держит правило на каждом PR. +SET LOCAL lock_timeout = '5s'; + CREATE EXTENSION IF NOT EXISTS pgcrypto; CREATE TABLE IF NOT EXISTS yandex_session_cookies (