Module: Gem::GemcutterUtilities (Ruby 2.7.2)
Description: Module : Gem::GemcutterUtilities - Ruby 2.7.2

### Home Classes Methods

### In Files

- rubygems/gemcutter_utilities.rb

### Methods

- #add_key_option
- #add_otp_option
- #api_key
- #get_otp
- #host
- #mfa_unauthorized?
- #rubygems_api_request
- #set_api_key
- #sign_in
- #verify_api_key
- #with_response

### Included Modules

- Gem::Text

### Class/Module Index

Quicksearch

- Bundler
- Gem::AvailableSet
- Gem::BasicSpecification
- Gem::BundlerVersionFinder
- Gem::Command
- Gem::CommandLineError
- Gem::CommandManager
- Gem::Commands
- Gem::Commands::BuildCommand
- Gem::Commands::CertCommand
- Gem::Commands::CheckCommand
- Gem::Commands::CleanupCommand
- Gem::Commands::ContentsCommand
- Gem::Commands::DependencyCommand
- Gem::Commands::EnvironmentCommand
- Gem::Commands::FetchCommand
- Gem::Commands::GenerateIndexCommand
- Gem::Commands::HelpCommand
- Gem::Commands::InfoCommand
- Gem::Commands::InstallCommand
- Gem::Commands::ListCommand
- Gem::Commands::LockCommand
- Gem::Commands::MirrorCommand
- Gem::Commands::OpenCommand
- Gem::Commands::OutdatedCommand
- Gem::Commands::OwnerCommand
- Gem::Commands::PristineCommand
- Gem::Commands::PushCommand
- Gem::Commands::QueryCommand
- Gem::Commands::RdocCommand
- Gem::Commands::SearchCommand
- Gem::Commands::ServerCommand
- Gem::Commands::SetupCommand
- Gem::Commands::SetupCommand::MakeDirs
- Gem::Commands::SigninCommand
- Gem::Commands::SignoutCommand
- Gem::Commands::SourcesCommand
- Gem::Commands::SpecificationCommand
- Gem::Commands::StaleCommand
- Gem::Commands::UninstallCommand
- Gem::Commands::UnpackCommand
- Gem::Commands::UpdateCommand
- Gem::Commands::WhichCommand
- Gem::Commands::YankCommand
- Gem::ConfigFile
- Gem::ConflictError
- Gem::ConsoleUI
- Gem::DefaultUserInteraction
- Gem::Dependency
- Gem::DependencyError
- Gem::DependencyInstaller
- Gem::DependencyList
- Gem::DependencyRemovalException
- Gem::DependencyResolutionError
- Gem::Deprecate
- Gem::Doctor
- Gem::DocumentError
- Gem::EndOfYAMLException
- Gem::ErrorReason
- Gem::Exception
- Gem::Ext
- Gem::Ext::BuildError
- Gem::Ext::Builder
- Gem::Ext::CmakeBuilder
- Gem::Ext::ConfigureBuilder
- Gem::Ext::ExtConfBuilder
- Gem::Ext::RakeBuilder
- Gem::FakeFetcher
- Gem::FilePermissionError
- Gem::FormatException
- Gem::GemNotFoundException
- Gem::GemNotInHomeException
- Gem::GemRunner
- Gem::GemcutterUtilities
- Gem::ImpossibleDependenciesError
- Gem::Indexer
- Gem::InstallError
- Gem::InstallUpdateOptions
- Gem::Installer
- Gem::Installer::FakePackage
- Gem::InstallerTestCase
- Gem::InvalidSpecificationException
- Gem::Licenses
- Gem::List
- Gem::LoadError
- Gem::LocalRemoteOptions
- Gem::MissingSpecError
- Gem::MissingSpecVersionError
- Gem::MockGemUi
- Gem::MockGemUi::InputEOFError
- Gem::MockGemUi::SystemExitException
- Gem::MockGemUi::TTY
- Gem::MockGemUi::TermError
- Gem::NameTuple
- Gem::NoAliasYAMLTree
- Gem::OperationNotSupportedError
- Gem::Package::DigestIO
- Gem::Package::Error
- Gem::Package::FormatError
- Gem::Package::NonSeekableIO
- Gem::Package::Old
- Gem::Package::PathError
- Gem::Package::TarHeader
- Gem::Package::TarInvalidError
- Gem::Package::TarReader
- Gem::Package::TarReader::Entry
- Gem::Package::TarReader::UnexpectedEOF
- Gem::Package::TarTestCase
- Gem::Package::TarWriter
- Gem::Package::TarWriter::BoundedStream
- Gem::Package::TarWriter::FileOverflow
- Gem::Package::TarWriter::RestrictedStream
- Gem::Package::TooLongFileName
- Gem::PackageTask
- Gem::PathSupport
- Gem::Platform
- Gem::PlatformMismatch
- Gem::RemoteError
- Gem::RemoteFetcher
- Gem::RemoteFetcher::FetchError
- Gem::RemoteFetcher::UnknownHostError
- Gem::RemoteInstallationCancelled
- Gem::RemoteInstallationSkipped
- Gem::RemoteSourceException
- Gem::Request::ConnectionPools
- Gem::Request::ConnectionPools::Net
- Gem::RequestSet
- Gem::RequestSet::GemDependencyAPI
- Gem::RequestSet::Lockfile
- Gem::RequestSet::Lockfile::ParseError
- Gem::RequestSet::Lockfile::Parser
- Gem::RequestSet::Lockfile::Tokenizer
- Gem::Requirement
- Gem::Requirement::BadRequirementError
- Gem::Resolver
- Gem::Resolver::APISet
- Gem::Resolver::APISpecification
- Gem::Resolver::ActivationRequest
- Gem::Resolver::BestSet
- Gem::Resolver::ComposedSet
- Gem::Resolver::Conflict
- Gem::Resolver::CurrentSet
- Gem::Resolver::DependencyRequest
- Gem::Resolver::GitSet
- Gem::Resolver::GitSpecification
- Gem::Resolver::IndexSet
- Gem::Resolver::IndexSpecification
- Gem::Resolver::InstalledSpecification
- Gem::Resolver::InstallerSet
- Gem::Resolver::LocalSpecification
- Gem::Resolver::LockSet
- Gem::Resolver::LockSpecification
- Gem::Resolver::Molinillo
- Gem::Resolver::Molinillo::CircularDependencyError
- Gem::Resolver::Molinillo::Delegates
- Gem::Resolver::Molinillo::Delegates::ResolutionState
- Gem::Resolver::Molinillo::Delegates::SpecificationProvider
- Gem::Resolver::Molinillo::DependencyGraph
- Gem::Resolver::Molinillo::DependencyGraph::Action
- Gem::Resolver::Molinillo::DependencyGraph::AddEdgeNoCircular
- Gem::Resolver::Molinillo::DependencyGraph::DeleteEdge
- Gem::Resolver::Molinillo::DependencyGraph::DetachVertexNamed
- Gem::Resolver::Molinillo::DependencyGraph::Log
- Gem::Resolver::Molinillo::DependencyGraph::Tag
- Gem::Resolver::Molinillo::DependencyGraph::Vertex
- Gem::Resolver::Molinillo::DependencyState
- Gem::Resolver::Molinillo::NoSuchDependencyError
- Gem::Resolver::Molinillo::PossibilityState
- Gem::Resolver::Molinillo::ResolutionState
- Gem::Resolver::Molinillo::Resolver
- Gem::Resolver::Molinillo::Resolver::Resolution
- Gem::Resolver::Molinillo::ResolverError
- Gem::Resolver::Molinillo::SpecificationProvider
- Gem::Resolver::Molinillo::UI
- Gem::Resolver::Molinillo::VersionConflict
- Gem::Resolver::RequirementList
- Gem::Resolver::Set
- Gem::Resolver::SourceSet
- Gem::Resolver::SpecSpecification
- Gem::Resolver::Specification
- Gem::Resolver::Stats
- Gem::Resolver::VendorSet
- Gem::Resolver::VendorSpecification
- Gem::RubyVersionMismatch
- Gem::RuntimeRequirementNotMetError
- Gem::S3URISigner
- Gem::S3URISigner::ConfigurationError
- Gem::S3URISigner::InstanceProfileError
- Gem::SafeYAML
- Gem::Security
- Gem::Security::Exception
- Gem::Security::Policy
- Gem::Security::Signer
- Gem::Security::TrustDir
- Gem::SecurityOption
- Gem::Server
- Gem::SilentUI
- Gem::Source
- Gem::Source::Git
- Gem::Source::Installed
- Gem::Source::Local
- Gem::Source::Lock
- Gem::Source::SpecificFile
- Gem::Source::Vendor
- Gem::SourceFetchProblem
- Gem::SourceList
- Gem::SpecFetcher
- Gem::SpecificGemNotFoundException
- Gem::Specification
- Gem::SpecificationPolicy
- Gem::StreamUI
- Gem::StreamUI::SilentDownloadReporter
- Gem::StreamUI::SilentProgressReporter
- Gem::StreamUI::SimpleProgressReporter
- Gem::StreamUI::ThreadedDownloadReporter
- Gem::StreamUI::VerboseProgressReporter
- Gem::StubSpecification
- Gem::SystemExitException
- Gem::TestCase
- Gem::TestCase::SpecFetcherSetup
- Gem::TestCase::StaticSet
- Gem::Text
- Gem::UninstallError
- Gem::Uninstaller
- Gem::UnsatisfiableDependencyError
- Gem::UriFormatter
- Gem::UriParser
- Gem::UriParsing
- Gem::UserInteraction
- Gem::Util
- Gem::Validator
- Gem::VerificationError
- Gem::Version
- Gem::VersionOption
- Kernel
- Object
- OpenSSL
- TempIO
- YAML::Syck
- YAML::Syck

No matching classes.

# Gem::GemcutterUtilities

Utility methods for using the RubyGems API.

### Constants

ERROR_CODE

### Attributes

host[W]

### Public Instance Methods

add_key_option() click to toggle source

Add the –key option

                   # File rubygems/gemcutter_utilities.rb, line 19
    def add_key_option
      add_option('-k', '--key KEYNAME', Symbol,
                 'Use the given API key',
                 'from ~/.gem/credentials') do |value,options|
        options[:key] = value
      end
    end

add_otp_option() click to toggle source

Add the –otp option

                   # File rubygems/gemcutter_utilities.rb, line 30
    def add_otp_option
      add_option('--otp CODE',
                 'Digit code for multifactor authentication') do |value, options|
        options[:otp] = value
      end
    end

api_key() click to toggle source

The API key from the command options or from the user’s configuration.

                   # File rubygems/gemcutter_utilities.rb, line 40
    def api_key
      if ENV["GEM_HOST_API_KEY"]
        ENV["GEM_HOST_API_KEY"]
      elsif options[:key]
        verify_api_key options[:key]
      elsif Gem.configuration.api_keys.key?(host)
        Gem.configuration.api_keys[host]
      else
        Gem.configuration.rubygems_api_key
      end
    end

get_otp() click to toggle source

                   # File rubygems/gemcutter_utilities.rb, line 110
    def get_otp
      say 'You have enabled multi-factor authentication. Please enter OTP code.'
      ask 'Code: '
    end

host() click to toggle source

The host to connect to either from the RUBYGEMS_HOST environment variable or from the user’s configuration

                   # File rubygems/gemcutter_utilities.rb, line 56
    def host
      configured_host = Gem.host unless
        Gem.configuration.disable_default_gem_server

      @host ||=
        begin
          env_rubygems_host = ENV['RUBYGEMS_HOST']
          env_rubygems_host = nil if
            env_rubygems_host and env_rubygems_host.empty?

          env_rubygems_host || configured_host
        end
    end

mfa_unauthorized?(response) click to toggle source

                   # File rubygems/gemcutter_utilities.rb, line 106
    def mfa_unauthorized?(response)
      response.kind_of?(Net::HTTPUnauthorized) && response.body.start_with?('You have enabled multifactor authentication')
    end

rubygems_api_request(method, path, host = nil, allowed_push_host = nil, &block) click to toggle source

Creates an RubyGems API to `host` and `path` with the given HTTP `method`.

If `allowed_push_host` metadata is present, then it will only allow that host.

                   # File rubygems/gemcutter_utilities.rb, line 75
    def rubygems_api_request(method, path, host = nil, allowed_push_host = nil, &block)
      require 'net/http'

      self.host = host if host
      unless self.host
        alert_error "You must specify a gem server"
        terminate_interaction(ERROR_CODE)
      end

      if allowed_push_host
        allowed_host_uri = URI.parse(allowed_push_host)
        host_uri         = URI.parse(self.host)

        unless (host_uri.scheme == allowed_host_uri.scheme) && (host_uri.host == allowed_host_uri.host)
          alert_error "#{self.host.inspect} is not allowed by the gemspec, which only allows #{allowed_push_host.inspect}"
          terminate_interaction(ERROR_CODE)
        end
      end

      uri = URI.parse "#{self.host}/#{path}"

      request_method = Net::HTTP.const_get method.to_s.capitalize
      response = Gem::RemoteFetcher.fetcher.request(uri, request_method, &block)
      return response unless mfa_unauthorized?(response)

      Gem::RemoteFetcher.fetcher.request(uri, request_method) do |req|
        req.add_field "OTP", get_otp
        block.call(req)
      end
    end

set_api_key(host, key) click to toggle source

Returns true when the user has enabled multifactor authentication from `response` text and no otp provided by options.

                   # File rubygems/gemcutter_utilities.rb, line 190
    def set_api_key(host, key)
      if host == Gem::DEFAULT_HOST
        Gem.configuration.rubygems_api_key = key
      else
        Gem.configuration.set_api_key host, key
      end
    end

sign_in(sign_in_host = nil) click to toggle source

Signs in with the RubyGems API at `sign_in_host` and sets the rubygems API key.

                   # File rubygems/gemcutter_utilities.rb, line 119
    def sign_in(sign_in_host = nil)
      sign_in_host ||= self.host
      return if api_key

      pretty_host = if Gem::DEFAULT_HOST == sign_in_host
                      'RubyGems.org'
                    else
                      sign_in_host
                    end

      say "Enter your #{pretty_host} credentials."
      say "Don't have an account yet? " +
          "Create one at #{sign_in_host}/sign_up"

      email = ask "   Email: "
      password = ask_for_password "Password: "
      say "\n"

      response = rubygems_api_request(:get, "api/v1/api_key",
                                      sign_in_host) do |request|
        request.basic_auth email, password
        request.add_field "OTP", options[:otp] if options[:otp]
      end

      with_response response do |resp|
        say "Signed in."
        set_api_key host, resp.body
      end
    end

verify_api_key(key) click to toggle source

Retrieves the pre-configured API key `key` or terminates interaction with an error.

                   # File rubygems/gemcutter_utilities.rb, line 153
    def verify_api_key(key)
      if Gem.configuration.api_keys.key? key
        Gem.configuration.api_keys[key]
      else
        alert_error "No such API key. Please add it to your configuration (done automatically on initial `gem push`)."
        terminate_interaction(ERROR_CODE)
      end
    end

with_response(response, error_prefix = nil) click to toggle source

If `response` is an HTTP Success (2XX) response, yields the response if a block was given or shows the response body to the user.

If the response was not successful, shows an error to the user including the `error_prefix` and the response body.

                   # File rubygems/gemcutter_utilities.rb, line 169
    def with_response(response, error_prefix = nil)
      case response
      when Net::HTTPSuccess then
        if block_given?
          yield response
        else
          say clean_text(response.body)
        end
      else
        message = response.body
        message = "#{error_prefix}: #{message}" if error_prefix

        say clean_text(message)
        terminate_interaction(ERROR_CODE)
      end
    end