download_strategy: raise on wrong tag revision.

Adds some added security to Git tags so we are able to provide an
effective checksum rather than letting them be changed without our
knowing.

Also:

- Reprioritise ref_types. Tag should take priority over branch and revisions over a single one.
- Add current_revision method. Used to verify the current repository revision matches the specified
revision. Currently only implemented for Git.
This commit is contained in:
Mike McQuaid 2015-03-07 14:59:30 +00:00
parent 5206a2523e
commit b6a0105b7e

View File

@ -98,11 +98,12 @@ class AbstractDownloadStrategy
end end
class VCSDownloadStrategy < AbstractDownloadStrategy class VCSDownloadStrategy < AbstractDownloadStrategy
REF_TYPES = [:branch, :revision, :revisions, :tag].freeze REF_TYPES = [:tag, :branch, :revisions, :revision].freeze
def initialize name, resource def initialize name, resource
super super
@ref_type, @ref = extract_ref(meta) @ref_type, @ref = extract_ref(meta)
@revision = meta[:revision]
@clone = HOMEBREW_CACHE.join(cache_filename) @clone = HOMEBREW_CACHE.join(cache_filename)
end end
@ -119,6 +120,15 @@ class VCSDownloadStrategy < AbstractDownloadStrategy
else else
clone_repo clone_repo
end end
if @ref_type == :tag && @revision && current_revision
unless current_revision == @revision
raise <<-EOS.undent
#{@ref} tag should be #{@revision}
but is actually #{current_revision}!
EOS
end
end
end end
def stage def stage
@ -153,6 +163,9 @@ class VCSDownloadStrategy < AbstractDownloadStrategy
def update def update
end end
def current_revision
end
def extract_ref(specs) def extract_ref(specs)
key = REF_TYPES.find { |type| specs.key?(type) } key = REF_TYPES.find { |type| specs.key?(type) }
return key, specs[key] return key, specs[key]
@ -570,6 +583,10 @@ class GitDownloadStrategy < VCSDownloadStrategy
quiet_system 'git', '--git-dir', git_dir, 'rev-parse', '-q', '--verify', "#{@ref}^{commit}" quiet_system 'git', '--git-dir', git_dir, 'rev-parse', '-q', '--verify', "#{@ref}^{commit}"
end end
def current_revision
Utils.popen_read('git', '--git-dir', git_dir, 'rev-parse', '-q', '--verify', "HEAD").strip
end
def repo_valid? def repo_valid?
quiet_system "git", "--git-dir", git_dir, "status", "-s" quiet_system "git", "--git-dir", git_dir, "status", "-s"
end end