diff --git a/src/servers/api/file-browser/router.ts b/src/servers/api/file-browser/router.ts
index 3ddf9c9e..d424209a 100644
--- a/src/servers/api/file-browser/router.ts
+++ b/src/servers/api/file-browser/router.ts
@@ -2,7 +2,6 @@ import { createRouter } from '@@/create-router';
import { resolve, dirname, join, parse as parsePath } from 'node:path';
import { readdir, stat, mkdir, rm, rename, readFile, cp, unlink } from 'node:fs/promises';
import { existsSync } from 'node:fs';
-import { homedir } from 'node:os';
import { getHomeDir, DATA_PATH, getUserSettingsFile } from '@@/data-path';
import * as errors from '@@/custom-errors';
import { readTtsConfig } from '@@/api/server-settings/tts';
@@ -64,11 +63,11 @@ function getUserDataDir(email: string): string {
}
function getRootDir(user: UserCtx, root?: string): string {
- if (!root || root === 'home') return getHomeDir(user.email);
+ if (!root || root === 'home') {
+ if (user.role === 'Super Admin' && process.env.HOME_DIR) return process.env.HOME_DIR;
+ return getHomeDir(user.email);
+ }
if (root === 'user-data') return getUserDataDir(user.email);
- if (user.role !== 'Super Admin') throw errors.FORBIDDEN('Only Super Admin can access this root');
- if (root === '~') return homedir();
- if (root === 'officer.dev') return resolve(process.cwd(), '..');
throw errors.BAD_REQUEST(`Invalid root: ${root}`);
}
@@ -374,7 +373,7 @@ router.post('/save-result', async (ctx) => {
const srcAbs = resolve(userDataDir, cachedPath);
if (!existsSync(srcAbs)) throw errors.BAD_REQUEST('Cached file not found');
- const homeDir = getHomeDir(user.email);
+ const homeDir = getRootDir(user, 'home');
const destAbs = resolve(homeDir, relativePath);
if (!destAbs.startsWith(homeDir)) throw errors.FORBIDDEN('Path outside home directory');
diff --git a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/FileBrowserApp.tsx b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/FileBrowserApp.tsx
index 3bd553de..b6cf6742 100644
--- a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/FileBrowserApp.tsx
+++ b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/FileBrowserApp.tsx
@@ -1,6 +1,5 @@
import { Breadcrumb } from './components/Breadcrumb';
import { Toolbar } from './components/Toolbar';
-import { HomeDirSelector } from './components/HomeDirSelector';
import { UploadProgress } from './components/UploadProgress';
import { FileViewContainer } from './components/FileViewContainer';
import { TaskRunnerDialog } from './components/TaskRunnerDialog';
@@ -26,7 +25,6 @@ export const FileBrowserApp = ({ basePath = '/', rootOverride, initialPath, defa
return (
-
diff --git a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/HomeDirSelector.tsx b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/HomeDirSelector.tsx
deleted file mode 100644
index d3dcaccc..00000000
--- a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/HomeDirSelector.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Home, FolderRoot, Code } from 'lucide-react';
-import { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group';
-import type { UseFileBrowserAppType } from '../useFileBrowserApp';
-
-type HomeDirSelectorProps = {
- fileBrowserManager: UseFileBrowserAppType;
- basePath: string;
-};
-
-export const HomeDirSelector = ({ fileBrowserManager, basePath }: HomeDirSelectorProps) => {
- const { user, homeRoot, setHomeRoot, currentPath, setCurrentPath } = fileBrowserManager;
-
- if (basePath !== '/' || user?.role !== 'Super Admin') return null;
-
- return (
-
- {
- setHomeRoot(v as 'home' | '~' | 'officer.dev');
- if (currentPath !== '/') setCurrentPath('/');
- }}
- className="flex items-center gap-4"
- >
-
-
-
-
-
- );
-};
diff --git a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/TaskRunnerDialog.tsx b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/TaskRunnerDialog.tsx
index 8fcc07e6..7b5376c9 100644
--- a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/TaskRunnerDialog.tsx
+++ b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/components/TaskRunnerDialog.tsx
@@ -6,7 +6,7 @@ type TaskRunnerDialogProps = {
};
export const TaskRunnerDialog = ({ fileBrowserManager }: TaskRunnerDialogProps) => {
- const { runningTask, setRunningTask, refresh, homeRoot, currentPath, getEntryAbsPath } = fileBrowserManager;
+ const { runningTask, setRunningTask, refresh, currentPath, getEntryAbsPath } = fileBrowserManager;
if (!runningTask) return null;
@@ -23,7 +23,7 @@ export const TaskRunnerDialog = ({ fileBrowserManager }: TaskRunnerDialogProps)
entryName={runningTask.entry.name}
entryFullPath={getEntryAbsPath(runningTask.entry.name)}
entryType={runningTask.entry.type}
- cwd={{ root: homeRoot, path: currentPath.replace(/^\//, '') }}
+ cwd={{ root: 'home', path: currentPath.replace(/^\//, '') }}
/>
);
};
diff --git a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/useFileBrowserApp.ts b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/useFileBrowserApp.ts
index 746125ed..b074a5cd 100644
--- a/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/useFileBrowserApp.ts
+++ b/src/workspaces/officerdev/src/apps/FileBrowser/FileBrowserApp/useFileBrowserApp.ts
@@ -16,7 +16,7 @@ export const useFileBrowserApp = (basePath: string, rootOverride?: string, initi
const { user } = useAuth();
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
- const [homeRoot, setHomeRoot] = useUserState
('files/homeRoot', 'home');
+ const homeRoot = 'home';
const [globalPath, setGlobalPath] = useUserState('files/currentPath', '/');
const [localPath, setLocalPath] = useState(initialPath ?? basePath);
const scoped = basePath !== '/';
@@ -655,7 +655,7 @@ export const useFileBrowserApp = (basePath: string, rootOverride?: string, initi
// Auth
user,
// Navigation
- homeRoot, setHomeRoot,
+ homeRoot,
currentPath, setCurrentPath,
// Directory listing
visibleEntries, loading, refresh,
@@ -731,4 +731,3 @@ export type UseFileBrowserAppType = ReturnType;
type ClipboardState = { paths: string[]; mode: 'copy' | 'cut' } | null;
-type HomeRoot = 'home' | '~' | 'officer.dev';