Limit the development server to sources and dependencies

Vite serves any file under fs.allow through /@fs/, and the default
allow list is the workspace root. In a clusterio checkout that is also
the usual data directory, so with --dev any client that could reach the
controller could fetch config-controller.json, config-ctl.json and the
database without logging in. webpack-dev-middleware only served the
compiled bundles.

Allow the controller, web_ui, lib and dev plugin directories and the
node_modules directories Node.js would resolve their imports from.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bbassieandClaude Opus 5.5 committed 2026-10-27 23:01:12 +00:00
1 parent ebedf6b3b0
commit 5c92a44e65
2 files changed
+21 -2

No files matched your search

-1
View File
@@ -524,7 +524,6 @@ export default class Controller {
server: {
middlewareMode: true,
preTransformRequests: false,
fs: { allow: [vite.searchForWorkspaceRoot(controllerDir), ...pluginDirs.values()] },
},
plugins: [webUiVite.clusterioDevPlugins(pluginDirs)],
});
+21 -1
View File
@@ -47,6 +47,7 @@ const polyfills = {
zlib: "browserify-zlib",
};
const webUiPackage = fileURLToPath(new URL("./package.json", import.meta.url));
const libPackage = createRequire(webUiPackage).resolve("@clusterio/lib/package.json");
const sharedPrefix = "\0clusterio:shared/";
const pluginPrefix = "\0clusterio:plugin/";
@@ -83,6 +84,19 @@ async function findFile(dir, candidates) {
return undefined;
}
// node_modules directories Node.js would search for packages imported from dir.
function nodeModulesDirs(dir) {
const dirs = [];
for (let current = dir; ; current = path.dirname(current)) {
if (path.basename(current) !== "node_modules") {
dirs.push(path.join(current, "node_modules"));
}
if (current === path.dirname(current)) {
return dirs;
}
}
}
function chunkName(name) {
return name.replace(/^@/, "").replace(/[/]/g, "_");
}
@@ -292,8 +306,14 @@ export function clusterioApp({ entry }) {
export function clusterioDevPlugins(pluginDirs) {
return {
name: "clusterio:dev-plugins",
config() {
config(config) {
const root = path.resolve(config.root ?? process.cwd());
const sources = [root, path.dirname(webUiPackage), path.dirname(libPackage), ...pluginDirs.values()];
return {
server: {
// Vite's default is the workspace root, which may be the data directory.
fs: { allow: [...sources, ...sources.flatMap(nodeModulesDirs)] },
},
optimizeDeps: {
entries: [...pluginDirs.values()].flatMap(
dir => [`${dir}/index.{ts,js}`, `${dir}/web/**/*.{ts,tsx,js,jsx}`]