Files
overub/core/sandbox.py
2025-12-21 17:12:32 +01:00

30 lines
1.0 KiB
Python

from pathlib import Path
from typing import Optional
class Sandbox:
def __init__(self, root: Path, allow_network: bool = False) -> None:
self.root = root
self.allow_network = allow_network
def _resolve(self, path: str) -> Path:
target = (self.root / path).resolve()
if not str(target).startswith(str(self.root.resolve())):
raise PermissionError("Path outside sandbox")
return target
def read_text(self, path: str, encoding: str = "utf-8") -> str:
target = self._resolve(path)
return target.read_text(encoding=encoding)
def write_text(self, path: str, data: str, encoding: str = "utf-8") -> None:
target = self._resolve(path)
target.parent.mkdir(parents=True, exist_ok=True)
target.write_text(data, encoding=encoding)
def can_network(self) -> bool:
return self.allow_network
def for_plugin(self, name: str) -> "Sandbox":
return Sandbox(self.root / "external" / name, allow_network=self.allow_network)