Commit Graph

3174 Commits

Author SHA1 Message Date
Bryan Frimin
83468db034 Refactor sign-in page and IAM service lifecycle
Redesign the sign-in page to show email/password form inline
with OIDC provider buttons (with vendor icons) instead of
separate pages. Extract OIDCProvider type to its own file.

Replace errgroup with sync.WaitGroup + WithCancelCause for
graceful shutdown in IAM services. Refactor garbage collectors
to use functional options and time.Ticker instead of
time.After to avoid repeated allocations.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:43 +01:00
Bryan Frimin
23084a72a2 Add OIDC login support for Google and Microsoft providers
Implements OpenID Connect authentication flow with PKCE, JWT verification, and enterprise-only account restrictions. Adds OIDC service with JWKS caching and state management, HTTP handlers for login/callback flows, GraphQL query for available providers, and sign-in UI integration.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:43 +01:00
Bryan Frimin
2f8edfb6be Add per-email sender name for compliance page emails
When an email has a sender name set (the organization name), the
mailer composes the From header as "OrgName via Probo" instead of
the default global sender name. This gives compliance page
recipients clearer context about which organization is contacting
them.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-22 10:56:51 +01:00
Bryan Frimin
3bb27fe8f1 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-21 19:16:21 +01:00
Bryan Frimin
3b5122da5e Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-21 19:16:21 +01:00
Bryan Frimin
7b320916af Add audit log feature for recording all actions
Adds audit logging that records all authorized actions performed by
users and API keys. The audit log is automatically populated whenever
the authorizer approves an action, and is queryable via GraphQL, MCP,
and CLI interfaces. Permission checks are excluded via a dry-run flag
to avoid phantom entries on page loads.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-21 19:16:19 +01:00
Bryan Frimin
000347b1f9 Remove brew release
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 18:28:31 +01:00
Bryan Frimin
2df3a2083b Release v0.149.0 2026-03-20 18:13:56 +01:00
Bryan Frimin
3b072ed33b Use pull request for Homebrew tap formula updates
The homebrew-tap repository requires verified commit signatures
via org-level rulesets, which cannot be excluded per-repo.
Switch to creating a PR instead of pushing directly.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 18:07:13 +01:00
Bryan Frimin
190baeebed Use actual MIME type for trust center file exports
The export endpoint was hardcoding application/pdf for all trust center
files. Now the real MIME type from the stored file metadata is threaded
through the service layer and returned as a data URI, so non-PDF files
are handled correctly on the frontend. Watermarking is only applied when
the file is actually a PDF.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 18:01:00 +01:00
Bryan Frimin
8142637e79 Fix trust center SPA asset loading on custom domains
The base tag was only set for /trust/{slug} paths, causing asset requests on custom domains to resolve relative to the page URL instead of root, resulting in 404 fallback to index.html.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 18:00:56 +01:00
Bryan Frimin
193125f619 Release v0.148.0 2026-03-20 17:34:12 +01:00
Bryan Frimin
c2e13b7968 Add MCP audit report metadata and getAuditReportUrl tool
Adds has_report, report_filename, and report_mime_type fields to Audit type to expose report attachment status. Introduces new getAuditReportUrl tool to generate presigned download URLs for audit reports. Updates NewAudit type converter to accept optional report object for enriching metadata.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 15:58:27 +01:00
Bryan Frimin
138f24ef59 Add Homebrew tap publishing for prb CLI
Configure GoReleaser to publish the prb CLI to the getprobo/homebrew-tap repository on each release. Separate the prb archive from the main probod archive and add the necessary GitHub token to the release workflow.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 14:33:35 +01:00
Sacha Al Himdani
c1e41d88fc Npm audit fix
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-20 12:18:05 +01:00
Bryan Frimin
fce754cff4 Fix measure category filter not applying on initial page load
When navigating back to the measures page with a ?category query parameter, the filter wasn't applied to the initial Relay query. The component state was initialized from the URL, but the Relay fragment loaded with its default category: null. Add a mount effect that triggers a refetch with the initial category parameter.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 11:46:52 +01:00
Sacha Al Himdani
6e9cee9d34 Document migration rules for indexes and defaults
Clarify that indexes should not be added speculatively and
should only be introduced when justified by production query
latency. Also document that columns should avoid DEFAULT
clauses, with guidance on backfilling non-nullable columns.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-20 10:52:31 +01:00
Bryan Frimin
a69b6da377 Document fix categorization rule in release guide 2026-03-20 10:32:51 +01:00
Bryan Frimin
789637c90a Release v0.147.0 2026-03-20 10:31:40 +01:00
Bryan Frimin
ae6e5c8ff1 Fix compliance page to include private documents and audits
Private items should still be listed on the compliance page — only
items with visibility "NONE" should be excluded. Also add missing
trailing newline in the template file.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 10:14:03 +01:00
Bryan Frimin
63cf69fcef Propagate errors from compliance page fetch helpers
The fetch helpers silently swallowed pagination/list errors by breaking
out of the loop, which could return a successful response with
incomplete compliance data. Return errors instead.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 10:14:03 +01:00
Bryan Frimin
1879a1f77c Escape Markdown table cell values in compliance page template
Pipe characters and newlines in dynamic values break Markdown table
structure. Add a cell template function that escapes these characters.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 10:14:02 +01:00
Bryan Frimin
f11eae6b82 Add /llms.txt endpoint to trust center compliance page
Renders compliance data (frameworks, documents, audits, subprocessors, references, and external links) as a plain-text Markdown document. The endpoint supports all required visibility filters and pagination.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 10:14:01 +01:00
Bryan Frimin
19eb2f5d84 Add formal consent disclaimer when skipping confirmation email
Display a legal notice requiring the operator to certify they have
obtained verifiable prior consent (GDPR, CAN-SPAM) before bypassing
the confirmation email flow.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 09:54:28 +01:00
Bryan Frimin
c5589793da Allow skipping confirmation email when adding mailing list subscribers
When creating a new subscriber, operators can now check "Skip confirmation email" if they already have the recipient's consent. This creates the subscriber in confirmed status and skips sending the notification email.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 09:54:25 +01:00
Bryan Frimin
bedfd61168 Rename Vendor to Subprocessor in trust API surface
Rename Vendor → Subprocessor, VendorConnection → SubprocessorConnection, and VendorEdge → SubprocessorEdge across the GraphQL schema, Go resolvers, and React frontend components. Internal coredata types remain unchanged. User-facing labels in console app updated to reflect terminology change.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-20 09:52:37 +01:00
Bryan Frimin
f756b7273d Paginate findings and obligations 500 by 500
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 23:57:12 +01:00
Bryan Frimin
a7319e54a1 Paginate measures 500 by 500 instead of 100 by 100
Increase MaxCursorSize from 100 to 500 to allow larger page sizes, and set the measures list frontend query to fetch 500 items per page by default.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 23:55:50 +01:00
Bryan Frimin
baf8cf0837 Support developer-specific env vars in sandbox provisioning
Source a gitignored .sandbox.env file (if present) before running
probod-bootstrap so each developer can inject their own secrets
(SSO, API keys, etc.) without committing them to the repo.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 22:04:08 +01:00
Bryan Frimin
fc2c3eab61 Isolate sandbox node_modules with VM-local bind mount
Avoid platform conflicts between macOS host and Linux VM by
bind-mounting a VM-local directory over /workspace/node_modules.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 22:04:06 +01:00
Bryan Frimin
8fbc8a90e0 Simplify UpdateContext to always persist
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:52 +01:00
Bryan Frimin
a1f8f01165 Fix query loaders to reload on parameter changes
Remove !queryRef guard and add proper dependency arrays so queries
refetch when organizationId or meetingId changes.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:51 +01:00
Bryan Frimin
e90986f0af Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:51 +01:00
Bryan Frimin
89882d368c Rewrite context routes to use useQueryLoader pattern
Replace loaderFromQueryLoader/loadQuery in route definitions with
useQueryLoader inside dedicated Loader components, matching the
compliance-page pattern. Use index routes instead of redirect hacks.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:51 +01:00
Bryan Frimin
e1133b1e9a Access context fields explicitly to satisfy relay/unused-fields lint
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:50 +01:00
Bryan Frimin
a9ebeef0fa Transform meetings page into context page with tabs
Add structured organization context with 5 markdown sections (Product, Architecture, Team, Processes, Customers) editable inline. Meetings are now a tab within the context page. Moved all GraphQL queries from hooks/graph/MeetingGraph.ts into colocated components following new best practices. Updated database schema, backend services, GraphQL resolvers, and MCP API to support the new context fields and structure.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 19:02:50 +01:00
Bryan Frimin
c2a1843c67 Address PR review comments
- Fix import order: react-relay before react-router
- Add parentheses around arrow function parameter
- Sync category filter with URL param changes, not just on mount

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 18:33:43 +01:00
Bryan Frimin
ad7a3ecbe9 Fix measure breadcrumb category filter
When clicking a category name in the measure detail breadcrumb, users should be taken back to the measures list with that category filtered. Previously, the breadcrumb linked to a route that wasn't read by the measures page.

Changed the breadcrumb to use a ?category search param instead of a route segment, and updated the measures page to initialize and sync its category filter from the URL. Removed the now-unused category/:categoryId route.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 18:33:41 +01:00
Sacha Al Himdani
8ed6f1824f Fix unvalidated URL redirection in HTTP redirects
Use baseurl.Parse to construct the HTTPS redirect URL in the
trust center HTTP handler, breaking the taint chain from raw
request headers. Apply path.Clean to the slug-based redirect
in stripTrustPrefix to normalize path traversal sequences.

Addresses CodeQL go/unvalidated-url-redirection (CWE-601).

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 17:27:51 +01:00
Bryan Frimin
c74e5cc123 Add go fmt and go fix checks to lint
Adds go-fmt and go-fix Makefile targets that fail when gofmt or go fix
suggest changes. Both are wired into the lint target and used in CI.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 16:37:51 +01:00
Sacha Al Himdani
8b66a61990 Run go fix and go fmt
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 16:37:51 +01:00
Bryan Frimin
3f6c3c87f2 Release v0.146.1 2026-03-19 16:22:49 +01:00
Bryan Frimin
40df76d8b4 Fix SAML ACS endpoint CORS rejection
The SAML Assertion Consumer Service endpoint receives cross-origin POSTs from external identity providers by design. Bypass CSRF protection for this specific endpoint since the endpoint validates SAML response signatures itself.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 16:07:53 +01:00
dependabot[bot]
9120c2c662 Bump github.com/modelcontextprotocol/go-sdk from 1.4.0 to 1.4.1
Bumps [github.com/modelcontextprotocol/go-sdk](https://github.com/modelcontextprotocol/go-sdk) from 1.4.0 to 1.4.1.
- [Release notes](https://github.com/modelcontextprotocol/go-sdk/releases)
- [Commits](https://github.com/modelcontextprotocol/go-sdk/compare/v1.4.0...v1.4.1)

---
updated-dependencies:
- dependency-name: github.com/modelcontextprotocol/go-sdk
  dependency-version: 1.4.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-19 14:45:48 +01:00
Sacha Al Himdani
e1efc7b488 Release v0.146.0 2026-03-19 14:42:08 +01:00
Sacha Al Himdani
a5dc9a13ad Fix style
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 14:36:30 +01:00
Sacha Al Himdani
1db8e7133e Add document archiving
Documents can be archived and unarchived. Archived documents are
read-only, excluded from the trust center, and moved to a dedicated
Archived tab in the document list.

- Add archived_at timestamp and status (ACTIVE/ARCHIVED) PG enum column
- Rename DocumentStatus → DocumentVersionStatus, introduce DocumentStatus
- Archive/unarchive mutations in GraphQL, MCP, and CLI
- Bulk archive/unarchive mutations with Active/Archived tabs in the list
- ABAC policies: write actions denied on archived docs, unarchive denied
  on active docs
- Remove control/risk mappings and reset trust center visibility on archive
- Exclude archived documents from mapping dialogs and trust center tab

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-19 14:15:54 +01:00
Bryan Frimin
2e12c11c0c Fix flaky finding e2e tests: move advisory lock outside CTE
The pg_advisory_xact_lock inside the WITH clause caused race conditions
in READ COMMITTED mode. When a transaction blocked on the lock and resumed
after acquiring it, it used a stale snapshot and computed the same reference
ID as the previous transaction, violating the unique constraint. Moving the
lock to a separate statement before the INSERT ensures the snapshot includes
all previously committed data.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 13:30:07 +01:00
Bryan Frimin
a6c88c9631 Add fulltext search to measures page
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 12:36:51 +01:00
Bryan Frimin
c3be391e9d Fix DocumentList: clear selection on filter change, update connection ID, fix indentation
Addresses PR review comments: clears selected document IDs when changing
the type filter to prevent bulk actions on hidden rows, updates the Relay
connection ID when the filter changes so mutations target the correct
connection, and fixes eslint indentation violations.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 12:31:41 +01:00