From 7bdacdfc225777e7676812838c963c0ad06cd572 Mon Sep 17 00:00:00 2001
From: Tucker Siegel <tgsiegel@terpmail.umd.edu>
Date: Tue, 18 Apr 2023 11:33:29 -0400
Subject: [PATCH] add new functions

---
 .../java/edu/umd/dawn/common/jwt/Claims.java  | 12 ++++++
 .../java/edu/umd/dawn/common/jwt/JWTUtil.java | 37 +++++++++++++++++++
 2 files changed, 49 insertions(+)

diff --git a/src/main/java/edu/umd/dawn/common/jwt/Claims.java b/src/main/java/edu/umd/dawn/common/jwt/Claims.java
index 16b4006..ec6bf4b 100644
--- a/src/main/java/edu/umd/dawn/common/jwt/Claims.java
+++ b/src/main/java/edu/umd/dawn/common/jwt/Claims.java
@@ -1,6 +1,9 @@
 package edu.umd.dawn.common.jwt;
 
+import com.auth0.jwt.JWTCreator.Builder;
 import com.auth0.jwt.interfaces.DecodedJWT;
+
+import edu.umd.dawn.common.entities.User;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
 
@@ -17,4 +20,13 @@ public class Claims {
     public static Claims build(DecodedJWT jwt) {
         return new Claims(jwt.getClaim("id").asString());
     }
+
+    public static Claims fromUser(User user) {
+        return new Claims(user.getId());
+    }
+
+    public Builder fill(Builder jwtBuilder) {
+        jwtBuilder.withClaim("id", this.userId);
+        return jwtBuilder;
+    }
 }
diff --git a/src/main/java/edu/umd/dawn/common/jwt/JWTUtil.java b/src/main/java/edu/umd/dawn/common/jwt/JWTUtil.java
index 36cfaea..c256510 100644
--- a/src/main/java/edu/umd/dawn/common/jwt/JWTUtil.java
+++ b/src/main/java/edu/umd/dawn/common/jwt/JWTUtil.java
@@ -1,8 +1,15 @@
 package edu.umd.dawn.common.jwt;
 
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.temporal.ChronoUnit;
+
 import com.auth0.jwt.JWT;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.interfaces.DecodedJWT;
+
+import edu.umd.dawn.common.entities.User;
 import edu.umd.dawn.common.exceptions.BaseExceptions;
 import edu.umd.dawn.common.exceptions.DawnException;
 import lombok.Getter;
@@ -22,6 +29,11 @@ public class JWTUtil {
         decode();
     }
 
+    public JWTUtil(String accessSecret) {
+        this.accessSecret = accessSecret;
+        initAlgorithm();
+    }
+
     private void initAlgorithm() {
         this.algorithm = Algorithm.HMAC256(accessSecret);
     }
@@ -39,6 +51,16 @@ public class JWTUtil {
         }
     }
 
+    private String create(Claims claims, int expMin) {
+        try {
+            String token = claims.fill(JWT.create()
+            .withIssuer("dawn")).withExpiresAt(LocalDateTime.now().plus(expMin, ChronoUnit.MINUTES).toInstant(ZoneOffset.UTC)).sign(algorithm);
+            return token;
+        } catch (Exception e) {
+            throw new DawnException(BaseExceptions.INVALID_JWT, e);
+        }
+    }
+
     public Claims getClaims() {
         return Claims.build(this);
     }
@@ -46,4 +68,19 @@ public class JWTUtil {
     public static JWTUtil parse(String accessSecret, String jwt) {
         return new JWTUtil(accessSecret, jwt);
     }
+
+    public static String issue(String accessSecret, Claims claims) {
+        JWTUtil util = new JWTUtil(accessSecret);
+        return util.create(claims, 20); // eventually move 20 to be a variable
+    }
+
+    public static String issue(String accessSecret, Claims claims, int expTime) {
+        JWTUtil util = new JWTUtil(accessSecret);
+        return util.create(claims, expTime);
+    }
+
+    public static String issue(String accessSecret, User user, int expTime) {
+        JWTUtil util = new JWTUtil(accessSecret);
+        return util.create(Claims.fromUser(user), expTime);
+    }
 }
-- 
GitLab