UBERF-9479: Fix adapter security selection (#8007)

Signed-off-by: Andrey Sobolev <haiodo@gmail.com>
This commit is contained in:
Andrey Sobolev 2025-02-14 17:38:06 +07:00 committed by GitHub
parent dcb31e6e05
commit e0d6301100
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 37 additions and 4 deletions

View File

@ -33,6 +33,7 @@ import {
registerServerPlugins, registerServerPlugins,
registerStringLoaders, registerStringLoaders,
registerTxAdapterFactory, registerTxAdapterFactory,
setAdapterSecurity,
sharedPipelineContextVars sharedPipelineContextVars
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import serverToken from '@hcengineering/server-token' import serverToken from '@hcengineering/server-token'
@ -121,6 +122,7 @@ export function devTool (
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
registerServerPlugins() registerServerPlugins()
registerStringLoaders() registerStringLoaders()

View File

@ -24,6 +24,7 @@ import {
registerAdapterFactory, registerAdapterFactory,
registerDestroyFactory, registerDestroyFactory,
registerTxAdapterFactory, registerTxAdapterFactory,
setAdapterSecurity,
sharedPipelineContextVars sharedPipelineContextVars
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import { join } from 'path' import { join } from 'path'
@ -86,6 +87,7 @@ registerDestroyFactory('mongodb', createMongoDestroyAdapter)
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
startBackup( startBackup(
metricsContext, metricsContext,

View File

@ -63,6 +63,7 @@ import {
registerServerPlugins, registerServerPlugins,
registerStringLoaders, registerStringLoaders,
registerTxAdapterFactory, registerTxAdapterFactory,
setAdapterSecurity,
sharedPipelineContextVars sharedPipelineContextVars
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import serverToken, { decodeToken, generateToken, type Token } from '@hcengineering/server-token' import serverToken, { decodeToken, generateToken, type Token } from '@hcengineering/server-token'
@ -257,6 +258,7 @@ export async function startIndexer (
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
registerServerPlugins() registerServerPlugins()
registerStringLoaders() registerStringLoaders()

View File

@ -29,11 +29,13 @@ import { type Token } from '@hcengineering/server-token'
import { import {
createServerPipeline, createServerPipeline,
isAdapterSecurity,
registerAdapterFactory, registerAdapterFactory,
registerDestroyFactory, registerDestroyFactory,
registerServerPlugins, registerServerPlugins,
registerStringLoaders, registerStringLoaders,
registerTxAdapterFactory, registerTxAdapterFactory,
setAdapterSecurity,
sharedPipelineContextVars sharedPipelineContextVars
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import { uncompress } from 'snappy' import { uncompress } from 'snappy'
@ -99,6 +101,7 @@ export function start (
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
const usePrepare = (process.env.DB_PREPARE ?? 'true') === 'true' const usePrepare = (process.env.DB_PREPARE ?? 'true') === 'true'
@ -117,7 +120,7 @@ export function start (
metrics, metrics,
dbUrl, dbUrl,
model, model,
{ ...opt, externalStorage, adapterSecurity: dbUrl.startsWith('postgresql') }, { ...opt, externalStorage, adapterSecurity: isAdapterSecurity(dbUrl) },
{} {}
) )
const sessionFactory = (token: Token, workspace: Workspace, account: Account): Session => { const sessionFactory = (token: Token, workspace: Workspace, account: Account): Session => {

View File

@ -211,7 +211,8 @@ export async function getServerPipeline (
const pipelineFactory = createServerPipeline(ctx, dbUrl, model, { const pipelineFactory = createServerPipeline(ctx, dbUrl, model, {
externalStorage: storageAdapter, externalStorage: storageAdapter,
usePassedCtx: true, usePassedCtx: true,
disableTriggers: opt?.disableTriggers ?? false disableTriggers: opt?.disableTriggers ?? false,
adapterSecurity: isAdapterSecurity(dbUrl)
}) })
return await pipelineFactory(ctx, wsUrl, true, () => {}, null) return await pipelineFactory(ctx, wsUrl, true, () => {}, null)
@ -220,6 +221,23 @@ export async function getServerPipeline (
const txAdapterFactories: Record<string, DbAdapterFactory> = {} const txAdapterFactories: Record<string, DbAdapterFactory> = {}
const adapterFactories: Record<string, DbAdapterFactory> = {} const adapterFactories: Record<string, DbAdapterFactory> = {}
const destroyFactories: Record<string, (url: string) => WorkspaceDestroyAdapter> = {} const destroyFactories: Record<string, (url: string) => WorkspaceDestroyAdapter> = {}
const adapterSecurityState = new Set<string>()
export function isAdapterSecurity (name: string): boolean {
for (const it of adapterSecurityState) {
if (name.startsWith(it)) {
return true
}
}
return false
}
export function setAdapterSecurity (name: string, state: boolean): void {
if (state) {
adapterSecurityState.add(name)
} else {
adapterSecurityState.delete(name)
}
}
export function registerTxAdapterFactory (name: string, factory: DbAdapterFactory, useAsDefault: boolean = true): void { export function registerTxAdapterFactory (name: string, factory: DbAdapterFactory, useAsDefault: boolean = true): void {
txAdapterFactories[name] = factory txAdapterFactories[name] = factory

View File

@ -62,6 +62,7 @@ import {
registerServerPlugins, registerServerPlugins,
registerStringLoaders, registerStringLoaders,
registerTxAdapterFactory, registerTxAdapterFactory,
setAdapterSecurity,
sharedPipelineContextVars sharedPipelineContextVars
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage' import { buildStorageFromConfig, storageConfigFromEnv } from '@hcengineering/server-storage'
@ -160,6 +161,8 @@ export class WorkspaceWorker {
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
registerServerPlugins() registerServerPlugins()
registerStringLoaders() registerStringLoaders()

View File

@ -46,11 +46,13 @@ import {
} from '@hcengineering/postgres' } from '@hcengineering/postgres'
import { import {
createServerPipeline, createServerPipeline,
isAdapterSecurity,
registerAdapterFactory, registerAdapterFactory,
registerDestroyFactory, registerDestroyFactory,
registerServerPlugins, registerServerPlugins,
registerStringLoaders, registerStringLoaders,
registerTxAdapterFactory registerTxAdapterFactory,
setAdapterSecurity
} from '@hcengineering/server-pipeline' } from '@hcengineering/server-pipeline'
import { CloudFlareLogger } from './logger' import { CloudFlareLogger } from './logger'
import model from './model.json' import model from './model.json'
@ -109,6 +111,7 @@ export class Transactor extends DurableObject<Env> {
registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true) registerTxAdapterFactory('postgresql', createPostgresTxAdapter, true)
registerAdapterFactory('postgresql', createPostgresAdapter, true) registerAdapterFactory('postgresql', createPostgresAdapter, true)
registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true) registerDestroyFactory('postgresql', createPostgreeDestroyAdapter, true)
setAdapterSecurity('postgresql', true)
if (env.USE_GREEN === 'true') { if (env.USE_GREEN === 'true') {
registerGreenUrl(env.GREEN_URL) registerGreenUrl(env.GREEN_URL)
@ -140,7 +143,7 @@ export class Transactor extends DurableObject<Env> {
this.pipelineFactory = async (ctx, ws, upgrade, broadcast, branding) => { this.pipelineFactory = async (ctx, ws, upgrade, broadcast, branding) => {
const pipeline = createServerPipeline(this.measureCtx, dbUrl, model, { const pipeline = createServerPipeline(this.measureCtx, dbUrl, model, {
externalStorage: storage, externalStorage: storage,
adapterSecurity: false, adapterSecurity: isAdapterSecurity(dbUrl),
disableTriggers: false, disableTriggers: false,
fulltextUrl: env.FULLTEXT_URL, fulltextUrl: env.FULLTEXT_URL,
extraLogging: true, extraLogging: true,