class Inspec::WaiverFileReader
def self.fetch_waivers_by_profile(profile_id, files)
def self.fetch_waivers_by_profile(profile_id, files) read_waivers_from_file(profile_id, files) if @waivers_data.nil? || @waivers_data[profile_id].nil? @waivers_data[profile_id] end
def self.read_waivers_from_file(profile_id, files)
def self.read_waivers_from_file(profile_id, files) @waivers_data ||= {} output = {} files.each do |file_path| file_extension = File.extname(file_path) data = nil if [".yaml", ".yml"].include? file_extension data = Secrets::YAML.resolve(file_path) data = data.inputs unless data.nil? validate_json_yaml(data) elsif file_extension == ".csv" data = Waivers::CSVFileReader.resolve(file_path) headers = Waivers::CSVFileReader.headers validate_headers(headers) elsif file_extension == ".json" data = Waivers::JSONFileReader.resolve(file_path) validate_json_yaml(data) end output.merge!(data) if !data.nil? && data.is_a?(Hash) if data.nil? raise Inspec::Exceptions::WaiversFileNotReadable, "Cannot find parser for waivers file '#{file_path}'. " \ "Check to make sure file has the appropriate extension." end end @waivers_data[profile_id] = output end
def self.validate_headers(headers, json_yaml = false)
def self.validate_headers(headers, json_yaml = false) required_fields = json_yaml ? %w{justification} : %w{control_id justification} all_fields = %w{control_id justification expiration_date run} Inspec::Log.warn "Missing column headers: #{(required_fields - headers)}" unless (required_fields - headers).empty? Inspec::Log.warn "Invalid column header: Column can't be nil" if headers.include? nil Inspec::Log.warn "Extra column headers: #{(headers - all_fields)}" unless (headers - all_fields).empty? end
def self.validate_json_yaml(data)
def self.validate_json_yaml(data) headers = [] data.each_value do |value| headers.push value.keys end validate_headers(headers.flatten.uniq, true) end