package org.apereo.cas.services; import com.google.common.base.Throwables; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apereo.cas.support.oauth.services.OAuthRegisteredService; import javax.persistence.Column; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Lob; import javax.persistence.PostLoad; import java.time.ZonedDateTime; import java.util.HashSet; import java.util.Set; /** * This is {@link OidcRegisteredService}. * * @author Misagh Moayyed * @since 5.0.0 */ @Entity @DiscriminatorValue("oidc") public class OidcRegisteredService extends OAuthRegisteredService { private static final long serialVersionUID = 1310899699465091444L; @Column(length = 255, updatable = true, insertable = true) private String jwks; @Column(updatable = true, insertable = true) private boolean signIdToken = true; @Column(updatable = true, insertable = true) private boolean encryptIdToken; @Column(length = 255, updatable = true, insertable = true) private String idTokenEncryptionAlg; @Column(length = 255, updatable = true, insertable = true) private String idTokenEncryptionEncoding; @Column(updatable = true, insertable = true) private boolean dynamicallyRegistered; @Column(updatable = true, insertable = true) private boolean implicit; @Column(name = "DYNAMIC_REG_TIME") private ZonedDateTime dynamicRegistrationDateTime; @Lob @Column(name = "scopes", length = Integer.MAX_VALUE) private HashSet<String> scopes = new HashSet<>(); public OidcRegisteredService() { setJsonFormat(Boolean.TRUE); } public boolean isEncryptIdToken() { return encryptIdToken; } public void setEncryptIdToken(final boolean encryptIdToken) { this.encryptIdToken = encryptIdToken; } public boolean isSignIdToken() { return signIdToken; } public void setSignIdToken(final boolean signIdToken) { this.signIdToken = signIdToken; } public String getJwks() { return jwks; } public void setJwks(final String jwks) { this.jwks = jwks; } public boolean isImplicit() { return implicit; } public void setImplicit(final boolean implicit) { this.implicit = implicit; } public String getIdTokenEncryptionAlg() { return idTokenEncryptionAlg; } public void setIdTokenEncryptionAlg(final String idTokenEncryptionAlg) { this.idTokenEncryptionAlg = idTokenEncryptionAlg; } public String getIdTokenEncryptionEncoding() { return idTokenEncryptionEncoding; } public void setIdTokenEncryptionEncoding(final String idTokenEncryptionEncoding) { this.idTokenEncryptionEncoding = idTokenEncryptionEncoding; } public boolean isDynamicallyRegistered() { return dynamicallyRegistered; } /** * Indicates the service was dynamically registered. * Records the registration time automatically. * * @param dynamicallyRegistered dynamically registered. */ public void setDynamicallyRegistered(final boolean dynamicallyRegistered) { if (dynamicallyRegistered && !this.dynamicallyRegistered && dynamicRegistrationDateTime == null) { setDynamicRegistrationDateTime(ZonedDateTime.now()); } this.dynamicallyRegistered = dynamicallyRegistered; } /** * Gets scopes. * * @return the scopes */ public Set<String> getScopes() { if (this.scopes == null) { this.scopes = new HashSet<>(); } return scopes; } /** * Sets scopes. * * @param scopes the scopes */ public void setScopes(final Set<String> scopes) { getScopes().clear(); getScopes().addAll(scopes); } public ZonedDateTime getDynamicRegistrationDateTime() { return dynamicRegistrationDateTime; } public void setDynamicRegistrationDateTime(final ZonedDateTime dynamicRegistrationDateTime) { this.dynamicRegistrationDateTime = dynamicRegistrationDateTime; } /** * Initializes the registered service with default values * for fields that are unspecified. Only triggered by JPA. */ @PostLoad public void postLoad() { if (this.scopes == null) { this.scopes = new HashSet<>(); } } @Override protected AbstractRegisteredService newInstance() { return new OidcRegisteredService(); } @Override public boolean equals(final Object obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (obj.getClass() != getClass()) { return false; } final OidcRegisteredService rhs = (OidcRegisteredService) obj; final EqualsBuilder builder = new EqualsBuilder(); return builder .appendSuper(super.equals(obj)) .append(this.jwks, rhs.jwks) .append(this.implicit, rhs.implicit) .append(this.signIdToken, rhs.signIdToken) .append(this.encryptIdToken, rhs.encryptIdToken) .append(this.idTokenEncryptionAlg, rhs.idTokenEncryptionAlg) .append(this.idTokenEncryptionEncoding, rhs.idTokenEncryptionEncoding) .append(this.getScopes(), rhs.getScopes()) .isEquals(); } @Override public int hashCode() { return new HashCodeBuilder() .appendSuper(super.hashCode()) .append(jwks) .append(signIdToken) .append(implicit) .append(encryptIdToken) .append(idTokenEncryptionAlg) .append(idTokenEncryptionEncoding) .append(dynamicallyRegistered) .append(getScopes()) .toHashCode(); } @Override public String toString() { return new ToStringBuilder(this) .appendSuper(super.toString()) .append("jwks", jwks) .append("implicit", implicit) .append("signIdToken", signIdToken) .append("idTokenEncryptionAlg", idTokenEncryptionAlg) .append("idTokenEncryptionEncoding", idTokenEncryptionEncoding) .append("encryptIdToken", encryptIdToken) .append("dynamicallyRegistered", dynamicallyRegistered) .append("scopes", getScopes()) .toString(); } @Override public void copyFrom(final RegisteredService source) { super.copyFrom(source); try { final OidcRegisteredService oidcService = (OidcRegisteredService) source; setJwks(oidcService.getJwks()); setImplicit(oidcService.isImplicit()); setSignIdToken(oidcService.isSignIdToken()); setIdTokenEncryptionAlg(oidcService.getIdTokenEncryptionAlg()); setIdTokenEncryptionEncoding(oidcService.idTokenEncryptionEncoding); setEncryptIdToken(oidcService.isEncryptIdToken()); setDynamicallyRegistered(oidcService.isDynamicallyRegistered()); setScopes(oidcService.getScopes()); } catch (final Exception e) { throw Throwables.propagate(e); } } }