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>
This commit is contained in:
Ludovic Vielle
2026-07-30 17:17:58 +02:00
parent a26a4ad898
commit f998a35357
3 changed files with 20 additions and 8 deletions

View File

@@ -133,15 +133,22 @@ FOR UPDATE;
func (t *DeviceEnrollmentToken) DeleteExpired( func (t *DeviceEnrollmentToken) DeleteExpired(
ctx context.Context, ctx context.Context,
conn pg.Tx, conn pg.Tx,
scope Scoper,
now time.Time, now time.Time,
) (int64, error) { ) (int64, error) {
q := ` q := `
DELETE FROM device_enrollment_tokens DELETE FROM device_enrollment_tokens
WHERE WHERE
expires_at < @now %s
AND expires_at < @now
` `
result, err := conn.Exec(ctx, q, pgx.StrictNamedArgs{"now": now}) q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"now": now}
maps.Copy(args, scope.SQLArguments())
result, err := conn.Exec(ctx, q, args)
if err != nil { if err != nil {
return 0, fmt.Errorf("cannot delete expired device_enrollment_tokens: %w", err) return 0, fmt.Errorf("cannot delete expired device_enrollment_tokens: %w", err)
} }
@@ -152,14 +159,19 @@ WHERE
func (t *DeviceEnrollmentToken) Delete( func (t *DeviceEnrollmentToken) Delete(
ctx context.Context, ctx context.Context,
conn pg.Tx, conn pg.Tx,
scope Scoper,
) error { ) error {
q := ` q := `
DELETE FROM device_enrollment_tokens DELETE FROM device_enrollment_tokens
WHERE WHERE
id = @id %s
AND id = @id
` `
q = fmt.Sprintf(q, scope.SQLFragment())
args := pgx.StrictNamedArgs{"id": t.ID} args := pgx.StrictNamedArgs{"id": t.ID}
maps.Copy(args, scope.SQLArguments())
_, err := conn.Exec(ctx, q, args) _, err := conn.Exec(ctx, q, args)
if err != nil { if err != nil {

View File

@@ -95,7 +95,7 @@ func (h *gcHandler) cleanup(ctx context.Context) error {
func(ctx context.Context, tx pg.Tx) error { func(ctx context.Context, tx pg.Tx) error {
var token coredata.DeviceEnrollmentToken var token coredata.DeviceEnrollmentToken
tokensDeleted, err := token.DeleteExpired(ctx, tx, now) tokensDeleted, err := token.DeleteExpired(ctx, tx, coredata.NewNoScope(), now)
if err != nil { if err != nil {
return fmt.Errorf("cannot delete expired device enrollment tokens: %w", err) return fmt.Errorf("cannot delete expired device enrollment tokens: %w", err)
} }

View File

@@ -324,16 +324,16 @@ func (s *Service) ExchangeEnrollmentToken(
return fmt.Errorf("cannot load device enrollment token: %w", err) return fmt.Errorf("cannot load device enrollment token: %w", err)
} }
scope := coredata.NewScope(token.TenantID)
if now.After(token.ExpiresAt) { if now.After(token.ExpiresAt) {
if err := token.Delete(ctx, conn); err != nil { if err := token.Delete(ctx, conn, scope); err != nil {
return fmt.Errorf("cannot delete expired device enrollment token: %w", err) return fmt.Errorf("cannot delete expired device enrollment token: %w", err)
} }
return ErrEnrollmentTokenExpired return ErrEnrollmentTokenExpired
} }
scope := coredata.NewScope(token.TenantID)
device := &coredata.Device{} device := &coredata.Device{}
if err := device.LoadByIDForUpdate(ctx, conn, scope, token.DeviceID); err != nil { if err := device.LoadByIDForUpdate(ctx, conn, scope, token.DeviceID); err != nil {
return fmt.Errorf("cannot load device: %w", err) return fmt.Errorf("cannot load device: %w", err)
@@ -361,7 +361,7 @@ func (s *Service) ExchangeEnrollmentToken(
return fmt.Errorf("cannot set device api key hash: %w", err) return fmt.Errorf("cannot set device api key hash: %w", err)
} }
if err := token.Delete(ctx, conn); err != nil { if err := token.Delete(ctx, conn, scope); err != nil {
return fmt.Errorf("cannot delete device enrollment token: %w", err) return fmt.Errorf("cannot delete device enrollment token: %w", err)
} }