Skip to content

Commit 08043dc

Browse files
authored
fix: mfa changes (#177)
1 parent d6e27cc commit 08043dc

File tree

10 files changed

+66
-89
lines changed

10 files changed

+66
-89
lines changed

src/main/java/io/supertokens/storage/postgresql/config/PostgreSQLConfig.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ public String getTenantFirstFactorsTable() {
186186
return addSchemaAndPrefixToTableName("tenant_first_factors");
187187
}
188188

189-
public String getTenantDefaultRequiredFactorIdsTable() {
190-
return addSchemaAndPrefixToTableName("tenant_default_required_factor_ids");
189+
public String getTenantRequiredSecondaryFactorsTable() {
190+
return addSchemaAndPrefixToTableName("tenant_required_secondary_factors");
191191
}
192192

193193
public String getTenantThirdPartyProvidersTable() {

src/main/java/io/supertokens/storage/postgresql/queries/GeneralQueries.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -336,16 +336,13 @@ public static void createTablesIfNotExists(Start start) throws SQLException, Sto
336336
NO_OP_SETTER);
337337
}
338338

339-
if (!doesTableExists(start, Config.getConfig(start).getTenantDefaultRequiredFactorIdsTable())) {
339+
if (!doesTableExists(start, Config.getConfig(start).getTenantRequiredSecondaryFactorsTable())) {
340340
getInstance(start).addState(CREATING_NEW_TABLE, null);
341-
update(start, MultitenancyQueries.getQueryToCreateDefaultRequiredFactorIdsTable(start), NO_OP_SETTER);
341+
update(start, MultitenancyQueries.getQueryToCreateRequiredSecondaryFactorsTable(start), NO_OP_SETTER);
342342

343343
// index
344344
update(start,
345-
MultitenancyQueries.getQueryToCreateTenantIdIndexForDefaultRequiredFactorIdsTable(start),
346-
NO_OP_SETTER);
347-
update(start,
348-
MultitenancyQueries.getQueryToCreateOrderIndexForDefaultRequiredFactorIdsTable(start),
345+
MultitenancyQueries.getQueryToCreateTenantIdIndexForRequiredSecondaryFactorsTable(start),
349346
NO_OP_SETTER);
350347
}
351348

@@ -591,7 +588,7 @@ public static void deleteAllTables(Start start) throws SQLException, StorageQuer
591588
+ getConfig(start).getUsersTable() + ","
592589
+ getConfig(start).getAccessTokenSigningKeysTable() + ","
593590
+ getConfig(start).getTenantFirstFactorsTable() + ","
594-
+ getConfig(start).getTenantDefaultRequiredFactorIdsTable() + ","
591+
+ getConfig(start).getTenantRequiredSecondaryFactorsTable() + ","
595592
+ getConfig(start).getTenantConfigsTable() + ","
596593
+ getConfig(start).getTenantThirdPartyProvidersTable() + ","
597594
+ getConfig(start).getTenantThirdPartyProviderClientsTable() + ","

src/main/java/io/supertokens/storage/postgresql/queries/MultitenancyQueries.java

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,6 @@ static String getQueryToCreateTenantConfigsTable(Start start) {
4949
+ "email_password_enabled BOOLEAN,"
5050
+ "passwordless_enabled BOOLEAN,"
5151
+ "third_party_enabled BOOLEAN,"
52-
+ "totp_enabled BOOLEAN,"
53-
+ "has_first_factors BOOLEAN DEFAULT FALSE,"
54-
+ "has_default_required_factor_ids BOOLEAN DEFAULT FALSE,"
5552
+ "CONSTRAINT " + Utils.getConstraintName(schema, tenantConfigsTable, null, "pkey") + " PRIMARY KEY (connection_uri_domain, app_id, tenant_id)"
5653
+ ");";
5754
// @formatter:on
@@ -145,36 +142,29 @@ public static String getQueryToCreateTenantIdIndexForFirstFactorsTable(Start sta
145142
+ getConfig(start).getTenantFirstFactorsTable() + " (connection_uri_domain, app_id, tenant_id);";
146143
}
147144

148-
public static String getQueryToCreateDefaultRequiredFactorIdsTable(Start start) {
145+
public static String getQueryToCreateRequiredSecondaryFactorsTable(Start start) {
149146
String schema = Config.getConfig(start).getTableSchema();
150-
String tableName = Config.getConfig(start).getTenantDefaultRequiredFactorIdsTable();
147+
String tableName = Config.getConfig(start).getTenantRequiredSecondaryFactorsTable();
151148
// @formatter:off
152149
return "CREATE TABLE IF NOT EXISTS " + tableName + " ("
153150
+ "connection_uri_domain VARCHAR(256) DEFAULT '',"
154151
+ "app_id VARCHAR(64) DEFAULT 'public',"
155152
+ "tenant_id VARCHAR(64) DEFAULT 'public',"
156153
+ "factor_id VARCHAR(128),"
157-
+ "order_idx INTEGER NOT NULL,"
158154
+ "CONSTRAINT " + Utils.getConstraintName(schema, tableName, null, "pkey")
159155
+ " PRIMARY KEY (connection_uri_domain, app_id, tenant_id, factor_id),"
160156
+ "CONSTRAINT " + Utils.getConstraintName(schema, tableName, "tenant_id", "fkey")
161157
+ " FOREIGN KEY (connection_uri_domain, app_id, tenant_id)"
162-
+ " REFERENCES " + Config.getConfig(start).getTenantConfigsTable() + " (connection_uri_domain, app_id, tenant_id) ON DELETE CASCADE,"
163-
+ "CONSTRAINT " + Utils.getConstraintName(schema, tableName, "order_idx", "key")
164-
+ " UNIQUE (connection_uri_domain, app_id, tenant_id, order_idx)"
158+
+ " REFERENCES " + Config.getConfig(start).getTenantConfigsTable() + " (connection_uri_domain, app_id, tenant_id) ON DELETE CASCADE"
165159
+ ");";
166160
// @formatter:on
167161
}
168162

169-
public static String getQueryToCreateTenantIdIndexForDefaultRequiredFactorIdsTable(Start start) {
163+
public static String getQueryToCreateTenantIdIndexForRequiredSecondaryFactorsTable(Start start) {
170164
return "CREATE INDEX IF NOT EXISTS tenant_default_required_factor_ids_tenant_id_index ON "
171-
+ getConfig(start).getTenantDefaultRequiredFactorIdsTable() + " (connection_uri_domain, app_id, tenant_id);";
165+
+ getConfig(start).getTenantRequiredSecondaryFactorsTable() + " (connection_uri_domain, app_id, tenant_id);";
172166
}
173167

174-
public static String getQueryToCreateOrderIndexForDefaultRequiredFactorIdsTable(Start start) {
175-
return "CREATE INDEX IF NOT EXISTS tenant_default_required_factor_ids_order_idx_index ON "
176-
+ getConfig(start).getTenantDefaultRequiredFactorIdsTable() + " (order_idx ASC);";
177-
}
178168

179169
private static void executeCreateTenantQueries(Start start, Connection sqlCon, TenantConfig tenantConfig)
180170
throws SQLException, StorageQueryException {
@@ -190,7 +180,7 @@ private static void executeCreateTenantQueries(Start start, Connection sqlCon, T
190180
}
191181

192182
MfaSqlHelper.createFirstFactors(start, sqlCon, tenantConfig.tenantIdentifier, tenantConfig.firstFactors);
193-
MfaSqlHelper.createDefaultRequiredFactorIds(start, sqlCon, tenantConfig.tenantIdentifier, tenantConfig.defaultRequiredFactorIds);
183+
MfaSqlHelper.createRequiredSecondaryFactors(start, sqlCon, tenantConfig.tenantIdentifier, tenantConfig.requiredSecondaryFactors);
194184
}
195185

196186
public static void createTenantConfig(Start start, TenantConfig tenantConfig) throws StorageQueryException, StorageTransactionLogicException {
@@ -272,10 +262,10 @@ public static TenantConfig[] getAllTenants(Start start) throws StorageQueryExcep
272262
// Map (tenantIdentifier) -> firstFactors
273263
HashMap<TenantIdentifier, String[]> firstFactorsMap = MfaSqlHelper.selectAllFirstFactors(start);
274264

275-
// Map (tenantIdentifier) -> defaultRequiredFactorIds
276-
HashMap<TenantIdentifier, String[]> defaultRequiredFactorIdsMap = MfaSqlHelper.selectAllDefaultRequiredFactorIds(start);
265+
// Map (tenantIdentifier) -> requiredSecondaryFactors
266+
HashMap<TenantIdentifier, String[]> requiredSecondaryFactorsMap = MfaSqlHelper.selectAllRequiredSecondaryFactors(start);
277267

278-
return TenantConfigSQLHelper.selectAll(start, providerMap, firstFactorsMap, defaultRequiredFactorIdsMap);
268+
return TenantConfigSQLHelper.selectAll(start, providerMap, firstFactorsMap, requiredSecondaryFactorsMap);
279269
} catch (SQLException throwables) {
280270
throw new StorageQueryException(throwables);
281271
}

src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/MfaSqlHelper.java

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ public static HashMap<TenantIdentifier, String[]> selectAllFirstFactors(Start st
5454
});
5555
}
5656

57-
public static HashMap<TenantIdentifier, String[]> selectAllDefaultRequiredFactorIds(Start start)
57+
public static HashMap<TenantIdentifier, String[]> selectAllRequiredSecondaryFactors(Start start)
5858
throws SQLException, StorageQueryException {
59-
String QUERY = "SELECT connection_uri_domain, app_id, tenant_id, factor_id, order_idx FROM "
60-
+ getConfig(start).getTenantDefaultRequiredFactorIdsTable() + " ORDER BY order_idx ASC;";
59+
String QUERY = "SELECT connection_uri_domain, app_id, tenant_id, factor_id FROM "
60+
+ getConfig(start).getTenantRequiredSecondaryFactorsTable() + ";";
6161
return execute(start, QUERY, pst -> {}, result -> {
6262
HashMap<TenantIdentifier, List<String>> defaultRequiredFactors = new HashMap<>();
6363

@@ -97,24 +97,20 @@ public static void createFirstFactors(Start start, Connection sqlCon, TenantIden
9797
}
9898
}
9999

100-
public static void createDefaultRequiredFactorIds(Start start, Connection sqlCon, TenantIdentifier tenantIdentifier, String[] defaultRequiredFactorIds)
100+
public static void createRequiredSecondaryFactors(Start start, Connection sqlCon, TenantIdentifier tenantIdentifier, String[] requiredSecondaryFactors)
101101
throws SQLException, StorageQueryException {
102-
if (defaultRequiredFactorIds == null || defaultRequiredFactorIds.length == 0) {
102+
if (requiredSecondaryFactors == null || requiredSecondaryFactors.length == 0) {
103103
return;
104104
}
105105

106-
String QUERY = "INSERT INTO " + getConfig(start).getTenantDefaultRequiredFactorIdsTable() + "(connection_uri_domain, app_id, tenant_id, factor_id, order_idx) VALUES (?, ?, ?, ?, ?);";
107-
int orderIdx = 0;
108-
for (String factorId : defaultRequiredFactorIds) {
109-
int finalOrderIdx = orderIdx;
106+
String QUERY = "INSERT INTO " + getConfig(start).getTenantRequiredSecondaryFactorsTable() + "(connection_uri_domain, app_id, tenant_id, factor_id) VALUES (?, ?, ?, ?);";
107+
for (String factorId : requiredSecondaryFactors) {
110108
update(sqlCon, QUERY, pst -> {
111109
pst.setString(1, tenantIdentifier.getConnectionUriDomain());
112110
pst.setString(2, tenantIdentifier.getAppId());
113111
pst.setString(3, tenantIdentifier.getTenantId());
114112
pst.setString(4, factorId);
115-
pst.setInt(5, finalOrderIdx);
116113
});
117-
orderIdx++;
118114
}
119115
}
120116
}

src/main/java/io/supertokens/storage/postgresql/queries/multitenancy/TenantConfigSQLHelper.java

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,16 @@ public class TenantConfigSQLHelper {
4141
public static class TenantConfigRowMapper implements RowMapper<TenantConfig, ResultSet> {
4242
ThirdPartyConfig.Provider[] providers;
4343
String[] firstFactors;
44-
String[] defaultRequiredFactorIds;
44+
String[] requiredSecondaryFactors;
4545

46-
private TenantConfigRowMapper(ThirdPartyConfig.Provider[] providers, String[] firstFactors, String[] defaultRequiredFactorIds) {
46+
private TenantConfigRowMapper(ThirdPartyConfig.Provider[] providers, String[] firstFactors, String[] requiredSecondaryFactors) {
4747
this.providers = providers;
4848
this.firstFactors = firstFactors;
49-
this.defaultRequiredFactorIds = defaultRequiredFactorIds;
49+
this.requiredSecondaryFactors = requiredSecondaryFactors;
5050
}
5151

52-
public static TenantConfigSQLHelper.TenantConfigRowMapper getInstance(ThirdPartyConfig.Provider[] providers, String[] firstFactors, String[] defaultRequiredFactorIds) {
53-
return new TenantConfigSQLHelper.TenantConfigRowMapper(providers, firstFactors, defaultRequiredFactorIds);
52+
public static TenantConfigSQLHelper.TenantConfigRowMapper getInstance(ThirdPartyConfig.Provider[] providers, String[] firstFactors, String[] requiredSecondaryFactors) {
53+
return new TenantConfigSQLHelper.TenantConfigRowMapper(providers, firstFactors, requiredSecondaryFactors);
5454
}
5555

5656
@Override
@@ -61,9 +61,8 @@ public TenantConfig map(ResultSet result) throws StorageQueryException {
6161
new EmailPasswordConfig(result.getBoolean("email_password_enabled")),
6262
new ThirdPartyConfig(result.getBoolean("third_party_enabled"), this.providers),
6363
new PasswordlessConfig(result.getBoolean("passwordless_enabled")),
64-
new TotpConfig(result.getBoolean("totp_enabled")),
65-
result.getBoolean("has_first_factors") ? firstFactors : null,
66-
result.getBoolean("has_default_required_factor_ids") ? defaultRequiredFactorIds : null,
64+
firstFactors.length == 0 ? null : firstFactors,
65+
requiredSecondaryFactors.length == 0 ? null : requiredSecondaryFactors,
6766
JsonUtils.stringToJsonObject(result.getString("core_config"))
6867
);
6968
} catch (Exception e) {
@@ -72,11 +71,10 @@ public TenantConfig map(ResultSet result) throws StorageQueryException {
7271
}
7372
}
7473

75-
public static TenantConfig[] selectAll(Start start, HashMap<TenantIdentifier, HashMap<String, ThirdPartyConfig.Provider>> providerMap, HashMap<TenantIdentifier, String[]> firstFactorsMap, HashMap<TenantIdentifier, String[]> defaultRequiredFactorIdsMap)
74+
public static TenantConfig[] selectAll(Start start, HashMap<TenantIdentifier, HashMap<String, ThirdPartyConfig.Provider>> providerMap, HashMap<TenantIdentifier, String[]> firstFactorsMap, HashMap<TenantIdentifier, String[]> requiredSecondaryFactorsMap)
7675
throws SQLException, StorageQueryException {
7776
String QUERY = "SELECT connection_uri_domain, app_id, tenant_id, core_config,"
78-
+ " email_password_enabled, passwordless_enabled, third_party_enabled,"
79-
+ " totp_enabled, has_first_factors, has_default_required_factor_ids FROM "
77+
+ " email_password_enabled, passwordless_enabled, third_party_enabled FROM "
8078
+ getConfig(start).getTenantConfigsTable() + ";";
8179

8280
TenantConfig[] tenantConfigs = execute(start, QUERY, pst -> {}, result -> {
@@ -89,9 +87,9 @@ public static TenantConfig[] selectAll(Start start, HashMap<TenantIdentifier, Ha
8987
}
9088
String[] firstFactors = firstFactorsMap.containsKey(tenantIdentifier) ? firstFactorsMap.get(tenantIdentifier) : new String[0];
9189

92-
String[] defaultRequiredFactorIds = defaultRequiredFactorIdsMap.containsKey(tenantIdentifier) ? defaultRequiredFactorIdsMap.get(tenantIdentifier) : new String[0];
90+
String[] requiredSecondaryFactors = requiredSecondaryFactorsMap.containsKey(tenantIdentifier) ? requiredSecondaryFactorsMap.get(tenantIdentifier) : new String[0];
9391

94-
temp.add(TenantConfigSQLHelper.TenantConfigRowMapper.getInstance(providers, firstFactors, defaultRequiredFactorIds).mapOrThrow(result));
92+
temp.add(TenantConfigSQLHelper.TenantConfigRowMapper.getInstance(providers, firstFactors, requiredSecondaryFactors).mapOrThrow(result));
9593
}
9694
TenantConfig[] finalResult = new TenantConfig[temp.size()];
9795
for (int i = 0; i < temp.size(); i++) {
@@ -106,9 +104,8 @@ public static void create(Start start, Connection sqlCon, TenantConfig tenantCon
106104
throws SQLException, StorageQueryException {
107105
String QUERY = "INSERT INTO " + getConfig(start).getTenantConfigsTable()
108106
+ "(connection_uri_domain, app_id, tenant_id, core_config,"
109-
+ " email_password_enabled, passwordless_enabled, third_party_enabled,"
110-
+ " totp_enabled, has_first_factors, has_default_required_factor_ids)"
111-
+ " VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
107+
+ " email_password_enabled, passwordless_enabled, third_party_enabled)"
108+
+ " VALUES(?, ?, ?, ?, ?, ?, ?)";
112109

113110
update(sqlCon, QUERY, pst -> {
114111
pst.setString(1, tenantConfig.tenantIdentifier.getConnectionUriDomain());
@@ -118,9 +115,6 @@ public static void create(Start start, Connection sqlCon, TenantConfig tenantCon
118115
pst.setBoolean(5, tenantConfig.emailPasswordConfig.enabled);
119116
pst.setBoolean(6, tenantConfig.passwordlessConfig.enabled);
120117
pst.setBoolean(7, tenantConfig.thirdPartyConfig.enabled);
121-
pst.setBoolean(8, tenantConfig.totpConfig.enabled);
122-
pst.setBoolean(9, tenantConfig.firstFactors != null);
123-
pst.setBoolean(10, tenantConfig.defaultRequiredFactorIds != null);
124118
});
125119
}
126120

src/test/java/io/supertokens/storage/postgresql/test/AccountLinkingTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public void canLinkFailsIfTryingToLinkUsersAcrossDifferentStorageLayers() throws
8888
new EmailPasswordConfig(true),
8989
new ThirdPartyConfig(true, null),
9090
new PasswordlessConfig(true),
91-
new TotpConfig(false), null, null,
91+
null, null,
9292
coreConfig
9393
)
9494
);
@@ -131,7 +131,7 @@ public void canLinkFailsIfTryingToLinkUsersAcrossDifferentStorageLayers() throws
131131
new EmailPasswordConfig(true),
132132
new ThirdPartyConfig(true, null),
133133
new PasswordlessConfig(true),
134-
new TotpConfig(false), null, null,
134+
null, null,
135135
coreConfig
136136
)
137137
);

src/test/java/io/supertokens/storage/postgresql/test/LoggingTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ public void confirmHikariLoggerClosedOnlyWhenProcessEnds() throws Exception {
284284
new EmailPasswordConfig(true),
285285
new ThirdPartyConfig(true, null),
286286
new PasswordlessConfig(true),
287-
new TotpConfig(false), null, null,
287+
null, null,
288288
config
289289
), false);
290290

src/test/java/io/supertokens/storage/postgresql/test/SuperTokensSaaSSecretTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public void testThatTenantCannotSetDatabaseRelatedConfigIfSuperTokensSaaSSecretI
8989
Multitenancy.addNewOrUpdateAppOrTenant(process.main, new TenantConfig(new TenantIdentifier(null, null, "t1"), new EmailPasswordConfig(false),
9090
new ThirdPartyConfig(false, new ThirdPartyConfig.Provider[0]),
9191
new PasswordlessConfig(false),
92-
new TotpConfig(false), null, null,
92+
null, null,
9393
j), true);
9494
fail();
9595
} catch (BadPermissionException e) {
@@ -166,7 +166,7 @@ public void testThatTenantCanSetDatabaseRelatedConfigIfSuperTokensSaaSSecretIsNo
166166
new EmailPasswordConfig(false),
167167
new ThirdPartyConfig(false, new ThirdPartyConfig.Provider[0]),
168168
new PasswordlessConfig(false),
169-
new TotpConfig(false), null, null,
169+
null, null,
170170
j), false);
171171
}
172172

@@ -219,7 +219,7 @@ public void testThatTenantCannotGetDatabaseRelatedConfigIfSuperTokensSaaSSecretI
219219
new TenantConfig(new TenantIdentifier(null, null, "t" + i), new EmailPasswordConfig(false),
220220
new ThirdPartyConfig(false, new ThirdPartyConfig.Provider[0]),
221221
new PasswordlessConfig(false),
222-
new TotpConfig(false), null, null,
222+
null, null,
223223
j));
224224

225225
{

0 commit comments

Comments
 (0)