Tags give the ability to mark specific points in history as being important
-
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 генерируется при первом запуске
-
-
v0.2.0
b3105b4a · ·v0.2.0: cross-platform release with Windows support, file watcher hot-reload and --install-cert
-
-
v0.1.0
2b8b467b · ·v0.1.0: Stable L4 MITM proxy with hybrid WebPKI/MEC trust store and strict HTTP/1.1 ALPN fallback
-