Skip to content

Release v2.0.1 — session expiry configurable + audit consistency fixes - #6

Merged
dev-luigi merged 7 commits into
mainfrom
fix/v2.0.1-prep
Jul 25, 2026
Merged

Release v2.0.1 — session expiry configurable + audit consistency fixes#6
dev-luigi merged 7 commits into
mainfrom
fix/v2.0.1-prep

Conversation

@dev-luigi

Copy link
Copy Markdown
Member

Release v2.0.1

Batch of fixes + release plumbing. Cut from the chore(release): 2.0.1 commit (branding bumped to 2.0.1, CHANGELOG promoted).

Fixes (user-facing)

  • Session expiry is now configurable. IPMIDECK_AUTH_SESSION_EXPIRY / auth.session_expiry now drive both the session-token expiry and the cookie max_age (previously dead config — the lifetime was hardcoded at 24h). Invalid values fall back to 24h without crashing. New parse_duration_seconds() parser + tests.
  • FanPilot /status no longer reports a false "active" state for monitoring-only vendors (HPE, Lenovo, generic). The endpoint now reads vendor and only forces fanpilot mode when the vendor is fan-capable. Loop-skip / warn-but-allow behaviour (D-13/D-14) unchanged.

Internal / tooling

  • test_branding.py is now bump-agnostic (no pinned 2.0.0 literal), so a one-line version bump is committable through the pre-commit hook + CI gate.
  • check-wheel.py and smoke-docker.ps1 derive the version from branding._VERSION_FALLBACK instead of hardcoding it.
  • New tracked CHANGELOG.md (Keep a Changelog). The release-draft job now slices the tagged version's section into the release body via body_path (kept draft: true — the body arrives pre-filled and the maintainer reviews + Publishes).
  • README: Security section documents the configurable session expiry; header BMC badge adds Generic to match the support matrix.

Gates: pytest 335 passed, ruff clean.

- add parse_duration_seconds() pure parser to config.py (24h/90m/1d/45s/bare
  seconds; invalid or non-positive -> 24h default, never raises)
- AuthManager.session_expiry_seconds feeds create_session_token exp; keep the
  SESSION_EXPIRY_SECONDS constant as the 24h fallback default
- _set_session_cookie takes max_age; login/setup/configure pass the configured
  expiry so the cookie Max-Age matches the token exp (no more hardcoded 86400)
- lifespan wires config.auth.session_expiry -> auth.session_expiry_seconds
- tests/unit/test_session_expiry.py: parser + token-exp + end-to-end cookie proof
…ng-only vendors

- get_fanpilot_status guards the cold-start 'auto'->'fanpilot' fallback behind
  is_fan_capable(vendor); HPE/Lenovo/generic (no IPMI fan control) now report
  the truthful 'auto' instead of a false 'fanpilot active'
- SELECT vendor; default NULL/empty vendor to 'dell' to match /mode Decision G
- fan-capable vendors (dell/supermicro/ibm) keep the prior 'fanpilot' behavior
- integration tests: HPE reports 'auto', dell still reports 'fanpilot'
…0 literal)

- test_fallback_is_pep440_canonical asserts the PEP 440 X.Y.Z shape via regex
  instead of the pinned '2.0.0' literal, so a future _VERSION_FALLBACK bump stays
  committable through the pre-commit hook + CI gate
- test_version_fallback_when_uninstalled proves the PackageNotFoundError branch
  was actually taken (took_fallback flag) so the assert is no longer vacuous;
  keeps resolved == _VERSION_FALLBACK and adds an X.Y.Z shape check
- add 'import re'; leave the bump-agnostic '2.0.0-alpha.1' source-grep untouched
…h shipped code

- Security section names the IPMIDECK_AUTH_SESSION_EXPIRY / auth.session_expiry
  knob and the 24h default (the 'configurable expiry' claim is true after SX0-A)
- header BMC badge adds Generic (alt text + shields.io src label) so it agrees
  with the support matrix's sixth monitoring-only row
…ipts

check-wheel.py and smoke-docker.ps1 hardcoded "2.0.0", which would false-fail the
maintainer's manual wheel-check and Docker-smoke after any version bump. Both now read
_VERSION_FALLBACK from backend/core/branding.py (the single source of truth, same value
release.yml's guard reads), so a bump needs no edit here.
…y_path

Add a Keep-a-Changelog CHANGELOG.md and rework the release-draft job to slice the
tagged version's section into the release body (body_path) instead of the empty
generate_release_notes — the repo has no PRs in-range, so that produced near-empty
notes. Kept draft:true (option B): the body arrives pre-filled from the changelog and
the maintainer reviews + Publishes. The slice step fails the release if the tag has no
CHANGELOG section, forcing a promote of [Unreleased] before tagging.
Bump _VERSION_FALLBACK 2.0.0 -> 2.0.1 and promote CHANGELOG [Unreleased] -> [2.0.1].
Fixes: session expiry is now actually configurable (IPMIDECK_AUTH_SESSION_EXPIRY);
FanPilot /status no longer reports a false active state for monitoring-only vendors.
@dev-luigi
dev-luigi merged commit eb8452f into main Jul 25, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant