diff options
| author | 2023-02-24 18:32:25 -0500 | |
|---|---|---|
| committer | 2023-02-24 18:32:25 -0500 | |
| commit | 36814de6f7a231c86b356ec27b649da5ffc85c44 (patch) | |
| tree | a3b2ef8f11f250dd11ef84b4ae20d2dfcc462152 | |
| parent | Truncate FileAttachment repr to avoid log spam (diff) | |
Ignore user uploads in output files, default output to `/home`
- Adds ignore of user uploaded files in scanning of output files
- Adds ignore of files starting with leading underscores
- Changes default output path to `home`
Diffstat (limited to '')
| -rw-r--r-- | snekbox/memfs.py | 20 | ||||
| -rw-r--r-- | snekbox/nsjail.py | 9 | 
2 files changed, 20 insertions, 9 deletions
| diff --git a/snekbox/memfs.py b/snekbox/memfs.py index 259f6f7..34e696e 100644 --- a/snekbox/memfs.py +++ b/snekbox/memfs.py @@ -4,7 +4,7 @@ from __future__ import annotations  import logging  import warnings  import weakref -from collections.abc import Generator +from collections.abc import Generator, Sequence  from contextlib import suppress  from pathlib import Path  from types import TracebackType @@ -27,7 +27,7 @@ class MemFS:          instance_size: int,          root_dir: str | Path = "/memfs",          home: str = "home", -        output: str = "output", +        output: str = "home",      ) -> None:          """          Initialize an in-memory temporary file system. @@ -97,7 +97,7 @@ class MemFS:      @property      def output(self) -> Path:          """Path to output directory.""" -        return self.home / self._output_name +        return self.path / self._output_name      def __enter__(self) -> MemFS:          return self @@ -120,21 +120,28 @@ class MemFS:          folder.chmod(chmod)          return folder -    def files(self, limit: int, pattern: str = "**/*") -> Generator[FileAttachment, None, None]: +    def files( +        self, limit: int, pattern: str = "**/*", exclude_files: Sequence[str] = () +    ) -> Generator[FileAttachment, None, None]:          """          Yields FileAttachments for files found in the output directory.          Args:              limit: The maximum number of files to parse.              pattern: The glob pattern to match files against. +            exclude_files: Files (relative to home directory) to exclude.          """          count = 0          for file in self.output.rglob(pattern): +            if str(file.relative_to(self.home)) in exclude_files: +                log.info(f"Skipping excluded file {file!s}") +                continue              if count > limit:                  log.info(f"Max attachments {limit} reached, skipping remaining files")                  break              if file.is_file():                  count += 1 +                log.info(f"Found file {file!s}")                  yield FileAttachment.from_path(file, relative_to=self.output)      def files_list( @@ -142,6 +149,7 @@ class MemFS:          limit: int,          pattern: str,          preload_dict: bool = False, +        exclude_files: Sequence[str] = (),      ) -> list[FileAttachment]:          """          Return a sorted list of file paths within the output directory. @@ -150,11 +158,11 @@ class MemFS:              limit: The maximum number of files to parse.              pattern: The glob pattern to match files against.              preload_dict: Whether to preload as_dict property data. - +            exclude_files: Files (relative to home directory) to exclude.          Returns:              List of FileAttachments sorted lexically by path name.          """ -        res = sorted(self.files(limit, pattern), key=lambda f: f.path) +        res = sorted(self.files(limit, pattern, exclude_files), key=lambda f: f.path)          if preload_dict:              for file in res:                  # Loads the cached property as attribute diff --git a/snekbox/nsjail.py b/snekbox/nsjail.py index ba68a84..d425d35 100644 --- a/snekbox/nsjail.py +++ b/snekbox/nsjail.py @@ -53,10 +53,10 @@ class NsJail:          read_chunk_size: int = 10_000,          memfs_instance_size: int = 48 * Size.MiB,          memfs_home: str = "home", -        memfs_output: str = "output", +        memfs_output: str = "home",          files_limit: int | None = 100,          files_timeout: float | None = 8, -        files_pattern: str = "**/*", +        files_pattern: str = "**/[!_]*",      ):          """          Initialize NsJail. @@ -258,11 +258,14 @@ class NsJail:              # convert negative exit codes to the `N + 128` form.              returncode = -nsjail.returncode + 128 if nsjail.returncode < 0 else nsjail.returncode +            # Exclude user uploaded files from output +            to_exclude = [file.path for file in files]              # Parse attachments with time limit              try:                  attachments = timed(                      MemFS.files_list, -                    (fs, self.files_limit, self.files_pattern, True), +                    (fs, self.files_limit, self.files_pattern), +                    {"preload_dict": True, "exclude_files": to_exclude},                      timeout=self.files_timeout,                  )                  log.info(f"Found {len(attachments)} files.") | 
