From 6df28e615c57cf43af9f9183fa8646c941ae7bd3 Mon Sep 17 00:00:00 2001 From: Billy Olsen Date: Mon, 14 Aug 2023 16:17:37 -0700 Subject: [PATCH 1/2] Update mysql schema for modern mysql The groups keyword is reserved in mysql but can still have tables using this name if they are quoted with backticks (`). Additionally, default values cannot be specified for TEXT types unless wrapped in parentheses. Signed-off-by: Billy Olsen --- mysql.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mysql.go b/mysql.go index 914889e..db2fe6b 100644 --- a/mysql.go +++ b/mysql.go @@ -44,15 +44,15 @@ CREATE TABLE IF NOT EXISTS users ( passbcrypt VARCHAR(64) DEFAULT '', otpsecret VARCHAR(64) DEFAULT '', yubikey VARCHAR(128) DEFAULT '', - sshkeys TEXT DEFAULT '', - custattr TEXT DEFAULT '{}') + sshkeys TEXT DEFAULT (''), + custattr TEXT DEFAULT ('{}')) `) statement.Exec() statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_user_name on users(name)") statement.Exec() - statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS groups (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) NOT NULL, gidnumber INTEGER NOT NULL)") + statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS `groups` (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) NOT NULL, gidnumber INTEGER NOT NULL)") statement.Exec() - statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_group_name on groups(name)") + statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_group_name on `groups`(name)") statement.Exec() statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS includegroups (id INTEGER AUTO_INCREMENT PRIMARY KEY, parentgroupid INTEGER NOT NULL, includegroupid INTEGER NOT NULL)") statement.Exec() @@ -63,7 +63,7 @@ CREATE TABLE IF NOT EXISTS users ( // Migrate schema if necessary func (b MysqlBackend) MigrateSchema(db *sql.DB, checker func(*sql.DB, string) bool) { if !checker(db, "sshkeys") { - statement, _ := db.Prepare("ALTER TABLE users ADD COLUMN sshkeys TEXT DEFAULT ''") + statement, _ := db.Prepare("ALTER TABLE users ADD COLUMN sshkeys TEXT DEFAULT ('')") statement.Exec() } } From a19081b5ef88d50a8d6d00bcac51be1406faa6be Mon Sep 17 00:00:00 2001 From: Billy Olsen Date: Mon, 14 Aug 2023 18:50:20 -0700 Subject: [PATCH 2/2] Update the schema to rename groups to ldapgroups Update the schema to rename groups to ldapgroups. This allows for the table name and means to access it to be consistent across all databases. This is due to mysql reserving the name groups as a keyword. Signed-off-by: Billy Olsen --- mysql.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/mysql.go b/mysql.go index db2fe6b..1c1b30c 100644 --- a/mysql.go +++ b/mysql.go @@ -2,6 +2,7 @@ package main import ( "database/sql" + "fmt" _ "github.com/go-sql-driver/mysql" @@ -50,9 +51,9 @@ CREATE TABLE IF NOT EXISTS users ( statement.Exec() statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_user_name on users(name)") statement.Exec() - statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS `groups` (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) NOT NULL, gidnumber INTEGER NOT NULL)") + statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS ldapgroups (id INTEGER AUTO_INCREMENT PRIMARY KEY, name VARCHAR(64) NOT NULL, gidnumber INTEGER NOT NULL)") statement.Exec() - statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_group_name on `groups`(name)") + statement, _ = db.Prepare("CREATE UNIQUE INDEX idx_group_name on ldapgroups(name)") statement.Exec() statement, _ = db.Prepare("CREATE TABLE IF NOT EXISTS includegroups (id INTEGER AUTO_INCREMENT PRIMARY KEY, parentgroupid INTEGER NOT NULL, includegroupid INTEGER NOT NULL)") statement.Exec() @@ -66,4 +67,24 @@ func (b MysqlBackend) MigrateSchema(db *sql.DB, checker func(*sql.DB, string) bo statement, _ := db.Prepare("ALTER TABLE users ADD COLUMN sshkeys TEXT DEFAULT ('')") statement.Exec() } + + if TableExists(db, "`groups`") { + // Drop the table created during schema creation + statement, _ := db.Prepare("DROP TABLE ldapgroups") + statement.Exec() + + statement, _ = db.Prepare("ALTER TABLE `groups` RENAME ldapgroups") + statement.Exec() + } +} + +// Indicates whether the table exists or not +func TableExists(db *sql.DB, tableName string) bool { + var found string + err := db.QueryRow(fmt.Sprintf("SELECT COUNT(id) FROM %s", tableName)).Scan( + &found) + if err != nil { + return false + } + return true }