blob: ed7f218552105a1cf5d66d6bd125d4d2cd035d87 [file] [log] [blame]
package de.ids_mannheim.korap.oauth2.dao;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.List;
import java.util.Set;
import jakarta.persistence.EntityManager;
import jakarta.persistence.PersistenceContext;
import jakarta.persistence.Query;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import de.ids_mannheim.korap.config.Attributes;
import de.ids_mannheim.korap.config.FullConfiguration;
import de.ids_mannheim.korap.exceptions.KustvaktException;
import de.ids_mannheim.korap.exceptions.StatusCodes;
import de.ids_mannheim.korap.oauth2.constant.OAuth2Error;
import de.ids_mannheim.korap.oauth2.entity.AccessScope;
import de.ids_mannheim.korap.oauth2.entity.Authorization;
import de.ids_mannheim.korap.oauth2.entity.Authorization_;
import de.ids_mannheim.korap.utils.ParameterChecker;
/**
* Implementations of {@link AuthorizationDao} managing database
* queries and transactions regarding OAuth2 authorizations.
*
* @author margaretha
*
*/
@Transactional
@Repository
public class AuthorizationDaoImpl implements AuthorizationDao {
@PersistenceContext
private EntityManager entityManager;
@Autowired
private FullConfiguration config;
public Authorization storeAuthorizationCode (String clientId, String userId,
String code, Set<AccessScope> scopes, String redirectURI,
ZonedDateTime authenticationTime, String nonce)
throws KustvaktException {
ParameterChecker.checkStringValue(clientId, "client_id");
ParameterChecker.checkStringValue(userId, "user_id");
ParameterChecker.checkStringValue(code, "authorization_code");
ParameterChecker.checkCollection(scopes, "scopes");
ParameterChecker.checkObjectValue(authenticationTime,
"user_authentication_time");
Authorization authorization = new Authorization();
authorization.setCode(code);
authorization.setClientId(clientId);
authorization.setUserId(userId);
authorization.setScopes(scopes);
authorization.setRedirectURI(redirectURI);
authorization.setUserAuthenticationTime(authenticationTime);
authorization.setNonce(nonce);
ZonedDateTime now = ZonedDateTime
.now(ZoneId.of(Attributes.DEFAULT_TIME_ZONE));
authorization.setCreatedDate(now);
authorization.setExpiryDate(
now.plusSeconds(config.getAuthorizationCodeExpiry()));
entityManager.persist(authorization);
// what if unique fails
return authorization;
}
public Authorization retrieveAuthorizationCode (String code)
throws KustvaktException {
ParameterChecker.checkStringValue(code, "code");
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Authorization> query = builder
.createQuery(Authorization.class);
Root<Authorization> root = query.from(Authorization.class);
Predicate restrictions = builder.equal(root.get(Authorization_.code),
code);
query.select(root);
query.where(restrictions);
Query q = entityManager.createQuery(query);
try {
return (Authorization) q.getSingleResult();
}
catch (Exception e) {
throw new KustvaktException(StatusCodes.INVALID_AUTHORIZATION,
"Invalid authorization: " + e.getMessage(),
OAuth2Error.INVALID_REQUEST);
}
}
public Authorization updateAuthorization (Authorization authorization)
throws KustvaktException {
ParameterChecker.checkObjectValue(authorization, "authorization");
authorization = entityManager.merge(authorization);
return authorization;
}
@SuppressWarnings("unchecked")
@Override
public List<Authorization> retrieveAuthorizationsByClientId (
String clientId) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Authorization> query = builder
.createQuery(Authorization.class);
Root<Authorization> root = query.from(Authorization.class);
Predicate restrictions = builder
.equal(root.get(Authorization_.clientId), clientId);
query.select(root);
query.where(restrictions);
Query q = entityManager.createQuery(query);
return q.getResultList();
}
}