require 'puppet/ssl/openssl_loader' require 'digest/sha1' require 'uri' require 'puppet/util/http_proxy' require 'puppet/forge' require 'puppet/forge/errors' require 'puppet/network/http' class Puppet::Forge # = Repository # # This class is a file for accessing remote repositories with modules. class Repository include Puppet::Forge::Errors attr_reader :uri, :cache # Instantiate a new repository instance rooted at the +url+. # The library will report +for_agent+ in the User-Agent to the repository. def initialize(host, for_agent) @host = host @agent = for_agent @cache = Cache.new(self) @uri = URI.parse(host) ssl_provider = Puppet::SSL::SSLProvider.new @ssl_context = ssl_provider.create_system_context(cacerts: []) end # Return a Net::HTTPResponse read for this +path+. def make_http_request(path, io = nil) raise ArgumentError, "Path must start with forward slash" unless path.start_with?('/') begin str = @uri.to_s str.chomp!('/') str += Puppet::Util.uri_encode(path) uri = URI(str) headers = { "User-Agent" => user_agent } user = nil password = nil if forge_authorization headers["Authorization"] = forge_authorization elsif @uri.user && @uri.password user = @uri.user password = @uri.password end http = Puppet.runtime['http'] response = http.get(uri, headers: headers, user: user, password: password, ssl_context: @ssl_context) io.write(response.body) if io.respond_to?(:write) response rescue Puppet::SSL::CertVerifyError => e raise SSLVerifyError.new(:uri => @uri.to_s, :original => e.cause) rescue => e raise CommunicationError.new(:uri => @uri.to_s, :original => e) end end def forge_authorization if Puppet[:forge_authorization] Puppet[:forge_authorization] elsif Puppet.features.pe_license? PELicense.load_license_key.authorization_token end end # Return the local file name containing the data downloaded from the # repository at +release+ (e.g. "myuser-mymodule"). def retrieve(release) path = @host.chomp('/') + release return cache.retrieve(path) end # Return the URI string for this repository. def to_s "#<#{self.class} #{@host}>" end # Return the cache key for this repository, this a hashed string based on # the URI. def cache_key return @cache_key ||= [ @host.to_s.gsub(/[^[:alnum:]]+/, '_').sub(/_$/, ''), Digest::SHA1.hexdigest(@host.to_s) ].join('-').freeze end private def user_agent @user_agent ||= [ @agent, Puppet[:http_user_agent] ].join(' ').freeze end end end