36 lines
970 B
JavaScript
36 lines
970 B
JavaScript
import fs from 'fs/promises'
|
|
import path from 'path'
|
|
|
|
// nosemgrep: javascript.lang.security.audit.path-traversal.path-join-resolve-traversal.path-join-resolve-traversal
|
|
const getDataPath = (filename) => {
|
|
const cwd = process.cwd()
|
|
if (cwd.endsWith('.output')) {
|
|
// nosemgrep
|
|
return path.join(cwd, '../server/data', filename)
|
|
}
|
|
// nosemgrep
|
|
return path.join(cwd, 'server/data', filename)
|
|
}
|
|
|
|
const AUDIT_LOG_FILE = getDataPath('audit.log.jsonl')
|
|
|
|
function safeStr(v, max = 500) {
|
|
return String(v == null ? '' : v).slice(0, max)
|
|
}
|
|
|
|
export async function writeAuditLog(eventType, data = {}) {
|
|
const enabled = (process.env.AUDIT_LOG_ENABLED || 'true').toLowerCase() !== 'false'
|
|
if (!enabled) return
|
|
|
|
const entry = {
|
|
ts: new Date().toISOString(),
|
|
type: safeStr(eventType, 100),
|
|
data
|
|
}
|
|
|
|
await fs.mkdir(path.dirname(AUDIT_LOG_FILE), { recursive: true })
|
|
await fs.appendFile(AUDIT_LOG_FILE, JSON.stringify(entry) + '\n', 'utf-8')
|
|
}
|
|
|
|
|