package org.apereo.cas.ticket.factory; import org.apereo.cas.CipherExecutor; import org.apereo.cas.authentication.Authentication; import org.apereo.cas.ticket.ExpirationPolicy; import org.apereo.cas.ticket.Ticket; import org.apereo.cas.ticket.TicketFactory; import org.apereo.cas.ticket.TicketGrantingTicket; import org.apereo.cas.ticket.TicketGrantingTicketFactory; import org.apereo.cas.ticket.TicketGrantingTicketImpl; import org.apereo.cas.ticket.UniqueTicketIdGenerator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.Serializable; /** * The {@link DefaultTicketGrantingTicketFactory} is responsible * for creating {@link TicketGrantingTicket} objects. * * @author Misagh Moayyed * @since 4.2 */ public class DefaultTicketGrantingTicketFactory implements TicketGrantingTicketFactory { private static final Logger LOGGER = LoggerFactory.getLogger(DefaultTicketGrantingTicketFactory.class); /** * UniqueTicketIdGenerator to generate ids for {@link TicketGrantingTicket}s created. */ protected UniqueTicketIdGenerator ticketGrantingTicketUniqueTicketIdGenerator; /** * Expiration policy for ticket granting tickets. */ protected ExpirationPolicy ticketGrantingTicketExpirationPolicy; /** * The ticket cipher, if any. */ protected CipherExecutor<Serializable, String> cipherExecutor; public DefaultTicketGrantingTicketFactory(final UniqueTicketIdGenerator ticketGrantingTicketUniqueTicketIdGenerator, final ExpirationPolicy ticketGrantingTicketExpirationPolicy, final CipherExecutor<Serializable, String> cipherExecutor) { this.ticketGrantingTicketUniqueTicketIdGenerator = ticketGrantingTicketUniqueTicketIdGenerator; this.ticketGrantingTicketExpirationPolicy = ticketGrantingTicketExpirationPolicy; this.cipherExecutor = cipherExecutor; } @Override public <T extends TicketGrantingTicket> T create(final Authentication authentication) { final String tgtId = produceTicketIdentifier(authentication); return produceTicket(authentication, tgtId); } @Override public <T extends TicketFactory> T get(final Class<? extends Ticket> clazz) { return (T) this; } /** * Produce ticket. * * @param <T> the type parameter * @param authentication the authentication * @param tgtId the tgt id * @return the ticket. */ protected <T extends TicketGrantingTicket> T produceTicket(final Authentication authentication, final String tgtId) { final TicketGrantingTicket ticketGrantingTicket = new TicketGrantingTicketImpl( tgtId, authentication, this.ticketGrantingTicketExpirationPolicy); return (T) ticketGrantingTicket; } /** * Produce ticket identifier string. * * @param authentication the authentication * @return the ticket id. */ protected String produceTicketIdentifier(final Authentication authentication) { String tgtId = this.ticketGrantingTicketUniqueTicketIdGenerator.getNewTicketId(TicketGrantingTicket.PREFIX); if (this.cipherExecutor != null) { LOGGER.debug("Attempting to encode ticket-granting ticket [{}]", tgtId); tgtId = this.cipherExecutor.encode(tgtId); LOGGER.debug("Encoded ticket-granting ticket id [{}]", tgtId); } return tgtId; } }