lib/contrast/tasks/config.rb in contrast-agent-6.13.0 vs lib/contrast/tasks/config.rb in contrast-agent-6.14.0
- old
+ new
@@ -1,144 +1,33 @@
# Copyright (c) 2023 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
# frozen_string_literal: true
-require 'yaml'
-require 'contrast/configuration'
-require 'contrast/agent/reporting/reporter'
+require 'contrast/config/yaml_file'
+require 'contrast/config/validate'
module Contrast
# A Rake task to generate a contrast_security.yaml file with some basic settings
module Config
extend Rake::DSL
- DEFAULT_CONFIG = {
- 'api' => {
- 'url' => 'Enter your Contrast URL ex: https://app.contrastsecurity.com/Contrast',
- 'api_key' => 'Enter your Contrast api key',
- 'service_key' => 'Enter your Contrast service key',
- 'user_name' => 'Enter your Contrast user name'
- },
- 'agent' => {
- 'logger' => {
- 'level' => 'ERROR',
- 'path' => 'contrast_agent.log'
- }
- }
- }.cs__freeze
+ # The file create methods are required in the gemspec. Some of the Agent functions are not
+ # available there. To be safe the validate mechanics are extracted in different module.
+ extend Contrast::Config::Validate
- SKIP_LOG = %w[service_key api_key].cs__freeze
- REQUIRED = %i[url api_key service_key user_name].cs__freeze
-
namespace :contrast do
namespace :config do
desc 'Create a contrast_security.yaml in the applications root directory'
task :create do
- execution_directory = Dir.pwd
- target_path = File.join(execution_directory, 'contrast_security.yaml')
- if File.exist?(target_path)
- puts 'WARNING: contrast_security.yaml already exists'
- else
- File.write(target_path, YAML.dump(DEFAULT_CONFIG))
-
- puts "Created contrast_security.yaml at #{ target_path }"
- puts 'Open the file and enter your Contrast Security api keys or set them via environment variables'
- puts 'Visit our documentation site for more details: https://docs.contrastsecurity.com/installation-rubyconfig.html'
- end
+ Contrast::Config::YamlFile.create
end
end
end
namespace :contrast do
namespace :config do
desc 'Validate the provided Contrast configuration and confirm connectivity'
task validate: :environment do
- puts 'Validating Agent Configuration...'
- Contrast::Config.validate_config
- puts '...done!'
- puts 'Validating Contrast Reporter Headers...'
- reporter = Contrast::Config.validate_headers
- puts '...done!'
- puts 'Testing Reporter Client Connection...'
- Contrast::Config.test_connection(reporter) if reporter
- puts '...done!'
+ validate_file
end
- end
-
- def self.validate_config
- config = Contrast::Configuration.new
- abort('Unable to Build Config') unless config
- missing = []
-
- api_hash = config.api.to_contrast_hash
-
- api_hash.each_key do |key|
- value = mask_keys(api_hash, key)
- if value.is_a?(Contrast::Config::ApiProxyConfiguration)
- Contrast::Config.validate_proxy(value)
- elsif value.is_a?(Contrast::Config::CertificationConfiguration)
- Contrast::Config.validate_cert(value)
- next
- elsif value.is_a?(Contrast::Config::RequestAuditConfiguration)
- Contrast::Config.validate_audit(value)
- next
- elsif value.nil? && REQUIRED.includes?(key.to_sym)
- missing << key
- end
- end
- abort("Missing required API configuration values: #{ missing.join(', ') }") unless missing.empty?
- end
-
- def self.validate_proxy config
- puts("Proxy Enabled: #{ config.enable }")
- return unless config.enable
-
- puts("Proxy URL: #{ config.url }")
- abort('Proxy Enabled but no Proxy URL given') unless config.url
- end
-
- def self.validate_cert config
- puts("Certification Enabled: #{ config.enable }")
- return unless config.enable
-
- puts("CA File: #{ config.ca_file }")
- abort('CA file path not provided') unless config.ca_file
- puts("Cert File: #{ config.cert_file }")
- abort('Cert file path not provided') unless config.cert_file
- puts("Key File: #{ config.key_file }")
- abort('Key file path not provided') unless config.key_file
- end
-
- def self.validate_audit config
- puts("Request Audit Enabled: #{ config.enable }")
- return unless config.enable
-
- config.each do |k, v|
- puts("#{ k }::#{ v }")
- end
- end
-
- def self.validate_headers
- missing = []
- reporter = Contrast::Agent::Reporter.new
- reporter_headers = reporter.client.headers.to_contrast_hash
- reporter_headers.each_key do |key|
- value = mask_keys(reporter_headers, key)
- missing << key if value.nil?
- end
- abort("Missing required header values: #{ missing.join(', ') }") unless missing.empty?
- reporter
- end
-
- def self.test_connection reporter
- connection = reporter.connection
- abort('Failed to Initialize Connection please check error logs for details') unless connection
- abort('Failed to Start Client please check error logs for details') unless reporter.client.startup!(connection)
- end
-
- def self.mask_keys hash, key
- value = hash[key]
- redacted_value = Contrast::Configuration::REDACTED if SKIP_LOG.include?(key.to_s)
- puts("#{ key }::#{ redacted_value || value }") unless value.is_a?(Contrast::Config::BaseConfiguration)
- value
end
end
end
end