def self.read(path, entry)
flags = File::RDONLY
flags |= File::NOFOLLOW if File.const_defined?(:NOFOLLOW)
line = File.open(path, flags) { |file| file.gets("\n", MAX_BYTES + 1) }.to_s.force_encoding(Encoding::UTF_8)
return unless line.b.start_with?(PREFIX.b)
raise ConfigurationError, "Invalid override header" if line.bytesize > MAX_BYTES || !line.valid_encoding?
json = line.match(/\A<%# rails_ai_admin:override (\{.*\}) %>\r?\n?\z/)&.captures&.first
raise ConfigurationError, "Invalid override header" unless json
data = JSON.parse(json, object_class: HeaderObject, max_nesting: 2, allow_duplicate_key: false)
unless data.keys.sort == KEYS.sort && data["format"].is_a?(Integer) && data["format"] == 1 && data["key"] == entry.key &&
data["contract"].is_a?(Integer) && data["contract"].between?(1, 1_000_000) &&
data["source_sha256"].is_a?(String) && data["source_sha256"].match?(/\A[0-9a-f]{64}\z/) &&
data["gem_version"].is_a?(String) && data["gem_version"].match?(/\A[0-9a-zA-Z][0-9a-zA-Z.-]{0,63}\z/) && Gem::Version.correct?(data["gem_version"])
raise ConfigurationError, "Invalid override header"
end
data.freeze
rescue JSON::ParserError, EncodingError
raise ConfigurationError, "Invalid override header", cause: nil
end