package org.apereo.cas.otp.repository.credentials;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
/**
* This is {@link OneTimeTokenAccount}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
public class OneTimeTokenAccount implements Serializable, Comparable<OneTimeTokenAccount> {
private static final long serialVersionUID = -8289105320642735252L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id = Integer.MAX_VALUE;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String secretKey;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private int validationCode;
@ElementCollection
@CollectionTable(name = "scratch_codes", joinColumns = @JoinColumn(name = "username"))
@Column(updatable = true, insertable = true, nullable = false)
private List<Integer> scratchCodes = new ArrayList<>();
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String username;
public OneTimeTokenAccount() {
}
/**
* Instantiates a new Google authenticator account.
*
* @param username the user id
* @param secretKey the secret key
* @param validationCode the validation code
* @param scratchCodes the scratch codes
*/
@JsonCreator
public OneTimeTokenAccount(@JsonProperty("username") final String username,
@JsonProperty("secretKey") final String secretKey,
@JsonProperty("validationCode") final int validationCode,
@JsonProperty("scratchCodes") final List<Integer> scratchCodes) {
this.secretKey = secretKey;
this.validationCode = validationCode;
this.scratchCodes = scratchCodes;
this.username = username;
}
public String getSecretKey() {
return this.secretKey;
}
public int getValidationCode() {
return this.validationCode;
}
public List<Integer> getScratchCodes() {
return this.scratchCodes;
}
public String getUsername() {
return username;
}
public void setId(final long id) {
this.id = id;
}
public void setSecretKey(final String secretKey) {
this.secretKey = secretKey;
}
public void setValidationCode(final int validationCode) {
this.validationCode = validationCode;
}
public void setScratchCodes(final List<Integer> scratchCodes) {
this.scratchCodes = scratchCodes;
}
public void setUsername(final String username) {
this.username = username;
}
@Override
public int compareTo(final OneTimeTokenAccount o) {
return new CompareToBuilder()
.append(this.scratchCodes, o.getScratchCodes())
.append(this.validationCode, o.getValidationCode())
.append(this.secretKey, o.getSecretKey())
.append(this.username, o.getUsername())
.build();
}
@Override
public boolean equals(final Object obj) {
if (obj == null) {
return false;
}
if (obj == this) {
return true;
}
if (obj.getClass() != getClass()) {
return false;
}
final OneTimeTokenAccount rhs = (OneTimeTokenAccount) obj;
return new EqualsBuilder()
.append(this.secretKey, rhs.secretKey)
.append(this.validationCode, rhs.validationCode)
.append(this.scratchCodes, rhs.scratchCodes)
.append(this.username, rhs.username)
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder()
.append(secretKey)
.append(validationCode)
.append(scratchCodes)
.append(username)
.toHashCode();
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("id", id)
.append("username", username)
.toString();
}
}