Class: Gem::Validator
- Inherits:
-
Object
- Object
- Gem::Validator
- Includes:
- UserInteraction
- Defined in:
- lib/rubygems/validator.rb
Overview
Validator performs various gem file and gem database validation
Defined Under Namespace
Classes: ErrorData
Instance Method Summary collapse
-
#alien(gems = []) ⇒ Object
Checks the gem directory for the following potential inconsistencies/problems:.
-
#initialize ⇒ Validator
constructor
:nodoc:.
-
#verify_gem(gem_data) ⇒ Object
- Given a gem file’s contents, validates against its own MD5 checksum gem_data
- String
-
Contents of the gem file.
-
#verify_gem_file(gem_path) ⇒ Object
Given the path to a gem file, validates against its own MD5 checksum.
Methods included from UserInteraction
#alert, #alert_error, #alert_warning, #ask, #ask_for_password, #ask_yes_no, #choose_from_list, #say, #terminate_interaction, #verbose
Methods included from DefaultUserInteraction
ui, #ui, ui=, #ui=, use_ui, #use_ui
Constructor Details
#initialize ⇒ Validator
:nodoc:
18 19 20 |
# File 'lib/rubygems/validator.rb', line 18 def initialize # :nodoc: require 'find' end |
Instance Method Details
#alien(gems = []) ⇒ Object
Checks the gem directory for the following potential inconsistencies/problems:
-
Checksum gem itself
-
For each file in each gem, check consistency of installed versions
-
Check for files that aren’t part of the gem but are in the gems directory
-
1 cache - 1 spec - 1 directory.
returns a hash of ErrorData objects, keyed on the problem gem’s name. – TODO needs further cleanup
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/rubygems/validator.rb', line 85 def alien(gems=[]) errors = Hash.new { |h,k| h[k] = {} } Gem::Specification.each do |spec| next unless gems.include? spec.name unless gems.empty? next if spec.default_gem? gem_name = spec.file_name gem_path = spec.cache_file spec_path = spec.spec_file gem_directory = spec.full_gem_path unless File.directory? gem_directory errors[gem_name][spec.full_name] = "Gem registered but doesn't exist at #{gem_directory}" next end unless File.exist? spec_path errors[gem_name][spec_path] = "Spec file missing for installed gem" end begin verify_gem_file(gem_path) good, gone, unreadable = nil, nil, nil, nil File.open gem_path, Gem.binary_mode do |file| package = Gem::Package.new gem_path good, gone = package.contents.partition { |file_name| File.exist? File.join(gem_directory, file_name) } gone.sort.each do |path| errors[gem_name][path] = "Missing file" end good, unreadable = good.partition { |file_name| File.readable? File.join(gem_directory, file_name) } unreadable.sort.each do |path| errors[gem_name][path] = "Unreadable file" end good.each do |entry, data| begin next unless data # HACK `gem check -a mkrf` source = File.join gem_directory, entry['path'] File.open source, Gem.binary_mode do |f| unless f.read == data errors[gem_name][entry['path']] = "Modified from original" end end end end end installed_files = find_files_for_gem(gem_directory) extras = installed_files - good - unreadable extras.each do |extra| errors[gem_name][extra] = "Extra file" end rescue Gem::VerificationError => e errors[gem_name][gem_path] = e. end end errors.each do |name, subhash| errors[name] = subhash.map do |path, msg| ErrorData.new path, msg end.sort end errors end |
#verify_gem(gem_data) ⇒ Object
Given a gem file’s contents, validates against its own MD5 checksum
- gem_data
- String
-
Contents of the gem file
26 27 28 29 |
# File 'lib/rubygems/validator.rb', line 26 def verify_gem(gem_data) # TODO remove me? The code here only validate an MD5SUM that was # in some old formatted gems, but hasn't been for a long time. end |
#verify_gem_file(gem_path) ⇒ Object
Given the path to a gem file, validates against its own MD5 checksum
- gem_path
- String
-
Path to gem file
36 37 38 39 40 41 42 43 |
# File 'lib/rubygems/validator.rb', line 36 def verify_gem_file(gem_path) File.open gem_path, Gem.binary_mode do |file| gem_data = file.read verify_gem gem_data end rescue Errno::ENOENT, Errno::EINVAL raise Gem::VerificationError, "missing gem file #{gem_path}" end |