From c7f7186593ee8455234c7ba88eadc6ab086cdbdf Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Mon, 2 Sep 2024 16:01:33 +0530 Subject: [PATCH 1/8] fix: stats (#1033) * fix: stats * fix: test * fix: version --- CHANGELOG.md | 4 + build.gradle | 2 +- .../java/io/supertokens/ee/EEFeatureFlag.java | 102 ++++++++++-------- .../io/supertokens/test/FeatureFlagTest.java | 80 +++++++------- 4 files changed, 101 insertions(+), 87 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dd436509..d1d37c974 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased +## [9.2.1] - 2024-08-02 + +- Removes the stats that were resulting in high CPU consumption + ## [9.2.0] - 2024-08-20 - Adds `SECURITY` feature in `EE_FEATURES`. diff --git a/build.gradle b/build.gradle index b2f1a910d..b04ef0fcc 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ compileTestJava { options.encoding = "UTF-8" } // } //} -version = "9.2.0" +version = "9.2.1" repositories { diff --git a/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java b/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java index 4c959f6f8..b70b0c14d 100644 --- a/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java +++ b/ee/src/main/java/io/supertokens/ee/EEFeatureFlag.java @@ -200,29 +200,34 @@ private JsonObject getMFAStats() throws StorageQueryException, TenantOrAppNotFou // TODO: Active users are present only on public tenant and MFA users may be // present on different storages JsonObject result = new JsonObject(); - Storage[] storages = StorageLayer.getStoragesForApp(main, this.appIdentifier); - int totalUserCountWithMoreThanOneLoginMethod = 0; - int[] maus = new int[31]; + // Commenting out these stats for now as they are very CPU intensive and reduces the performance + // of other API calls while this is running. + // Also, we are not currently using these stats. - long now = System.currentTimeMillis(); + // Storage[] storages = StorageLayer.getStoragesForApp(main, this.appIdentifier); - for (Storage storage : storages) { - totalUserCountWithMoreThanOneLoginMethod += ((AuthRecipeStorage) storage) - .getUsersCountWithMoreThanOneLoginMethodOrTOTPEnabled(this.appIdentifier); + // int totalUserCountWithMoreThanOneLoginMethod = 0; + // int[] maus = new int[31]; - for (int i = 1; i <= 31; i++) { - long timestamp = now - (i * 24 * 60 * 60 * 1000L); + // long now = System.currentTimeMillis(); - // `maus[i-1]` since i starts from 1 - maus[i - 1] += ((ActiveUsersStorage) storage) - .countUsersThatHaveMoreThanOneLoginMethodOrTOTPEnabledAndActiveSince(appIdentifier, timestamp); - } - } + // for (Storage storage : storages) { + // totalUserCountWithMoreThanOneLoginMethod += ((AuthRecipeStorage) storage) + // .getUsersCountWithMoreThanOneLoginMethodOrTOTPEnabled(this.appIdentifier); - result.addProperty("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled", - totalUserCountWithMoreThanOneLoginMethod); - result.add("mauWithMoreThanOneLoginMethodOrTOTPEnabled", new Gson().toJsonTree(maus)); + // for (int i = 1; i <= 31; i++) { + // long timestamp = now - (i * 24 * 60 * 60 * 1000L); + + // // `maus[i-1]` since i starts from 1 + // maus[i - 1] += ((ActiveUsersStorage) storage) + // .countUsersThatHaveMoreThanOneLoginMethodOrTOTPEnabledAndActiveSince(appIdentifier, timestamp); + // } + // } + + // result.addProperty("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled", + // totalUserCountWithMoreThanOneLoginMethod); + // result.add("mauWithMoreThanOneLoginMethodOrTOTPEnabled", new Gson().toJsonTree(maus)); return result; } @@ -305,36 +310,41 @@ private JsonObject getAccountLinkingStats() throws StorageQueryException, Tenant } result.addProperty("usesAccountLinking", usesAccountLinking); - if (!usesAccountLinking) { - result.addProperty("totalUserCountWithMoreThanOneLoginMethod", 0); - JsonArray mauArray = new JsonArray(); - for (int i = 0; i < 31; i++) { - mauArray.add(new JsonPrimitive(0)); - } - result.add("mauWithMoreThanOneLoginMethod", mauArray); - return result; - } - - int totalUserCountWithMoreThanOneLoginMethod = 0; - int[] maus = new int[31]; - - long now = System.currentTimeMillis(); - - for (Storage storage : storages) { - totalUserCountWithMoreThanOneLoginMethod += ((AuthRecipeStorage) storage).getUsersCountWithMoreThanOneLoginMethod( - this.appIdentifier); - - for (int i = 1; i <= 31; i++) { - long timestamp = now - (i * 24 * 60 * 60 * 1000L); - - // `maus[i-1]` because i starts from 1 - maus[i - 1] += ((ActiveUsersStorage) storage).countUsersThatHaveMoreThanOneLoginMethodAndActiveSince( - appIdentifier, timestamp); - } - } - result.addProperty("totalUserCountWithMoreThanOneLoginMethod", totalUserCountWithMoreThanOneLoginMethod); - result.add("mauWithMoreThanOneLoginMethod", new Gson().toJsonTree(maus)); + // Commenting out these stats for now as they are very CPU intensive and reduces the performance + // of other API calls while this is running. + // Also, we are not currently using these stats. + + // if (!usesAccountLinking) { + // result.addProperty("totalUserCountWithMoreThanOneLoginMethod", 0); + // JsonArray mauArray = new JsonArray(); + // for (int i = 0; i < 31; i++) { + // mauArray.add(new JsonPrimitive(0)); + // } + // result.add("mauWithMoreThanOneLoginMethod", mauArray); + // return result; + // } + + // int totalUserCountWithMoreThanOneLoginMethod = 0; + // int[] maus = new int[31]; + + // long now = System.currentTimeMillis(); + + // for (Storage storage : storages) { + // totalUserCountWithMoreThanOneLoginMethod += ((AuthRecipeStorage) storage).getUsersCountWithMoreThanOneLoginMethod( + // this.appIdentifier); + + // for (int i = 1; i <= 31; i++) { + // long timestamp = now - (i * 24 * 60 * 60 * 1000L); + + // // `maus[i-1]` because i starts from 1 + // maus[i - 1] += ((ActiveUsersStorage) storage).countUsersThatHaveMoreThanOneLoginMethodAndActiveSince( + // appIdentifier, timestamp); + // } + // } + + // result.addProperty("totalUserCountWithMoreThanOneLoginMethod", totalUserCountWithMoreThanOneLoginMethod); + // result.add("mauWithMoreThanOneLoginMethod", new Gson().toJsonTree(maus)); return result; } diff --git a/src/test/java/io/supertokens/test/FeatureFlagTest.java b/src/test/java/io/supertokens/test/FeatureFlagTest.java index 39f079c72..2cc0276de 100644 --- a/src/test/java/io/supertokens/test/FeatureFlagTest.java +++ b/src/test/java/io/supertokens/test/FeatureFlagTest.java @@ -193,14 +193,14 @@ public void testThatCallingGetFeatureFlagAPIReturnsMfaStats() throws Exception { assert maus.get(29).getAsInt() == 0; JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); - int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); - JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); +// JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// +// assert mfaMaus.size() == 31; +// assert mfaMaus.get(0).getAsInt() == 0; +// assert mfaMaus.get(29).getAsInt() == 0; - assert mfaMaus.size() == 31; - assert mfaMaus.get(0).getAsInt() == 0; - assert mfaMaus.get(29).getAsInt() == 0; - - assert totalMfaUsers == 0; +// assert totalMfaUsers == 0; } // First register 2 users for emailpassword recipe. @@ -253,15 +253,15 @@ public void testThatCallingGetFeatureFlagAPIReturnsMfaStats() throws Exception { assert maus.get(0).getAsInt() == 2; // 2 users have signed up assert maus.get(29).getAsInt() == 2; - JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); - int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); - JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); - - assert mfaMaus.size() == 31; - assert mfaMaus.get(0).getAsInt() == 1; // only 1 user has TOTP enabled - assert mfaMaus.get(29).getAsInt() == 1; - - assert totalMfaUsers == 1; +// JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); +// int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); +// JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// +// assert mfaMaus.size() == 31; +// assert mfaMaus.get(0).getAsInt() == 1; // only 1 user has TOTP enabled +// assert mfaMaus.get(29).getAsInt() == 1; +// +// assert totalMfaUsers == 1; } { @@ -299,14 +299,14 @@ public void testThatCallingGetFeatureFlagAPIReturnsMfaStats() throws Exception { { JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); - int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); - JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); - - assert mfaMaus.size() == 31; - assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user - assert mfaMaus.get(29).getAsInt() == 2; - - assert totalMfaUsers == 2; +// int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); +// JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// +// assert mfaMaus.size() == 31; +// assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user +// assert mfaMaus.get(29).getAsInt() == 2; +// +// assert totalMfaUsers == 2; } // Add TOTP to the linked user @@ -342,14 +342,14 @@ public void testThatCallingGetFeatureFlagAPIReturnsMfaStats() throws Exception { { // MFA stats should still count 2 users JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); - int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); - JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); - - assert mfaMaus.size() == 31; - assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user - assert mfaMaus.get(29).getAsInt() == 2; - - assert totalMfaUsers == 2; +// int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); +// JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// +// assert mfaMaus.size() == 31; +// assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user +// assert mfaMaus.get(29).getAsInt() == 2; +// +// assert totalMfaUsers == 2; } } @@ -378,14 +378,14 @@ public void testThatCallingGetFeatureFlagAPIReturnsMfaStats() throws Exception { { // MFA stats should still count 2 users JsonObject mfaStats = usageStats.get("mfa").getAsJsonObject(); - int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); - JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); - - assert mfaMaus.size() == 31; - assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user - assert mfaMaus.get(29).getAsInt() == 2; - - assert totalMfaUsers == 2; +// int totalMfaUsers = mfaStats.get("totalUserCountWithMoreThanOneLoginMethodOrTOTPEnabled").getAsInt(); +// JsonArray mfaMaus = mfaStats.get("mauWithMoreThanOneLoginMethodOrTOTPEnabled").getAsJsonArray(); +// +// assert mfaMaus.size() == 31; +// assert mfaMaus.get(0).getAsInt() == 2; // 1 TOTP user + 1 account linked user +// assert mfaMaus.get(29).getAsInt() == 2; +// +// assert totalMfaUsers == 2; } } From 95d2fddbad4ed70afcc25800db0ce6e9eade2878 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Mon, 2 Sep 2024 16:02:42 +0530 Subject: [PATCH 2/8] adding dev-v9.2.1 tag to this commit to ensure building --- cli/jar/cli.jar | Bin 47547 -> 47547 bytes downloader/jar/downloader.jar | Bin 15229 -> 15229 bytes ee/jar/ee.jar | Bin 14572 -> 13874 bytes jar/{core-9.2.0.jar => core-9.2.1.jar} | Bin 796034 -> 796034 bytes 4 files changed, 0 insertions(+), 0 deletions(-) rename jar/{core-9.2.0.jar => core-9.2.1.jar} (94%) diff --git a/cli/jar/cli.jar b/cli/jar/cli.jar index 4d82d2732b2f6873b3ee630ec0bc01432df0464b..c3306c60fc9c62acf48d5a8448c03b082df92d19 100644 GIT binary patch delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZAe{|2RrylTuK%FIg*NJTOL0TYM-0%jo2%-3gTK-I8J z2dv?$0f?H+!DtVnH+wNoVFe33WOD}#XtSq@fd!_>x`GAn$TsqV1roGfzyiy)cXNRS zQq2Ou0z1t1GlCga77s%V4G(PreY$F}W|82P`o+xP}ePkcpCH0W&P( zwu23soSzzC;#|o_Ka*hv+ASe{P52Wo#V`X4? z01PIb$q#chH%Athv4W*Q0Rsyl`N@gFVv_^5^6;aD(PqK&7_iqi7c{mrfzAHaoC{%O zwe5m1)H|CY-d{V}32b!C^Ba360?j_j!oXk+G+KPK_>@BswRfhmL)1Q70CB4F!XFS{ z$}P44n;*HD1LDJ!6(2wXlfzg3h0v=^z;xd#a70bMuu2ciXIu?7X|mmFJ21a~wJ(@H zzd8|28?Olk)7@(_!Swev!C=~VZ7PJ`Bt7}UT5~X)Yh5y!E?5@_rZ29W38r(`SA*%- z>%+mc>xNt~y>$b`Y~GC!vnw~IfyEzf%mCBAn}WdfqD>HUeSvlye$Q$lR0;`|4!wpQ|-vKelbSEU-%67T}0A2qbr~m)} delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZAefmD%+ylTuK%FIg*NJTOL0TYM-0%jo2%-3gTK-I8J z2dv?$0f?H+!DtVnH+wNoVFe33WOD}#XtSq@fd!_>x`GAn$TsqV1roGfzyiy)cXNRS zQq2Ou0z1t1GlCga77s%V4G(PreY$F}W|82P`o+xP}ePkcpCH0W&P( zwu23soSzzC;#|o_Ka*hv+ASe{P52Wo#V`X4? z01PIb$q#chH%Athv4W*Q0Rsyl`N@gFVv_^5^6;aD(PqK&7_iqi7c{mrfzAHaoC{%O zwe5m1)H|CY-d{V}32b!C^Ba360?j_j!oXk+G+KPK_>@BswRfhmL)1Q70CB4F!XFS{ z$}P44n;*HD1LDJ!6(2wXlfzg3h0v=^z;xd#a70bMuu2ciXIu?7X|mmFJ21a~wJ(@H zzd8|28?Olk)7@(_!Swev!C=~VZ7PJ`Bt7}UT5~X)Yh5y!E?5@_rZ29W38r(`SA*%- z>%+mc>xNt~y>$b`Y~GC!vnw~IfyEzf%mCBAn}WdfqD>HUeSvlye$Q$lR0;`|4!wpQ|-vKelbSEU-%67T}04qNE*#H0l diff --git a/downloader/jar/downloader.jar b/downloader/jar/downloader.jar index 0ff7c3df95cae318496bb74e5b041e59fc3b7634..728c1694963fd077ab49fbcc9ea0aadfef27c3d9 100644 GIT binary patch delta 375 zcmexc_P2~Tz?+$ci-CcIgCVd%X(F#0Gl(+tQUg+v3_!pHB7lGyh%@u`nHf+uEYksN zxM~ifHuE#CWCJlK?`C%f3ovp7vqA;5C;OW7Ozz|50ZYu~y~zb;R7&(Qff-!VRba;C zc3CH|z!}-;5ScWE;}C{{avL{DYVuA!N3fE=dTbCqY=-t=0T07!X0VE5CMIC|uL)RU zvc0Jum|tLO1*X@Ux`OGirmoM1kp<76D-T ijYSrijiY_F@YIe z(p6x_dU;z)qYG#lRCLc2~ z0n>j?z!H<~P4&P!3rwxR^jcF_F#Xju7EFhl1%m07W*J~w#2muUFi!&W&zk3eX&Z|u oFg?>E08GEJ$O6-mmJoAxTKa?e+*S}e)+!UsKWXI)rX{UY04ptAk^lez diff --git a/ee/jar/ee.jar b/ee/jar/ee.jar index 5b0af492a97855bb59d1086dcff35876be3efd14..3e5e5592bada84333791584f0ce3e8c3525085f2 100644 GIT binary patch delta 11642 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 n@sa48NJNmx>2T(L> delta 12309 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 diff --git a/jar/core-9.2.0.jar b/jar/core-9.2.1.jar similarity index 94% rename from jar/core-9.2.0.jar rename to jar/core-9.2.1.jar index 8208f5d3a9903b64942f89cca94c27858f1e457f..597a678676820f04c87bad5e71130dca035b069c 100644 GIT binary patch delta 9367 zcmZWu2Ut|c_TRmG@7>)ymoA{vR%{_gCC_N=Jr+a-;}bD<-xCWOF;*-fAQmEmC=dMrNjMRla3a_#tcyj~OeUMn z6dE6x?o`Xth5gegq*kZ+z(^DOBk}*RKNj|P`1kcKrvF#ql0Sc8VUp<=8}Wbgoy})m zILNr|8Vvtda%<+yEv-HOA*`C&WV&dk@k7m?bXFp9p#@Glp-&P?VE$&eI%Y6%-F>nK zpts*t+0vO=x?HUxSaJ#M3XB1PnN|R=gQ&9`lZZU9ckr=(c9UtFm&sHsqfOg@{KCdD zc4y8yJK*Z(b1d@4cDnzX#WQ2zSUatoOl1j%{CQm#5s0Q{L?jSqL>LMOw0jk^1I#|1L$r+1{d8bY>zC;a@?OzhAdpAX z7pM6uCet+M%oU0!Et^Z4=I@QJ1vWBDVtRpA>#>PQI6Sc@5d0>6L_)yyK0uf{T~~R7 z@>7z+RZgL2CCx!|9kQI!Iz`KHNV)9I z>po^EL8U~$7inyodMGq&gzU*&=SROS#4ziaX$!u6kYDWcnd3BRGQfeKDzPw3=g1^`qDscHmol3Y=&-7gYFbYqKThz|WK zHNiR*9g|{^+wqiiu@bllxFgL$?#BDlPUJ@YA-Q1slV3 zW6OU~<6Se$4eV8M3rimyrN(V6?ufd!w?xCB8@oGLDo}S@XKsa$TyYo6EX9dW>9Uf+ z!$z_xJxk9AW~_cWhj<(WdBL9J? z!c|Vk4$SowG&<@L+XJ9`s*0@9P2MsNSAn;D5B=PYXi~Wi^D|7MxeM(gNG6<$M*I87 zrxDfnlNXqs+0u+G@S8FqfvJ>AG(Cx}kkB2(&oBqbKY}1lbI45~t&d61#!01*-&awb{R!@$Q0fjb@8(G2mhlJ)0 zeqm!fSb?jEmhB`eE!{;tjeSk!of1e-Z6SZ713J`M4)o)Q-J}j`kCI)1>>DMw02jP@ zUjr#~g!~B88yTO_B9a9gC(-Z@tRjv*q^5B!T4o!WhgW~J{0s%3j_rP9H4{9C?PYSr z=sre1j&i@jGcm{X@iLx*ljG&Sm|2}zIR+42IbCiCDekM^`9ghW_j8H1 zNtC}ZeB(Yfds4hyfGIXgl)IvzTQuXW2~%=4*D@)t^!&9yvT-ff68kVC_|%y36>RA zO{N(gY58i_hcT&&mU)c0u-i&mR~3YJ`YN&hfEqPZ`Z)p0?4;zOZ@AN$mNT6cqCgpF z*bKJqZ=EKUX`vt)r$dyD3TRFZQ+%v|mP9Cd@IWxS^;c>j8vie)6j9VjYdf}M z2P-=~uGBnP^90LAN{liD&6H14au8+3EB8=&_AKRBK>Vt03Et9El}gB5w@~>2WuWVq zE1iM)a=DUY2b8^53B(kSZ&l`MK#M3;%F#oYBZ?2^_~Z`e=uVdwDPB;@!QDOPJ!f%t zb*Jgk62$3Fi;LJwi7p}z!|j6d9<8`tSF#CM-dUoAVkrFCLc@Yp58A8@%V>m@DdjjX zEng}tF!r18lp+rT%_s-My3mxzb)PEtjrrJ5Rt-eTOPULwg|W5AzrmnWgDI!=dW^AGfqI`UFu1U+qz#}iL~`6)V*kKM3E{6+5eh4 z0lD;^x*NH@9;*i0b1hf>1Htl_9@cMh0%rMJw~8iLw=O_bRNE?}?zMW>16cl*jjg|9 z1hZOM-(bG{n+|^C;T@}vdAK}e19z;06_dHr!MYCjR$?z}5{9M?vVQlMp@Y)9rdk!c zbhyykFx+|>14xRo#$glGSnEO5Kbd6pu*1ltKD^QMgw14nS_xjse0ew<%+zzCLaqJL z5u6rB8S$kbBuxk1^MlIv-gYvXBCFG^J?u*swmApIup%Df3zk!K?*~T8nxFlqrNI$ zxStGo8DBfu@?huEM=rLGAUt)%;lKb__Pz{)XG-vM;$w_)wKc-Ka=pXW8JqedDkI%b zHJOT>=>AY!un}C_))X5*s;*7LUdA@JwZby(?reL7%YA#OEdeXhthcQvAj+P|4xXw9 zef)}zxbtZZr{eYy+cmVgcZBUd)@tu~+Y0RYfN8dgcsi~o*xJIp`X|~xplU#x?J6p~ zTVk7x!B5<1JBzfC?Y6a8o8r6*={!qgqYI=9r3rY$zRd1@OWcj-hium|0G|`K>saBp z7i{$q)%ne)pydWnZIO5;=0CH2hv7YWV;g}}#V=qQ_MYf}`&!6P?jp&aS_Pg3wS4V2 z@nvnRZ*S%ePo@qX?AzhHwDGaCy(hkUdv&!Bl|ZAgyS*D;ZLZ<=CXjw;xV>L3K$|Ao zfAHprKO`J<-(tHrzW2D-Ve{<~c>5kmv(Lr0bkDGVi?r;8_6bPyr}j8Rs}|eYcTukU zYKc7xpMZmw*$1Ql-uKxZvqI5r^yzZ3oZc_D-^aCgf3>~de_vM)nxe9wCuYwO4Gv#x zpKXI|uK!}M1-}LuN`XBeGc4F+Ki~(i`S@bH7xaNHzHR>!@;Y_f-W(#*@7NdN6HMy; zACEe0&PyzK0gtikb&S%x_J){5?fdqheLRQvt;bBHm;0) z+>9CK?j@CI_gwaL-rP&8ir(SdevT_E^MALi(pzIcRPZ#1M`|VL>B+$ke+IDckv@I! z>C82Z>ECHh;DyZJ?G8F-hUWA?Gg~o9TZSfP)A)vj)%yz6yPk16R;!Jremzy|C^<2Q zk;OG1?Ap#EF3X&()u+?Eb(@hGr{SxZKfu~USagP#i~%|lwcCi~nOa};(@m*zb`rA@ zE{XechE~~Fnyh6bd(+!}PrhYrFNqF%%)Y|0s4E*&W^1u%=k*+I0-~4{Z7!k@KWe2I zY1w@33erxbYnMNVXtH-}tC8EKP-DNC@xmQHsLjXT_dTLb!&waDKaa2uDYV~R?JsM~ z@3i*O8MFd!XsglsufJ(E!4hS6OebJAzN@7p^W;5k4j{^o(pQ`bk9O)ho-LvVA2;;n%a`Q#DO0dLOw^gSzXCTFhy5~ zk=Bsh{V?(~o~-!;N&iYfD;r0ip~v4Rl0m2da~4)pclz6}OMG%-Glw)OVbk>kyS4ap znhVh-HFSUDY%D29JBOx`FA=?tBa6)z_G>F$ID=pbPs|{#_->(238WqrwPgZn3Y4tF z#D``kkRbSUAc1@fpmHK<2_Q0&bOw-}NG1UAPa+WjCMA)+d?(S%Nu(W6{AQBx08E)l zCIP6JNy0%UBw2tJ$>g8NN+!JlgwG;lL8eIxi{+rmy81zv-mFnt5Srqx<8V^Kw0o3Ne19Ej|>BlJdZ4Z z;`pSJE&NR{$C=hRrbP;c4 zx(I4tIvEQ5pao18JK$U!7!jppDyWp(GE`A;Ms zK;cg$2|$O%WHNvQi-pV=OUQJfKGU4lwWo+I!tMzgb zRQ7Tq?7M>e8(2vzgk@zV8!9dwzmm)XpsgZ(07R`K(Eu*3BI^MpWRdXz-e!>$0JHx? zW&qGvlPLh^t|rR?e7=U&pIiQE4VehQJzIo2DVueKvu6rqMbQ2VloKG9N(5de#Td+PGfSr^W`6>Cz2COWr8JsExwug^eQA9-BllFK!~S zV5dh8D+?dVq8!p4K+VnKoXp=We3fk`VZdtli#Qo8e<1^bBIS}X0LJGs86Fs$Umtom zm(+q!dLHQppkJOCx7~T7S1@;Vw}`pxvqf~Sa0@%w+>m#^sOHRkcCt97EMKG=wUvwl z%H^#h#Kzl%`t4tt`yJcZ#^M^K+eF=FY$vmUq8sdVa#ohXD!?xW{~c@*amtEAOf_Q% z`2s#2*dcQD-^qM%!ML5cis^x!ECo)fyo()C4x)Fl)5}4@E*3op9tETafMEq}3vkNz z0=5e|cvV0;0$>$@XAPaRn{|w{p6zDGl!Kmo*x+!mYY$6|gMhuP}6BWDGon& zLd}Jw4#Zo(kfp)Na|(sV(?Stl+kGSkWVUm_Wj^08z>57s>-B!21y&~=U{<-{&j*m7 zd5|@O6Gk5t-p?NtWodATwTH7<{V=Zwhgj)21#X1_zp`6_e@gjPl#TVMJ5U-N7FL-c zyj$pl!(;@o{&|G$8LpLkL{!4-DCq^1?>~W~M}_5(mivM_)O*5CVoMT&ugR$pCSMHx<^UW!}&Xex}%~`X;*_Q?D(I?RDilF3O5i%}UMF`WcisIbADn_ZxH6gtD8aw>lpi{Bv&%cXB zxvmt8BD2=`(1F(p{9a6#ToZ88nOxI3b@Pw$9wMBEjVaqzC_M#FoeKiT($ zL;v5|rsj55{VsY~>As+3-WP$JOW0!NG9ydG*k3IX1#13)T}7OA_<_*s^ibr)8rl_D zu78MlCjY_KIv2k62N?|@{E=Yo`UI*!7M5XfvL1`Ux%pUh|C=YGSvgPG70itVJryAP zsVI_9sgOx56+L)XDyE2CxIQ$dj5G$-O=ZHFOSwpFTDb`EUb)y3tn;kB&qPO-KNBM& zJr}hd{ajS(>LsyRU`$4sQfl|3*ab`d0XfeJkR<`Bn^0=sO{k|4!KP{gb^SxaG-z ziuHElPtp@8uv1&S7dv(2dsaoh$m12lq4wkC4Dwf zVk~+p07=&I6vfJVB9A6h(QylnQS`PTvQ5!(aa&a#Z$P-jC#gDo&!gF@j*s&9oX^Am z)~fe_@Yh-O_CP7M>R6^wn~rTuwdo;XzSySYV7ImFxPmv>_0GV8HSVVAxW?OPdOsj% zX*ymP&O{Vo4AF6SohCY7oDFmxPYDcdp|0c5zSVWyq2rwN1Tgl-Nyj^5w6i`1D36_m zjc^x6ftI<5$RP0^t|IX`R~;{pN3J^F5TzItu2!Hz)(0K@&n92NNKcrjG<7yX;+uSbB)C4V6UFS>RCI(`R@4bYQ-Z+3`E zk8p^oIp+}3H>@V=l2c7|G%!%_23kJ^ic0++C>(aIF4D-W{waC>4h*g#IyRt&DBzJA MI=)B(Yw83456S=cNB{r; delta 9367 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%0D3X2sHEb%Pa{PFizg8XW6^}t{07C+( zj`9LDd4%ub5*P$yN*StnUvw-UuAs}f~2 uI9S6q^oL-I)bGKhuuWxhBd795=Z!ruv Date: Wed, 4 Sep 2024 16:49:29 +0530 Subject: [PATCH 3/8] fix: index for MAU (#1034) --- CHANGELOG.md | 20 ++++++++++++++++++- build.gradle | 2 +- .../queries/ActiveUsersQueries.java | 5 +++++ .../inmemorydb/queries/GeneralQueries.java | 4 ++++ 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1d37c974..001af5c22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,25 @@ to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased -## [9.2.1] - 2024-08-02 +## [9.2.2] - 2024-09-04 + +- Adds index on `last_active_time` for `user_last_active` table to improve the performance of MAU computation. + +### Migration + +If using PostgreSQL, run the following SQL script: + +```sql +CREATE INDEX IF NOT EXISTS user_last_active_last_active_time_index ON user_last_active (last_active_time DESC, app_id DESC); +``` + +If using MySQL, run the following SQL script: + +```sql +CREATE INDEX user_last_active_last_active_time_index ON user_last_active (last_active_time DESC, app_id DESC); +``` + +## [9.2.1] - 2024-09-02 - Removes the stats that were resulting in high CPU consumption diff --git a/build.gradle b/build.gradle index b04ef0fcc..c565f1bdc 100644 --- a/build.gradle +++ b/build.gradle @@ -19,7 +19,7 @@ compileTestJava { options.encoding = "UTF-8" } // } //} -version = "9.2.1" +version = "9.2.2" repositories { diff --git a/src/main/java/io/supertokens/inmemorydb/queries/ActiveUsersQueries.java b/src/main/java/io/supertokens/inmemorydb/queries/ActiveUsersQueries.java index 3daf34809..aa065acf1 100644 --- a/src/main/java/io/supertokens/inmemorydb/queries/ActiveUsersQueries.java +++ b/src/main/java/io/supertokens/inmemorydb/queries/ActiveUsersQueries.java @@ -23,6 +23,11 @@ static String getQueryToCreateUserLastActiveTable(Start start) { + " );"; } + static String getQueryToCreateLastActiveTimeIndexForUserLastActiveTable(Start start) { + return "CREATE INDEX user_last_active_last_active_time_index ON " + + Config.getConfig(start).getUserLastActiveTable() + "(last_active_time DESC, app_id DESC);"; + } + public static int countUsersActiveSince(Start start, AppIdentifier appIdentifier, long sinceTime) throws SQLException, StorageQueryException { String QUERY = "SELECT COUNT(*) as total FROM " + Config.getConfig(start).getUserLastActiveTable() diff --git a/src/main/java/io/supertokens/inmemorydb/queries/GeneralQueries.java b/src/main/java/io/supertokens/inmemorydb/queries/GeneralQueries.java index 57b11eafd..edf7a7f11 100644 --- a/src/main/java/io/supertokens/inmemorydb/queries/GeneralQueries.java +++ b/src/main/java/io/supertokens/inmemorydb/queries/GeneralQueries.java @@ -245,6 +245,10 @@ public static void createTablesIfNotExists(Start start, Main main) throws SQLExc if (!doesTableExists(start, Config.getConfig(start).getUserLastActiveTable())) { getInstance(main).addState(CREATING_NEW_TABLE, null); update(start, ActiveUsersQueries.getQueryToCreateUserLastActiveTable(start), NO_OP_SETTER); + + // index + update(start, ActiveUsersQueries.getQueryToCreateLastActiveTimeIndexForUserLastActiveTable(start), + NO_OP_SETTER); } if (!doesTableExists(start, Config.getConfig(start).getAccessTokenSigningKeysTable())) { From 635254ace2a3dab41d9aae288d006ee0910b61cb Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Wed, 4 Sep 2024 16:51:48 +0530 Subject: [PATCH 4/8] adding dev-v9.2.2 tag to this commit to ensure building --- cli/jar/cli.jar | Bin 47547 -> 47547 bytes downloader/jar/downloader.jar | Bin 15229 -> 15229 bytes ee/jar/ee.jar | Bin 13874 -> 13874 bytes jar/{core-9.2.1.jar => core-9.2.2.jar} | Bin 796034 -> 796129 bytes 4 files changed, 0 insertions(+), 0 deletions(-) rename jar/{core-9.2.1.jar => core-9.2.2.jar} (90%) diff --git a/cli/jar/cli.jar b/cli/jar/cli.jar index c3306c60fc9c62acf48d5a8448c03b082df92d19..1b8e8254186d8eaddffcf0410c7714ac0bcc8fe3 100644 GIT binary patch delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZB}qBfO@ylTuK%FIg*NJTOL0TYM-0%jo2%-3gTK-I8J z2dv?$0f?H+!DtVnH+wNoVFe33WOD}#XtSq@fd!_>x`GAn$TsqV1roGfzyiy)cXNRS zQq2Ou0z1t1GlCga77s%V4G(PreY$F}W|82P`o+xP}ePkcpCH0W&P( zwu23soSzzC;#|o_Ka*hv+ASe{P52Wo#V`X4? z01PIb$q#chH%Athv4W*Q0Rsyl`N@gFVv_^5^6;aD(PqK&7_iqi7c{mrfzAHaoC{%O zwe5m1)H|CY-d{V}32b!C^Ba360?j_j!oXk+G+KPK_>@BswRfhmL)1Q70CB4F!XFS{ z$}P44n;*HD1LDJ!6(2wXlfzg3h0v=^z;xd#a70bMuu2ciXIu?7X|mmFJ21a~wJ(@H zzd8|28?Olk)7@(_!Swev!C=~VZ7PJ`Bt7}UT5~X)Yh5y!E?5@_rZ29W38r(`SA*%- z>%+mc>xNt~y>$b`Y~GC!vnw~IfyEzf%mCBAn}WdfqD>HUeSvlye$Q$lR0;`|4!wpQ|-vKelbSEU-%67T}05s|>Z~y=R delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZAe{|2RrylTuK%FIg*NJTOL0TYM-0%jo2%-3gTK-I8J z2dv?$0f?H+!DtVnH+wNoVFe33WOD}#XtSq@fd!_>x`GAn$TsqV1roGfzyiy)cXNRS zQq2Ou0z1t1GlCga77s%V4G(PreY$F}W|82P`o+xP}ePkcpCH0W&P( zwu23soSzzC;#|o_Ka*hv+ASe{P52Wo#V`X4? z01PIb$q#chH%Athv4W*Q0Rsyl`N@gFVv_^5^6;aD(PqK&7_iqi7c{mrfzAHaoC{%O zwe5m1)H|CY-d{V}32b!C^Ba360?j_j!oXk+G+KPK_>@BswRfhmL)1Q70CB4F!XFS{ z$}P44n;*HD1LDJ!6(2wXlfzg3h0v=^z;xd#a70bMuu2ciXIu?7X|mmFJ21a~wJ(@H zzd8|28?Olk)7@(_!Swev!C=~VZ7PJ`Bt7}UT5~X)Yh5y!E?5@_rZ29W38r(`SA*%- z>%+mc>xNt~y>$b`Y~GC!vnw~IfyEzf%mCBAn}WdfqD>HUeSvlye$Q$lR0;`|4!wpQ|-vKelbSEU-%67T}0A2qbr~m)} diff --git a/downloader/jar/downloader.jar b/downloader/jar/downloader.jar index 728c1694963fd077ab49fbcc9ea0aadfef27c3d9..ba570be87c852a6d0432a929574d229a55db8a19 100644 GIT binary patch delta 375 zcmexc_P2~Tz?+$ci-CcIgQ28NWg@Q{Gl(+tQUg+v3_!pHB7lGyh%@u`nHf+uEYksN zxM~ifHuE#CWCJlK?`C%f3ovp7vqA;5C;OW7Ozz|50ZYu~y~zb;R7&(Qff-!VRba;C zc3CH|z!}-;5ScWE;}C{{avL{DYVuA!N3fE=dTbCqY=-t=0T07!X0VE5CMIC|uL)RU zvc0Jum|tLO1*X@Ux`OGirmoM1kp<76D-T ijYSrijoM1kp<76D-T ijYSrijf+@V7k;K3QS)z2?EpVrU793jj{CPsisO`_Ab*300l`uA^-pY delta 220 zcmdm#vnhu+z?+$ci-CcIgCV3rX(F#0Gl(+tQUg+v3_!pHB7lGyh%@u`nHf+uEYksN zxT+7LCbKhIfauLmj7M0&3{JKiOklf+@V7k;K3QS)z2?EpVrU793jj{CPsisO`_Ab*30GI|lZ~y=R diff --git a/jar/core-9.2.1.jar b/jar/core-9.2.2.jar similarity index 90% rename from jar/core-9.2.1.jar rename to jar/core-9.2.2.jar index 597a678676820f04c87bad5e71130dca035b069c..141db7124a5b417482f5e3d13403ef78367123c1 100644 GIT binary patch delta 42114 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 GEdK+>-%ZQ_ delta 42271 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 Date: Thu, 5 Sep 2024 13:13:34 +0530 Subject: [PATCH 5/8] fix: flaky tests (#1035) * fix: flaky tests * fix: flaky test * fix: flaky test --- .../supertokens/test/totp/TOTPRecipeTest.java | 315 ++++++++++-------- 1 file changed, 177 insertions(+), 138 deletions(-) diff --git a/src/test/java/io/supertokens/test/totp/TOTPRecipeTest.java b/src/test/java/io/supertokens/test/totp/TOTPRecipeTest.java index 37a690957..d7d0539dd 100644 --- a/src/test/java/io/supertokens/test/totp/TOTPRecipeTest.java +++ b/src/test/java/io/supertokens/test/totp/TOTPRecipeTest.java @@ -318,71 +318,90 @@ public int triggerAndCheckRateLimit(Main main, TOTPDevice device) throws Excepti } @Test - public void rateLimitCooldownTest() throws Exception { - String[] args = {"../"}; - - // set rate limiting cooldown time to 1s - Utils.setValueInConfig("totp_rate_limit_cooldown_sec", "1"); - // set max attempts to 3 - Utils.setValueInConfig("totp_max_attempts", "3"); - - TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); - assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); - - if (StorageLayer.getStorage(process.getProcess()).getType() != STORAGE_TYPE.SQL) { - return; + public void rateLimitCooldownTest() throws Throwable { + // Flaky test. + Throwable lastException = null; + + for (int i = 0; i < 5; i++) { + String[] args = {"../"}; + + // set rate limiting cooldown time to 1s + Utils.setValueInConfig("totp_rate_limit_cooldown_sec", "1"); + // set max attempts to 3 + Utils.setValueInConfig("totp_max_attempts", "3"); + + TestingProcessManager.TestingProcess process = TestingProcessManager.start(args); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STARTED)); + + if (StorageLayer.getStorage(process.getProcess()).getType() != STORAGE_TYPE.SQL) { + return; + } + + try { + FeatureFlagTestContent.getInstance(process.main) + .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MFA}); + + Main main = process.getProcess(); + + // Create device + TOTPDevice device = Totp.registerDevice(main, "user", "deviceName", 1, 1); + Totp.verifyDevice(main, "user", device.deviceName, generateTotpCode(main, device, -1)); + + // Trigger rate limiting and fix it with a correct code after some time: + int attemptsRequired = triggerAndCheckRateLimit(main, device); + assert attemptsRequired == 3; + // Wait for 1 second (Should cool down rate limiting): + Thread.sleep(1000); + // But again try with invalid code: + InvalidTotpException invalidTotpException; + for (int tries = 0; tries < 10; tries++) { + invalidTotpException = assertThrows(InvalidTotpException.class, + () -> Totp.verifyCode(main, "user", "invalid0")); + if (invalidTotpException.currentAttempts == 3) { + break; + } + } + + // This triggered rate limiting again. So even valid codes will fail for + // another cooldown period: + LimitReachedException limitReachedException = assertThrows(LimitReachedException.class, + () -> Totp.verifyCode(main, "user", generateTotpCode(main, device))); + assertEquals(3, limitReachedException.currentAttempts); + // Wait for 1 second (Should cool down rate limiting): + Thread.sleep(1000); + + // test that after cool down, we can retry invalid codes N times again + for (int tries = 0; tries < 10; tries++) { + invalidTotpException = assertThrows(InvalidTotpException.class, + () -> Totp.verifyCode(main, "user", "invalid0")); + if (invalidTotpException.currentAttempts == 3) { + break; + } + } + + Thread.sleep(1100); + + // Now try with valid code: + Totp.verifyCode(main, "user", generateTotpCode(main, device)); + // Now invalid code shouldn't trigger rate limiting. Unless you do it N times: + assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "user", "invaldd")); + + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + return; // successful + } catch (Exception | AssertionError e) { + process.kill(); + assertNotNull(process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + Thread.sleep(250); + + lastException = e; + } + } + if (lastException != null) { + throw lastException; } - - FeatureFlagTestContent.getInstance(process.main) - .setKeyValue(FeatureFlagTestContent.ENABLED_FEATURES, new EE_FEATURES[]{EE_FEATURES.MFA}); - - Main main = process.getProcess(); - - // Create device - TOTPDevice device = Totp.registerDevice(main, "user", "deviceName", 1, 1); - Totp.verifyDevice(main, "user", device.deviceName, generateTotpCode(main, device, -1)); - - // Trigger rate limiting and fix it with a correct code after some time: - int attemptsRequired = triggerAndCheckRateLimit(main, device); - assert attemptsRequired == 3; - // Wait for 1 second (Should cool down rate limiting): - Thread.sleep(1000); - // But again try with invalid code: - InvalidTotpException invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(1, invalidTotpException.currentAttempts); - invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(2, invalidTotpException.currentAttempts); - invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(3, invalidTotpException.currentAttempts); - - // This triggered rate limiting again. So even valid codes will fail for - // another cooldown period: - LimitReachedException limitReachedException = assertThrows(LimitReachedException.class, - () -> Totp.verifyCode(main, "user", generateTotpCode(main, device))); - assertEquals(3, limitReachedException.currentAttempts); - // Wait for 1 second (Should cool down rate limiting): - Thread.sleep(1000); - - // test that after cool down, we can retry invalid codes N times again - invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(1, invalidTotpException.currentAttempts); - invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(2, invalidTotpException.currentAttempts); - invalidTotpException = assertThrows(InvalidTotpException.class, - () -> Totp.verifyCode(main, "user", "invalid0")); - assertEquals(3, invalidTotpException.currentAttempts); - - Thread.sleep(1100); - - // Now try with valid code: - Totp.verifyCode(main, "user", generateTotpCode(main, device)); - // Now invalid code shouldn't trigger rate limiting. Unless you do it N times: - assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "user", "invaldd")); } @Test @@ -460,82 +479,102 @@ public void createAndVerifyDeviceTest() throws Exception { } @Test - public void removeDeviceTest() throws Exception { + public void removeDeviceTest() throws Throwable { // Flaky test. - TestSetupResult result = defaultInit(); - if (result == null) { - return; + Throwable lastException = null; + + for (int i = 0; i < 5; i++) { + TestSetupResult result = defaultInit(); + if (result == null) { + return; + } + + try { + Main main = result.process.getProcess(); + TOTPStorage storage = result.storage; + + // Create devices + TOTPDevice device1 = Totp.registerDevice(main, "user", "device1", 1, 30); + TOTPDevice device2 = Totp.registerDevice(main, "user", "device2", 1, 30); + + Thread.sleep(1); + Totp.verifyDevice(main, "user", "device1", generateTotpCode(main, device1, -1)); + Thread.sleep(1); + Totp.verifyDevice(main, "user", "device2", generateTotpCode(main, device2, -1)); + + TOTPDevice[] devices = Totp.getDevices(main, "user"); + assert (devices.length == 2); + + // Try to delete device for non-existent user: + assertThrows(UnknownDeviceException.class, () -> Totp.removeDevice(main, "non-existent-user", "device1")); + + // Try to delete non-existent device: + assertThrows(UnknownDeviceException.class, () -> Totp.removeDevice(main, "user", "non-existent-device")); + + // Delete one of the devices + { + assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "user", "ic0")); + + Thread.sleep(1000 - System.currentTimeMillis() % 1000 + 10); + + Thread.sleep(1); + Totp.verifyCode(main, "user", generateTotpCode(main, device1)); + Thread.sleep(1); + Totp.verifyCode(main, "user", generateTotpCode(main, device2)); + + // Delete device1 + Totp.removeDevice(main, "user", "device1"); + + // 1 device still remain so all codes should still be there: + TOTPUsedCode[] usedCodes = getAllUsedCodesUtil(storage, "user"); + assert (usedCodes.length == 5); // 2 for device verification and 3 for code verification + + devices = Totp.getDevices(main, "user"); + assert (devices.length == 1); + } + + // Deleting the last device of a user should delete all related codes: + // Delete the 2nd (and the last) device + { + + // Create another user to test that other users aren't affected: + TOTPDevice otherUserDevice = Totp.registerDevice(main, "other-user", "device", 1, 30); + Totp.verifyDevice(main, "other-user", "device", generateTotpCode(main, otherUserDevice, -1)); + Thread.sleep(1); + Totp.verifyCode(main, "other-user", generateTotpCode(main, otherUserDevice)); + assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "other-user", "ic1")); + + // Delete device2 + Totp.removeDevice(main, "user", "device2"); + + // No more devices are left for the user: + assert (Totp.getDevices(main, "user").length == 0); + + // No device left so all codes of the user should be deleted: + TOTPUsedCode[] usedCodes = getAllUsedCodesUtil(storage, "user"); + assert (usedCodes.length == 0); + + usedCodes = getAllUsedCodesUtil(storage, "other-user"); + System.out.println("Point2 " + usedCodes.length); + assert (usedCodes.length == 3); // 1 for device verification and 2 for code verification + + // But for other users things should still be there: + TOTPDevice[] otherUserDevices = Totp.getDevices(main, "other-user"); + assert (otherUserDevices.length == 1); + } + + result.process.kill(); + assertNotNull(result.process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + + return; // successful + } catch (Exception | AssertionError e) { + lastException = e; + result.process.kill(); + assertNotNull(result.process.checkOrWaitForEvent(ProcessState.PROCESS_STATE.STOPPED)); + } } - Main main = result.process.getProcess(); - TOTPStorage storage = result.storage; - - // Create devices - TOTPDevice device1 = Totp.registerDevice(main, "user", "device1", 1, 30); - TOTPDevice device2 = Totp.registerDevice(main, "user", "device2", 1, 30); - - Thread.sleep(1); - Totp.verifyDevice(main, "user", "device1", generateTotpCode(main, device1, -1)); - Thread.sleep(1); - Totp.verifyDevice(main, "user", "device2", generateTotpCode(main, device2, -1)); - - TOTPDevice[] devices = Totp.getDevices(main, "user"); - assert (devices.length == 2); - - // Try to delete device for non-existent user: - assertThrows(UnknownDeviceException.class, () -> Totp.removeDevice(main, "non-existent-user", "device1")); - - // Try to delete non-existent device: - assertThrows(UnknownDeviceException.class, () -> Totp.removeDevice(main, "user", "non-existent-device")); - - // Delete one of the devices - { - assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "user", "ic0")); - - Thread.sleep(1000 - System.currentTimeMillis() % 1000 + 10); - - Thread.sleep(1); - Totp.verifyCode(main, "user", generateTotpCode(main, device1)); - Thread.sleep(1); - Totp.verifyCode(main, "user", generateTotpCode(main, device2)); - - // Delete device1 - Totp.removeDevice(main, "user", "device1"); - - devices = Totp.getDevices(main, "user"); - assert (devices.length == 1); - - // 1 device still remain so all codes should still be still there: - TOTPUsedCode[] usedCodes = getAllUsedCodesUtil(storage, "user"); - assert (usedCodes.length == 5); // 2 for device verification and 3 for code verification - } - - // Deleting the last device of a user should delete all related codes: - // Delete the 2nd (and the last) device - { - - // Create another user to test that other users aren't affected: - TOTPDevice otherUserDevice = Totp.registerDevice(main, "other-user", "device", 1, 30); - Totp.verifyDevice(main, "other-user", "device", generateTotpCode(main, otherUserDevice, -1)); - Thread.sleep(1); - Totp.verifyCode(main, "other-user", generateTotpCode(main, otherUserDevice)); - assertThrows(InvalidTotpException.class, () -> Totp.verifyCode(main, "other-user", "ic1")); - - // Delete device2 - Totp.removeDevice(main, "user", "device2"); - - // No more devices are left for the user: - assert (Totp.getDevices(main, "user").length == 0); - - // No device left so all codes of the user should be deleted: - TOTPUsedCode[] usedCodes = getAllUsedCodesUtil(storage, "user"); - assert (usedCodes.length == 0); - - // But for other users things should still be there: - TOTPDevice[] otherUserDevices = Totp.getDevices(main, "other-user"); - assert (otherUserDevices.length == 1); - - usedCodes = getAllUsedCodesUtil(storage, "other-user"); - assert (usedCodes.length == 3); // 1 for device verification and 2 for code verification + if (lastException != null) { + throw lastException; } } From df55b5fab5671823efba831e7a1e7b58293e0263 Mon Sep 17 00:00:00 2001 From: Sattvik Chakravarthy Date: Thu, 5 Sep 2024 13:14:38 +0530 Subject: [PATCH 6/8] adding dev-v9.2.2 tag to this commit to ensure building --- cli/jar/cli.jar | Bin 47547 -> 47547 bytes downloader/jar/downloader.jar | Bin 15229 -> 15229 bytes ee/jar/ee.jar | Bin 13874 -> 13874 bytes jar/core-9.2.2.jar | Bin 796129 -> 796129 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cli/jar/cli.jar b/cli/jar/cli.jar index 1b8e8254186d8eaddffcf0410c7714ac0bcc8fe3..af853e1d9ff0dc7b6715643a6ed1735317c134ee 100644 GIT binary patch delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZB}bD63WdDWOfl$n&9( z02oX5yQqs@ZlF<`H4E@*6L0-OD-ITymn zYTE^2sCPC)yuWs`6WHjO=Qs9D1e$%4g@M5uXteld@hOKOYVS;Ahp2tF0OC~Tg+Cy^ zlv`{8Ha~JP2gHXdD?We(CWo*53!zt;fa$(f;E0-hVU-@3&$t?F(qy~Uc3^(}YF{vY zesv<4HeM47rn}cuLjev z*N1~?*A2N~dg}&=*}NMeW>;=Z1B*Y}m;t7JHwA&|MVlbz`U34z-VCuTb~8lm@MaIN z8on(Mz2#dVc3j-z1s0dv8V#mvwnE(dWGlq|R@=hB;*+;Q^xxYCPJELMw?oXCwH=(~ gCO_K_kvH6t1Xe$7hZ~r_zXM{9=}t(vmF;u|070-qZ~y=R delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZB}qBfO@ylTuK%FIg*NJTOL0TYM-0%jo2%-3gTK-I8J z2dv?$0f?H+!DtVnH+wNoVFe33WOD}#XtSq@fd!_>x`GAn$TsqV1roGfzyiy)cXNRS zQq2Ou0z1t1GlCga77s%V4G(PreY$F}W|82P`o+xP}ePkcpCH0W&P( zwu23soSzzC;#|o_Ka*hv+ASe{P52Wo#V`X4? z01PIb$q#chH%Athv4W*Q0Rsyl`N@gFVv_^5^6;aD(PqK&7_iqi7c{mrfzAHaoC{%O zwe5m1)H|CY-d{V}32b!C^Ba360?j_j!oXk+G+KPK_>@BswRfhmL)1Q70CB4F!XFS{ z$}P44n;*HD1LDJ!6(2wXlfzg3h0v=^z;xd#a70bMuu2ciXIu?7X|mmFJ21a~wJ(@H zzd8|28?Olk)7@(_!Swev!C=~VZ7PJ`Bt7}UT5~X)Yh5y!E?5@_rZ29W38r(`SA*%- z>%+mc>xNt~y>$b`Y~GC!vnw~IfyEzf%mCBAn}WdfqD>HUeSvlye$Q$lR0;`|4!wpQ|-vKelbSEU-%67T}05s|>Z~y=R diff --git a/downloader/jar/downloader.jar b/downloader/jar/downloader.jar index ba570be87c852a6d0432a929574d229a55db8a19..70a9676289a8fef811e4bb1e79933e736f8df4b8 100644 GIT binary patch delta 375 zcmexc_P2~Tz?+$ci-CcIgW*D^>O@{OW)NlOr3R!T8GwKZL;wLZ5NGD=Gc%xSSf&Hk zaMc_{ZRTfO$p&If-p%d|7GUHEW`zo9PxdwEncToM1kp<76D-T ijYSrijO@{OW)NlOr3R!T8GwKZL;wLZ5NGD=Gc%xSSf&Hk za8(~fO=f4b0MVPB7>}@k8Jui4n81uD92uHmCH_VbrHw|7U_Ps{37EDqwg=O7#(H3S sy|ERTeq(G4rgco*z;vle6qvqb5(K8zO#{I68)NCoQ%#k?>|Lf603Y^5i~s-t delta 220 zcmdm#vnhu+z?+$ci-CcIgQ2`lWg@Q{Gl(+tQUg+v3_!pHB7lGyh%@u`nHf+uEYksN zxT+7LCbKhIfauLmj7M0&3{JKiOklf+@V7k;K3QS)z2?EpVrU793jj{CPsisO`_Ab*300l`uA^-pY diff --git a/jar/core-9.2.2.jar b/jar/core-9.2.2.jar index 141db7124a5b417482f5e3d13403ef78367123c1..ec60a6447efa581571b9aa5768ebcddc2ac12f8c 100644 GIT binary patch delta 9900 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 Date: Fri, 6 Sep 2024 11:37:55 +0530 Subject: [PATCH 7/8] adding dev-v9.2.2 tag to this commit to ensure building --- cli/jar/cli.jar | Bin 47547 -> 47547 bytes downloader/jar/downloader.jar | Bin 15229 -> 15229 bytes ee/jar/ee.jar | Bin 13874 -> 13874 bytes jar/core-9.2.2.jar | Bin 796129 -> 796129 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/cli/jar/cli.jar b/cli/jar/cli.jar index af853e1d9ff0dc7b6715643a6ed1735317c134ee..4ff950e1890a79d47c23d4231af75d392a934a3a 100644 GIT binary patch delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZB}Z82&SdDWOfl$n&9( z02oX5yQqs@ZlF<`H4E@*6L0-OD-ITymn zYTE^2sCPC)yuWs`6WHjO=Qs9D1e$%4g@M5uXteld@hOKOYVS;Ahp2tF0OC~Tg+Cy^ zlv`{8Ha~JP2gHXdD?We(CWo*53!zt;fa$(f;E0-hVU-@3&$t?F(qy~Uc3^(}YF{vY zesv<4HeM47rn}cuLjev z*N1~?*A2N~dg}&=*}NMeW>;=Z1B*Y}m;t7JHwA&|MVlbz`U34z-VCuTb~8lm@MaIN z8on(Mz2#dVc3j-z1s0dv8V#mvwnE(dWGlq|R@=hB;*+;Q^xxYCPJELMw?oXCwH=(~ gCO_K_kvH6t1Xe$7hZ~r_zXM{9=}t(vmF;u|03(Ao5C8xG delta 856 zcmdn}nQ8ZDCf)#VW)?061`ZB}bD63WdDWOfl$n&9( z02oX5yQqs@ZlF<`H4E@*6L0-OD-ITymn zYTE^2sCPC)yuWs`6WHjO=Qs9D1e$%4g@M5uXteld@hOKOYVS;Ahp2tF0OC~Tg+Cy^ zlv`{8Ha~JP2gHXdD?We(CWo*53!zt;fa$(f;E0-hVU-@3&$t?F(qy~Uc3^(}YF{vY zesv<4HeM47rn}cuLjev z*N1~?*A2N~dg}&=*}NMeW>;=Z1B*Y}m;t7JHwA&|MVlbz`U34z-VCuTb~8lm@MaIN z8on(Mz2#dVc3j-z1s0dv8V#mvwnE(dWGlq|R@=hB;*+;Q^xxYCPJELMw?oXCwH=(~ gCO_K_kvH6t1Xe$7hZ~r_zXM{9=}t(vmF;u|070-qZ~y=R diff --git a/downloader/jar/downloader.jar b/downloader/jar/downloader.jar index 70a9676289a8fef811e4bb1e79933e736f8df4b8..051bdfc539c3e824cbfa2297bdfdd8b64786747d 100644 GIT binary patch delta 375 zcmexc_P2~Tz?+$ci-CcIgJDOE+C*M8W)NlOr3R!T8GwKZL;wLZ5NGD=Gc%xSSf&Hk zaMc_{ZRTfO$p&If-p%d|7GUHEW`zo9PxdwEncTO@{OW)NlOr3R!T8GwKZL;wLZ5NGD=Gc%xSSf&Hk zaMc_{ZRTfO$p&If-p%d|7GUHEW`zo9PxdwEncTmKXaS-(J24(%0W&z+ZZLrvPdG9(K}JvZH_`{wjYf@Nn$_3@OxqaS zgN>*&)&tY)jjh1+8)I8Atz+T_rb|tt!1N`PATX_N8UWV+##nmtR8u7|dzWbi0P%-G Ad;kCd delta 220 zcmdm#vnhu+z?+$ci-CcIgW*!9>O@{OW)NlOr3R!T8GwKZL;wLZ5NGD=Gc%xSSf&Hk za8(~fO=f4b0MVPB7>}@k8Jui4n81uD92uHmCH_VbrHw|7U_Ps{37EDqwg=O7#(H3S sy|ERTeq(G4rgco*z;vle6qvqb5(K8zO#{I68)NCoQ%#k?>|Lf603Y^5i~s-t diff --git a/jar/core-9.2.2.jar b/jar/core-9.2.2.jar index ec60a6447efa581571b9aa5768ebcddc2ac12f8c..fd1d03d2dd7ffa40c52ef1a45586b5cd01338034 100644 GIT binary patch delta 9900 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 delta 9900 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 x9IZ5^by8^!m(D*+Q@EN3k-~LB Date: Tue, 17 Sep 2024 17:34:19 +0530 Subject: [PATCH 8/8] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d05352b7..13223df35 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ We also believe in the principle of least vendor lock-in. Your having full contr can switch away from SuperTokens without forcing your existing users to logout, reset their passwords, or in the worst case, sign up again. -### [Click here](https://thirdpartyemailpassword.demo.supertokens.io/) to see the demo app. +### [Click here](https://thirdpartyemailpassword.demo.supertokens.com/) to see the demo app. - Please visit [our website](https://supertokens.io/pricing) to see the list of features. - We want to make features as decoupled as possible. This means you can use SuperTokens for just login, or just session