23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
# File 'lib/readme/webhook.rb', line 23
def self.verify(body, signature, secret)
raise MissingSignatureError unless signature
parsed = signature.split(',').each_with_object({ time: -1, readme_signature: '' }) do |item, accum|
k, v = item.split('=')
accum[:time] = v if k.eql? 't'
accum[:readme_signature] = v if k.eql? 'v0'
end
thirty_minutes = 30 * 60
raise ExpiredSignatureError if Time.now.utc - Time.at(0, parsed[:time].to_i, :millisecond).utc > thirty_minutes
unsigned = "#{parsed[:time]}.#{body}"
mac = OpenSSL::HMAC.hexdigest('SHA256', secret, unsigned)
raise InvalidSignatureError if mac != parsed[:readme_signature]
end
|