Use transaction and check root on server init

This commit is contained in:
advplyr committed 2026-10-04 20:03:56 -05:00
1 parent 2a0507ffc6
commit 34715558df
3 files changed
+22 -6

No files matched your search

+15 -3
View File
@@ -420,9 +420,21 @@ class Database {
*/ */
async createRootUser(username, pash, auth) { async createRootUser(username, pash, auth) {
if (!this.sequelize) return false if (!this.sequelize) return false
await this.userModel.createRootUser(username, pash, auth) const transaction = await this.sequelize.transaction()
this.hasRootUser = true try {
return true const rootCount = await this.userModel.count({ where: { type: 'root' }, transaction })
if (rootCount > 0) {
await transaction.rollback()
return false
}
await this.userModel.createRootUser(username, pash, auth, transaction)
await transaction.commit()
this.hasRootUser = true
return true
} catch (error) {
await transaction.rollback()
throw error
}
} }
updateServerSettings() { updateServerSettings() {
+5 -1
View File
@@ -472,7 +472,11 @@ class Server {
const rootUsername = newRoot.username || 'root' const rootUsername = newRoot.username || 'root'
const rootPash = newRoot.password ? await this.auth.localAuthStrategy.hashPassword(newRoot.password) : '' const rootPash = newRoot.password ? await this.auth.localAuthStrategy.hashPassword(newRoot.password) : ''
if (!rootPash) Logger.warn(`[Server] Creating root user with no password`) if (!rootPash) Logger.warn(`[Server] Creating root user with no password`)
await Database.createRootUser(rootUsername, rootPash, this.auth) const created = await Database.createRootUser(rootUsername, rootPash, this.auth)
if (!created) {
Logger.error(`[Server] attempt to init server when server already has a root user`)
return res.sendStatus(500)
}
res.sendStatus(200) res.sendStatus(200)
} }
+2 -2
View File
@@ -189,7 +189,7 @@ class User extends Model {
* @param {import('../Auth')} auth * @param {import('../Auth')} auth
* @returns {Promise<User>} * @returns {Promise<User>}
*/ */
static async createRootUser(username, pash, auth) { static async createRootUser(username, pash, auth, transaction = null) {
const userId = uuidv4() const userId = uuidv4()
const token = auth.generateAccessToken({ id: userId, username }) const token = auth.generateAccessToken({ id: userId, username })
@@ -207,7 +207,7 @@ class User extends Model {
seriesHideFromContinueListening: [] seriesHideFromContinueListening: []
} }
} }
return this.create(newUser) return this.create(newUser, { transaction })
} }
/** /**