Tags

Tags give the ability to mark specific points in history as being important
  • v1.7.5

    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

    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 · style: cargo fmt ·
    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

    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

    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

    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

    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

    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

    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.4.0

    Release: Janus v1.4.0 — Beta
    release: janus 1.4.0
  • v1.3.0

    Release v1.3.0: D-Bus tray (ksni), idempotent CA install, faster builds
  • v1.2.0

    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

    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 генерируется при первом запуске
  • v1.0.0

    Janus v1.0.0 — Selective TLS MITM proxy (MVP v1)
  • v0.2.0

    b3105b4a · style: apply cargo fmt ·
    v0.2.0: cross-platform release with Windows support, file watcher hot-reload and --install-cert
  • stable-linux

    fb8f8b71 · close task ·
    stable-linux: hermetic e2e integration suite, clock-skew resilient certs
  • v0.1.0

    v0.1.0: Stable L4 MITM proxy with hybrid WebPKI/MEC trust store and strict HTTP/1.1 ALPN fallback
  • v0.1.0-alpha

    Stable MVP: HTTP CONNECT fix, MITM and Passthrough working