Module: OllamaChat::Utils::PathValidator
- Included in:
- Tools::RunTests
- Defined in:
- lib/ollama_chat/utils/path_validator.rb
Overview
Utility module that centralises path‑validation logic for OllamaChat tools.
The module is deliberately kept private – it is mixed into tool classes that need to validate file paths against a whitelist. By extracting the logic into a reusable mixin we avoid duplication and make the intent of each tool explicit.
Instance Method Summary collapse
-
#assert_valid_path(path, allowed, check_file: false) ⇒ Pathname
Validates that a supplied path is located inside one of the allowed directories.
Instance Method Details
#assert_valid_path(path, allowed, check_file: false) ⇒ Pathname
Validates that a supplied path is located inside one of the allowed directories.
The method performs the following steps:
-
Canonicalises the supplied
pathusing ‘Pathname#expand_path` and `cleanpath(true)` – this resolves symlinks and removes..components. -
Normalises each entry in
allowedinto an absolute, cleanedPathname(an empty ornilallowed list results in an empty array, which causes every path to be rejected – the safest default). -
Checks that the canonicalised
pathstarts with any of the allowed directories. -
If the check fails, raises an
OllamaChat::InvalidPathErrorthat carries the offending path for debugging and error reporting.
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/ollama_chat/utils/path_validator.rb', line 36 def assert_valid_path(path, allowed, check_file: false) target_path = Pathname.new(path)..cleanpath(true) target_path.dirname.directory? or raise OllamaChat::InvalidPathError, "#{target_path.dirname.to_s.inspect} is not a directory" if check_file target_path.file? or raise OllamaChat::InvalidPathError, "#{target_path.to_s.inspect} is not a file" end allowed_dirs, rest = Array(allowed).map do |p| Pathname.new(p)..cleanpath end.partition(&:directory?) unless rest.empty? warn "Ignoring non-directories: #{rest.map(&:to_path).map(&:inspect) * ', '} in assert_valid_path." end valid_path = allowed_dirs.any? do |allowed_dir| check_path = target_path check_path.directory? or check_path = check_path.dirname check_path.ascend.any? do |tp| tp == allowed_dir end end unless valid_path error = OllamaChat::InvalidPathError.new( "Path #{path} is not within allowed directories: " \ "#{allowed_dirs&.join(', ') || '∅'}" ) error.path = path raise error end target_path end |