feat: Emberwake, Crucible phases, Linux agent, musical dashboard, e2e
Emberwake spread/waterhole UI, campaign DB, spread handler, spread-kit web publisher, and SPREAD_TECHNIQUES doc. Crucible Phase A-C: expanded ops, port-forward matrix, remote dir browser, crucible help/tests. Linux agent hardening: credential vault, persistence audit, firewall/defender deploy, SMB spread status, CPU stats, screenshots/crypt/file-ops split. Docker compose and agent/server images with e2e validation script and docs. Musical dashboard: ambient music player, hover SFX, SoundContext/AmbientMusicContext, steampunk polish. Public builds API, dropper handler updates, SessionGate and fleet UX. README and PROBLEMS.md refresh.
This commit is contained in:
41
server/web/src/help/remoteDirBrowser.test.ts
Normal file
41
server/web/src/help/remoteDirBrowser.test.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import {
|
||||
defaultBrowseRoot,
|
||||
joinRemotePath,
|
||||
parseListDirMessage,
|
||||
pathBreadcrumbs,
|
||||
} from './remoteDirBrowser';
|
||||
|
||||
describe('remoteDirBrowser helpers', () => {
|
||||
it('parseListDirMessage reads agent JSON', () => {
|
||||
const msg = JSON.stringify({
|
||||
path: '/home/alice',
|
||||
home_dir: '/home/alice',
|
||||
platform: 'linux',
|
||||
entries: [{ name: 'docs', is_dir: true, size: 0 }],
|
||||
});
|
||||
const parsed = parseListDirMessage(msg);
|
||||
expect(parsed?.path).toBe('/home/alice');
|
||||
expect(parsed?.entries).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('defaultBrowseRoot returns empty for agent home resolution', () => {
|
||||
expect(defaultBrowseRoot('windows')).toBe('');
|
||||
expect(defaultBrowseRoot('linux')).toBe('');
|
||||
});
|
||||
|
||||
it('joinRemotePath handles unix parent', () => {
|
||||
expect(joinRemotePath('/home/alice/docs', '..')).toBe('/home/alice');
|
||||
expect(joinRemotePath('/home/alice/docs', 'file.txt')).toBe('/home/alice/docs/file.txt');
|
||||
});
|
||||
|
||||
it('joinRemotePath handles windows parent', () => {
|
||||
expect(joinRemotePath('C:\\Users\\alice', '..')).toBe('C:\\Users');
|
||||
expect(joinRemotePath('C:\\Users\\alice', 'Desktop')).toBe('C:\\Users\\alice\\Desktop');
|
||||
});
|
||||
|
||||
it('pathBreadcrumbs splits mixed separators', () => {
|
||||
expect(pathBreadcrumbs('/var/log')).toEqual(['var', 'log']);
|
||||
expect(pathBreadcrumbs('C:\\Users\\bob')).toEqual(['C:', 'Users', 'bob']);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user