diff options
Diffstat (limited to 'lib/rubygems/specification.rb')
-rw-r--r-- | lib/rubygems/specification.rb | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb index 6f69ee22ce..8af62cced7 100644 --- a/lib/rubygems/specification.rb +++ b/lib/rubygems/specification.rb @@ -761,6 +761,8 @@ class Gem::Specification < Gem::BasicSpecification attr_accessor :specification_version + attr_reader :checksum + def self._all # :nodoc: @@all ||= Gem.loaded_specs.values | stubs.map(&:to_spec) end @@ -2738,4 +2740,22 @@ class Gem::Specification < Gem::BasicSpecification def raw_require_paths # :nodoc: @require_paths end + + def add_checksum(checksum) + @checksum ||= checksum + end + + # if we don't get the checksum from the server + # calculating the checksum from the file on disk still provides some measure of security + # if it changes from install to install, that is cause for concern + def to_checksum + return Bundler::Checksum.new(name, version, platform, ["sha256-#{checksum}"]) if checksum + return Bundler::Checksum.new(name, version, platform) unless File.exist?(cache_file) + + require "rubygems/package" + package = Gem::Package.new(cache_file) + digest = Bundler::Checksum.digest_from_file_source(package.gem) + calculated_checksum = digest.hexdigest! + Bundler::Checksum.new(name, version, platform, ["sha256-#{calculated_checksum}"]) if calculated_checksum + end end |