Tags give the ability to mark specific points in history as being important
-
v1.8.0
5a4af479 · ·Security hardening release Leaf certificates are now issued for 90 days (SEC-01) and the local CA can no longer issue intermediate CAs (SEC-02, pathlen 0). Domain fronting is blocked by enforcing SNI equals the CONNECT host (SEC-04). The cert cache is a bounded LRU of 500 entries (SEC-05) and a failed upstream answers a synthetic 502 Bad Gateway (SEC-06). Dashboard rule mutations are protected against cross-site requests (SEC-03). Docs are synced with the runtime and the Flatpak/Snap limitation is documented (DOC-01).
-
v1.7.9
Release: Janus v1.7.9 — Stable Releaseab3bdd44 · ·Патч-релиз доверия: устранён сбой установки CA в браузеры на Linux после v1.7.4. - **Linux TrustStore (Chromium/Chrome/Edge/Яндекс)**: во все вызовы `certutil` добавлен флаг `-d sql:<путь>` — без него база NSS не выбиралась и импорт CA падал с `SEC_ERROR_BAD_DATABASE` - Автоматическая инициализация NSS-базы (`certutil -N --empty-password`) при первом запуске: каталог создаётся с правами `0700` - Единый источник пути к CA-сертификату (`CaStore::cert_pem_path()`): trust store импортирует реальный `ca_cert.pem`, а не угаданный `ca.crt` - Диагностика: stderr `certutil`/`security` при сбоях пишется в лог Janus (level debug); при отсутствии `certutil` в PATH — явный warn - macOS и Windows: сбои `security add-trusted-cert` и `certutil -addstore` больше не деградируют в безымянный `Failed` — причина видна в логе - Релизный конвейер одной командой: `just release-full` (build-all → dist → upload → create); asset-ссылки релиза генерируются автоматически с реальным project id
-
v1.7.8
Release: Janus v1.7.8 — Release (have bugs)264cf2b8 · ·Путь от v1.4.0 Beta к стабильному продукту: macOS, PAC, нативная установка CA, репродуцируемые сборки и подписанные артефакты. - **macOS (экспериментально → стабильно)**: системный прокси через SystemConfiguration, автостарт через launchd (gui-домен), трей, сборка через cargo zigbuild (universal binary: `aarch64` + `x86_64`) - **PAC auto-config**: выборочная маршрутизация вместо перехвата всего трафика; `proxy.pac` раздаётся и регистрируется в ОС как autoconfig URL - **Валидация правил**: вставленные URL больше не ломают роутер; нормализация паттернов с trailing slash; проверка доменов без учёта регистра - **Нативная установка CA без sudo/UAC**: user-store на Windows/macOS/Linux; поддержка Firefox (enterprise roots на Windows/macOS, ручной импорт на Linux); идемпотентная установка; манифест CA-TRUST (границы хранения и доверия) - Лок роутера больше не паникует при hot-reload под нагрузкой - CONNECT читается до конца заголовков: фрагментация и заголовки >4KB не роняют соединение - Uppercase-хост из CONNECT больше не уходит молча в passthrough - Кэш сертификатов не теряет записи под нагрузкой (fix холодного домена) - Pre-warm литеральных доменов белого списка на старте и при hot-reload - Удалён мёртвый модуль `src/tls`; `--reset-proxy` пишет в `janus.log` - Upstream TLS-коннектор строится один раз вместо клона ~200 корней на каждое соединение - Публичный бенчмарк скорости: `just bench --baseline`, baseline в репозитории - Единый crypto-провайдер ring вместо aws-lc (без C-сборки, кросс-компиляция без Apple SDK) - Репродуцируемые сборки: детерминированные флаги, `codegen-units=1`, `SOURCE_DATE_EPOCH`, pinned toolchain (`rust-toolchain.toml`) - Артефакты подписываются minisign в CI: `SHA256SUMS.minisig`, `provenance.json.minisig` - SLSA v1 provenance связывает бинарники с коммитом, rustc и флагами сборки - Проверка независимым скриптом: `just release-verify v1.7.8 [--rebuild]` - 74+ angry unit-тестов ядра (Yegor256-стиль) - Coverage-гейт ≥80% на core domain, мутационное тестирование (cargo-mutants) - E2E-набор с mock TLS-серверами; тесты UX с scripted process fakes
-
v1.7.5
2649781a · ·v1.7.5 — Blazing first connect: cold-cache fix, cert pre-warm, public benchmark The first impression scenario ("open sberbank.ru") no longer races a cold cache: Janus now keeps the warm path warm and measures itself. FIXES - InMemoryCertCache used try_read/try_write: under contention a read returned a false miss and an insert silently dropped its entry. Browsers fire several parallel CONNECTs at a new domain, so the cache stayed cold and certificates regenerated on every attempt. The map now uses blocking locks; a regression test hammers the cache with concurrent readers while inserting and demands the entry survives. - Literal whitelist domains are pre-warmed at startup and on every hot reload (src/proxy/prewarm.rs) — certificate generation is off the browser critical path. Wildcard patterns cannot be pre-warmed: the leaf must match the SNI the browser actually sends. - Debug eprintln noise removed from the MITM path (Noiseless principle). - An upstream-first reorder was reverted after the integration suite rejected it: an untrusted upstream now fails INSIDE the client HTTPS session instead of resetting the browser TLS handshake. BENCHMARKS (public, speed only — output carries no machine data) - tests/perf/bench_perf_test.rs: cold vs warm tunnel latency and warm worst case through the real proxy core against mock TLS upstreams. - scripts/bench.sh: debug binary by default, --release to switch, --build, --rounds N, --json for robots, --baseline to refresh the committed baseline; --quiet for clean stdout. - Baseline (debug, 20 rounds): cold CONNECT 110ms, warm average 29ms, warm worst 32ms — committed as reports/perf/baseline.json so future changes compare against numbers, not vibes. -
v1.7.4
cb8f55b8 · ·v1.7.4 — Native user-level CA trust stores Janus now makes browsers trust its local CA natively on every platform, strictly at the user level: no sudo, no UAC, no system CA bundles, no crawling through per-profile cert9.db databases. WHAT CHANGED - TrustStore trait with an idempotent ensure() built over the injected ProcessRunner (phase-3 micro-object architecture, scripted-fake testable). - Windows: CurrentUser\Root via native certutil — Chrome, Edge and Yandex pick the CA up instantly. - macOS: login Keychain via native security add-trusted-cert — Chrome, Edge and Safari. - Linux: Chromium NSS shared user DB via certutil -t "C,," — supports both the M146+ default (~/.local/share/pki/nssdb) and the legacy ~/.pki/nssdb, creates an empty database when none exists, and degrades quietly when certutil is absent. - Config.auto_trust (default true): trust is ensured fire-and- forget at startup, check-first, so native platform confirmations appear at most once per profile. - Firefox: security.enterprise_roots.enabled = true on Windows and macOS (the official Mozilla mechanism); manual import stays the documented path on Linux, where the flag is not supported. - docs/dev-rules/CA-TRUST.md codifies the storage and trust boundaries; the Firefox guide is split per operating system. QUALITY - 9 angry unit tests for the NSS backend plus cfg-gated suites for Windows and macOS: one assertion per test, scripted process fakes, no OS calls; full suite green (99 lib tests), cargo check --tests clean. - Built on the yegor256-test-campaign baseline (phases 1-3, 70.67% line coverage).
-
yegor256-test-campaign
6e70b625 · ·Yegor256 Angry Test Campaign — phases 1-3 complete A quality offensive against the janus codebase following Yegor Bugayenko's testing philosophy: exactly one assertion per test, zero shared state (no setUp, no static fixtures), no mocking frameworks — only real objects and scripted fakes behind injected traits, irregular and boundary inputs, negative failure messages ("cannot ..."). PHASE 1 - CORE DOMAIN TO 100% 74 angry unit tests for cert/ca, cert/generate, config/loader and proxy/router: malformed PEM, mismatched cert/key pairs, permission denials, XDG fallbacks, wildcard edge cases (trailing dots, unicode, punycode, ports, hyphens, consecutive dots). PHASE 2 - SHATTER THE MONOLITHS The 857-line dashboard/mod.rs was split into 12 single-responsibility micro-objects under src/dashboard/ (server, state, assets + StaticAssets trait, health, stats_stream, radar_stream, log_export, ConfigPersister, radar, rules, stats), each wired through constructor injection. app/mod.rs was reduced to wiring with a testable bootstrap::run(). PHASE 3 - INFRASTRUCTURE TO 50% The 523-line ux/proxy.rs god object (GNOME/KDE/Windows/macOS/PAC in one struct) was replaced by trait boundaries and platform micro-objects: SystemProxy + ProcessRunner traits, one TokioProcessRunner as the only process-spawning point, GnomeProxy (gsettings), KdeProxy (kwriteconfig6 fallback to 5, kded reload), WindowsProxy (reg + WinINET, cfg windows), MacOsProxy (SystemConfiguration, cfg macos), and a factory classifying XDG_CURRENT_DESKTOP. The 0%-coverage open.rs and install.rs were deleted per Yegor's rule; Browser was rewritten TDD-style with an injected runner. main.rs became pure CLI routing (route() -> Action + text builders) preserving the user-facing flag contract; session logging moved to app/logging.rs. RESULT (cargo-llvm-cov, 2026-08-29) lines 70.67%, functions 70.03%, regions 69.72% - up from 68.39%/66.87% after phase 2 and 71.92% on the pre-split monolith baseline. 99 in-crate unit tests plus fake-backed ux suites (GNOME/KDE/Windows/factory/ browser/FakeProxy) and real-binary CLI integration tests through CARGO_BIN_EXE_janus. STILL OPEN Phase 4 (CI coverage gate) and a known flake: config::loader test_load_creates_default fails sporadically under parallel instrumented load only. -
v1.7.3-coverage
c97a3876 · ·Coverage milestone: 74 angry tests added Lines: 71.92% | Functions: 69.58% | Regions: 71.17% | Instantiations: 50.09% Core domain improvements: - proxy/router.rs: 100% functions, 96% instantiations - config/loader.rs: 92% lines, 88% functions - cert/ca.rs: 82% lines Test files: - tests/unit/proxy/router_test.rs (24) - tests/unit/cert/ca_test.rs (20) - tests/unit/config/loader_test.rs (30) All 190 tests pass. Next: shatter dashboard/mod.rs and ux/proxy.rs per Yegor's EO principles.
-
v1.7.2
3c9015ed · ·v1.7.2 — coverage tier push: 67.3% to 72.2% line coverage - Dashboard SSE streams refactored into testable payload builders (stats_patch_line, radar_list_payload, initial_event_from) - CaStore::default_dir contract under test - InstanceGuard drop removes the unix socket file - Earlier in the cycle: dashboard HTTP handlers, rules CRUD with real state and persistence, stats counters/broadcasts, listener bind/rebind lifecycle, TeeWriter log mirroring Tier status: pure logic at 90-100%, HTTP/async layer at 80%+, OS glue (gsettings/registry/launchd/browser) intentionally untested from Linux.
-
v1.7.1
146a0937 · ·v1.7.1 — coverage push: dashboard handlers, rules CRUD, stats, listener lifecycle - Dashboard HTTP handlers under test: index, style, datastar, fonts, icons, /api/health, /api/log export (was 0%) - Guard-rule CRUD tested end-to-end with real state and config persistence - Stats counters and broadcasts fully covered - TcpProxyListener: bind/desired_addr/rebind scenarios including invalid reloaded addresses - TeeWriter session log mirroring covered - Test profile: parallel codegen for faster test compile cycles
-
v1.7.0
b8b0bd15 · ·v1.7.0 — macOS support (experimental: runtime untested on real hardware) WHAT - SystemProxy via the native SystemConfiguration framework: per-service Proxies dictionaries are patched with a merge that preserves unrelated user settings (SOCKS, exclusions). Manual HTTP/HTTPS proxy and PAC auto-config URL both supported; clean removal on shutdown. - Autostart as a launchd user agent: ~/Library/LaunchAgents/com.janus.proxy.plist (RunAtLoad + KeepAlive), registered via launchctl bootstrap gui/<uid>. - Tray icon on the AppKit main thread: the async engine moves to a side thread, the main thread owns a CFRunLoop serving an NSStatusItem built with tray-icon; menu clicks flow into the same TrayCommand channel. - Makefile targets for macOS builds on a Mac or CI runner: build-darwin-arm64 / build-darwin-x86_64 / build-darwin-universal (lipo). - rustls/tokio-rustls/axum-server pinned to the ring crypto provider: single-provider process, and aws-lc-sys's C build no longer blocks darwin cross-checks. STATUS - Compile-verified from Linux: cargo check --target aarch64-apple-darwin. - NOT yet exercised at runtime on real macOS hardware — proxy registration, launchd agent and the tray need a smoke test on a Mac or a CI macos runner before this platform can be called stable.
-
v1.6.0
657107e9 · ·v1.6.0 — rule validation: user input can no longer break the router WHAT - New sanitize_pattern() in the proxy router: single canonicalization point for every guard rule. Strips pasted URL noise (https:// scheme, paths, query strings, ports), lowercases, and rejects anything unmatchable. - WildcardRouter::new / update_rules silently drop invalid patterns from config.toml instead of carrying broken matchers. - Dashboard POST /api/rules validates input and shows a red inline error (glow-styled) under the form instead of failing silently; success clears it. WHY - Users naturally paste full URLs like https://www.sber.ru/ into the rule form; slashes and schemes poisoned wildcard matching and broke parsing. - Config files hand-edited with the same noise are now self-healing.
-
v1.5.0
668bce8d · ·v1.5.0 — PAC auto-config: selective routing instead of global proxy hijack WHAT - New pac module: PacScript generates a proxy.pac from live router rules, PacHost serves it over plain HTTP at http://127.0.0.1:<pac_port>/proxy.pac (default 18082) with graceful shutdown. - SystemProxy gained enable_pac/disable_pac: Windows writes HKCU AutoConfigURL, GNOME switches gsettings to mode 'auto', KDE sets ProxyType=2 + proxyConfigUrl. - app::run now registers the PAC URL on startup and unregisters it on shutdown; the tray proxy toggle and --reset-proxy handle PAC as well. - New config key pac_port (default 18082). WHY - Forcing all system traffic through one static HTTP proxy broke local networks: router panels, LAN hosts and plain-HTTP requests died with NS_ERROR_NET_EMPTY_RESPONSE, and TPROXY/VPN setups lost their routing. - Browsers now decide per-request where to go: whitelisted RU domains are MITM'd through Janus, everything else (LAN, *.lan/*.local, the internet) goes DIRECT. No manual browser configuration is needed anymore. REMOVED - UserCaStore legacy (ux/ca.rs): no more poking into Firefox cert9.db / NSS databases and user trust stores; the --install-cert flag and the auto_install_ca config key are gone. The Janus CA itself is still generated and stored locally for MITM signing.
-
-
-
-
v1.2.0
b25327e0 · ·v1.2.0 — Zero-effort onboarding (install and forget) Новая стадия проекта (Janus): - Авто-установка локального CA в пользовательские хранилища без root/admin: Windows: certutil -user -addstore Root (без UAC) + NSS Firefox/LibreWolf Linux: NSS Chromium (~/.pki/nssdb) + Firefox/LibreWolf профили - Авто-настройка системного прокси в пользовательской сессии: Windows: HKCU Internet Settings + WinINET-уведомление Linux: GNOME gsettings / KDE kwriteconfig - Graceful shutdown: прокси восстанавливается при SIGINT/SIGTERM/Ctrl+C - Флаг --reset-proxy для ручного сброса после аварийного выхода - Авто-открытие дашборда в браузере при старте - Конфиг: auto_install_ca / auto_proxy / auto_open_dashboard (по умолчанию true)
-
v1.1.0
3c3713c5 · ·v1.1.0 — Zero-config selective TLS MITM proxy for Russian sites Текущая стадия проекта (Janus): - Вшитые сертификаты НУЦ Минцифры (root + 2 sub CA) — доверие к апстриму из коробки, без ручной настройки - Базовый список RU-доменов (госуслуги, банки, транспорт) в default config - CLI: -h/--help, -v/--version, --install-cert (на русском) - HTTPS-дашборд с сертификатом от Janus Local CA - Русский UI, компактный скроллируемый список правил - Janus Local CA генерируется при первом запуске
-