Class AbandonedCeremonyTimer

java.lang.Object
io.jans.fido2.service.app.AbandonedCeremonyTimer

@ApplicationScoped @Named public class AbandonedCeremonyTimer extends Object
Relabels assertion ceremonies that lapsed without ever being completed.

A ceremony is written as pending when the options are issued and flipped to authenticated when the assertion is verified. If the user cancels, closes the sheet, or simply gives up, nothing is ever posted back — so without this sweep the row stays pending until the cleaner deletes it, and an abandoned ceremony is indistinguishable first from one still in flight and then from one that never happened at all.

Only ceremonies issued for a named user are swept. A usernameless one is offered on every login page load and left untouched as soon as the user identifies themselves, so sweeping it recorded an abandonment for every successful sign-in — see isSpeculative(io.jans.orm.model.fido2.Fido2AuthenticationData).

The sweep is deliberately not coordinated across nodes, so abandonment is counted at least once rather than exactly once. Two locking approaches were examined and rejected: the metrics aggregation scheduler's cluster lock is only initialised behind that scheduler's own enabled check, so with aggregation disabled it silently reports success on every node; and a dedicated cluster node type would allocate an index into a base DN that other components already populate. What bounds the error is the transition itself — it only fires from pending, so a row another node has already claimed is not matched again and the stored value converges regardless of who writes it. Only the emitted metric can duplicate, and only for a batch two nodes read before either writes it back; single-node deployments are exact.

Author:
Janssen Project
  • Field Details

    • BATCH_SIZE

      public static final int BATCH_SIZE
      Ceilings one sweep, so a backlog is bounded per pass rather than read at once.
      See Also:
  • Constructor Details

    • AbandonedCeremonyTimer

      public AbandonedCeremonyTimer()
  • Method Details

    • initTimer

      public void initTimer()
    • process

      @Asynchronous public void process(@Observes AbandonedCeremonyEvent abandonedCeremonyEvent)