43 Commits

Author SHA1 Message Date
Sacha Al Himdani
f604c48686 Archive SCIM users with in-use profiles instead of 500ing
When a SCIM hard delete targets a profile that is still referenced
(e.g. completed document version signatures, FK RESTRICT), profile.Delete
fails with 23503 and poisons the surrounding transaction. The existing
deactivate fallback then ran on the aborted transaction and failed with
25P02, surfacing to the connector as an opaque 500 and eventually
disabling the bridge.

Wrap profile.Delete in a savepoint so the FK violation only rolls back
the delete attempt, leaving the outer transaction healthy for the
deactivate/archive fallback. Also map FK violations in Membership.Delete
to ErrResourceInUse for consistency with MembershipProfile.Delete.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-15 15:44:29 +02:00
Sacha Al Himdani
4c57d201a4 Make license declarations consistently MIT
The source headers, LICENSE files, and license metadata had drifted
apart. Align the entire project to MIT:

- Convert every source-file header to the MIT text across all comment
  styles (Go, TS, TSX, JS, MJS, SQL, CSS, GraphQL, shell), including
  SPDX-License-Identifier tags
- Set the root and cookie-banner LICENSE files to the MIT text with a
  "MIT License" title line
- Switch the package.json license fields, Docker image label, and
  cookie-banner README to MIT
- Update docs and the genmodels header generator accordingly
- Normalize copyright lines to a single format
  (Copyright (c) <year(s)> Probo Inc <hello@probo.com>.): unify the
  hello@getprobo.com and hello@probo.inc emails to hello@probo.com and
  the comma-separated years to a hyphenated range

Genuine third-party references are intentionally left untouched: the
Lucide icon attributions (Lucide is ISC) and the trivy dependency
license allowlist.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-13 16:21:14 +02:00
Sacha Al Himdani
9ac71f948f Update contact email to hello@probo.com
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-09 16:45:23 +02:00
Bryan Frimin
bd04f1812a Style
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-05-23 14:07:37 -07:00
Bryan Frimin
b39d880c0f Switch AuthorizationAttributes to batch and add AuthorizeBatch
Change AuthorizationAttributer.AuthorizationAttributes to take a slice
of resource ids and return policy.AttributesByID, so a single SQL
round-trip can load condition attributes for a whole batch. All
coredata implementations are migrated to a single
`WHERE id = ANY(@resource_ids::text[])` query that returns only the
rows it finds.

Authorizer gains:
  - AuthorizeBatch — all-or-nothing across a homogeneous (same entity
    type, same organization) resource set; rejects mixed entity types,
    mixed organizations, and empty batches with structured errors.
  - AuthorizeMulti — heterogeneous evaluation that returns one error
    per item and writes audit log entries in a single bulk insert.

The single-resource Authorize is rewired to delegate to AuthorizeBatch
so all paths share the same condition evaluation and audit logging.
recordAuditLog is split into buildAuditLogEntry plus a batch insert.

Tests cover the new batch and multi paths, mixed/empty/unsupported
resource cases, audit log batching, and dry-run behaviour.

Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-05-23 13:31:36 -07:00
Émile Ré
46c6068559 Apply coredata rules: idempotent deletes and constraint checks
Delete methods no longer check RowsAffected — deletes are
idempotent. PgError handlers now check both error code and
constraint name to avoid misattributing violations. Also
migrated remaining errors.As patterns to errors.AsType.

Signed-off-by: Émile Ré <emile@probo.com>
2026-05-20 09:44:00 +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
Sacha Al Himdani
e5e17d59ac Handle SCIM user email rename via external ID fallback
When a user's email is renamed in the identity provider (e.g. Google
Workspace), the external ID stays the same but the email changes. The
SCIM CreateUser now falls back to external ID lookup when no profile is
found by identity, and reassociates the existing profile to the new
identity instead of failing with a 409 uniqueness error.

Also removes user emails from bridge sync error messages to avoid
logging PII, using external IDs instead.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-23 10:45:48 +02:00
Bryan Frimin
f17fb7bf49 Upgrade to kit v0.3.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-03 11:56:06 +02: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
Émile Ré
7794563e94 Remove duplicate membership method
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:12:56 +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
Bryan Frimin
65aea6ea11 Fix column reference "full_name" is ambiguous
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-04 18:46:44 +01:00
Émile Ré
8559a11be5 Fix organization members order and filtering
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-19 18:33:36 +04:00
Émile Ré
887d39144b Order membership by organization name
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-19 17:37:15 +04:00
Émile Ré
3669df3f8a Handle membership deletions and role updates in iam policies
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:36:49 -08:00
Émile Ré
b961069e1d Accept/Expire invitations on SAML & SCIM operations
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:34:02 -08:00
Bryan Frimin
c4597b34fd Remove dead code
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:30:27 -08:00
Bryan Frimin
7030d06aed Add membership state
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:22:47 -08:00
Bryan Frimin
e2225d9970 Refactor scim filter management
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:22:46 -08:00
Bryan Frimin
31f79fccce Add SCIM handler draft
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:22:44 -08:00
Bryan Frimin
cfc514c8e0 Add SCIM management
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:20:14 -08:00
Bryan Frimin
b6799cbb01 Add membership source
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 12:17:52 -08:00
Bryan Frimin
4013b00841 Refactor policies document
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 11:37:39 -08:00
Émile Ré
e0f6bbd204 Plug back organization members
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 10:27:44 -08:00
Bryan Frimin
5ae8da7610 Improve Authorize performance
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:25:17 -08:00
Bryan Frimin
d4b039737e Rename identity profile on membership profile
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:14:54 -08:00
Bryan Frimin
2f7a3a5f76 Add identity profile
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:13:29 -08:00
Émile Ré
86bdb14289 Plug assume organization session
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2026-01-17 10:10:28 -08:00
Bryan Frimin
c2a5197459 Prefix table with iam_
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:10:27 -08:00
Bryan Frimin
0f7c755d53 Rename user into identity
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:10:27 -08:00
Bryan Frimin
74fc3b8cd1 Rewrite identity and access management
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-01-17 10:07:34 -08:00
Émile Ré
c0b2a5702d Introduce pkg/mail.Addr
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-15 18:24:00 +01:00
Sacha Al Himdani
21c4b7cd9d Add role management
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-11-13 17:11:22 +01:00
Bryan Frimin
59aa332ab5 Move to vanity import url
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-31 17:01:52 +01:00
Bryan Frimin
d1c31978da Fix role and organization logo
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-30 22:42:17 +01:00
Bryan Frimin
88f3d61982 Fix order by
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-30 16:38:10 +01:00
Bryan Frimin
2766f8e423 Add SAML support
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-30 16:31:27 +01:00
Sacha Al Himdani
feeaad777c Fix style of invitation and membership files
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-14 16:32:23 +02:00
Sacha Al Himdani
165eb267f2 Refactor invitation system
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-14 16:32:22 +02:00
Bryan Frimin
0f96b8518f Refactoring of authentification
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-14 16:32:22 +02:00