A dedicated personal-account page does not scale as more refusal
reasons appear. Redirect the OIDC callback to /auth/error with an
error code query parameter so the frontend can map codes to clear
user-facing messages.
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
Personal Google and Microsoft accounts were rejected with a raw
JSON unauthorized response after the OIDC callback. Redirect to a
dedicated auth page that explains the enterprise-account
requirement, and check enterprise eligibility before xms_edov so
Microsoft consumer accounts get the same clear error.
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
The /enroll wait UI polled device state via node(), which
requires an assumed org session, so confirmation never
succeeded for unassumed viewers. Expose viewer.enrolledDevice
behind itam:employee-device:get (own-device, skip assumption)
and point the poller at it.
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
The Add Source card links to a connector's docs, but the API-key
connect dialog did not, so a user filling in an API key had no path
to the setup instructions. Add a "Documentation" button to the dialog
footer, styled like Cancel and on the left of the Cancel/Connect row,
shown only when the provider has a docs page.
Extract the rendering into a shared ConnectorDocumentationLink
component with a link/button variant (the card keeps the quiet link,
the dialog uses the button) and give DialogFooter an optional start
slot for left-aligned footer content.
Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
The access review Add Source dialog listed each connector with no
path to its setup documentation. Connectors that have a published
docs page on probo.com now surface a "Documentation" link on the
card, opening the page in a new tab; connectors without a page show
nothing extra.
The link is data-driven from the connector registry: a new
DocumentationURL on the provider Registration, populated for the 12
documented providers via a single accessReviewDocsURL helper, is
surfaced as a nullable documentationUrl on ConnectorProviderInfo and
rendered by the console only when present. This keeps the registry
the single source of truth and adds no client-side provider map.
The links resolve once the probo.com access-review docs pages are
deployed; until then they 404, so deploy the docs alongside this
change.
Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
Keep more of the orchestrator assessment text,
skipping profile fields already on the third party,
and render the notes as markdown in the console.
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
Leaving mid-ease left the 150ms transition running toward the last
target; snapshot the computed transform and clear transition instead.
Signed-off-by: Émile Ré <emile@probo.com>
Reset the enter-ease timer on each move so transition:none cannot
cut off a retargeted interpolation mid-flight.
Signed-off-by: Émile Ré <emile@probo.com>
The first eased frame was cancelled by the next pointermove flipping
transition to none, which snapped the blur when entering at an edge.
Signed-off-by: Émile Ré <emile@probo.com>
MediaTile and BackdropCard share opposite-pointer blur tracking over
the full card, with Figma-matched opacity/zoom per surface, eased
enter, and a frozen pose on leave.
Signed-off-by: Émile Ré <emile@probo.com>
Compliance portal already embeds and serves the public SPA, so the
old @probo/trust app was unused. Drop its Makefile/CI stubs, Relay
project, CORS port, and the helper that only it imported.
Signed-off-by: Émile Ré <emile@probo.com>
Rate limits no longer inflate ssl_retry_count into an instant FAILED
path. Centralize outcomes in decideProvisioningOutcome, keep ACME
order state on transient and rate-limit errors, bound each Process
tick with a timeout, and block on FOR UPDATE when persisting a
freshly issued certificate.
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
Signed-off-by: Bryan Frimin <bryan@probo.com>
A hardcoded 'de breaks vowel harmony for many
entity names. Use "için" instead so the hero
title stays grammatical for any {{name}}.
Signed-off-by: Émile Ré <emile@probo.com>
Non-English heroTitle strings still used "trust"
equivalents. Switch them to each locale's IT
compliance term so they match English and the
portal tagline.
Signed-off-by: Émile Ré <emile@probo.com>
Store a short entity name instead of the full home
heading so orgs can brand portals for sub-entities.
Restore hero i18n composition and keep the English
document title composed from the entity name.
Signed-off-by: Émile Ré <emile@probo.com>
Select menus portal at z-3 while drawers sit at z-5, so
the popup opened behind the drawer. Portal into the drawer
panel instead. Point .env.example VITE_API_URL at the slug
subdomain with a local Vite note.
Signed-off-by: Émile Ré <emile@probo.com>
Restore VITE_API_URL to :8080 in .env.example with notes
for local Vite (:5174 + proxy target). Log compliance
portal lookup errors in the SNI middleware with context.
Signed-off-by: Émile Ré <emile@probo.com>
Custom-domain base URLs included the request path, so
canonical/hreflang doubled routes; emit SEO links only with
an absolute origin. Rewrite Korean mismatch strings to avoid
literal particle parentheses, rename HtmlLang to HTMLLang, and
ship public favicons so Vite no longer 404s the fallback icon.
Signed-off-by: Émile Ré <emile@probo.com>
Swallow locale mutation rejections after the toast, close the
mobile drawer on locale change, escape SEO paths, share the
IAM locale list with SEO, and finish dropping /trust leftovers.
Signed-off-by: Émile Ré <emile@probo.com>
Portals are host-routed on slug subdomains, so SEO path
stripping and the frontend basename helper were dead code.
Signed-off-by: Émile Ré <emile@probo.com>
Hardcoding the trust-center origin broke local portal
development. Read COMPLIANCE_PORTAL_PROXY_TARGET so each
slug can point Vite's /graphql proxy at the right HTTPS host.
Signed-off-by: Émile Ré <emile@probo.com>
Schedule persist and navigate together, and defer the
mismatch banner so a one-frame URL/identity desync does
not flash during language changes from the menu.
Signed-off-by: Émile Ré <emile@probo.com>
Dismiss the user menu on language pick, and update the
URL together with an optimistic identity write so the
mismatch callout does not flash mid-switch.
Signed-off-by: Émile Ré <emile@probo.com>
Render the switch-to-saved button in the identity locale,
translate remaining locale stubs, and use a checkmark for
selected dropdown radio items.
Signed-off-by: Émile Ré <emile@probo.com>
Signed-in viewers with no saved preference get the current
URL locale once so later unprefixed visits have a default.
Signed-off-by: Émile Ré <emile@probo.com>
index.html doubles as a production Go template; Vite does not
execute it, so bare {{if}}/{{range}} leaked into the page.
Signed-off-by: Émile Ré <emile@probo.com>
Path-segment locales make each language crawlable with self
canonical and hreflang, while identity.locale persists an
explicit choice without client storage or cookie banners.
Signed-off-by: Émile Ré <emile@probo.com>
The UI composed "Compliance at {{name}}." via i18n while the
DB only held the org name. Persist the full heading, backfill
existing rows, and drop the unused heroTitle locale keys.
Also use clientip.Extract for NDA signing events and default
the portal base domain to probopage.localhost for local runs.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Stop aliasing compliancePortalVisibility to compliancePageVisibility in
document, file, and audit list items so the console matches the renamed
GraphQL field.
Signed-off-by: Bryan Frimin <bryan@probo.com>
OAuth /initiate replaced magic-link sign-in, but eleven non-English
locale files still carried the old auth copy. Drop those keys so every
catalog matches en-US and fr-FR.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Update mailing list queries to currentCompliancePortal, and include regenerated console resolvers plus sorted n8n/frontend imports from the rename.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Update visitor-facing apps to Compliance Portal
types, hooks, and resolvers so they match the
backend GraphQL rename.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Point compliance-page screens and Relay graphs
at the renamed Compliance Portal API fields and
mutations.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Main's new compliance-portal data-request pages (rights request
submission and listing) still referenced the sign-in dialog and
package names the earlier rebase's OAuth /initiate migration and
compliancepage -> complianceportal rename had already replaced.
Gate the "New Request" button behind OAuth like the rest of the
portal and point resolvers at the flattened visitor.Service methods.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Authorization-code exchange used ExternalClientID, which
is empty for registered clients and broke e2e token
grants. Pass the authenticated client's GID instead.
Also satisfy wsl_v5 blank-line rules, wire the delete
reference dialog through its mutation hook, and name the
filemanager logger.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Align console references and OAuth branding with the
compliance-page model, and fix certificate cache eviction,
portal OAuth handlers, and magic-link edge cases left after
the trust-center rename.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Generate MCP types before complianceportal, stub apps/trust
dist for embed, fix domains section indent, and start the
compose stack only after bin/probod is built.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Workflows still stubbed apps/trust/dist after the rename, so
go:embed and frontend builds failed. Also make step-ca writable
on Linux CI and fix domains section indent lint.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Replace flattened SSL fields with a certificate
relation loaded through certmanager, and resolve
domain slots from IDs already on the trust center
instead of reloading the compliance page.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Move Emile's commitment CRUD into complianceportal management,
wire console and visitor GraphQL, and drop portal magic-link
sign-in in favor of OAuth /initiate while keeping documents,
NDA/full-name gates, and access-request resume markers.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Keep GraphQL-aligned TrustCenterReferenceGraph naming, drop the
unused domain redirect route, and tighten related compliance
page UI review nits around magic-link navigation and links.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Remove the separate portal login page, show OAuth client branding on
sign-in, and preserve authorize continue URLs across auth methods.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Update Relay schema paths and HTTP endpoints so the portal app
talks to the compliance portal GraphQL and OAuth routes.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Surface dedicated routes when a portal magic link is expired or
already used, and add the portal login entry point in console.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Redirect visitors through the compliance portal OAuth initiate
endpoint and remove the verify-magic-link page and routes.
Signed-off-by: Bryan Frimin <bryan@probo.com>
Store website, email, and headquarters on the trust center so
public and admin surfaces read branding from one place. Drop the
trust API organization type and wire console, MCP, CLI, and apps
through the updated schema.
Signed-off-by: Bryan Frimin <bryan@probo.com>