class Gitrob::BlobObserver

Constants

ALLOWED_PARTS
ALLOWED_TYPES
CUSTOM_SIGNATURES_FILE_PATH
REQUIRED_SIGNATURE_KEYS
SIGNATURES_FILE_PATH

Public Class Methods

custom_signatures?() click to toggle source
# File lib/gitrob/blob_observer.rb, line 50
def self.custom_signatures?
  File.exist?(CUSTOM_SIGNATURES_FILE_PATH)
end
load_custom_signatures!() click to toggle source
# File lib/gitrob/blob_observer.rb, line 54
def self.load_custom_signatures!
  signatures = JSON.load(File.read(CUSTOM_SIGNATURES_FILE_PATH))
  validate_signatures!(signatures)
  signatures.each do |signature|
    @signatures << Signature.new(signature)
  end
rescue CorruptSignaturesError => e
  raise e
rescue
  raise CorruptSignaturesError, "Could not parse signature file"
end
load_signatures!() click to toggle source
# File lib/gitrob/blob_observer.rb, line 33
def self.load_signatures!
  @signatures = []
  signatures = JSON.load(File.read(SIGNATURES_FILE_PATH))
  validate_signatures!(signatures)
  signatures.each_with_index do |signature|
    @signatures << Signature.new(signature)
  end
rescue CorruptSignaturesError => e
  raise e
rescue
  raise CorruptSignaturesError, "Could not parse signature file"
end
observe(blob) click to toggle source
# File lib/gitrob/blob_observer.rb, line 15
def self.observe(blob)
  signatures.each do |signature|
    if signature.type == "match"
      observe_with_match_signature(blob, signature)
    else
      observe_with_regex_signature(blob, signature)
    end
  end
  blob.flags_count = blob.flags.count
  blob.save
  blob.flags_count
end
observe_with_match_signature(blob, signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 110
def self.observe_with_match_signature(blob, signature)
  haystack = blob.send(signature.part.to_sym)
  return unless haystack == signature.pattern
  blob.add_flag(
    :caption     => signature.caption,
    :description => signature.description,
    :assessment  => blob.assessment
  )
end
observe_with_regex_signature(blob, signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 120
def self.observe_with_regex_signature(blob, signature)
  haystack = blob.send(signature.part.to_sym)
  regex    = Regexp.new(signature.pattern, Regexp::IGNORECASE)
  return if regex.match(haystack).nil?
  blob.add_flag(
    :caption     => signature.caption,
    :description => signature.description,
    :assessment  => blob.assessment
  )
end
signatures() click to toggle source
# File lib/gitrob/blob_observer.rb, line 28
def self.signatures
  load_signatures! unless @signatures
  @signatures
end
unload_signatures() click to toggle source
# File lib/gitrob/blob_observer.rb, line 46
def self.unload_signatures
  @signatures = []
end
validate_signature!(signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 81
def self.validate_signature!(signature)
  validate_signature_keys!(signature)
  validate_signature_type!(signature)
  validate_signature_part!(signature)
end
validate_signature_keys!(signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 87
def self.validate_signature_keys!(signature)
  REQUIRED_SIGNATURE_KEYS.each do |key|
    unless signature.key?(key)
      fail CorruptSignaturesError,
           "Missing required signature key: #{key}"
    end
  end
end
validate_signature_part!(signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 103
def self.validate_signature_part!(signature)
  unless ALLOWED_PARTS.include?(signature["part"])
    fail CorruptSignaturesError,
         "Invalid signature part: #{signature['part']}"
  end
end
validate_signature_type!(signature) click to toggle source
# File lib/gitrob/blob_observer.rb, line 96
def self.validate_signature_type!(signature)
  unless ALLOWED_TYPES.include?(signature["type"])
    fail CorruptSignaturesError,
         "Invalid signature type: #{signature['type']}"
  end
end
validate_signatures!(signatures) click to toggle source
# File lib/gitrob/blob_observer.rb, line 66
def self.validate_signatures!(signatures)
  if !signatures.is_a?(Array) || signatures.empty?
    fail CorruptSignaturesError,
         "Signature file contains no signatures"
  end
  signatures.each_with_index do |signature, index|
    begin
      validate_signature!(signature)
    rescue CorruptSignaturesError => e
      raise CorruptSignaturesError,
            "Validation failed for Signature ##{index + 1}: #{e.message}"
    end
  end
end