# Changelog

Все значимые изменения решения `codekeepers.justice` фиксируются здесь.
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.1.0/),
проект следует [семантическому версионированию](https://semver.org/lang/ru/).

## [3.0.1] — 2026-05-20

### Security

Закрыты XSS-уязвимости, выявленные автоматическим чеклистом безопасности
маркетплейса 1С-Битрикс (7 находок), плюс однотипные места:

- **Высокий** — соц-ссылки (`social/`, `social-sidebar/`) выводились в `href`
  без экранирования и проверки схемы. Теперь через `Url::href()`
  (allowlist `http/https/mailto/tel` + относительные, режет `javascript:`/`data:`).
- **Высокий** — JSON-LD в `header.php` доверял `HTTP_HOST` (Host header
  injection) и сериализовался без `JSON_HEX_TAG`. Теперь host берётся из
  `main.server_name` (fallback — валидация allowlist), а `json_encode`
  получает флаги `JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS|JSON_HEX_QUOT`.
- **Средний** — URL из свойств инфоблоков (`features`, `call-to-action`,
  `slider_mainpage`, `sidebar-phone`, `team-list`, `team-list-slider` и др.)
  экранировались, но без проверки схемы → `javascript:`/`data:` проходили.
  Теперь через `Url::href()`.
- **Средний** — `footerDescription[TEXT]` в `footer.php` выводился сырым HTML.
  Теперь через `Html::sanitize()` (`\CBXSanitizer`, SECURE_LEVEL_MIDDLE).
- **Средний** — фоновое изображение страницы (`ShowProperty("image")`) в
  `style="background-image:url(...)"` (`header.php`) выводилось без
  экранирования. Теперь через `Url::cssUrl(GetProperty('image'))`.
- **Средний** — `Templating\Text` авто-переключал текстовое поле в HTML при
  наличии тегов и возвращал сырой ввод. Эвристика убрана: HTML рендерится
  только при явном `TYPE=html` и проходит `Html::sanitize()`.
- **Низкий** — `Video\EmbedUrlBuilder` в Rutube-ветке возвращал сырой `$url`
  (regex без якоря конца). Regex заякорен (`/?$`), возвращается канонический
  URL, собранный из извлечённого id.
- **Hardening** — все `background-image: url()` с сырым `SRC` → `Url::cssUrl()`;
  reflected XSS в `?tags=` (blog-list) → `urlencode`+экранирование; сырые
  `href`/`NAME` в `news.detail`, `catalog.section.list`, `search.tags.cloud`,
  `stats` → экранирование.

### Added

- `Codekeepers\Justice\Security\Url` (`lib/security/url.php`) — `href()` и
  `cssUrl()` (allowlist схем, защита от control-char-обхода, escape).
- `Codekeepers\Justice\Security\Html` (`lib/security/html.php`) — `sanitize()`
  поверх `\CBXSanitizer`.
- Unit-тест `tests/unit/security-url-test.php` (28 assertions, без ядра).

### Changed

- `tools/pack.sh` складывает релизные архивы в `dist/<version>/`
  (`codekeepers.justice.tar.gz` + `.last_version.tar.gz`).

### Fixed

Тема **Modern**, планшетная версия (≤991px) — верх главной страницы:

- Блок «Преимущества» (`.features`) больше не обрезается и не налезает на
  hero-плитки — раскладывается в одну колонку (стопкой, как в classic).
- Phone-блок в шапке получил отступ от нижней границы header'а.
- Гамбургер-меню (`.open-nav-bar`) теперь видимо (тёмные полоски на белом
  header'е) и открывает навигацию; на десктопе скрыто (там горизонтальное меню).
- Четыре сервис-плитки — в один ряд (как в classic), с отступом от кнопки
  «Консультация»; добавлен верхний отступ перед слоганом hero.
- Пункты верхнего уровня в раскрытом бургер-меню больше не тёмные на тёмном
  фоне — сделаны светлыми (подменю на белом фоне без изменений).

## [3.0.0] — 2026-05-18

- Мажорный релиз линейки 3.0: переименование `justicenext` → `justice`
  (см. историю Phase 14), полностью переработанный backend 2.0.2,
  PHP 8.1+, D7 ORM, типизированный SiteSettings, композитный кэш,
  две темы (classic/modern), локальные WOFF2 шрифты.
