Files
dsh/upstream/container/platform/lib/access-evidence.mjs
T

64 lines
2.0 KiB
JavaScript

import { lstat, readdir } from 'node:fs/promises'
import { join } from 'node:path'
const EVIDENCE_KEYS = Object.freeze([
'dshSettings',
'webProfile',
'dshSessions',
'userSkills',
'deploymentState',
'managementState',
'updaterState',
'legacyAuthenticationConfigured',
])
async function exists(path) {
return lstat(path).then(() => true, error => error?.code === 'ENOENT' ? false : Promise.reject(error))
}
async function nonEmptyDirectory(path) {
try { return (await readdir(path)).length > 0 }
catch (error) { return error?.code === 'ENOENT' ? false : Promise.reject(error) }
}
export function parseAccessEvidence(value) {
let parsed
try { parsed = JSON.parse(value) } catch { throw new Error('legacy installation evidence is invalid') }
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)
|| Object.keys(parsed).length !== EVIDENCE_KEYS.length
|| EVIDENCE_KEYS.some(key => typeof parsed[key] !== 'boolean')) {
throw new Error('legacy installation evidence is invalid')
}
return Object.freeze(Object.fromEntries(EVIDENCE_KEYS.map(key => [key, parsed[key]])))
}
export async function collectAccessEvidence({ dshHome, paths, legacyAuthenticationConfigured = false }) {
const [
dshSettings,
webProfile,
dshSessions,
userSkills,
deploymentState,
managementState,
updaterState,
] = await Promise.all([
exists(join(dshHome, 'settings.yaml')),
exists(join(dshHome, 'profiles', 'web', 'package.json')),
nonEmptyDirectory(join(dshHome, 'sessions')),
nonEmptyDirectory(join(dshHome, 'skills')),
exists(join(paths.deploymentStateRoot, 'slots.json')),
nonEmptyDirectory(paths.managementStateRoot),
nonEmptyDirectory(paths.updaterStateRoot),
])
return Object.freeze({
dshSettings,
webProfile,
dshSessions,
userSkills,
deploymentState,
managementState,
updaterState,
legacyAuthenticationConfigured: legacyAuthenticationConfigured === true,
})
}