Commit Graph

5515 Commits

Author SHA1 Message Date
Émile Ré
51ba02cedd Differentiate portal callout colors and width
When both banners stack they read as one band if they share
gold. Use sky (info) for locale and amber (warning) for NDA,
and keep content inside the same max-w-5xl column as TopBar.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:28 +02:00
Émile Ré
1e8690aaae Extract locale mismatch callout variants
Match the unsigned-NDA banner layout: keep layout classes in
tv slots so the callout shell stays free of raw utilities.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
7f7c836e57 Show unsigned NDA banner in the portal shell
Signed-in users with an incomplete portal NDA need a clear
path to review and sign without waiting for a private
document export to fail the gate.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
320d5ee03c Skip NDA gate for public document exports
Signed-in users exporting a PUBLIC doc, report, or file
should not be forced through the NDA. Keep the gate on
private targets and always on bulk requestAccesses.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
5bca465277 Fix lint issues
Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
312cb67106 Add Documents back link on the NDA gate
Match the document viewer header so users can leave without
signing, returning to the list instead of the continue URL
that would re-trigger the gate.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
c96bf22e1c Handle auth gates in every portal mutation
Mutations never reach route error boundaries, so each call
site reimplemented sign-in / full-name / NDA redirects.
Consume those gates in the shared useMutation notifier and
drop the duplicated handlers.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:27 +02:00
Émile Ré
693ee7002b Redirect viewer export to the NDA gate
Document export is a mutation, so NDA_SIGNATURE_REQUIRED never
reaches the route boundary. Catch it in the export hook, stop
re-firing on mutate identity churn, and match gate errors by
name when instanceof fails across package copies.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:26 +02:00
Émile Ré
52c3d4df60 Limit NDA gate to document loads
Signed-in users should browse the compliance portal the
same way visitors do. Keep @nda on export and access
mutations so signatures are only required when loading a
document.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-30 17:21:26 +02:00
Ludovic Vielle
f998a35357 Scope device enrollment token deletes
Delete and DeleteExpired omitted Scoper, breaking the
tenant-isolation pattern used elsewhere in coredata. Pass a
tenant scope from ExchangeEnrollmentToken and NewNoScope from
the ITAM GC so cross-tenant cleanup stays explicit.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-30 17:19:17 +02:00
Cursor Agent
a26a4ad898 Defer weekend document reminders to Monday
Reminders that fall due on Saturday or Sunday no longer send
over the weekend or spend the escalation ladder unused. SQL
keeps calendar cadence and rolls weekend due times to Monday
at the same clock hour. The first debounced notice is unchanged.

Co-authored-by: Sacha Al Himdani <sacha@probo.com>
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
2026-07-30 15:14:19 +00:00
Cursor Agent
eaff3c9dda Align MS365 access review users list with SCIM
Build /users like the SCIM bridge ListUsers helper so access
review only returns home-tenant members (userType eq Member).

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 14:59:16 +00:00
Ludovic Vielle
7bce67454c Map ITAM actions to v1:itam OAuth2 scopes
ITAM GraphQL actions were never registered in the shared OAuth2
scope registry, so bearer-token callers failed closed even when
role policies allowed them. Add v1:itam / v1:itam:read mappings,
register them in probod, and sync the CLI client scopes.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-30 16:34:17 +02:00
Ludovic Vielle
7731566c68 Add soft delete for revoked devices
Admins could only revoke devices, so never-enrolled and revoked
inventory rows piled up with no way to remove them. Soft-delete
is limited to REVOKED devices (revoke first), and ITAM GC now
hard-deletes PENDING/REVOKED orphans with no API key, postures,
or valid enrollment token—including user tombstones without
history.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-30 16:34:16 +02:00
Sacha Al Himdani
41da4bbad1 Default MCP third-party list to level 1
Omit level to return direct third parties; pass level to filter
by hierarchy depth. Documented on the tool and filter field.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-30 16:19:01 +02:00
Sacha Al Himdani
573549fcec Show reconnect when access-review connectors need new OAuth scopes
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-30 15:43:47 +02:00
Cursor Agent
51a748c625 Use cassette test for Microsoft MFA driver
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
2026-07-30 15:43:47 +02:00
Cursor Agent
f8b27d859d Fetch Microsoft MFA statuses
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
2026-07-30 15:43:47 +02:00
Sacha Al Himdani
bc635c445b Fix brace-expansion DoS advisory in package-lock
Bump transitive brace-expansion to patched releases (5.0.9 / 2.1.3 / 1.1.17) so expand() cannot OOM the process on crafted brace patterns.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-30 15:41:09 +02:00
Cursor Agent
d598715b46 Include activated_at in SCIM export profile load
LoadExistingByIDs scanned into MembershipProfile without
activated_at/deactivated_at after the profile-state split, so
SCIM_EVENT CSV exports failed collecting rows by ID.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 12:24:27 +00:00
Bryan Frimin
f8a18a2929 Release @probo/n8n-nodes-probo/v0.209.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-07-30 14:01:38 +02:00
Bryan Frimin
6d9a928024 Release probod/v0.241.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-07-30 14:01:14 +02:00
Bryan Frimin
4aae46be79 Release prb/v0.207.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-07-30 14:00:27 +02:00
Cursor Agent
b44ceb32e6 Drop redundant safecsv WriteRow helper
WriteRow was a variadic alias for Write(SanitizeRecord(...))
with no extra safety or column checks. Export call sites already
use []string headers; matching encoding/csv keeps one API surface.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
010fdcd51e Write log export CSV rows with safecsv WriteRow
Document that Write and WriteRow sanitize fields; export
streaming uses WriteRow at call sites instead of Write([]string).

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
5ea732a97f Resolve SCIM export profiles from event path IDs
SCIM events store user_name, not identity_id; profile GIDs
in /Users/{id} paths drive LoadExistingByIDs and identity
email lookup instead of batching by user_name.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
39b00bc4a7 Drop SCIM export userName email fallback
Email comes from identity when a profile matches; empty
email only when the event has no profile row to join.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
71c6726281 Move safecsv package doc onto writer.go
Drop the doc-only source file; keep export guidance on the
main Writer entry point.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
b1e6949fe4 Escape CSV cells that start with tab or carriage return
Trim-based formula detection skipped the old rule for
leading control characters; check those bytes before trim.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
90b3258f32 Harden safecsv against whitespace formula tricks
Ignore leading Unicode space when detecting formula cells,
extend starter runes, and document export usage in package
doc.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:13:17 +00:00
Cursor Agent
fc54faa263 Extract safecsv writer for spreadsheet-safe exports
Wrap encoding/csv with formula-safe cell sanitization and
use it from log export streaming.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
c5b1f210d5 Harden log export CSV and fix profile loader boundary
Load SCIM profile emails via Identities in the export
layer, drop the cross-table join, sanitize formula-leading
cells, and fall back to validated userName when profile email
is missing. Drop redundant gid array casts in LoadByIDs.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
45a7a428bf Fix wsl lint in SCIM export string dedupe
Add required blank line before append in
uniqueNonEmptyStrings.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
6906e0ff5b Separate SCIM export email from event user name
Load identity email for matched profiles and drop parsing
userName as email; user_name column stays the event value.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
6cbf16814c Use coredata models in log export batch loaders
Drop export-only row types; load Identity, PersonalAPIKey,
and MembershipProfile through the usual slice LoadByIDs helpers.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
e4d86f0f9e Add narrow audit log actor loaders for CSV export
Replace full Identity and PersonalAPIKey batch loads with
rows that select only id, email, name fields used in export.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
7bba43b902 Select only SCIM export profile columns by user name
The batch loader no longer scans into MembershipProfile with
placeholder email and organization name columns from dropped
identity and organization joins.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
ced25bad32 Load SCIM export profiles without identity join
Membership profile rows already carry SCIM userName and
name fields; export email comes from userName, not login
identity email.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
b715107e6c Drop empty-input guards from batch loaders
ANY(@ids) with an empty array is valid in Postgres and
CollectRows already yields an empty slice; the early nil
assignments added noise without changing callers.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
0e05fca7fc Hoist log export WalkAll order to package vars
Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
018b0d5633 Fold WalkLoader into Loader with slice constraint
Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
0132bc78bd Let WalkAll use coredata collection slice types
WalkAll now accepts loaders and callbacks typed as S ~[]T so
exports can use AuditLogEntries and SCIMEvents directly. Pass the
trimmed page slice to walk, not the over-fetched loader result.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
bff06a3c6d Pass export filters into CSV stream helpers
Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
Signed-off-by: Cursor Agent <cursoragent@cursor.com>
2026-07-30 10:12:47 +00:00
Cursor Agent
e9567c8e65 Wrap audit log export load errors and rename batch
Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
1bdbe2c1a8 Rename SCIM export page variable to events
Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
a3fb9d3dca Drop JSON blobs from log export CSV rows
Audit exports no longer emit a metadata JSON column. SCIM full
names come only from membership profiles, not request bodies.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Cursor Agent
5cd407bd86 Emit audit and SCIM log exports as CSV
JSONL was awkward in spreadsheets and SIEM imports. Write
tab-separated-friendly CSV with organization name on every row,
resolve audit actors to email or API key name, and enrich SCIM rows
with profile email and display name when available.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 10:12:47 +00:00
Ludovic Vielle
0448c25d8b Release probo-agent/v0.4.2
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-30 12:09:35 +02:00
Ludovic Vielle
5e63e193cd Stop macOS agent updates from spawning BTM entries
Unsigned darwin release tarballs replaced the Developer ID
binary on each auto-update, so Background Task Management
treated every release as a new identity and showed the generic
executable icon. Sign those archives with a stable identifier,
refuse signature downgrades, and attribute daemon/tray jobs to
Probo Agent.app via AssociatedBundleIdentifiers.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-30 11:43:02 +02:00
Cursor Agent
0a61bea40c Fix deactivateUser title after main rebase
Main renamed archiveUser to deactivateUser; keep the new name and
set its title and full annotation hints.

Signed-off-by: Cursor Agent <cursoragent@cursor.com>

Co-authored-by: Bryan FRIMIN <bryan@frimin.fr>
2026-07-30 09:16:06 +00:00