apereo/cas · error

Ticket [ ] is not registered in the catalog and is…

Error message

Ticket [{}] is not registered in the catalog and is unrecognized

What it means

GeodeTicketRegistry.getTicket() encodes the ticket id, then looks up its metadata in the ticket catalog. If no catalog entry exists for that ticket id prefix, the registry cannot determine which Geode cache region to query; it logs this warning and returns null. Callers should treat the ticket as expired/unknown (InvalidTicketException downstream).

Solutions

  1. Register the ticket definition for the id prefix via the ticket catalog configuration
  2. Check that the ticket id being resolved is well-formed and originates from this CAS deployment
  3. Enable trace logging to inspect the encoded id being looked up and compare its prefix to catalog entries

Example fix

// before: custom ticket never registered
// custom XYZ- prefix missing from catalog
// after
@Override
protected void addTicketToCatalog(final DefaultTicketDefinitionBuilder builder) {
    builder.buildAndRegisterTicketDefinition(this.catalog, "XYZ", XyzTicket.class, PolicyMethod.ATTRIBUTE);
}
Defensive patterns

Strategy: validation

Validate before calling

var metadata = ticketCatalog.find(ticketId);
if (metadata == null) {
    LOGGER.warn("Unknown ticket id prefix: {}", ticketId);
}

Type guard

boolean isKnownTicket(var catalog, String id) { return id != null && catalog.find(id) != null; }

Try / catch

try {
    Ticket t = ticketRegistry.getTicket(ticketId, TicketGrantingTicket.class);
} catch (InvalidTicketException e) {
    handleUnknownOrExpiredTicket(ticketId);
}

Prevention

When it happens

Trigger: getTicket(ticketId) called with an id whose prefix (e.g. TGT-, ST-, PGT-) has no registered ticket definition in the catalog - malformed ticket ids, custom ticket types not registered, or ids passed with the wrong prefix/case.

Common situations: Client sends a ticket id from a different CAS deployment with different ticket definitions; custom ticket types added to the registry but not the catalog; truncated or hand-crafted ticket strings in test scripts.

Understand the failure class

Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08). Data as JSON: /api/errors/2a7917d428450956. Report an issue: GitHub.

Appendix: source

Thrown at support/cas-server-support-geode-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/GeodeTicketRegistry.java:127

                val query = cache.cache().getQueryService().newQuery(queryString);
                val digestedId = digestIdentifier(principalId);
                val results = (Collection<String>) query.execute(digestedId);
                cache.region().removeAll(results);
                return results.size();
            }))
            .sum();
    }

    @Override
    public Ticket getTicket(final String ticketIdToGet, final Predicate<Ticket> predicate) {
        val ticketId = digestIdentifier(ticketIdToGet);
        if (StringUtils.isBlank(ticketId)) {
            return null;
        }
        LOGGER.debug("Encoded ticket id is [{}]", ticketId);
        val metadata = ticketCatalog.find(ticketIdToGet);
        if (metadata == null) {
            LOGGER.warn("Ticket [{}] is not registered in the catalog and is unrecognized", ticketIdToGet);
            return null;
        }
        val cache = getCacheFromMetadata(metadata);
        LOGGER.trace("Located cache region [{}] for ticket id [{}]", cache.region().getName(), ticketId);
        val ticket = cache.region().get(ticketId);
        LOGGER.trace("Located ticket from cache for ticket id [{}] is [{}]", ticketId, ticket);
        if (ticket == null) {
            LOGGER.debug("No ticket by id [{}] is found in the ignite ticket registry", ticketId);
            return null;
        }
        val result = decodeTicket(ticket.getTicket());
        return predicate.test(result) ? result : null;
    }

    @Override
    public Collection<? extends Ticket> getTickets() {
        try (val stream = stream()) {
            return stream.collect(Collectors.toSet());

View on GitHub (pinned to e7288fc434)