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';