Commit Graph

77 Commits

Author SHA1 Message Date
Émile Ré
85a2f43e72 Release probod/v0.191.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-22 13:58:22 +02:00
Émile Ré
1ebbffcef9 Release prb/v0.188.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-22 13:58:07 +02:00
Émile Ré
d44272bb9e Release probod/v0.190.1 2026-05-20 15:19:12 +04:00
Émile Ré
3b5b4251b2 Release proboctl/v0.1.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-20 13:49:31 +04:00
Émile Ré
1c445d6597 Release probod/v0.190.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-20 13:48:57 +04:00
Émile Ré
9156d6a16a Add wsl linter and fix
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-20 09:27:28 +04:00
Émile Ré
ed41b354b0 Allow domains to belong to multiple third parties
Change the unique constraint on common_third_party_domains from (domain)
to (common_third_party_id, domain) so a domain like google.com can be
associated with Google, Google Analytics, Google AdSense, etc.

Also fix Beamer domain (was hotjar.com, now getbeamer.com) and preserve
the original url.Parse error in pgconn DSN parsing.

Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:11 +04:00
Émile Ré
48a494461e Add proboctl CLI and move seed commands into it
Introduce a new proboctl Cobra CLI for Probo instance management
that connects directly to PostgreSQL. Move the standalone
common-third-parties-import and common-tracker-patterns-import
commands into proboctl as `proboctl seed common-third-parties`
and `proboctl seed common-tracker-patterns`, replacing flag-based
PG connection with a shared factory pattern.

Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:09 +04:00
Émile Ré
844817543d Handle LoadByID errors explicitly instead of silently falling through to auto-create
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:09 +04:00
Émile Ré
53e1260d4d Add slug-based dedup and auto-create third parties from OCD
Add a slug column to common_third_parties for stable cross-source
deduplication. The OCD tracker patterns importer now resolves third
parties via a three-step cascade (slug lookup, domain fallback,
auto-create) instead of silently dropping unmatched links.

Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:08 +04:00
Émile Ré
a16821802e Fix PR review findings
- Replace copy-pasted New Relic URLs in Resend third-party entry
  with correct resend.com URLs and drop inapplicable fields
- Escape single '%' instead of '%%' in LIKE pattern conversion so
  literal percent signs are not treated as wildcards
- Return actual row ID from CommonTrackerPattern.Upsert via
  RETURNING id so conflict-path callers get the existing ID
- Add ORDER BY id ASC to vendor-by-common-third-party query for
  deterministic LIMIT 1 selection

Signed-off-by: Émile Ré <emile@getprobo.com>
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:08 +04:00
Émile Ré
ad74bb2ed6 Switch tracker patterns import to Open Cookie Database
Replace the local data.json source with a live clone of the
Open Cookie Database repository. The importer now reads
open-cookie-database.json, maps OCD entries to tracker pattern
rows, and resolves third-party links via case-insensitive
platform name lookup.

Signed-off-by: Émile Ré <emile@getprobo.com>
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:07 +04:00
Émile Ré
f0483d5280 Add tracker pattern seed data and domain aliases
Seed common_tracker_patterns from Open Cookie Database (2300
patterns with max_age_seconds where available). Add domain
aliases to all 92 vendors in data.json. Extend third-parties
import to upsert domain aliases. Add dedicated import command
for tracker patterns with third-party name cache.

Signed-off-by: Émile Ré <emile@getprobo.com>
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-18 19:05:06 +04:00
Sacha Al Himdani
3ff66757ad Remove deprecated snapshot system
The register/document model has fully replaced the snapshot system.
Delete every snapshot-scoped row and strip the application code that
referenced them: SnapshotID/SourceID struct fields, snapshot_id IS NULL
filters, snapshot columns from SELECT/INSERT statements and named args,
and the eight migrate-*-snapshots-to-documents one-shot tools.

The remaining snapshot_id / source_id columns, the snapshots and
controls_snapshots tables, the snapshots_type enum, and the
snapshot-scoped indexes are now unused; they are dropped in a follow-up
schema migration so this change can roll back cleanly without leaving
orphaned data.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-15 23:26:02 +02:00
Sacha Al Himdani
0360cfe3b4 Release probod/v0.189.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-15 09:27:11 +02:00
Sacha Al Himdani
0bca4456d7 Release prb/v0.187.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-15 09:24:52 +02:00
Sacha Al Himdani
eecbe4c46c Rename vendors to third parties
Renames the user-facing 'vendor' concept to 'third party' across the
entire codebase. The shared common_third_parties reference table is
unchanged.

Migration. Renames the vendor_category enum, the vendors and
vendor_<entity> tables (contacts, services, compliance_reports,
business_associate_agreements, data_privacy_agreements,
risk_assessments) and their vendor_id columns, the asset_vendors /
data_vendors / processing_activity_vendors junction tables,
generated_documents.vendors_document_id, the webhook_event_type
'vendor:<verb>' values, and the snapshots_type 'VENDORS' value.

Backend. Renames coredata models and SQL queries, probo services,
GraphQL / MCP API surface, console / trust / webhook resolvers and
types, the CLI (prb vendor* -> prb third-party*; pkg/cmd/vendormgmt
-> pkg/cmd/thirdpartymgmt), the document generator, vetting agent
prompts, and the common-third-parties-import command.

Frontend, packages, n8n, e2e. Renames apps/console pages, components,
hooks, routes, dialogs, and tabs; the shared @probo/vendors package
(now @probo/third-parties); the @probo/ui Vendors atoms (now
ThirdParties, VendorLogo -> ThirdPartyLogo); the n8n community node
actions/vendor folder (now actions/thirdParty); and the e2e Go test
suite (console and MCP). Filesystem and URL paths use kebab-case
(third-parties), GraphQL fields and TypeScript identifiers use
camelCase (thirdParty / thirdParties), Go types use PascalCase
(ThirdParty), and human-facing text uses 'third party' with a space.

Co-authored-by: Bryan Frimin <bryan@getprobo.com>
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-13 21:21:39 +02:00
Émile Ré
004ea564f4 Release probod/v0.188.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-13 15:22:30 +04:00
Émile Ré
d90cad8a58 Release prb/v0.186.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-13 15:20:15 +04:00
Émile Ré
85c028b537 Release probod/v0.187.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 18:49:33 +04:00
Émile Ré
fa55c0fb6e Fix SSRF protection bypass in common-third-parties-import
The HTTP transport was replaced after WithSSRFProtection() was applied,
discarding the protected dialer. Wrap the existing transport with
userAgentTransport instead of replacing it.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:38 +04:00
Émile Ré
10ac52eff3 Fix PR review feedback
- Preserve SSRF protection by wrapping the existing transport
  instead of replacing it with a bare http.Transport
- Strip DSN from url.Parse error to avoid leaking credentials
- Gate CommonThirdPartyCombobox on search length to prevent
  showing stale results when input is shortened
- Handle multi-value and uppercase sizes attributes in
  parseSizeAttr for correct icon-size ranking
- Match rel tokens containing "icon" (e.g. "shortcut icon")
  instead of requiring an exact match
- Limit HTML response body to 10 MiB before parsing
- Reject sslmode=prefer explicitly in both import tools

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:37 +04:00
Émile Ré
f7dd08d432 Optimize website logo get
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:37 +04:00
Émile Ré
bf8c622bcd Extract webinspect package for logo discovery
Replace the Google Favicons API with HTML head tag parsing
to find higher-quality logos (SVG, apple-touch-icon, large
PNG icons, msapplication-TileImage). The new pkg/webinspect
package parses a website's DOM tree and is extensible for
future resource extraction (footer links, etc.).

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:36 +04:00
Émile Ré
684fadea3e Remove unused description column from common_third_parties
The description field was never surfaced in the UI and added no value.
Drop it from the database, Go structs, GraphQL schema, import tool,
frontend fragment, and vendor seed data.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:36 +04:00
Émile Ré
4a405ce16c Self-host common third party logos via S3
Fetch favicons at import time instead of calling Google's favicon
service per page load. Logos are stored as public files in S3 and
served through the existing /api/files/v1/{id} endpoint.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:36 +04:00
Émile Ré
c76711e8b7 Use unsecure TLS
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:35 +04:00
Émile Ré
361fe1d713 Add common_third_parties shared reference table
Introduce a globally-shared, non-tenant-scoped common_third_parties
table that mirrors the public subset of vendor metadata, plus a
one-shot cmd/common-third-parties-import CLI that seeds it from
packages/vendors/data.json. The catalog will back future flows (e.g.
vendor autocomplete) so each tenant no longer needs to duplicate the
same baseline data.

The importer is idempotent via ON CONFLICT (lower(name)) DO UPDATE
and prints inserted/updated counts. GIDs use gid.NilTenant since the
table is not tenant-scoped; uniqueness still comes from the entity
type plus 14 bytes of timestamp/random suffix.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 16:43:35 +04:00
Émile Ré
95271e3f4e Release probod/v0.186.1
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 14:25:20 +04:00
Sacha Al Himdani
97c902ddf1 Release probod/v0.186.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-12 10:10:59 +02:00
Sacha Al Himdani
cc185f66dd Release prb/v0.185.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-12 10:08:28 +02:00
Émile Ré
d7f27e73d7 Release probod/v0.185.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 10:50:29 +04:00
Émile Ré
b6615d4279 Release prb/v0.184.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-12 10:49:55 +04:00
Émile Ré
791ad9a5ce Release probod-bootstrap/v0.1.1
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-08 14:26:39 +04:00
Émile Ré
e490a12a37 Release probod/v0.184.2
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-08 14:26:23 +04:00
Émile Ré
e930b697b3 Release prb/v0.183.1
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-08 14:26:01 +04:00
Émile Ré
ba918c01ab Upgrade go to 1.26.3
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-08 13:46:14 +04:00
Émile Ré
6e81aca989 Release probod/v0.184.1 2026-05-08 12:57:38 +04:00
Bryan Frimin
4336b8eb48 Remove MS365 external user from access review
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-05-07 17:18:17 +02:00
Émile Ré
259a162f97 Release probod/v0.184.0 2026-05-07 18:10:32 +04:00
Émile Ré
593a354c8c Release probod/v0.183.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-07 16:23:44 +04:00
Émile Ré
0649d032cd Release prb/v0.183.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-07 16:23:37 +04:00
Émile Ré
72fa79629f Review fixes
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-07 15:13:43 +04:00
Émile Ré
4598506076 Extract shared types and add Regulation type with parsing methods
Move cookie banner types (CookieItem, Category, Regulation, BannerConfig,
etc.) into a dedicated types.ts file. Add a coredata.Regulation type with
parsing, JSON marshaling, and database scanning methods. Hardcode the
geoloc-import data directory since the submodule path is fixed.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-07 15:13:42 +04:00
Émile Ré
ad22fec81d Add IP-to-country geolocation service
Introduce a geoloc package that stores CIDR-to-country mappings in
PostgreSQL using the native cidr type with a GiST index for fast
containment lookups. Data comes from the ipverse/country-ip-blocks
dataset added as a git submodule.

A standalone geoloc-import command reads the TXT files from disk
and bulk-loads them via COPY. probod wires the service and logs a
warning when the table is empty.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-05-07 15:13:41 +04:00
Bryan Frimin
6708cc901c Drop FAILED status from access review campaigns
Source fetch failures stay surfaced on the source fetch (status and
last error) instead of failing the entire campaign, so reviewers can
proceed on the sources that succeeded.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-05-07 12:59:55 +02:00
Bryan Frimin
a350605cf5 Release probod/v0.182.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-05-06 16:54:26 +02:00
Bryan Frimin
95a9ba0139 Release prb/v0.182.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-05-06 16:54:15 +02:00
Bryan Frimin
ac526fb54d Split release into per-track packages
Each shippable artifact (prb, probod server group, probod-bootstrap,
@probo/n8n-nodes-probo, @probo/cookie-banner) now has its own version
file, its own CHANGELOG.md, its own annotated-tag scheme of the form
<track>/v<version>, and its own GitHub Actions release workflow. The
unified release.yaml is removed; the unified CHANGELOG.md becomes a
short index pointing at each per-track file, with the prior history
preserved in CHANGELOG.archive.md.

Probod's CHANGELOG carries the post-split monorepo releases (0.174.0
through 0.181.0) so the server-group history stays continuous and the
probod docker image keeps its existing version line.

contrib/claude/release.md is split into contrib/claude/release/ with
one entrypoint per track plus a README that drives the agent: detect
which tracks have user-facing commits since their last tag and skip
tracks with no relevant changes, so a release request never tags an
unchanged track. The cookie-banner and n8n-node entrypoints add an
explicit npm run build step after the version bump (build.mjs bakes
package.json's version into __SDK_VERSION__) so compile errors and
package-lock.json updates are caught before tagging.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-05-06 16:04:36 +02:00
Sacha Al Himdani
553901e4ad Add risk publish to document system
Replace the old snapshot-based system for risks with the publish
document system, mirroring the prior vendor / processing activity / DPIA
/ TIA migration. Includes the GraphQL mutation, MCP tool, CLI command,
n8n operation, frontend publish dialog, e2e tests, and a prosemirror
register template covering name, description, category, treatment,
owner, inherent and residual scoring, and notes.

The risk register lives as a generated DocumentTypeRegister document on
the organization, reused across publishes (the major version bumps on
every republish). Approvers can be passed in to create a draft pending
approval; otherwise the version is published immediately. The frontend
Risks page exposes a Publish button and a Document link button when the
document exists, and pre-fills the previous default approvers.

Risks was the last remaining snapshot type, so this commit also removes
the entire snapshot system: drop snapshotId from the Risk GraphQL type
and RiskFilter; remove RiskSnapshotter, Risks.Snapshot,
InsertRiskSnapshots, and the SnapshotID/SourceID fields on Risk; delete
Snapshot, ControlSnapshot, SnapshotsType, SnapshotOrderField,
Snapshottable, the SnapshotService, the Snapshot console resolvers and
GraphQL schema, the Snapshot MCP types and operations
(list/get/take/listControlSnapshots), the snapshot CLI (prb snapshot),
the snapshot frontend pages, routes, banner, LinkedSnapshotsCard,
SnapshotGraph, snapshot helpers, and the snapshot n8n resource and
control link/unlink snapshot operations. The snapshot_id columns remain
in the database but are now filtered out with snapshot_id IS NULL.

Add Get/Upsert/Clear GeneratedDocumentID methods on Risk backed by a new
risks_document_id column on generated_documents, matching the
ProcessingActivity/Finding/Vendor pattern. The migration command
migrate-risk-snapshots-to-documents uses raw SQL queries instead of the
Go snapshot types, since those are gone.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-04 14:13:42 +02:00