Class
The format class knows the guts of the ancient .gem file format and provides the capability to read such ancient gems.
Please pretend this doesn’t exist.
Class Methods
lib/rubygems/package/old.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/package/old.rb, line 21
def initialize(gem, security_policy)
require 'fileutils'
require 'zlib'
Gem.load_yaml
@contents = nil
@gem = gem
@security_policy = security_policy
@spec = nil
end
Creates a new old-format package reader for gem
. Old-format packages cannot be written.
Instance Methods
#
lib/rubygems/package/old.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/package/old.rb, line 35
def contents
verify
return @contents if @contents
@gem.with_read_io do |io|
read_until_dashes io # spec
header = file_list io
@contents = header.map {|file| file['path'] }
end
end
A list of file names contained in this gem
lib/rubygems/package/old.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/package/old.rb, line 51
def extract_files(destination_dir)
verify
errstr = "Error reading files from gem"
@gem.with_read_io do |io|
read_until_dashes io # spec
header = file_list io
raise Gem::Exception, errstr unless header
header.each do |entry|
full_name = entry['path']
destination = install_location full_name, destination_dir
file_data = String.new
read_until_dashes io do |line|
file_data << line
end
file_data = file_data.strip.unpack("m")[0]
file_data = Zlib::Inflate.inflate file_data
raise Gem::Package::FormatError, "#{full_name} in #{@gem} is corrupt" if
file_data.length != entry['size'].to_i
FileUtils.rm_rf destination
FileUtils.mkdir_p File.dirname(destination), :mode => dir_mode && 0755
File.open destination, 'wb', file_mode(entry['mode']) do |out|
out.write file_data
end
verbose destination
end
end
rescue Zlib::DataError
raise Gem::Exception, errstr
end
Extracts the files in this package into destination_dir
#
lib/rubygems/package/old.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/package/old.rb, line 132
def spec
verify
return @spec if @spec
yaml = String.new
@gem.with_read_io do |io|
skip_ruby io
read_until_dashes io do |line|
yaml << line
end
end
begin
@spec = Gem::Specification.from_yaml yaml
rescue YAML::SyntaxError
raise Gem::Exception, "Failed to parse gem specification out of gem file"
end
rescue ArgumentError
raise Gem::Exception, "Failed to parse gem specification out of gem file"
end
The specification for this gem
#
lib/rubygems/package/old.rb
View on GitHub
# File tmp/rubies/ruby-3.0.5/lib/rubygems/package/old.rb, line 159
def verify
return true unless @security_policy
raise Gem::Security::Exception,
'old format gems do not contain signatures and cannot be verified' if
@security_policy.verify_data
true
end
Raises an exception if a security policy that verifies data is active. Old
format gems cannot be verified as signed.