dev-cmd: add brew verify
				
					
				
			This is a direct copy of `trailofbits/homebrew-brew-verify`, but in the `DevCmd` namespace instead. Signed-off-by: William Woodruff <william@yossarian.net>
This commit is contained in:
		
							parent
							
								
									f66edcd636
								
							
						
					
					
						commit
						77f55aab05
					
				
							
								
								
									
										87
									
								
								Library/Homebrew/dev-cmd/verify.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								Library/Homebrew/dev-cmd/verify.rb
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
			
		||||
# typed: true
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require "abstract_command"
 | 
			
		||||
require "formula"
 | 
			
		||||
require "date"
 | 
			
		||||
require "attestation"
 | 
			
		||||
 | 
			
		||||
module Homebrew
 | 
			
		||||
  module DevCmd
 | 
			
		||||
    class VerifyCmd < AbstractCommand
 | 
			
		||||
      cmd_args do
 | 
			
		||||
        description <<~EOS
 | 
			
		||||
          Verify the build provenance of bottles using GitHub's attestation tools.
 | 
			
		||||
          This is done by first fetching the given bottles, and then verifying
 | 
			
		||||
          their provenance.
 | 
			
		||||
 | 
			
		||||
          Note that this command depends on the GitHub CLI. Run `brew install gh`.
 | 
			
		||||
        EOS
 | 
			
		||||
        flag   "--os=",
 | 
			
		||||
               description: "Download for the given operating system." \
 | 
			
		||||
                            "(Pass `all` to download for all operating systems.)"
 | 
			
		||||
        flag   "--arch=",
 | 
			
		||||
               description: "Download for the given CPU architecture." \
 | 
			
		||||
                            "(Pass `all` to download for all architectures.)"
 | 
			
		||||
        flag   "--bottle-tag=",
 | 
			
		||||
               description: "Download a bottle for given tag."
 | 
			
		||||
        switch "--deps",
 | 
			
		||||
               description: "Also download dependencies for any listed <formula>."
 | 
			
		||||
        switch "-f", "--force",
 | 
			
		||||
               description: "Remove a previously cached version and re-fetch."
 | 
			
		||||
        switch "-j", "--json",
 | 
			
		||||
               description: "Return JSON for the attestation data for each bottle."
 | 
			
		||||
        conflicts "--os", "--bottle-tag"
 | 
			
		||||
        conflicts "--arch", "--bottle-tag"
 | 
			
		||||
        named_args [:formula], min: 1
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      sig { override.void }
 | 
			
		||||
      def run
 | 
			
		||||
        bucket = if args.deps?
 | 
			
		||||
          args.named.to_formulae.flat_map do |formula|
 | 
			
		||||
            [formula, *formula.recursive_dependencies.map(&:to_formula)]
 | 
			
		||||
          end
 | 
			
		||||
        else
 | 
			
		||||
          args.named.to_formulae
 | 
			
		||||
        end.uniq
 | 
			
		||||
 | 
			
		||||
        os_arch_combinations = args.os_arch_combinations
 | 
			
		||||
        json_results = []
 | 
			
		||||
        bucket.each do |formula|
 | 
			
		||||
          os_arch_combinations.each do |os, arch|
 | 
			
		||||
            SimulateSystem.with(os:, arch:) do
 | 
			
		||||
              bottle_tag = if (bottle_tag = args.bottle_tag&.to_sym)
 | 
			
		||||
                Utils::Bottles::Tag.from_symbol(bottle_tag)
 | 
			
		||||
              else
 | 
			
		||||
                Utils::Bottles::Tag.new(system: os, arch:)
 | 
			
		||||
              end
 | 
			
		||||
 | 
			
		||||
              bottle = formula.bottle_for_tag(bottle_tag)
 | 
			
		||||
 | 
			
		||||
              if bottle.nil?
 | 
			
		||||
                opoo "Bottle for tag #{bottle_tag.to_sym.inspect} is unavailable."
 | 
			
		||||
                next
 | 
			
		||||
              end
 | 
			
		||||
              bottle.clear_cache if args.force?
 | 
			
		||||
              bottle.fetch
 | 
			
		||||
              begin
 | 
			
		||||
                attestation = Homebrew::Attestation.check_core_attestation bottle
 | 
			
		||||
                oh1 "#{bottle.filename} has a valid attestation"
 | 
			
		||||
                json_results.push(attestation)
 | 
			
		||||
              rescue Homebrew::Attestation::InvalidAttestationError => e
 | 
			
		||||
                ofail <<~ERR
 | 
			
		||||
                  Failed to verify #{bottle.filename} with tag #{bottle_tag} due to error:
 | 
			
		||||
 | 
			
		||||
                  #{e}
 | 
			
		||||
                ERR
 | 
			
		||||
              end
 | 
			
		||||
            end
 | 
			
		||||
          end
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        puts json_results.to_json if args.json?
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user