Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions forge/db/migrations/20251006-01-fix-sso-group-type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/**
* Change column type
*/

const { DataTypes } = require('sequelize')

module.exports = {
up: async (context, Sequelize) => {
const dialect = context.sequelize.options.dialect
if (dialect === 'sqlite') {
// For SQLITE, we need to avoid triggering cascading deletes due to the way it does column changes
const sqlFind = "select sql from SQLITE_MASTER where name = 'Users' and type = 'table';"
const [results] = await context.sequelize.query(sqlFind)
if (results.length === 0) {
return // Nothing to do
}

// Check if the DDL is as expected already
const ddl = results[0].sql
const re = /(`SSOGroups`[^,]+?VARCHAR\(255\))/.exec(ddl)
if (!re || re.length < 2) {
return // Nothing to do
}

// create new column definition
const currentColDef = re[1]
const newColDef = currentColDef.replace('VARCHAR(255)', 'TEXT')

// update the table with the new column definition
await context.sequelize.query('pragma writable_schema=1;')
const sqlUpdate = `update SQLITE_MASTER set sql = replace(sql, '${currentColDef}', '${newColDef}') where name = 'Users' and type = 'table';`
context.sequelize.query(sqlUpdate)
await context.sequelize.query('pragma writable_schema=0;')
} else {
// For Postgres, we can use changeColumn directly.
await context.changeColumn('Users', 'SSOGroups', {
type: DataTypes.TEXT,
allowNull: true
})
}
},
down: async (useContext, Sequelize) => {
}
}
2 changes: 1 addition & 1 deletion forge/db/models/User.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ module.exports = {
defaultValue: false
},
SSOGroups: {
type: DataTypes.STRING,
type: DataTypes.TEXT,
allowNull: true,
get () {
const rawValue = this.getDataValue('SSOGroups')
Expand Down
18 changes: 11 additions & 7 deletions forge/ee/routes/sso/auth.js
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,17 @@ module.exports = fp(async function (app, opts) {
return
}
}
if (providerOpts.exposeGroups) {
// get SAML groups
user.SSOGroups = app.sso.getUserGroups(samlUser, user, providerOpts)
await user.save()
} else {
user.SSOGroups = null
await user.save()
try {
if (providerOpts.exposeGroups) {
// get SAML groups
user.SSOGroups = app.sso.getUserGroups(samlUser, user, providerOpts)
await user.save()
} else {
user.SSOGroups = null
await user.save()
}
} catch (err) {
app.log.error(`SAML SSOGroups error: ${err.toString()} ${err.stack}`)
}
done(null, user)
} else {
Expand Down
Loading