package auth.models; import auth.GrantType; import auth.TokenGenerator; import com.avaje.ebean.Ebean; import com.avaje.ebean.Model; import com.avaje.ebean.SqlUpdate; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import play.Configuration; import service.PoseidonService; import javax.persistence.*; import java.util.Date; import static api.v1.Token.TokenType.BEARER; import static play.data.validation.Constraints.Required; @Entity @Table(name = "POS_TOKEN") public class Token extends Model { private static final Logger LOGGER = LoggerFactory.getLogger(Token.class); @Id public Long id; @Required @Column(name = "access_token", nullable = false) public String accessToken; @Column(name = "refresh_token") public String refreshToken; @Required @Column(name = "created") public Date created; @Required @Column(name = "token_type") public String tokenType; @Required @Column(name = "grant_type") public String grantType; @Required @Column(name = "accessExpires", nullable = false) public Date accessExpires; @Required @Column(name = "refreshExpires", nullable = false) public Date refreshExpires; @ManyToOne @JoinColumn(name = "logon_user_id") public User user; public Token(User user, GrantType grantType) { this.accessToken = new TokenGenerator().createToken(); this.refreshToken = new TokenGenerator().createToken(); DateTimeZone tz = PoseidonService.getTimeZone(); this.accessExpires = new DateTime(tz).plusSeconds(Configuration.root().getInt("token.accessExpires")).toDate(); this.refreshExpires = new DateTime(tz).plusSeconds(Configuration.root().getInt("token.refreshExpires")).toDate(); this.created = PoseidonService.getNow().toDate(); this.tokenType = BEARER.getValue(); this.grantType = grantType.getValue(); if (user != null) { this.user = user; } } public static Finder<Long, Token> find = new Finder<>(Token.class); public static Token find(Long id) { Token token = find.byId(id); LOGGER.debug(token == null ? "Could not find token by id = {}" : "Found token by id = {}", id); return token; } public static Token findByTokenValue(String value) { Token token = find.where().eq("access_token", value).findUnique(); LOGGER.debug(token == null ? "Could not find token by value = {}" : "Found token by value = {}", value); return token; } public static Token findByRefreshToken(String refreshToken) { Token token = find.where().eq("refresh_token", refreshToken).findUnique(); LOGGER.debug(token == null ? "Could not find refreshtoken by value = {}" : "Found refreshtoken by value = {}", refreshToken); return token; } public Long getExpiresInSeconds() { return (long) Math.ceil((accessExpires.getTime() - System.currentTimeMillis()) / 1000.0); } public boolean isRefreshTokenActive() { return new DateTime(refreshExpires, PoseidonService.getTimeZone()).isAfterNow(); } public boolean isActive() { return new DateTime(accessExpires, PoseidonService.getTimeZone()).isAfterNow(); } public static void deleteOldExpiredTokens() { String sql = "DELETE " + " FROM pos_token " + " WHERE refreshExpires = accessExpires" + " AND accessExpires < :date"; SqlUpdate batchDelete = Ebean.createSqlUpdate(sql); batchDelete.setParameter("date",new DateTime().minusMonths(1).toDate()); batchDelete.execute(); } }