Class: Gitrob::BlobObserver

Inherits:
Object
  • Object
show all
Defined in:
lib/gitrob/blob_observer.rb

Defined Under Namespace

Classes: CorruptSignaturesError, Signature

Constant Summary collapse

SIGNATURES_FILE_PATH =
File.expand_path(
"../../../signatures.json", __FILE__)
CUSTOM_SIGNATURES_FILE_PATH =
File.join(
Dir.home, ".gitrobsignatures")
REQUIRED_SIGNATURE_KEYS =
%w(part type pattern caption description)
ALLOWED_TYPES =
%w(regex match)
ALLOWED_PARTS =
%w(path filename extension)

Class Method Summary collapse

Class Method Details

.custom_signatures?Boolean

Returns:

  • (Boolean)


50
51
52
# File 'lib/gitrob/blob_observer.rb', line 50

def self.custom_signatures?
  File.exist?(CUSTOM_SIGNATURES_FILE_PATH)
end

.load_custom_signatures!Object



54
55
56
57
58
59
60
61
62
63
64
# 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!Object



33
34
35
36
37
38
39
40
41
42
43
44
# 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) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# 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) ⇒ Object



110
111
112
113
114
115
116
117
118
# 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) ⇒ Object



120
121
122
123
124
125
126
127
128
129
# 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

.signaturesObject



28
29
30
31
# File 'lib/gitrob/blob_observer.rb', line 28

def self.signatures
  load_signatures! unless @signatures
  @signatures
end

.unload_signaturesObject



46
47
48
# File 'lib/gitrob/blob_observer.rb', line 46

def self.unload_signatures
  @signatures = []
end

.validate_signature!(signature) ⇒ Object



81
82
83
84
85
# 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) ⇒ Object



87
88
89
90
91
92
93
94
# 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) ⇒ Object



103
104
105
106
107
108
# 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) ⇒ Object



96
97
98
99
100
101
# 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) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
# 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