Skip to content

chore(release): cut 1.5.0 - #36

Merged
WhiteMuush merged 38 commits into
mainfrom
develop
Oct 13, 2026
Merged

WhiteMuush merged 38 commits into
mainfrom
develop

Conversation

@WhiteMuush

Copy link
Copy Markdown
Owner

Summary

Release 1.5.0. Minor rather than patch because it adds features and one schema migration; nothing breaks for operators.

For operators

  • One migration runs on start: 20261012124727_track_scan_checks. It only adds (a ScanCheck table, a nullable ApiCredential.rateLimitPerMinute column), so rolling back to 1.4.0 still works. Nothing to do by hand.
  • Environment variables, port and the image base are unchanged.

Security

Fixes

Features

Quality

WhiteMuush and others added 30 commits October 12, 2026 14:50
The runner paced every source at one call per 1.5 s and swallowed any
lookup error, so a source refusing calls (HIBP Core 1 allows 10 per
minute) left employees looking breach-free when they were never checked.
IntelX also returned partial results when a result poll failed.

Each source now has its own pace, from a per-provider default the
customer can override per credential. Rate limits, outages and network
errors are retried with Retry-After or a backoff. A rejected key, a wait
longer than a minute or an exhausted retry budget blocks the source for
the rest of the scan. Every employee and source pair ends as a ScanCheck
row, CHECKED or FAILED with a reason, and the scan can rerun only the
pairs that are not checked yet.

Refs #21
A scan that skips employees must say so. The employees page and the
dashboard show a "Scan incomplete" banner per source, with the last
error and a button that scans only the unchecked pairs. The employee
drawer lists each source with its last check, and no longer reads "No
breaches recorded" as a clean result while a source has not checked.

The Data API page shows each source's rate limit and lets an admin set
it to match their plan, or go back to the default.

Refs #21
LeakCheck answers 400 "Invalid X-API-Key" to a key cut short on paste,
not 401, so the scan showed "Unexpected response (HTTP 400)" and kept
calling it for every employee. Found while checking the feature against
the live API.
Each source in the "Scan incomplete" banner gets a "Learn more" panel:
what went wrong, why, and numbered steps to fix it, with links to the
Data API page and the provider's account page.
fix(scan): stop reporting unchecked as clean
A company could not tell which breach source was worth paying for: six
keys sat side by side. The Data API page now groups them as Recommended,
Additional and Free or limited (from the existing reliability tier), and
shows for each what it brings, its starting price with the date it was
checked, its free tier and a link to the live pricing page.

Prices change and Gardik runs on the customer's servers, so the date and
link are always shown, and an unpublished price says so instead of
quoting third-party figures. Levels are advice only.

Refs #19
The page listed six cards one under the other. It now reads like an
integrations catalog: a summary (connected sources, last scan, sources
that need action), search and filters, and a grid of tiles with each
provider's logo, level, starting price and real health from the last
scan. A tile opens a side panel with the overview, health and the steps
to fix it, the key and rate settings, and pricing.

A key or rate changed after a failure shows as waiting for a scan, not
as still broken. Removing a key now asks for confirmation. Logos are the
providers' own icons, served from public/sources so the page loads no
third-party image.

Refs #19
feat(credentials): source catalog with levels
Breach names and data types come from external sources, some of them
dark web aggregators, and reached every alert channel as they were. A
crafted name could inject a fake link into the administrator's email,
ping a whole Slack channel with <!channel> or render a disguised link
in Slack and Teams, and forge a new event in the SIEM export with a
line break.

The alert email escapes every value. Slack and Teams escape their
control characters and show source values as inline code. CEF and
syslog keep each event on one line.

Refs #24
fix(notify): escape breach source data in alerts
The "Scan incomplete" banner could not be closed. A close button now
hides it until a scan changes the status (which sources missed how many
employees, and why), so a new problem is never hidden. The choice is kept
per browser. The Data API page still shows the status.

Refs #26
feat(scan): let users dismiss the incomplete banner
The Prettier config asked for single quotes while the code uses double quotes, and Prettier itself was never installed. Its config now matches the code. knip and the vitest coverage provider come in for the upcoming check command.
jose (test identity provider) and react-resizable (its stylesheet) were imported but only installed through other packages. Versions match the ones already locked.
One command runs every quality gate: lint, format, types, schema, unit tests with a coverage floor, knip, version consistency, licenses, production audit and ASCII. The pre-push hook and the CI quality job both call it, so local and CI cannot drift. The CI test job is folded into it.
chore: repo hygiene and npm run check
Files already over the limit are capped at their current size, so they can only shrink until #30 splits them.
build: cap files at 200 lines, one-line comments
WhiteMuush and others added 8 commits October 13, 2026 10:37
OpenLDAP returns several mail values as an array, which the sync joined into one invalid address, so the employee was never matched. The connection is now also closed when the search fails.
docs: state supported versions, drop stale tag
A user without an email fell back to its user name, so a login like ada.lovelace was stored and scanned as an email address.
test: unit tests for directory connectors
Minor release: new features (source catalog, scan coverage tracking, dismissible scan banner) and one schema migration, with no breaking change for operators. Ships the alert escaping security fix and the LDAP and AWS directory fixes.
@WhiteMuush
WhiteMuush merged commit b77fc88 into main Oct 13, 2026
25 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