mirror of
https://github.com/GNS3/gns3-server.git
synced 2026-11-03 05:51:15 +02:00
fix: never allow the projects directory to become a project directory
Loading a .gns3 placed directly in the projects root registered the shared projects directory as the project path (load_project derives the path from the file's parent directory). Deleting such an entry ran rmtree on the projects directory itself, wiping every project until a root-owned file stopped it, and left a zombie entry in the controller. Three layers of protection: - Controller.load_project() refuses a .gns3 whose parent directory is the projects directory; the normal subdirectory layout is unaffected - the Project.path setter rejects the projects directory itself and its ancestors, closing the same hole for POST/PUT with an explicit path - Project.delete() uses realpath + commonpath instead of commonprefix: entries whose path is the projects root are refused, and sibling directories sharing a string prefix (/srv/projects-evil vs /srv/projects) are no longer treated as inside the projects dir Also removes the project_load MCP tool: loading by raw server filesystem path is a footgun for automated clients; projects can still be opened by project_id via the remaining tools.
This commit is contained in:
11 files changed
+125
-28
No files matched your search
@@ -745,6 +745,17 @@ class Controller:
|
||||
if not os.path.exists(path):
|
||||
raise ControllerError(f"'{path}' does not exist on the controller")
|
||||
|
||||
# A .gns3 file must live in its own directory: the project path is
|
||||
# the file's parent directory. A file placed directly in the
|
||||
# projects directory would register the shared projects root as the
|
||||
# project directory, and deleting that project would wipe every
|
||||
# project on the controller.
|
||||
projects_path = os.path.realpath(self.projects_directory())
|
||||
if os.path.realpath(os.path.dirname(path)) == projects_path:
|
||||
raise ControllerError(
|
||||
f"'{path}' cannot be loaded: the .gns3 file must be in its own subdirectory of '{projects_path}'"
|
||||
)
|
||||
|
||||
topo_data = load_topology(path)
|
||||
topo_data.pop("topology")
|
||||
topo_data.pop("version")
|
||||
|
||||
Reference in new issue
Block a user