mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-06-12 08:51:53 +00:00
* fix(desktop): Harden local file tree paths Normalize Electron local path handling across file tree, preview, media, and git-root flows. Reject malformed and Windows device paths, recheck sensitive files after realpath resolution, and preserve external symlink traversal with stable renderer errors. * fix(desktop): Address file tree review feedback
54 lines
1,013 B
JavaScript
54 lines
1,013 B
JavaScript
'use strict'
|
|
|
|
const fs = require('node:fs')
|
|
const path = require('node:path')
|
|
const { resolveRequestedPathForIpc } = require('./hardening.cjs')
|
|
|
|
function findGitRoot(start, fsImpl = fs) {
|
|
let dir = start
|
|
|
|
for (let i = 0; i < 50; i += 1) {
|
|
try {
|
|
if (fsImpl.existsSync(path.join(dir, '.git'))) {
|
|
return dir
|
|
}
|
|
} catch {
|
|
return null
|
|
}
|
|
|
|
const parent = path.dirname(dir)
|
|
|
|
if (parent === dir) {
|
|
return null
|
|
}
|
|
|
|
dir = parent
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
async function gitRootForIpc(startPath, options = {}) {
|
|
const fsImpl = options.fs || fs
|
|
let resolved
|
|
|
|
try {
|
|
resolved = resolveRequestedPathForIpc(startPath, { purpose: 'Git root' })
|
|
} catch {
|
|
return null
|
|
}
|
|
|
|
try {
|
|
const stat = await fsImpl.promises.stat(resolved)
|
|
const start = stat.isDirectory() ? resolved : path.dirname(resolved)
|
|
|
|
return findGitRoot(start, fsImpl)
|
|
} catch {
|
|
return findGitRoot(resolved, fsImpl)
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
findGitRoot,
|
|
gitRootForIpc
|
|
}
|