mirror of
https://github.com/Ark0N/Codeman.git
synced 2026-11-14 18:39:33 +01:00
fix(files): harden the outside-worktree root after review
Keep the 1.49.0 API meaning: liveWorktree and root=live stay inside the session folder, and an outside worktree is published as outsideWorktree and walked only with root=live-any. Refuse a symlinked .git folder as the main worktree, sensitive files inside a followed worktree, and any outside worktree while attachment confinement is on or around a blocked tree. The file routes re-check the guard settings on every request, and a throwing rule check refuses. The panel keeps its Back to worktree button while pinned to the session folder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
c9b79097b0
commit
8d33f53fd0
28 files changed
+856
-198
No files matched your search
@@ -27,7 +27,7 @@
|
||||
* @module config/attachment-guard
|
||||
*/
|
||||
|
||||
import { sep } from 'node:path';
|
||||
import { join, sep } from 'node:path';
|
||||
import { isSensitivePath } from '../web/sensitive-path.js';
|
||||
import { readJsonConfig, SETTINGS_PATH } from '../web/route-helpers.js';
|
||||
|
||||
@@ -131,3 +131,25 @@ export function isBlockedAttachmentPath(absPath: string, blockedTrees: readonly
|
||||
if (isSensitivePath(absPath)) return true;
|
||||
return blockedTrees.some((tree) => isUnderTree(absPath, tree));
|
||||
}
|
||||
|
||||
/**
|
||||
* Like `isBlockedAttachmentPath`, for a directory. The sensitive patterns describe file locations
|
||||
* such as ~/.ssh/<key>, so a child probe is what refuses a folder like ~/.ssh itself.
|
||||
*/
|
||||
export function isBlockedAttachmentDirectory(dir: string, blockedTrees: readonly string[]): boolean {
|
||||
return (
|
||||
isBlockedAttachmentPath(dir, blockedTrees) ||
|
||||
isBlockedAttachmentPath(join(dir, '__codeman_blocked_dir_probe__'), blockedTrees)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* True when the attachment guard refuses `root` as the root of a worktree outside the session
|
||||
* folder: workspace confinement is on, the folder is blocked or sensitive, or it surrounds a
|
||||
* blocked tree. `root` must be absolute and symlink-resolved.
|
||||
*/
|
||||
export function isOutsideWorktreeRootRefused(root: string, guard: AttachmentGuardConfig): boolean {
|
||||
if (guard.confineToWorkspace) return true;
|
||||
if (isBlockedAttachmentDirectory(root, guard.blockedTrees)) return true;
|
||||
return guard.blockedTrees.some((tree) => isUnderTree(tree, root));
|
||||
}
|
||||
Reference in new issue
Block a user