From f2c2f3cd332715af83c949d32572387d6c76d196 Mon Sep 17 00:00:00 2001 From: tamassoltesz Date: Thu, 5 Dec 2024 23:42:25 +0100 Subject: [PATCH] feat: creating database tables --- .../storage/mysql/config/MySQLConfig.java | 8 ++ .../storage/mysql/queries/GeneralQueries.java | 23 +++++ .../mysql/queries/WebAuthNQueries.java | 95 +++++++++++++++++++ 3 files changed, 126 insertions(+) create mode 100644 src/main/java/io/supertokens/storage/mysql/queries/WebAuthNQueries.java diff --git a/src/main/java/io/supertokens/storage/mysql/config/MySQLConfig.java b/src/main/java/io/supertokens/storage/mysql/config/MySQLConfig.java index 85d2e74..ff0baff 100644 --- a/src/main/java/io/supertokens/storage/mysql/config/MySQLConfig.java +++ b/src/main/java/io/supertokens/storage/mysql/config/MySQLConfig.java @@ -389,6 +389,14 @@ public String getOAuthLogoutChallengesTable() { return addPrefixToTableName("oauth_logout_challenges"); } + public String getWebAuthNUsersTable(){ return addPrefixToTableName("webauthn_users");} + + public String getWebAuthNUserToTenantTable(){ return addPrefixToTableName("webauthn_user_to_tenant"); } + + public String getWebAuthNGeneratedOptionsTable() { return addPrefixToTableName("webauthn_generated_options"); } + + public String getWebAuthNCredentialsTable() { return addPrefixToTableName("webauthn_credentials"); } + private String addPrefixToTableName(String tableName) { return mysql_table_names_prefix + tableName; } diff --git a/src/main/java/io/supertokens/storage/mysql/queries/GeneralQueries.java b/src/main/java/io/supertokens/storage/mysql/queries/GeneralQueries.java index 956faa0..013ca77 100644 --- a/src/main/java/io/supertokens/storage/mysql/queries/GeneralQueries.java +++ b/src/main/java/io/supertokens/storage/mysql/queries/GeneralQueries.java @@ -447,6 +447,29 @@ public static void createTablesIfNotExists(Start start, Connection con) throws S // index update(con, OAuthQueries.getQueryToCreateOAuthLogoutChallengesTimeCreatedIndex(start), NO_OP_SETTER); } + + if(!doesTableExists(start, con, Config.getConfig(start).getWebAuthNUsersTable())){ + getInstance(start).addState(CREATING_NEW_TABLE, null); + update(con, WebAuthNQueries.getQueryToCreateWebAuthNUsersTable(start), NO_OP_SETTER); + } + + if(!doesTableExists(start, con, Config.getConfig(start).getWebAuthNUserToTenantTable())){ + getInstance(start).addState(CREATING_NEW_TABLE, null); + update(con, WebAuthNQueries.getQueryToCreateWebAuthNUsersToTenantTable(start), NO_OP_SETTER); + } + + if(!doesTableExists(start, con, Config.getConfig(start).getWebAuthNGeneratedOptionsTable())){ + getInstance(start).addState(CREATING_NEW_TABLE, null); + update(con, WebAuthNQueries.getQueryToCreateWebAuthNGeneratedOptionsTable(start), NO_OP_SETTER); + //index + update(con, WebAuthNQueries.getQueryToCreateWebAuthNChallengeExpiresIndex(start), NO_OP_SETTER); + } + + if(!doesTableExists(start, con, Config.getConfig(start).getWebAuthNCredentialsTable())){ + getInstance(start).addState(CREATING_NEW_TABLE, null); + update(con, WebAuthNQueries.getQueryToCreateWebAuthNCredentialsTable(start), NO_OP_SETTER); + } + } @TestOnly diff --git a/src/main/java/io/supertokens/storage/mysql/queries/WebAuthNQueries.java b/src/main/java/io/supertokens/storage/mysql/queries/WebAuthNQueries.java new file mode 100644 index 0000000..3ad22fb --- /dev/null +++ b/src/main/java/io/supertokens/storage/mysql/queries/WebAuthNQueries.java @@ -0,0 +1,95 @@ +/* + * Copyright (c) 2024, VRAI Labs and/or its affiliates. All rights reserved. + * + * This software is licensed under the Apache License, Version 2.0 (the + * "License") as published by the Apache Software Foundation. + * + * You may not use this file except in compliance with the License. You may + * obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + */ + +package io.supertokens.storage.mysql.queries; + + +import io.supertokens.storage.mysql.Start; +import io.supertokens.storage.mysql.config.Config; + +public class WebAuthNQueries { + + static String getQueryToCreateWebAuthNUsersTable(Start start){ + String webAuthNUsersTableName = Config.getConfig(start).getWebAuthNUsersTable(); + return "CREATE TABLE IF NOT EXISTS " + webAuthNUsersTableName + "(" + + " app_id VARCHAR(64) DEFAULT 'public' NOT NULL," + + " user_id CHAR(36) NOT NULL," + + " email VARCHAR(256) NOT NULL," + + " rp_id VARCHAR(256) NOT NULL," + + " time_joined BIGINT NOT NULL," + + " PRIMARY KEY (app_id, user_id)," + + " FOREIGN KEY (app_id, user_id) REFERENCES " + Config.getConfig(start).getAppIdToUserIdTable() + + " (app_id, user_id) ON DELETE CASCADE " + + ");"; + } + + static String getQueryToCreateWebAuthNUsersToTenantTable(Start start){ + String webAuthNUserToTenantTableName = Config.getConfig(start).getWebAuthNUserToTenantTable(); + return "CREATE TABLE IF NOT EXISTS " + webAuthNUserToTenantTableName +" (" + + " app_id VARCHAR(64) DEFAULT 'public' NOT NULL," + + " tenant_id VARCHAR(64) DEFAULT 'public' NOT NULL," + + " user_id CHAR(36) NOT NULL," + + " email VARCHAR(256) NOT NULL," + + " UNIQUE (app_id, tenant_id, email)," + + " PRIMARY KEY (app_id, tenant_id, user_id)," + + " FOREIGN KEY (app_id, tenant_id, user_id) " + + " REFERENCES "+ Config.getConfig(start).getUsersTable()+" (app_id, tenant_id, user_id) ON DELETE CASCADE" + + ");"; + } + + static String getQueryToCreateWebAuthNGeneratedOptionsTable(Start start){ + String webAuthNGeneratedOptionsTable = Config.getConfig(start).getWebAuthNGeneratedOptionsTable(); + return "CREATE TABLE IF NOT EXISTS " + webAuthNGeneratedOptionsTable + "(" + + " app_id VARCHAR(64) DEFAULT 'public' NOT NULL," + + " tenant_id VARCHAR(64) DEFAULT 'public' NOT NULL," + + " id CHAR(36) NOT NULL," + + " challenge VARCHAR(256) NOT NULL," + + " email VARCHAR(256)," + + " rp_id VARCHAR(256) NOT NULL," + + " origin VARCHAR(256) NOT NULL," + + " expires_at BIGINT NOT NULL," + + " created_at BIGINT NOT NULL," + + " PRIMARY KEY (app_id, tenant_id, id)," + + " FOREIGN KEY (app_id, tenant_id) " + + " REFERENCES " + Config.getConfig(start).getTenantsTable() + " (app_id, tenant_id) ON DELETE CASCADE" + + ");"; + } + + static String getQueryToCreateWebAuthNChallengeExpiresIndex(Start start) { + return "CREATE INDEX webauthn_user_challenges_expires_at_index ON " + + Config.getConfig(start).getWebAuthNGeneratedOptionsTable() + + " (app_id, tenant_id, expires_at);"; + } + + static String getQueryToCreateWebAuthNCredentialsTable(Start start){ + String webAuthNCredentialsTable = Config.getConfig(start).getWebAuthNCredentialsTable(); + return "CREATE TABLE IF NOT EXISTS "+ webAuthNCredentialsTable + "(" + + " id VARCHAR(256) NOT NULL," + + " app_id VARCHAR(64) DEFAULT 'public'," + + " rp_id VARCHAR(256)," + + " user_id CHAR(36)," + + " counter BIGINT NOT NULL," + + " public_key BLOB NOT NULL," + + " transports TEXT NOT NULL," + + " created_at BIGINT NOT NULL," + + " updated_at BIGINT NOT NULL," + + " PRIMARY KEY (app_id, rp_id, id)," + + " FOREIGN KEY (app_id, user_id) REFERENCES " + + Config.getConfig(start).getWebAuthNUsersTable() + " (app_id, user_id) ON DELETE CASCADE" + + ");"; + } + +}