Commit Graph

282 Commits

Author SHA1 Message Date
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
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
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
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
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
4f54241382 Add document types filtering and rename ISMS to GOVERNANCE
Adds 5 new document types (PLAN, REGISTER, RECORD, REPORT, TEMPLATE), renames ISMS to GOVERNANCE, and implements type-based filtering across GraphQL, MCP, and frontend. Includes migration, enum updates, filter implementation with SQL array support, and frontend dropdown UI with Relay refetch pattern.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 12:31:39 +01:00
Bryan Frimin
d7c120c144 Rename NONCONFORMITY to MINOR_NONCONFORMITY and add MAJOR_NONCONFORMITY
Support distinguishing between minor and major non-conformities in findings. Rename the existing NONCONFORMITY enum value to MINOR_NONCONFORMITY and add a new MAJOR_NONCONFORMITY value across all API layers (GraphQL, MCP, CLI) and the database.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 10:02:28 +01:00
Bryan Frimin
a5743729f7 Add file visibility (PRIVATE/PUBLIC) + public files API
Adds a visibility enum to files with PRIVATE (default) and PUBLIC states.
PUBLIC files are accessible via an unauthenticated /api/files/v1/{fileID}
endpoint that redirects to a presigned S3 URL. Introduces pkg/file service
to manage file operations. Logo uploads (trust centers, organizations,
frameworks, references) are marked PUBLIC; other files are PRIVATE.
Includes database migration and backfill for existing logos.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-18 19:19:04 +01:00
Bryan Frimin
736436e997 Add database migration to merge findings
Merge nonconformities and continual_improvements tables into a
unified findings table with kind (NONCONFORMITY, OBSERVATION,
EXCEPTION), status, and priority enums. Create findings_audits
junction table for the many-to-many audit relationship.

The migration generates new FND-XXX reference IDs per organization,
migrates both live and snapshot records preserving source_id links,
and carries over audit associations to the junction table.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-17 15:05:30 +01:00
Sacha Al Himdani
cf1dadc0b5 Add implemented state and justification to controls
Introduce `implemented` enum (IMPLEMENTED/NOT_IMPLEMENTED) and
`not_implemented_justification` (nullable text) fields on the Control
entity across all API surfaces (GraphQL, MCP, CLI), database, frontend,
and SOA export.

The database stores implementation state as a PostgreSQL enum
`control_implementation_state`. Controls default to IMPLEMENTED during
migration. The SOA list and PDF export show implementation status
alongside applicability, with "-" for non-applicable controls.
Justification columns are renamed for clarity: "Justification for
non-applicability" and "Justification for non-implementation".

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-17 11:01:04 +01:00
Sacha Al Himdani
85ec106cd6 Send mailing list emails
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-11 15:34:37 +01:00
Sacha Al Himdani
aa01c40184 Remove with tenant from mailman
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-11 15:34:36 +01:00
Sacha Al Himdani
4d2cb793b6 Add compliance page mailing list base
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-11 15:34:36 +01:00
Émile Ré
68faaf9d53 Remove unused columns
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-11 17:22:11 +04:00
Émile Ré
87fcf96ff1 Remove FKs referencing peoples and table
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-11 16:53:46 +04:00
Bryan Frimin
f99b2f7828 Rename nickname
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-11 13:09:03 +01:00
Bryan Frimin
dd3885ac54 Fix MS365 attributes handling
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-11 13:09:01 +01:00
Bryan Frimin
1d8ce190c3 Fix userName must be case insentive
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-11 13:09:01 +01:00
Bryan Frimin
c8250f6794 Add userName and externalID support
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-11 13:09:00 +01:00
Sacha Al Himdani
fe241fc136 Add social links
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-11 12:10:57 +01:00
Bryan Frimin
4875a2bd5e Improve mailer performance
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-09 11:19:04 +01:00
Émile Ré
46d8450ead Fix migration
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-05 11:18:19 +04:00
Émile Ré
909beeb606 Migrate some trust_center_access columns to profiles
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-05 10:36:08 +04:00
Sacha Al Himdani
c17c53e80f Add compliance frameworks
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-04 10:19:39 +01:00
Sacha Al Himdani
6a83b53b47 Add obligation webhooks
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-27 17:14:26 +01:00
Sacha Al Himdani
6905472fba Add user webhooks
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-27 10:14:53 +01:00
Bryan Frimin
9ec950d633 Remove content type from email attachment
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:33 +01:00
Bryan Frimin
16503a7df4 Use electronic signature for compliage page NDA
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:27 +01:00
Bryan Frimin
c191d25e9a Add electronic signature
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:27 +01:00
Sacha Al Himdani
e6f9d7aae2 Clean up database
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-23 09:37:43 +01:00
Émile Ré
2793c18587 Fix deletion in migration
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:13:04 +04:00
Émile Ré
776af96170 Fix bot review
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:13:02 +04:00
Émile Ré
ab5fe8e5e2 Fix e2e tests
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:13:01 +04:00
Émile Ré
d90ef86b0b Cascade delete user invitations
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:13:00 +04:00
Émile Ré
47aba96b69 Reimplement invitations
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:58 +04:00
Émile Ré
a42fc4fa61 Reimplement remove / create in console
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:57 +04:00
Émile Ré
56ec0ab3c3 Move source and state from membership to profile
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:55 +04:00
Émile Ré
4c67217e35 Remove membership derived struct fields
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:54 +04:00
Émile Ré
c115e2c9dc Update graphql schema
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:53 +04:00
Sacha Al Himdani
40e4db9278 Remove deprecated SOA code
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-17 15:06:49 +01:00
Sacha Al Himdani
9b97e47615 Create safer approver migration
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-17 10:48:44 +01:00
Bryan Frimin
93c7b0c2dc Add multi-approver support
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-17 10:48:44 +01:00
Bryan Frimin
3d8c7c4dd6 Rename owner by approver
Document owner does not make sense it's more an document approver.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-17 10:48:43 +01:00
Sacha Al Himdani
60538ef2bb Change webhook configuration to subscription
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:28 +01:00
Sacha Al Himdani
6de906d0a9 Remove status on webhook data
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:28 +01:00
Sacha Al Himdani
2d2546ee1b Remove endpoint on webhook events
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:27 +01:00
Sacha Al Himdani
ae6e6b665b Add failed status to webhook data
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:27 +01:00
Sacha Al Himdani
a1e726ec49 Change webhook table names
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:26 +01:00
Sacha Al Himdani
f9de9c4834 Add webhooks
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-13 18:28:25 +01:00