package org.openiot.lsm.security.oauth; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map.Entry; import org.jasig.cas.authentication.Authentication; import org.jasig.cas.authentication.principal.Service; import org.jasig.cas.ticket.ExpirationPolicy; import org.jasig.cas.ticket.ServiceTicket; import org.jasig.cas.ticket.Ticket; import org.jasig.cas.ticket.TicketGrantingTicket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.Assert; public class LSMTicketGrantingTicketImpl extends LSMAbstractTicket implements TicketGrantingTicket, java.io.Serializable { /** Unique Id for serialization. */ private static final long serialVersionUID = -5197946718924166491L; private static final Logger LOG = LoggerFactory.getLogger(LSMTicketGrantingTicketImpl.class); /** * The authenticated object for which this ticket was generated for. */ private Authentication authentication; /** * Flag to enforce manual expiration. * */ private Boolean expired = false; private HashMap<String, Service> services = new HashMap<String, Service>(); public LSMTicketGrantingTicketImpl() { // nothing to do } /** * Constructs a new TicketGrantingTicket. * * @param id * the id of the Ticket * @param ticketGrantingTicket * the parent ticket * @param authentication * the Authentication request for this ticket * @param policy * the expiration policy for this ticket. * @throws IllegalArgumentException * if the Authentication object is null */ public LSMTicketGrantingTicketImpl(final String id, final LSMTicketGrantingTicketImpl ticketGrantingTicket, final Authentication authentication, final ExpirationPolicy policy) { super(id, ticketGrantingTicket, policy); Assert.notNull(authentication, "authentication cannot be null"); this.authentication = authentication; } /** * Constructs a new TicketGrantingTicket without a parent TicketGrantingTicket. * * @param id * the id of the Ticket * @param authentication * the Authentication request for this ticket * @param policy * the expiration policy for this ticket. */ public LSMTicketGrantingTicketImpl(final String id, final Authentication authentication, final ExpirationPolicy policy) { this(id, null, authentication, policy); } public Authentication getAuthentication() { return this.authentication; } public Boolean getExpired() { return expired; } public void setExpired(Boolean expired) { this.expired = expired; } public void setAuthentication(Authentication authentication) { this.authentication = authentication; } public synchronized ServiceTicket grantServiceTicket(final String id, final Service service, final ExpirationPolicy expirationPolicy, final boolean credentialsProvided) { final ServiceTicket serviceTicket = new LSMServiceTicketImpl(id, this, service, this.getCountOfUses() == 0 || credentialsProvided, expirationPolicy); updateState(); final List<Authentication> authentications = getChainedAuthentications(); service.setPrincipal(authentications.get(authentications.size() - 1).getPrincipal()); this.services.put(id, service); return serviceTicket; } public HashMap<String, Service> getServices() { return services; } public void setServices(HashMap<String, Service> services) { this.services = services; } private void logOutOfServices() { for (final Entry<String, Service> entry : this.services.entrySet()) { if (!entry.getValue().logOutOfService(entry.getKey())) { LOG.warn("Logout message not sent to [" + entry.getValue().getId() + "]; Continuing processing..."); } } } public boolean isRoot() { return this.getGrantingTicket() == null; } public synchronized void expire() { this.expired = true; logOutOfServices(); } public boolean isExpiredInternal() { return this.expired; } public List<Authentication> getChainedAuthentications() { final List<Authentication> list = new ArrayList<Authentication>(); if (this.getGrantingTicket() == null) { list.add(this.getAuthentication()); return Collections.unmodifiableList(list); } list.add(this.getAuthentication()); list.addAll(this.getGrantingTicket().getChainedAuthentications()); return Collections.unmodifiableList(list); } public final boolean equals(final Object object) { if (object == null || !(object instanceof TicketGrantingTicket)) { return false; } final Ticket ticket = (Ticket) object; return ticket.getId().equals(this.getId()); } }