package org.apereo.cas.support.oauth.services;
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.services.AbstractRegisteredService;
import org.apereo.cas.services.RegexRegisteredService;
import org.apereo.cas.services.RegisteredService;
import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.PostLoad;
import java.util.HashSet;
import java.util.Set;
/**
* An extension of the {@link RegexRegisteredService} that defines the
* OAuth client id and secret for a given registered service.
*
* @author Misagh Moayyed
* @since 4.0.0
*/
@Entity
@DiscriminatorValue("oauth")
public class OAuthRegisteredService extends RegexRegisteredService {
private static final long serialVersionUID = 5318897374067731021L;
@Column(length = 255, updatable = true, insertable = true)
private String clientSecret;
@Column(length = 255, updatable = true, insertable = true)
private String clientId;
@Column(updatable = true, insertable = true)
private Boolean bypassApprovalPrompt = Boolean.FALSE;
@Column(updatable = true, insertable = true)
private Boolean generateRefreshToken = Boolean.FALSE;
@Column(updatable = true, insertable = true)
private Boolean jsonFormat = Boolean.FALSE;
@Lob
@Column(name = "supported_grants", length = Integer.MAX_VALUE)
private HashSet<String> supportedGrantTypes = new HashSet<>();
@Lob
@Column(name = "supported_responses", length = Integer.MAX_VALUE)
private HashSet<String> supportedResponseTypes = new HashSet<>();
public String getClientId() {
return this.clientId;
}
public void setClientId(final String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return this.clientSecret;
}
public void setClientSecret(final String clientSecret) {
this.clientSecret = clientSecret;
}
public Boolean isBypassApprovalPrompt() {
return this.bypassApprovalPrompt;
}
public void setBypassApprovalPrompt(final Boolean bypassApprovalPrompt) {
this.bypassApprovalPrompt = bypassApprovalPrompt;
}
public Boolean isGenerateRefreshToken() {
return this.generateRefreshToken;
}
public void setGenerateRefreshToken(final Boolean generateRefreshToken) {
this.generateRefreshToken = generateRefreshToken;
}
public Boolean isJsonFormat() {
return this.jsonFormat;
}
public void setJsonFormat(final Boolean jsonFormat) {
this.jsonFormat = jsonFormat;
}
public Set<String> getSupportedGrantTypes() {
return supportedGrantTypes;
}
public void setSupportedGrantTypes(final Set<String> supportedGrantTypes) {
this.supportedGrantTypes = new HashSet<>(supportedGrantTypes);
}
public Set<String> getSupportedResponseTypes() {
return supportedResponseTypes;
}
public void setSupportedResponseTypes(final Set<String> supportedResponseTypes) {
this.supportedResponseTypes = new HashSet<>(supportedResponseTypes);
}
@Override
public String toString() {
final ToStringBuilder builder = new ToStringBuilder(this);
builder.appendSuper(super.toString());
builder.append("clientId", getClientId());
builder.append("approvalPrompt", isBypassApprovalPrompt());
builder.append("generateRefreshToken", isGenerateRefreshToken());
builder.append("jsonFormat", isJsonFormat());
builder.append("supportedResponseTypes", getSupportedResponseTypes());
builder.append("supportedGrantTypes", getSupportedGrantTypes());
return builder.toString();
}
@Override
public void copyFrom(final RegisteredService source) {
super.copyFrom(source);
final OAuthRegisteredService oAuthRegisteredService = (OAuthRegisteredService) source;
setClientId(oAuthRegisteredService.getClientId());
setClientSecret(oAuthRegisteredService.getClientSecret());
setBypassApprovalPrompt(oAuthRegisteredService.isBypassApprovalPrompt());
setGenerateRefreshToken(oAuthRegisteredService.isGenerateRefreshToken());
setJsonFormat(oAuthRegisteredService.isJsonFormat());
setSupportedGrantTypes(oAuthRegisteredService.getSupportedGrantTypes());
setSupportedResponseTypes(oAuthRegisteredService.getSupportedResponseTypes());
}
@Override
protected AbstractRegisteredService newInstance() {
return new OAuthRegisteredService();
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
final OAuthRegisteredService rhs = (OAuthRegisteredService) obj;
return new EqualsBuilder()
.appendSuper(super.equals(obj))
.append(this.clientSecret, rhs.clientSecret)
.append(this.clientId, rhs.clientId)
.append(this.bypassApprovalPrompt, rhs.bypassApprovalPrompt)
.append(this.generateRefreshToken, rhs.generateRefreshToken)
.append(this.jsonFormat, rhs.jsonFormat)
.append(this.supportedResponseTypes, rhs.supportedResponseTypes)
.append(this.supportedGrantTypes, rhs.supportedGrantTypes)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.appendSuper(super.hashCode())
.append(this.clientSecret)
.append(this.clientId)
.append(this.bypassApprovalPrompt)
.append(this.generateRefreshToken)
.append(this.jsonFormat)
.append(this.supportedResponseTypes)
.append(this.supportedGrantTypes)
.toHashCode();
}
/**
* Post load processing, once the service is located via JPA.
*/
@PostLoad
public void postLoad() {
if (this.supportedGrantTypes == null) {
this.supportedGrantTypes = new HashSet<>();
}
if (this.supportedResponseTypes == null) {
this.supportedResponseTypes = new HashSet<>();
}
}
}