package com.github.windbender.dao;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Restrictions;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.github.windbender.domain.ResetPasswordToken;
import com.github.windbender.domain.User;
import com.github.windbender.resources.UserResource;
import com.yammer.dropwizard.hibernate.AbstractDAO;
public class TokenDAO extends AbstractDAO<ResetPasswordToken>{
private static final int VALID_FOR_MINUTES = 10;
Logger log = LoggerFactory.getLogger(TokenDAO.class);
public TokenDAO(SessionFactory sessionFactory) {
super(sessionFactory);
}
public boolean isTokenValid(String token) {
User p = getUserForToken(token);
if(p == null) return false;
return true;
}
public User getUserForToken(String token) {
clearOldTokens();
Session currentSession = this.currentSession();
Criteria crit = currentSession.createCriteria(ResetPasswordToken.class);
crit.add(Restrictions.eq("token", token));
log.info("the criteria is " + crit.toString());
List<ResetPasswordToken> findList = crit.list();
log.info("the list is " + findList);
if(findList.size() ==1) {
return findList.get(0).getUser();
}
return null;
}
private void clearOldTokens() {
DateTime now = new DateTime();
Session currentSession = this.currentSession();
Criteria crit = currentSession.createCriteria(ResetPasswordToken.class);
crit.add(Restrictions.lt("expirationTime", now));
log.info("the criteria is " + crit.toString());
List<ResetPasswordToken> findList = crit.list();
log.info("the list is " + findList);
if (findList.size() > 0) {
for(ResetPasswordToken rpwt: findList) {
this.currentSession().delete(rpwt);
}
}
}
// creates a random token, stores in DB, and returns.
public String createToken(User p) {
try {
String code = UserResource.makeVerifyCode();
ResetPasswordToken tok = new ResetPasswordToken();
tok.setToken(code);
DateTime now = new DateTime();
tok.setExpirationTime(now.plusMinutes(VALID_FOR_MINUTES));
tok.setUser(p);
ResetPasswordToken ptok = this.persist(tok);
return ptok.getToken();
} catch (NoSuchAlgorithmException e) {
log.error("can't make a reset password token because ",e);
}
return null;
}
}