# frozen_string_literal: true require "config_server_agent/version" require "net/http" require "json" class ConfigServerAgent class Error < StandardError; end def initialize( auth0_client_id: ENV['AUTH0_CLIENT_ID'], auth0_client_secret: ENV['AUTH0_CLIENT_SECRET'], auth0_host: ENV['AUTH0_HOST'], config_server_audience: ENV['CONFIG_SERVER_AUDIENCE'], config_server_api_key: ENV['CONFIG_SERVER_API_KEY'], config_server_host: ENV['CONFIG_SERVER_HOST'], user_agent: "ConfigServerAgent/#{ConfigServerAgent::VERSION}", user_agent_comment: nil ) @auth0_client_id = auth0_client_id or raise ArgumentError, "Missing auth0_client_id parameter" @auth0_client_secret = auth0_client_secret or raise ArgumentError, "Missing auth0_client_secret parameter" @auth0_host = auth0_host or raise ArgumentError, "Missing auth0_host parameter" @config_server_audience = config_server_audience or raise ArgumentError, "Missing config_server_audience parameter" @config_server_api_key = config_server_api_key or raise ArgumentError, "Missing config_server_api_key parameter" @config_server_host = config_server_host or raise ArgumentError, "Missing config_server_host parameter" @config = nil @mutex = Mutex.new @user_agent = user_agent @user_agent += " (#{user_agent_comment})" if user_agent_comment end def get_config return @config if @config @mutex.synchronize do @config ||= _get_config end end def clear @config = nil end private def _get_config token = get_token url = URI "#{@config_server_host}/api/config_pack" http = Net::HTTP.new url.host, url.port http.use_ssl = url.scheme == 'https' request = Net::HTTP::Post.new url request['user-agent'] = @user_agent request['content-type'] = 'application/json' request['authorization'] = "Bearer #{token}" request['accept'] = 'application/json' request.body = { api_key: @config_server_api_key }.to_json response = http.request request JSON.parse response.read_body end def get_token url = URI "https://#{@auth0_host}/oauth/token" http = Net::HTTP.new url.host, url.port http.use_ssl = url.scheme == 'https' request = Net::HTTP::Post.new url request['user-agent'] = @user_agent request['content-type'] = 'application/json' request.body = { client_id: @auth0_client_id, client_secret: @auth0_client_secret, audience: @config_server_audience, grant_type: 'client_credentials', }.to_json response = http.request request JSON.parse(response.read_body)["access_token"] or raise Error, "No token from #{@auth0_host}" rescue JSON::ParserError raise Error, "Invalid response from #{@auth0_host}" end end