app/controllers/view_components_system_test_controller.rb



# frozen_string_literal: true

class ViewComponentsSystemTestController < ActionController::Base # :nodoc:
  before_action :validate_test_env
  before_action :validate_file_path

  def self.temp_dir
    @_tmpdir ||= FileUtils.mkdir_p("./tmp/view_components/").first
  end

  def system_test_entrypoint
    render file: @path
  end

  private

  def validate_test_env
    raise ViewComponent::SystemTestControllerOnlyAllowedInTestError unless Rails.env.test?
  end

  # Ensure that the file path is valid and doesn't target files outside
  # the expected directory (e.g. via a path traversal or symlink attack)
  def validate_file_path
    base_path = ::File.realpath(self.class.temp_dir)
    @path = ::File.realpath(params.permit(:file)[:file], base_path)
    unless @path.start_with?(base_path)
      raise ViewComponent::SystemTestControllerNefariousPathError
    end
  end
end