From de76ce8dd02ac0dffc04f3fbd1077dd05cb2ed8a Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Fri, 1 Sep 2023 11:34:58 +0530 Subject: [PATCH] fix: merge latest (#782) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: add exp and iat to JWT payloads without scientific notation (#765) * adding dev-v6.0.9 tag to this commit to ensure building * fix: fix handling of b64 and b64url encoded access tokens (#767) * adding dev-v6.0.10 tag to this commit to ensure building * Update release.md * Update release.md * fix: ee featureflag cron job (#778) * fix: ee featureflag cron job * fix: test * fix: tests * fix: tests * adding dev-v6.0.11 tag to this commit to ensure building * fix: test (#779) * adding dev-v6.0.11 tag to this commit to ensure building * fix: test (#780) * fix: test * fix: test * adding dev-v6.0.11 tag to this commit to ensure building * fix: test (#781) * adding dev-v6.0.11 tag to this commit to ensure building --------- Co-authored-by: Mihály Lengyel Co-authored-by: rishabhpoddar --- .github/ISSUE_TEMPLATE/release.md | 7 ++ CHANGELOG.md | 12 +++ build.gradle | 2 +- cli/jar/cli.jar | Bin 47546 -> 47546 bytes downloader/jar/downloader.jar | Bin 15229 -> 15229 bytes ee/jar/ee.jar | Bin 13259 -> 13262 bytes .../java/io/supertokens/ee/EEFeatureFlag.java | 4 +- jar/{core-6.0.8.jar => core-6.0.11.jar} | Bin 658492 -> 658527 bytes src/main/java/io/supertokens/Main.java | 3 +- .../supertokens/jwt/JWTSigningFunctions.java | 7 +- src/main/java/io/supertokens/utils/Utils.java | 3 +- .../java/io/supertokens/test/CronjobTest.java | 88 +++++++++++++++++- .../io/supertokens/test/FeatureFlagTest.java | 39 ++++++++ .../test/session/AccessTokenTest.java | 44 +++++++-- 14 files changed, 187 insertions(+), 22 deletions(-) rename jar/{core-6.0.8.jar => core-6.0.11.jar} (90%) diff --git a/.github/ISSUE_TEMPLATE/release.md b/.github/ISSUE_TEMPLATE/release.md index 3ef05dfdd..ad9f7269e 100644 --- a/.github/ISSUE_TEMPLATE/release.md +++ b/.github/ISSUE_TEMPLATE/release.md @@ -119,6 +119,7 @@ labels: - [ ] Change [checklist in contributing guide for which tables to pick when migrating data from dev to prod instance](https://test.supertokens.com/docs/contribute/checklists/saas/tables-to-consider-for-data-migration-dev-to-prod). - [ ] Update license key used for cores to include nea feature. - [ ] Update table schema in mysql / postgresql section for self hosted in docs + - [ ] Update API that returns the list of paid features in saas dashboard - [ ] [supertokens-node:X.Y](https://github.com/supertokens/supertokens-node/tree/X.Y) - [ ] [supertokens-golang:X.Y](https://github.com/supertokens/supertokens-golang/tree/X.Y) - [ ] [supertokens-website:X.Y](https://github.com/supertokens/supertokens-website/tree/X.Y) @@ -183,6 +184,12 @@ curl --location --request POST 'https://try.supertokens.com/recipe/dashboard/use --header 'Content-Type: application/json' \ --data-raw '{"email": "rishabh@supertokens.com","password": "abcd1234"}' +curl --location --request POST 'https://try.supertokens.com/recipe/dashboard/user' \ +--header 'rid: dashboard' \ +--header 'api-key: ' \ +--header 'Content-Type: application/json' \ +--data-raw '{"email": "demo@supertokens.com","password": "abcd1234"}' + curl --location --request PUT 'https://try.supertokens.com/recipe/multitenancy/tenant' \ --header 'Content-Type: application/json' \ --data-raw '{ diff --git a/CHANGELOG.md b/CHANGELOG.md index eb6a91080..a6cf0be20 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,6 +55,18 @@ ALTER TABLE emailpassword_pswd_reset_tokens ADD CONSTRAINT emailpassword_pswd_re ALTER TABLE emailpassword_pswd_reset_tokens ADD COLUMN email VARCHAR(256); ``` +## [6.0.11] - 2023-08-16 + +- Fixed feature flag cron job + +## [6.0.10] - 2023-08-16 + +- Fixed an encoding/decoding issue for certain access token payloads + +## [6.0.9] - 2023-08-14 + +- Now using decimal notation to add numbers into the access token payload (instead of scientific notation) + ## [6.0.8] - 2023-08-01 - Fixes CUD validation starting with number. diff --git a/build.gradle b/build.gradle index 49e9735c9..83265aeea 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ compileTestJava { options.encoding = "UTF-8" } // } //} -version = "6.0.8" +version = "6.0.11" repositories { diff --git a/cli/jar/cli.jar b/cli/jar/cli.jar index 68c5606cfed5c236f84078292f980153013e94b4..e34e8ae494be2f3da80e37a1880e7c62bb89902a 100644 GIT binary patch delta 835 zcmdn>nQ7N&Cf)#VW)?061`ZB}nLFht@~Sa|C^IiLAQjF41WX_T2$+F5Ghd&X0ae2? z9k7P01|VuO2ctcR-t5IVg%vFDkj)(|pv|5p1{Rni>k1aQBiqOe7Wf!%JbALVAXsp@ z_HHh)V5(UFSYU_Qenv2(%Hn|tSSHrj6D+XOcNxqEE8PZXb zEMSIt+;*@blRw70fCVfPW<&IX><&m{oy?a8(JPx)%EpK4@yUjrl9TPXaPgygeDkFo zABgdag=-0*4Yg4>6*z-U?m?XKZnTN zp2p6F%?+Fj!2!5gY2gouZ)6u+fOSSJ=789ryy62$U~<^XzYuzr37GC(1&)--=U3^0 z_>)#!frV{X+kxr2)xKc*-0DOyZL}s7On0rx1k>Nv1cPaxwW$z#ll0{CYt6xI&UMLP zI)7apn7*)XCYa7yUk#>Ttq%v&E*o;e^p*_}vw1c`%&yp&1{Qy~F#}BdYzhL?3pYW` z^#R(Yv>9So%w~w#q0Js(HN0COdds#z?6|PS3oI_XH5yD;Z-uz`@m7fYEw_b%#V2ip w=)b!SoW>>_Y=@XLb2~U?O@6u^B5$xG39NqV4mU7;ZwJI2lbw)oE8Xb|0NYwZ!2kdN delta 835 zcmdn>nQ7N&Cf)#VW)?061`ZB}zS)cudDWOfl$no;+Dw5G=S{ zdp8$YFx4yoEU?3DKO>k?W${1+EEDVN2^LuCy9{Q7@#OQt9Fu#4dB75Lf@|2o4CyFI z7BIs+ZadhJ$sglgzycNtvmtsxb_b-fPUcI4=#@uiSjbj@TZu#%6HpF?DB zPh;o8<_6A%-~imLwD1SSH?oT@z&axqb3p7*Uhx4WFga}HUkJU*1Wfm?0!PZ^^Q-hg z{7I{=z{0kx?Z9;1YF{vYZgnD>mkqgKddmig**qH|W>;)X1B*Z0m;t7JHU)v{g_|Je z`T*@x+6=KPW-~;*+*P w^xxeEPGge|wnNOBxgDIcCO_Q{kvG_p1Xe$FhZ~r_w*z91$xcYPmF{!}021~pSpWb4 diff --git a/downloader/jar/downloader.jar b/downloader/jar/downloader.jar index 80c8ebfa64d016bd47bfa2d87374e00376e4206f..7a4eb7a87fde8d5d767d1b0cca06eea336c1d5d6 100644 GIT binary patch delta 375 zcmexc_P2~Tz?+$ci-CcIgJI52`H8%0%pl6lOASbcGXMb-hyVg+AkNI!XJ$avuuKQ6 z;i@@^+RV?mk`2U|yqnz_EWpSS%nB9Ip6qMRGr5nK2P`p{_a+yZQ7O^K1ZHqaSAiLm z+hv`=0%v5WLuAqvjzbs*%5B^rsmVL_9KlNd>ajueuo>Ee1w0I^nZYWKnV5j-zb0Ub z$@ZptV19wA6_{RY>I$a6n#O|ZP_sZVz0xcLOpBO9_!;I&VE$S2958KT5e24aS_FXU iHx^l7I?@ti&Q42zFrV8BLdRNVg83({e8IG&bqWAfzJVM7 delta 375 zcmexc_P2~Tz?+$ci-CcIgJHsK#)-UY%pl6lOASbcGXMb-hyVg+AkNI!XJ$avuuKQ6 z;i@@^+RV?mk`2U|yqnz_EWpSS%nB9Ip6qMRGr5nK2P`p{_a+yZQ7O^K1ZHqaSAiLm z+hv`=0%v5WLuAqvjzbs*%5B^rsmVL_9KlNd>ajueuo>Ee1w0I^nZYWKnV5j-zb0Ub z$@ZptV19wA6_{RY>I$a6n#O|ZP_sZVz0xcLOpBO9_!;I&VE$S2958KT5e24aS_FXU iHx^l7I?@ti&Q42zFrV8BLdRNVg83({e8IG&bqWCNUUl36 diff --git a/ee/jar/ee.jar b/ee/jar/ee.jar index 7c0f3649f87184be4c642c8f5de301441097a5dd..11e6be2a9df4f3b12d7cba66182919b5b4903a32 100644 GIT binary patch delta 10063 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

Di6B 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 diff --git a/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java b/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java index 2b0a94dba..8efe42552 100644 --- a/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java +++ b/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java @@ -52,8 +52,8 @@ import java.util.List; public class EEFeatureFlag implements io.supertokens.featureflag.EEFeatureFlagInterface { - public static final int INTERVAL_BETWEEN_SERVER_SYNC = 1000 * 3600 * 24; // 1 day. - private static final long INTERVAL_BETWEEN_DB_READS = (long) 1000 * 3600 * 4; // 4 hour. + public static final int INTERVAL_BETWEEN_SERVER_SYNC = 3600 * 24; // 1 day (in seconds). + private static final long INTERVAL_BETWEEN_DB_READS = (long) 1000 * 3600 * 4; // 4 hour (in millis). public static final String REQUEST_ID = "licensecheck"; public static final String FEATURE_FLAG_KEY_IN_DB = "FEATURE_FLAG"; diff --git a/jar/core-6.0.8.jar b/jar/core-6.0.11.jar similarity index 90% rename from jar/core-6.0.8.jar rename to jar/core-6.0.11.jar index da52cfb58f0db043e7fde5056502f1b63586b75a..2704fcaef5d5bad97612a72005f23d0cb32f877a 100644 GIT binary patch delta 34569 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 delta 34206 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 jwtPayload = new Gson().fromJson(payload, HashMap.class); - if (jwksDomain != null) { - jwtPayload.putIfAbsent("iss", jwksDomain); + if (jwksDomain != null && !payload.has("iss")){ + payload.addProperty("iss", jwksDomain); } JWTCreator.Builder builder = com.auth0.jwt.JWT.create(); @@ -141,7 +140,7 @@ public static String createJWTToken(JWTSigningKey.SupportedAlgorithms supportedA if (jwksDomain != null) { builder.withIssuer(jwksDomain); } - builder.withPayload(jwtPayload); + builder.withPayload(payload.toString()); return builder.sign(signingAlgorithm); } diff --git a/src/main/java/io/supertokens/utils/Utils.java b/src/main/java/io/supertokens/utils/Utils.java index 1a0232180..37b5a9e98 100644 --- a/src/main/java/io/supertokens/utils/Utils.java +++ b/src/main/java/io/supertokens/utils/Utils.java @@ -77,8 +77,9 @@ public static String convertToBase64(String str) { return new String(Base64.getEncoder().encode(stringToBytes(str)), StandardCharsets.UTF_8); } + // This function deserializes both B64 and B64URL encodings public static String convertFromBase64(String str) { - return new String(Base64.getDecoder().decode(stringToBytes(str)), StandardCharsets.UTF_8); + return new String(Base64.getDecoder().decode(stringToBytes(str.replace("-", "+").replace("_", "/"))), StandardCharsets.UTF_8); } public static String throwableStacktraceToString(Throwable e) { diff --git a/src/test/java/io/supertokens/test/CronjobTest.java b/src/test/java/io/supertokens/test/CronjobTest.java index a9bf933b1..606ea745b 100644 --- a/src/test/java/io/supertokens/test/CronjobTest.java +++ b/src/test/java/io/supertokens/test/CronjobTest.java @@ -31,6 +31,7 @@ import io.supertokens.multitenancy.MultitenancyHelper; import io.supertokens.pluginInterface.STORAGE_TYPE; import io.supertokens.pluginInterface.Storage; +import io.supertokens.pluginInterface.authRecipe.AuthRecipeUserInfo; import io.supertokens.pluginInterface.multitenancy.*; import io.supertokens.pluginInterface.multitenancy.exceptions.TenantOrAppNotFoundException; import io.supertokens.storageLayer.StorageLayer; @@ -39,11 +40,9 @@ import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; +import org.reflections.Reflections; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import static org.junit.Assert.*; @@ -780,4 +779,85 @@ public void testThatCoreAutomaticallySyncsToConfigChangesInDb() throws Exception process.kill(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); } + + @Test + public void testThatNoCronJobIntervalIsMoreThanADay() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + if (StorageLayer.getStorage(process.getProcess()).getType() != STORAGE_TYPE.SQL) { + return; + } + + // ensure none of the tasks have an interval more than a day + for (CronTask task : Cronjobs.getInstance(process.getProcess()).getTasks()) { + assertTrue(task.getIntervalTimeSeconds() <= 3600 * 24); + assertTrue(task.getInitialWaitTimeSeconds() <= 3600 * 24); + } + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } + + @Test + public void testThatThereAreTasksOfAllCronTaskClassesAndHaveCorrectIntervals() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + if (StorageLayer.getStorage(process.getProcess()).getType() != STORAGE_TYPE.SQL) { + return; + } + + Reflections reflections = new Reflections("io.supertokens"); + Set> classes = reflections.getSubTypesOf(CronTask.class); + + Set classNames = new HashSet<>(); + + for (Class cls : classes) { + if (!cls.getName().contains("io.supertokens.test")) { + classNames.add(cls.getName()); + } + } + + // Note that the time is in seconds + Map intervals = new HashMap<>(); + intervals.put("io.supertokens.ee.cronjobs.EELicenseCheck", 86400); + intervals.put("io.supertokens.cronjobs.syncCoreConfigWithDb.SyncCoreConfigWithDb", 60); + intervals.put("io.supertokens.cronjobs.deleteExpiredSessions.DeleteExpiredSessions", 43200); + intervals.put("io.supertokens.cronjobs.deleteExpiredPasswordResetTokens.DeleteExpiredPasswordResetTokens", 3600); + intervals.put("io.supertokens.cronjobs.deleteExpiredEmailVerificationTokens.DeleteExpiredEmailVerificationTokens", 43200); + intervals.put("io.supertokens.cronjobs.deleteExpiredPasswordlessDevices.DeleteExpiredPasswordlessDevices", 3600); + intervals.put("io.supertokens.cronjobs.deleteExpiredTotpTokens.DeleteExpiredTotpTokens", 3600); + intervals.put("io.supertokens.cronjobs.deleteExpiredDashboardSessions.DeleteExpiredDashboardSessions", 43200); + intervals.put("io.supertokens.cronjobs.telemetry.Telemetry", 86400); + intervals.put("io.supertokens.cronjobs.deleteExpiredAccessTokenSigningKeys.DeleteExpiredAccessTokenSigningKeys", 86400); + + Map delays = new HashMap<>(); + delays.put("io.supertokens.ee.cronjobs.EELicenseCheck", 86400); + delays.put("io.supertokens.cronjobs.syncCoreConfigWithDb.SyncCoreConfigWithDb", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredSessions.DeleteExpiredSessions", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredPasswordResetTokens.DeleteExpiredPasswordResetTokens", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredEmailVerificationTokens.DeleteExpiredEmailVerificationTokens", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredPasswordlessDevices.DeleteExpiredPasswordlessDevices", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredTotpTokens.DeleteExpiredTotpTokens", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredDashboardSessions.DeleteExpiredDashboardSessions", 0); + delays.put("io.supertokens.cronjobs.telemetry.Telemetry", 0); + delays.put("io.supertokens.cronjobs.deleteExpiredAccessTokenSigningKeys.DeleteExpiredAccessTokenSigningKeys", 0); + + List allTasks = Cronjobs.getInstance(process.getProcess()).getTasks(); + assertEquals(10, allTasks.size()); + + for (CronTask task : allTasks) { + assertEquals(intervals.get(task.getClass().getName()).intValue(), task.getIntervalTimeSeconds()); + assertEquals(delays.get(task.getClass().getName()).intValue(), task.getInitialWaitTimeSeconds()); + } + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } } diff --git a/src/test/java/io/supertokens/test/FeatureFlagTest.java b/src/test/java/io/supertokens/test/FeatureFlagTest.java index c52221252..15be7c36e 100644 --- a/src/test/java/io/supertokens/test/FeatureFlagTest.java +++ b/src/test/java/io/supertokens/test/FeatureFlagTest.java @@ -21,6 +21,10 @@ import com.google.gson.JsonObject; import com.google.gson.JsonPrimitive; import io.supertokens.ProcessState; +import io.supertokens.cronjobs.CronTask; +import io.supertokens.cronjobs.CronTaskTest; +import io.supertokens.cronjobs.Cronjobs; +import io.supertokens.cronjobs.syncCoreConfigWithDb.SyncCoreConfigWithDb; import io.supertokens.emailpassword.EmailPassword; import io.supertokens.featureflag.EE_FEATURES; import io.supertokens.featureflag.FeatureFlag; @@ -35,6 +39,7 @@ import io.supertokens.session.Session; import io.supertokens.storageLayer.StorageLayer; import io.supertokens.test.httpRequest.HttpRequestForTesting; +import io.supertokens.test.multitenant.api.TestMultitenancyAPIHelper; import io.supertokens.webserver.WebserverAPI; import org.junit.*; import org.junit.rules.TestRule; @@ -702,4 +707,38 @@ public void testPaidFeaturesAreEnabledIfUsingInMemoryDatabase() throws Exception process.kill(); assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); } + + @Test + public void testNetworkCallIsMadeInCoreInit() throws Exception { + String[] args = {"../"}; + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + if (StorageLayer.getStorage(process.getProcess()).getType() != STORAGE_TYPE.SQL) { + return; + } + + if (StorageLayer.isInMemDb(process.getProcess())) { + return; + } + + // While adding license + TestMultitenancyAPIHelper.addLicense(OPAQUE_KEY_WITH_MULTITENANCY_FEATURE, process.getProcess()); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.LICENSE_KEY_CHECK_NETWORK_CALL)); + ProcessState.getInstance(process.getProcess()).clear(); + + process.kill(false); + + + // Restart core and check if the call was made during init + process = TestingProcessManager.start(args); + process.startProcess(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.LICENSE_KEY_CHECK_NETWORK_CALL)); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } } diff --git a/src/test/java/io/supertokens/test/session/AccessTokenTest.java b/src/test/java/io/supertokens/test/session/AccessTokenTest.java index 968c2a460..30247227a 100644 --- a/src/test/java/io/supertokens/test/session/AccessTokenTest.java +++ b/src/test/java/io/supertokens/test/session/AccessTokenTest.java @@ -18,6 +18,7 @@ import com.google.gson.Gson; import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import io.supertokens.ProcessState.EventAndException; import io.supertokens.ProcessState.PROCESS_STATE; import io.supertokens.exceptions.AccessTokenPayloadError; @@ -256,7 +257,8 @@ public void inputOutputTest() throws Exception { EventAndException e = process.checkOrWaitForEvent(PROCESS_STATE.STARTED); assertNotNull(e); JsonObject jsonObj = new JsonObject(); - jsonObj.addProperty("key", "value"); + String testValue = "asdf???123"; + jsonObj.addProperty("key", testValue); // db key long expiryTime = System.currentTimeMillis() + 1000; @@ -268,10 +270,15 @@ public void inputOutputTest() throws Exception { assertEquals("userId", info.recipeUserId); assertEquals("refreshTokenHash1", info.refreshTokenHash1); assertEquals("parentRefreshTokenHash1", info.parentRefreshTokenHash1); - assertEquals("value", info.userData.get("key").getAsString()); + assertEquals(testValue, info.userData.get("key").getAsString()); assertEquals("antiCsrfToken", info.antiCsrfToken); assertEquals(expiryTime / 1000 * 1000, info.expiryTime); + JsonObject payload = (JsonObject) new JsonParser() + .parse(io.supertokens.utils.Utils.convertFromBase64(newToken.token.split("\\.")[1])); + // This throws if the number is in scientific (E) format + assertEquals(expiryTime / 1000, Long.parseLong(payload.get("exp").toString())); + JWT.JWTPreParseInfo jwtInfo = JWT.preParseJWTInfo(newToken.token); assertNotNull(jwtInfo.kid); assertEquals(jwtInfo.version, AccessToken.getLatestVersion()); @@ -286,22 +293,29 @@ public void inputOutputTestStatic() throws Exception { EventAndException e = process.checkOrWaitForEvent(PROCESS_STATE.STARTED); assertNotNull(e); JsonObject jsonObj = new JsonObject(); - jsonObj.addProperty("key", "value"); + String testValue = "asdf???123"; + jsonObj.addProperty("key", testValue); // db key long expiryTime = System.currentTimeMillis() + 1000; TokenInfo newToken = AccessToken.createNewAccessToken(process.getProcess(), "sessionHandle", "userId", "refreshTokenHash1", "parentRefreshTokenHash1", jsonObj, "antiCsrfToken", expiryTime, AccessToken.getLatestVersion(), true); + System.out.println(newToken.token); AccessTokenInfo info = AccessToken.getInfoFromAccessToken(process.getProcess(), newToken.token, true); assertEquals("sessionHandle", info.sessionHandle); assertEquals("userId", info.recipeUserId); assertEquals("refreshTokenHash1", info.refreshTokenHash1); assertEquals("parentRefreshTokenHash1", info.parentRefreshTokenHash1); - assertEquals("value", info.userData.get("key").getAsString()); + assertEquals(testValue, info.userData.get("key").getAsString()); assertEquals("antiCsrfToken", info.antiCsrfToken); assertEquals(expiryTime / 1000 * 1000, info.expiryTime); + JsonObject payload = (JsonObject) new JsonParser() + .parse(io.supertokens.utils.Utils.convertFromBase64(newToken.token.split("\\.")[1])); + // This throws if the number is in scientific (E) format + assertEquals(expiryTime / 1000, Long.parseLong(payload.get("exp").toString())); + JWT.JWTPreParseInfo jwtInfo = JWT.preParseJWTInfo(newToken.token); assertNotNull(jwtInfo.kid); assertEquals(jwtInfo.version, AccessToken.getLatestVersion()); @@ -315,7 +329,8 @@ public void inputOutputTestV2() throws Exception { EventAndException e = process.checkOrWaitForEvent(PROCESS_STATE.STARTED); assertNotNull(e); JsonObject jsonObj = new JsonObject(); - jsonObj.addProperty("key", "value"); + String testValue = "asdf???123"; + jsonObj.addProperty("key", testValue); // db key long expiryTime = System.currentTimeMillis() + 1000; @@ -327,9 +342,15 @@ public void inputOutputTestV2() throws Exception { assertEquals("userId", info.recipeUserId); assertEquals("refreshTokenHash1", info.refreshTokenHash1); assertEquals("parentRefreshTokenHash1", info.parentRefreshTokenHash1); - assertEquals("value", info.userData.get("key").getAsString()); + assertEquals(testValue, info.userData.get("key").getAsString()); assertEquals("antiCsrfToken", info.antiCsrfToken); assertEquals(expiryTime, info.expiryTime); + + JsonObject payload = (JsonObject) new JsonParser() + .parse(io.supertokens.utils.Utils.convertFromBase64(newToken.token.split("\\.")[1])); + // This throws if the number is in scientific (E) format + assertEquals(expiryTime, Long.parseLong(payload.get("expiryTime").toString())); + process.kill(); } @@ -343,7 +364,8 @@ public void inputOutputTestv1() throws InterruptedException, InvalidKeyException EventAndException e = process.checkOrWaitForEvent(PROCESS_STATE.STARTED); assertNotNull(e); JsonObject jsonObj = new JsonObject(); - jsonObj.addProperty("key", "value"); + String testValue = "asdf???123"; + jsonObj.addProperty("key", testValue); // db key TokenInfo newToken = AccessToken.createNewAccessTokenV1(process.getProcess(), "sessionHandle", "userId", @@ -353,8 +375,14 @@ public void inputOutputTestv1() throws InterruptedException, InvalidKeyException assertEquals("userId", info.recipeUserId); assertEquals("refreshTokenHash1", info.refreshTokenHash1); assertEquals("parentRefreshTokenHash1", info.parentRefreshTokenHash1); - assertEquals("value", info.userData.get("key").getAsString()); + assertEquals(testValue, info.userData.get("key").getAsString()); assertEquals("antiCsrfToken", info.antiCsrfToken); + + JsonObject payload = (JsonObject) new JsonParser() + .parse(io.supertokens.utils.Utils.convertFromBase64(newToken.token.split("\\.")[1])); + // This throws if the number is in scientific (E) format + Long.parseLong(payload.get("expiryTime").toString()); + process.kill(); }