package org.apereo.cas.consent;
import org.apereo.cas.authentication.Authentication;
import org.apereo.cas.authentication.principal.Service;
import org.apereo.cas.services.RegisteredService;
import org.apereo.cas.util.CollectionUtils;
import org.apereo.cas.util.DigestUtils;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* This is {@link ConsentDecision}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@Entity
@Table(name = "ConsentDecision")
public class ConsentDecision {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String principal;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String service;
@Column(nullable = false)
private LocalDateTime date;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private Long reminder = 14L;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private TimeUnit reminderTimeUnit = TimeUnit.DAYS;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String attributeNames;
@Column(length = 255, updatable = true, insertable = true, nullable = false)
private String attributeValues;
public LocalDateTime getDate() {
return date;
}
public void setDate(final LocalDateTime date) {
this.date = date;
}
public long getReminder() {
return reminder;
}
public void setReminder(final long reminder) {
this.reminder = reminder;
}
public TimeUnit getReminderTimeUnit() {
return reminderTimeUnit;
}
public void setReminderTimeUnit(final TimeUnit reminderTimeUnit) {
this.reminderTimeUnit = reminderTimeUnit;
}
public long getId() {
return id;
}
public void setId(final long id) {
this.id = id;
}
public String getPrincipal() {
return principal;
}
public void setPrincipal(final String principal) {
this.principal = principal;
}
public String getService() {
return service;
}
public void setService(final String service) {
this.service = service;
}
public String getAttributeNames() {
return attributeNames;
}
public void setAttributeNames(final String attributeNames) {
this.attributeNames = attributeNames;
}
public String getAttributeValues() {
return attributeValues;
}
public void setAttributeValues(final String attributeValues) {
this.attributeValues = attributeValues;
}
/**
* Build consent decision consent decision.
*
* @param service the service
* @param registeredService the registered service
* @param authentication the authentication
* @return the consent decision
*/
public static ConsentDecision buildConsentDecision(final Service service,
final RegisteredService registeredService,
final Authentication authentication) {
final ConsentDecision consent = new ConsentDecision();
consent.setPrincipal(authentication.getPrincipal().getId());
consent.setService(service.getId());
final Map<String, Object> attributes =
registeredService.getAttributeReleasePolicy().getAttributes(authentication.getPrincipal(),
service, registeredService);
final String names = DigestUtils.sha512(attributes.keySet().stream().collect(Collectors.joining("|")));
consent.setAttributeNames(names);
final String values = DigestUtils.sha512(attributes.values().stream()
.map(CollectionUtils::toCollection)
.map(c -> {
final String value = c.stream().map(Object::toString).collect(Collectors.joining());
return value;
})
.collect(Collectors.joining("|")));
consent.setAttributeValues(values);
consent.setDate(LocalDateTime.now());
return consent;
}
}