Commit Graph

3209 Commits

Author SHA1 Message Date
Bryan Frimin
d1e4f31d07 Fix empty search_engine_indexing on trust centers
Trust centers were created without setting SearchEngineIndexing,
defaulting to an empty string in the database. This caused scan
errors when loading trust centers.

Add a migration to fix corrupted rows, set a DEFAULT on the
column, and add a CHECK constraint. Also set the field explicitly
when creating new trust centers.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 10:13:00 +01:00
Sacha Al Himdani
c5d4912c4c Npm audit fix
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 09:16:26 +01:00
Sacha Al Himdani
8c02c53315 Update copyright headers across all Go files
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-25 17:38:32 +01:00
Bryan Frimin
fcf197cd1c Release v0.152.0 2026-03-25 15:23:01 +01:00
Bryan Frimin
e74c0a11c6 Update copyright headers to 2025-2026 for modified files
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:47 +01:00
Bryan Frimin
7625096d00 Fix copyright year to 2026 for new dataloader file
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:47 +01:00
Bryan Frimin
812de537f9 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:47 +01:00
Bryan Frimin
d24712344e Add GraphQL dataloaders for batched record lookups
Introduce dataloadgen-based dataloaders to batch individual
record-by-ID fetches in GraphQL resolvers into single SQL
queries. Each entity type (organization, framework, control,
vendor, document, risk, measure, task, file, report, profile)
gets a LoadByIDs method in coredata and a GetByIDs service
method with variadic arguments and dedicated collection return
types. Resolvers now use dataloader.FromContext instead of
direct service calls for single-record lookups.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:46 +01:00
Bryan Frimin
2004bf6050 Fix CAA issuer matching to handle parameters
CAA issue records may contain parameters after a semicolon per
RFC 8659 (e.g. "letsencrypt.org; accounturi=..."). Split on ";"
and compare only the issuer domain so these records are accepted.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 12:23:32 +01:00
Bryan Frimin
9b66d05c3c Check CAA records before ACME certificate issuance
Before requesting a certificate from the ACME provider, verify
that CAA DNS records for the domain permit issuance by the
configured CA. This avoids wasting ACME attempts on domains
whose CAA policy would reject the request.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 12:23:30 +01:00
Bryan Frimin
63965261db Fix Microsoft OIDC token exchange auth style
Without an explicit AuthStyle, the oauth2 library uses
auto-detection which tries Basic auth first. Microsoft
rejects this, and since PKCE codes are single-use, the
retry with the correct style fails.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 09:43:33 +01:00
Bryan Frimin
728804b559 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 09:40:44 +01:00
Bryan Frimin
dcf81c4575 Fix SCIM bridge updating all users on every sync
The SCIM client User struct had json:"-" tags on most fields
(GivenName, FamilyName, ExternalID, Department, etc.), so
ListUsers never populated them from the JSON response. The
bridge comparison always saw empty strings on the SCIM side
vs actual values from the provider, making needsUpdate true
for every user on every sync cycle.

Add custom UnmarshalJSON on User to properly parse nested
SCIM JSON (name object, enterprise extension) into the flat
struct, so the existing diff logic correctly skips unchanged
users.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 09:40:44 +01:00
Bryan Frimin
f0d43fd8e5 Fix ACME challenge retry to create fresh orders
When CompleteHTTPChallenge fails, the challenge is already marked
invalid by Let's Encrypt. Retrying Accept on the same challenge
always fails with "authorization must be pending". Reset the
domain to pending with cleared challenge data so each retry
creates a new ACME order.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 09:30:40 +01:00
Sacha Al Himdani
c18f0b0748 Bump aquasecurity/trivy-action from 0.33.1 to 0.35.0
Fixes GHSA-69fq-xp46-6x23 (Critical) and GHSA-9p44-j4g5-cfx5 (Medium).

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-25 08:54:09 +01:00
Bryan Frimin
81a4ec7c6e Remove useless card
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 08:19:28 +01:00
Bryan Frimin
535d5e99d0 Release v0.151.0 2026-03-24 17:02:55 +01:00
Bryan Frimin
784c88895a Allow editing non-SCIM fields on SCIM-managed profiles
Contract start and end dates are never synced by SCIM, so they
should remain editable even when a profile is SCIM-managed.
The backend now skips overwriting SCIM-synced fields (fullName,
kind, position, additionalEmailAddresses) for SCIM profiles,
and the frontend disables only those fields instead of the
entire form.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-24 16:44:53 +01:00
Bryan Frimin
359f85f5da Add SEO controls and sitemap for compliance pages
Add search engine indexing toggle, robots.txt, and sitemap.xml
generation for compliance pages. Replace checkboxes with toggle
components in the compliance page UI and add an "Open" button
in the page header to quickly access the live compliance page.
The search engine indexing toggle is disabled when the compliance
page is inactive.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-24 15:55:31 +01:00
Bryan Frimin
8b483e5629 Release v0.150.0 2026-03-23 14:48:48 +01:00
Bryan Frimin
87c7552a35 Replace inline password form with link to dedicated sign-in page
The SignInPage now shows OIDC, SSO, and email buttons instead of
embedding the email/password form directly. Users clicking "Sign in
with email" are taken to the existing PasswordSignInPage.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:46 +01:00
Bryan Frimin
d05367eeb2 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:46 +01:00
Bryan Frimin
887e994ff1 Refactor OIDC buttons: extract OIDCButton component, inline loops
Address PR review feedback:
- Remove OIDCButtons wrapper components that only loop, inline .map()
  directly in SignInPage and ConnectPage
- OIDCButton uses useTranslate() and useSafeContinueUrl() hooks
  internally instead of receiving hook results as props
- Move OIDCButton to local _components folders
- Fix eslint import grouping in SignInPage

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:46 +01:00
Bryan Frimin
0476cd2d87 Use preloaded query for SignInPage instead of lazy load
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:46 +01:00
Bryan Frimin
bcd4fc1a2f Move Divider to _components folder in trust auth pages
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:45 +01:00
Bryan Frimin
42129f7ce2 Restore inline password form in SignInPage
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:45 +01:00
Bryan Frimin
68abae6730 Use Relay fragment for OIDC buttons in ConnectPage
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:45 +01:00
Bryan Frimin
dcc08c42e3 Fix lint errors in SignInPage: use Relay fragment for OIDC providers
- Add blank line between import groups (import-x/order)
- Use Relay fragment in OIDCButtons to colocate field queries (relay/unused-fields)

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:45 +01:00
Bryan Frimin
f8e086a00b Address PR review feedback for OIDC sign-in pages
- Remove inline password form from SignInPage (use PasswordSignInPage)
- Extract Divider and OIDCButtons to _components folder
- Move OIDC providers into page queries instead of lazy-loaded queries
- Create useSafeContinueUrl hook for trust app using getPathPrefix
- Use safeContinueUrl.toString() for continue URL parameter
- Fix wg.Go style in IAM service Run method

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:44 +01:00
Bryan Frimin
1d3cc1c65e Use single OIDC session auth method instead of per-provider values
The OIDC provider is already tracked in iam_oidc_states.provider, so
there is no need for provider-specific session auth methods (GOOGLE,
MICROSOFT). Replace them with a single OIDC auth method.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:44 +01:00
Bryan Frimin
7e757bfa06 Sort OIDC providers for deterministic API response order
EnabledProviders() iterated a map, producing nondeterministic order.
Sort the slice before returning to ensure stable UI and test behavior.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:44 +01:00
Bryan Frimin
3e4a7d3638 Add OIDC login support to compliance page
Add Google and Microsoft sign-in buttons to the trust center connect
page, matching the console sign-in experience. The backend OIDC flow
already supports flexible continue URLs, so only the GraphQL schema
and frontend needed changes.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:44 +01:00
Bryan Frimin
95803e4bca Fix wg.Go call style in OIDC service Run method
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:44 +01:00
Bryan Frimin
29b41208f3 Address PR review feedback for OIDC login
- Remove sensitive nonce values from error messages to prevent logging leaks
- Guard ticker intervals against non-positive durations in SAML domain
  verifier and garbage collector to prevent panics
- Require both client ID and client secret for Google/Microsoft OIDC
  providers to be marked as enabled
- Replace http.DefaultClient with kit/httpclient for JWKS fetching to
  ensure proper timeouts
- Fix eslint indentation in SignInPage OIDC button click handler

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:43 +01:00
Bryan Frimin
3066e7d14c Fix eslint errors in sign-in page
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-23 14:17:43 +01:00
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