8e687f99c1
Путь человека рвался пополам: лендинг и кабинет считали разные счётчики,
а вход и регистрация не писались вообще. Почему люди бросают регистрацию,
узнать было нельзя.
Счётчик лендинга 110476275 становится счётчиком полного пути и грузится
на всех страницах кабинета. Прежний счётчик кабинета 110494416 не тронут,
его история цела, на страницах кабинета работают оба.
Что сделано:
- загрузчик Метрики поднимает счётчики по области: public или app
- белый список раскладок: новая раскладка Метрику НЕ получает по умолчанию
- формы входа и регистрации закрыты от записи классом ym-hide-content
- метка utm не теряется при заходе сразу в кабинет минуя лендинг
Найдено при исполнении и закрыто:
- почта выводится в заголовке ДВУХ экранов, то есть вне формы: класс на форме
её не накрывал, утекла бы в записи открытым текстом. Замаскирована точечно
- Метрика, единожды запустившись, пишет дальше сама и роутером не выключается.
Админ входит через общий /login и идёт в админку к чужим телефонам.
Корни админки и портала продаж закрыты ym-hide-content
- ключ metrika в config/services.php был объявлен ДВАЖДЫ: раздвоил его мой
же merge 42e907c8 от 14.07. PHP молча берёт последний, правка первого блока
не дала бы ничего и не выругалась. Дубль вычищен, прочие конфиги проверены
В кабинете Метрики включена галочка «включая поддомены»: счётчик принимал
данные только с liderra.ru и молча выбрасывал бы всё из кабинета.
Заодно погашен долг по статанализу: 63 ошибки держали коммит. Все до одной
в тестах, в боевом коде ноль. Природа ложная — анализатор не понимает
устройство Pest и ругается на обычный вызов внутри теста. Их гасят списком
игнора, а список пересобирали 18.07, тогда как тесты добавлялись 19-20.07,
в том числе мои по рекламной аудитории. Список пересобран, стало 0 ошибок.
Долг накопился в том числе потому, что вчера я обошёл эту проверку.
Тесты: 27 новых, все проверены вырезанием защиты. Полный набор 202 файла зелёный.
План: docs/superpowers/plans/2026-07-20-skvoznoy-put-do-vebvizora.md
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
61 lines
3.0 KiB
TypeScript
61 lines
3.0 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { readFileSync } from 'node:fs';
|
|
import { resolve } from 'node:path';
|
|
|
|
/**
|
|
* Экраны входа и регистрации собирают персональные данные: почту, пароль,
|
|
* код из СМС, резервный код. С 20.07.2026 на них грузится Вебвизор, поэтому
|
|
* контейнер формы обязан нести ym-hide-content — иначе введённое уедет
|
|
* в записи Метрики открытым текстом (152-ФЗ).
|
|
*
|
|
* Проверяем разметку файлом, а не смонтированным компонентом: класс должен
|
|
* стоять в исходнике всегда, независимо от состояния формы.
|
|
*/
|
|
const EKRANY = [
|
|
'LoginView.vue',
|
|
'RegisterView.vue',
|
|
'ForgotPasswordView.vue',
|
|
'ResetPasswordView.vue',
|
|
'TwoFactorView.vue',
|
|
'UseRecoveryCodeView.vue',
|
|
'ConfirmEmailView.vue',
|
|
];
|
|
|
|
/**
|
|
* Экраны, где почта выводится в ЗАГОЛОВКЕ — то есть вне контейнера формы.
|
|
* Класс на форме их не накрывает: обнаружено при исполнении 20.07.2026,
|
|
* до находки план считал, что все ПДн лежат внутри формы.
|
|
* Здесь маскировка обязана стоять на самом теге с почтой.
|
|
*/
|
|
const EKRANY_S_POCHTOY_V_ZAGOLOVKE: Array<[string, string]> = [
|
|
['TwoFactorView.vue', 'userEmail'],
|
|
['ConfirmEmailView.vue', 'email'],
|
|
];
|
|
|
|
describe('маскировка ПДн на экранах входа', () => {
|
|
it.each(EKRANY)('%s закрывает форму от записи Вебвизором', (fayl) => {
|
|
const put = resolve(__dirname, '../../resources/js/views/auth', fayl);
|
|
const ishodnik = readFileSync(put, 'utf-8');
|
|
|
|
expect(ishodnik).toContain('ym-hide-content');
|
|
});
|
|
|
|
it.each(EKRANY_S_POCHTOY_V_ZAGOLOVKE)(
|
|
'%s маскирует почту в заголовке — она вне формы, класс на форме её не закрывает',
|
|
(fayl, peremennaya) => {
|
|
const put = resolve(__dirname, '../../resources/js/views/auth', fayl);
|
|
const ishodnik = readFileSync(put, 'utf-8');
|
|
|
|
// Тег, который выводит почту, обязан сам нести класс маскировки.
|
|
// Проверяем строку целиком, а не наличие класса где-то в файле:
|
|
// иначе тест зеленеет за счёт класса на форме и дыру пропускает.
|
|
const stroka = ishodnik
|
|
.split('\n')
|
|
.find((s) => s.includes(`{{ ${peremennaya} }}`));
|
|
|
|
expect(stroka, `не нашёл вывод {{ ${peremennaya} }} в ${fayl}`).toBeDefined();
|
|
expect(stroka).toContain('ym-hide-content');
|
|
}
|
|
);
|
|
});
|