Commit Graph

3243 Commits

Author SHA1 Message Date
Sacha Al Himdani
0920690816 Add ability to disconnect Slack channel from compliance page
Users could connect a Slack channel to their compliance page but had no
way to remove or change the connection afterward. This adds a disconnect
button with a confirmation dialog next to connected Slack channels.

- GraphQL: deleteSlackConnection mutation with resolver
- Frontend: Disconnect button using useMutation with @deleteEdge

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 15:40:21 +02:00
Bryan Frimin
bc51c910ae Rename TruffleHog exclude paths file to plain text
The --exclude-paths flag expects a plain text file with one regex
per line, not a YAML file.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
5237e57d27 Revert "Use inline trufflehog:ignore instead of exclude paths file"
This reverts commit f10ecb8210b1176311d9372d1108b91ce8290fd4.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
7dcc3d21ac Use inline trufflehog:ignore instead of exclude paths file
Inline comments are more targeted than excluding the entire file
from secret scanning. Remove the .trufflehog.yml exclude file and
the --exclude-paths flag from the workflow.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
bba7855678 Fix TruffleHog exclude paths file format
The --exclude-paths flag expects newline-separated regexes, not YAML.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
b60b21aad0 Exclude guardrail test file from TruffleHog secret scanning
The sensitive_data_test.go file contains dummy connection strings
(postgres://, mongodb://, amqp://) used as test fixtures for the data
leak guardrail. These trigger false positives in TruffleHog.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
4725a1b080 Fix false positives in agent guardrails
Skip empty fingerprints in SystemPromptLeakGuardrail to prevent blank
values from flagging every message. Replace overly broad "sk-" pattern
in SensitiveDataGuardrail with specific LLM provider prefixes
("sk-proj-" for OpenAI, "sk-ant-" for Anthropic) to avoid false
positives on common words like "risk-based" or "task-management".

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
2f8674471b Fix one-argument-per-line style in prompt injection guardrail
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
ded859d130 Set temperature to 0 for prompt injection classifier
Deterministic output improves consistency of the safety classifier.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
ef8402ca93 Add reusable agent guardrails for prompt injection and data leaks
Introduce a pkg/agent/guardrail package with three guardrails that
can be composed into any agent:

- PromptInjectionGuardrail: LLM-based input classifier that detects
  prompt injection attempts before the agent processes them.
- SensitiveDataGuardrail: pattern-based output check for leaked
  tokens, keys, connection strings, and raw SQL.
- SystemPromptLeakGuardrail: configurable output check that detects
  system prompt content in responses using caller-provided
  fingerprints.

The classifier prompt is embedded from a plain text file for easy
review and editing.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Sacha Al Himdani
a54aaa8dca Release v0.154.1
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 14:16:34 +02:00
Sacha Al Himdani
454e6a52d4 Fix goreleaser snapshot signing creating missing bundle file
When running in snapshot mode, the signing step skips cosign but does
not create the expected .bundle file. The checksum step then fails
because it cannot find the signature artifact. Touch the file so the
pipeline can continue.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 14:06:40 +02:00
Sacha Al Himdani
3528e5d1a0 Release v0.154.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 13:36:03 +02:00
Sacha Al Himdani
0da0660c4d Update CHANGELOG
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 21:48:23 +01:00
Sacha Al Himdani
03d77c3bab Fix duplicate organization name returning internal error
When creating an organization with a name that produces a duplicate trust
center slug, the API now returns a Conflict response instead of a
generic Internal error.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 20:26:13 +01:00
Sacha Al Himdani
999171a626 Add document approval workflow
Introduce a complete approval system for document publishing. Document
versions can now require approval from selected reviewers before being
published, with automatic publishing once all approvers have approved.

- Add approval quorum and decision tables with backfill migration
- Implement request approval, approve, and reject flows with electronic
  signature support for approve decisions
- Add employee approvals page with dedicated tab and pending approvals view
- Add changelog field to publish and request approval flows
- Pre-select previous version's approvers in the publish dialog
- Show quorum approvers in document list with 100 approver hard limit
- Expose approval workflow through GraphQL, MCP, and CLI
- Remove legacy default approvers feature entirely
- Add comprehensive e2e test coverage for approval workflows

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 19:43:20 +01:00
Sacha Al Himdani
4a2d308da0 Add task drag-and-drop reordering
Order tasks by priority (ASC) by default. Enable drag-and-drop
on the TODO and DONE tabs using native HTML5 drag events,
following the compliance external URLs pattern. The "All" tab
remains read-only since priority is scoped per state.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 15:47:12 +01:00
Sacha Al Himdani
257cbcf826 Add task priority field
Introduce a rank-style priority on tasks, scoped by
(organization_id, state). New tasks auto-assign the next
priority. Reordering uses the same CTE-based algorithm as
trust center references and compliance external URLs.
Exposed through GraphQL, MCP, and the PRIORITY order field.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 15:47:12 +01:00
Sacha Al Himdani
72a48ff6b1 Run n8n-node lint on pull requests using n8n-node CLI
The PR lint path was running `npx eslint .` for the n8n-node package,
which uses a different config than `npx n8n-node lint` used on push.
This caused lint to pass on PRs but fail on push to main.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 14:24:53 +01:00
Sacha Al Himdani
596901b799 Fix n8n-node lint by scoping brace-expansion override for minimatch@3
The root brace-expansion@5 override broke minimatch@3 (used by
@eslint/config-array) because v5 changed the export API. Add a
scoped override so minimatch@3 gets brace-expansion@1.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 14:24:53 +01:00
Sacha Al Himdani
a8f733706b Fix npm audit vulnerabilities
Bump @n8n/node-cli to ^0.24.1 and remove stale form-data override.

Add overrides for transitive sub-dependencies with no upstream fix:
- brace-expansion ^5.0.5 (ReDoS / process hang)
- minimatch@9 ^9.0.9 (ReDoS in 9.0.0-9.0.6)
- langsmith ^0.5.0 (SSRF via tracing header injection)
- handlebars 4.7.9 (prototype pollution / XSS)
- @langchain/community ^1.1.25 (SSRF bypass)

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 11:23:41 +01:00
Bryan Frimin
cd62af88a3 Fix arrow-parens lint error in VerifyMagicLinkPage
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 09:15:41 +01:00
Bryan Frimin
8f59eb6b8a Distinguish expired magic links from invalid tokens
When a magic link token expires, the user now sees a specific
error message ("This magic link has expired. Please request a
new one.") instead of the generic "Failed to connect" error.

This adds ErrExpiredToken to the IAM error types, checks for
statelesstoken.ErrExpiredToken in both GetMagicLinkEmail and
OpenSessionWithMagicLink, and handles it in the trust resolver
and frontend.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 09:15:41 +01:00
Bryan Frimin
36d517e8ce Fix n8n sub-dep CVE
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 08:10:57 +01:00
Bryan Frimin
6d0c7fe262 Release v0.153.2 2026-03-26 21:47:25 +01:00
Bryan Frimin
095b36d6e4 Mark failed evidence descriptions instead of retrying
Previously the worker reset failed descriptions back to PENDING,
causing infinite retry loops for permanently broken evidence.
Add a FAILED status so these items stop cycling and can be
investigated.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 21:37:53 +01:00
Bryan Frimin
992c4ab7f3 Release v0.153.1 2026-03-26 17:56:37 +01:00
Bryan Frimin
84b71af54c Use file model MIME type instead of S3 content type
GetFileBase64 read the MIME type from the S3 response header,
which can be application/octet-stream for files uploaded without
an explicit content type. Use file.GetMimeType() from the
database instead, which stores the correct MIME type captured
at upload time. This fixes evidence description failures when
calling the OpenAI API with PDF files.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 17:34:04 +01:00
Bryan Frimin
644061f465 Release v0.153.0 2026-03-26 17:15:29 +01:00
Bryan Frimin
6bcd4b5c66 Fix e2e test config for new agents config structure
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 15:29:41 +01:00
Bryan Frimin
619ec7b882 Add AI-powered evidence description generation
Introduce a background worker that automatically generates
compliance-focused descriptions for uploaded evidence files
using configurable LLM providers. Descriptions are surfaced
across all interfaces: GraphQL API, MCP API, CLI, and the
console UI.

Key changes:
- Multi-provider LLM config with per-agent settings (pointer
  types for Temperature/MaxTokens to preserve zero values)
- Evidence description worker with bounded concurrency
- EvidenceDescriptionStatus typed enum with PostgreSQL enum type
- New `prb evidence` CLI commands (list, view, delete)
- Evidence description displayed in console table and preview
- Migration only marks evidences without files as completed

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 14:32:41 +01:00
Bryan Frimin
8bbed534a9 Fix batch signature dialog wording
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 11:25:57 +01:00
Sacha Al Himdani
a3580a5647 Treat ESLint warnings as errors in all packages
Add --max-warnings 0 to every eslint lint script so that any warning
causes a non-zero exit code. This makes `make lint` and CI fail on
warnings, not just hard errors.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 10:47:33 +01:00
Sacha Al Himdani
93c3b70ecc Fix frontend lint warnings in documents and references
- Remove unused `rank` field from CompliancePageReferenceListItemFragment;
  the parent list fragment already fetches it for drag-and-drop reordering.
  Thread `rank` through the onEdit call chain so the edit dialog can still
  pre-populate the field via a dedicated parameter instead of the fragment.
- Add missing `documentTypeFilter` dependency to the refetch useEffect in
  DocumentList so stale closure values are never used on tab change.
- Break overlong line in DocumentList (canSendAnySignatureNotifications).

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 10:47:33 +01:00
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