package org.apereo.cas.ticket.registry; import org.apereo.cas.authentication.Authentication; import org.apereo.cas.authentication.CoreAuthenticationTestUtils; import org.apereo.cas.authentication.principal.Service; import org.apereo.cas.services.RegisteredServiceTestUtils; import org.apereo.cas.ticket.AbstractTicketException; import org.apereo.cas.ticket.ServiceTicket; import org.apereo.cas.ticket.Ticket; import org.apereo.cas.ticket.TicketGrantingTicket; import org.apereo.cas.ticket.TicketGrantingTicketImpl; import org.apereo.cas.ticket.proxy.ProxyGrantingTicket; import org.apereo.cas.ticket.support.NeverExpiresExpirationPolicy; import org.junit.Before; import org.junit.Test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import static org.junit.Assert.*; /** * @author Scott Battaglia * @since 3.1 */ public class DistributedTicketRegistryTests { private static final String TGT_NAME = "TGT"; private static final String TGT_ID = "test"; private TestDistributedTicketRegistry ticketRegistry; private boolean wasTicketUpdated; public void setWasTicketUpdated(final boolean wasTicketUpdated) { this.wasTicketUpdated = wasTicketUpdated; } @Before public void setUp() throws Exception { this.ticketRegistry = new TestDistributedTicketRegistry(this); this.wasTicketUpdated = false; } @Test public void verifyProxiedInstancesEqual() { final TicketGrantingTicket t = new TicketGrantingTicketImpl(TGT_ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); this.ticketRegistry.addTicket(t); final TicketGrantingTicket returned = (TicketGrantingTicket) this.ticketRegistry.getTicket(TGT_ID); assertEquals(t, returned); assertEquals(returned, t); assertEquals(t.getCreationTime(), returned.getCreationTime()); assertEquals(t.getAuthentication(), returned.getAuthentication()); assertEquals(t.getCountOfUses(), returned.getCountOfUses()); assertEquals(t.getGrantingTicket(), returned.getGrantingTicket()); assertEquals(t.getId(), returned.getId()); assertEquals(t.getChainedAuthentications(), returned.getChainedAuthentications()); assertEquals(t.isExpired(), returned.isExpired()); assertEquals(t.isRoot(), returned.isRoot()); final ServiceTicket s = t.grantServiceTicket("stest", RegisteredServiceTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, true); this.ticketRegistry.addTicket(s); final ServiceTicket sreturned = (ServiceTicket) this.ticketRegistry.getTicket("stest"); assertEquals(s, sreturned); assertEquals(sreturned, s); assertEquals(s.getCreationTime(), sreturned.getCreationTime()); assertEquals(s.getCountOfUses(), sreturned.getCountOfUses()); assertEquals(s.getGrantingTicket(), sreturned.getGrantingTicket()); assertEquals(s.getId(), sreturned.getId()); assertEquals(s.isExpired(), sreturned.isExpired()); assertEquals(s.getService(), sreturned.getService()); assertEquals(s.isFromNewLogin(), sreturned.isFromNewLogin()); } @Test public void verifyUpdateOfRegistry() throws AbstractTicketException { final TicketGrantingTicket t = new TicketGrantingTicketImpl(TGT_ID, CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy()); this.ticketRegistry.addTicket(t); final TicketGrantingTicket returned = (TicketGrantingTicket) this.ticketRegistry.getTicket(TGT_ID); final ServiceTicket s = returned.grantServiceTicket("test2", RegisteredServiceTestUtils.getService(), new NeverExpiresExpirationPolicy(), false, true); this.ticketRegistry.addTicket(s); final ServiceTicket s2 = (ServiceTicket) this.ticketRegistry.getTicket("test2"); assertNotNull(s2.grantProxyGrantingTicket("ff", CoreAuthenticationTestUtils.getAuthentication(), new NeverExpiresExpirationPolicy())); assertTrue(s2.isValidFor(RegisteredServiceTestUtils.getService())); assertTrue(this.wasTicketUpdated); returned.markTicketExpired(); assertTrue(t.isExpired()); } @Test public void verifyTicketDoesntExist() { assertNull(this.ticketRegistry.getTicket("fdfas")); } @Test public void verifyDeleteTicketWithPGT() { final Authentication a = CoreAuthenticationTestUtils.getAuthentication(); this.ticketRegistry.addTicket(new TicketGrantingTicketImpl( TGT_NAME, a, new NeverExpiresExpirationPolicy())); final TicketGrantingTicket tgt = this.ticketRegistry.getTicket( TGT_NAME, TicketGrantingTicket.class); final Service service = CoreAuthenticationTestUtils.getService("TGT_DELETE_TEST"); final ServiceTicket st1 = tgt.grantServiceTicket( "ST1", service, new NeverExpiresExpirationPolicy(), true, true); this.ticketRegistry.addTicket(st1); assertNotNull(this.ticketRegistry.getTicket(TGT_NAME, TicketGrantingTicket.class)); assertNotNull(this.ticketRegistry.getTicket("ST1", ServiceTicket.class)); final ProxyGrantingTicket pgt = st1.grantProxyGrantingTicket("PGT-1", a, new NeverExpiresExpirationPolicy()); assertEquals(a, pgt.getAuthentication()); this.ticketRegistry.addTicket(pgt); assertSame(3, this.ticketRegistry.deleteTicket(tgt.getId())); assertNull(this.ticketRegistry.getTicket(TGT_NAME, TicketGrantingTicket.class)); assertNull(this.ticketRegistry.getTicket("ST1", ServiceTicket.class)); assertNull(this.ticketRegistry.getTicket("PGT-1", ProxyGrantingTicket.class)); } private static class TestDistributedTicketRegistry extends AbstractTicketRegistry { private final DistributedTicketRegistryTests parent; private final Map<String, Ticket> tickets = new HashMap<>(); TestDistributedTicketRegistry(final DistributedTicketRegistryTests parent) { this.parent = parent; } @Override public Ticket updateTicket(final Ticket ticket) { this.parent.setWasTicketUpdated(true); return ticket; } @Override public void addTicket(final Ticket ticket) { this.tickets.put(ticket.getId(), ticket); updateTicket(ticket); } @Override public Ticket getTicket(final String ticketId) { return this.tickets.get(ticketId); } @Override public Collection<Ticket> getTickets() { return this.tickets.values(); } @Override public boolean deleteSingleTicket(final String ticketId) { return this.tickets.remove(ticketId) != null; } @Override public long deleteAll() { final int size = this.tickets.size(); this.tickets.clear(); return size; } } }