Repository navigation
chore(release): cut 1.5.0 - #36
Merged
Merged
Conversation
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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Release 1.5.0. Minor rather than patch because it adds features and one schema migration; nothing breaks for operators.
For operators
20261012124727_track_scan_checks. It only adds (aScanChecktable, a nullableApiCredential.rateLimitPerMinutecolumn), so rolling back to 1.4.0 still works. Nothing to do by hand.Security
Fixes
Features
Quality
npm run checkruns every gate before each push and in CI: Prettier, knip, coverage floor (56%), 200-line file cap, version consistency (chore: repo hygiene and npm run check聽#32, build: cap files at 200 lines, one-line comments聽#33).SECURITY.mdstates the supported versions (docs: state supported versions, drop stale tag聽#34).