class Octoks::Receiver

Constants

HMAC_DIGEST

Attributes

hooks[RW]
secret[R]

Public Class Methods

new(secret = nil) click to toggle source
# File lib/octoks/receiver.rb, line 11
def initialize(secret = nil)
  @hooks  = {}
  @secret = secret
end

Public Instance Methods

call(env) click to toggle source
# File lib/octoks/receiver.rb, line 28
def call(env)
  req    = Rack::Request.new(env)
  failed = [400, [], ["BAD REQUEST"]]

  if !req.post? or req.params['payload'].nil? or req.env["HTTP_X_GITHUB_EVENT"].nil?
    return failed
  end

  unless verify_signature(req)
    return failed
  end

  begin
    payload = JSON.parse(req.params['payload'])
  rescue
    return failed
  end

  event_name = req.env["HTTP_X_GITHUB_EVENT"]
  event      = Octoks::Event.new(event_name.to_sym, payload)

  emit(event)

  [200, [], ["OK"]]
end
emit(event) click to toggle source
# File lib/octoks/receiver.rb, line 21
def emit(event)
  hooks[event.name] ||= []
  hooks[event.name].each do |hook|
    hook.call(event)
  end
end
on(name, &cb) click to toggle source
# File lib/octoks/receiver.rb, line 16
def on(name, &cb)
  @hooks[name] ||= []
  @hooks[name].push(cb)
end
verify_signature(req) click to toggle source
# File lib/octoks/receiver.rb, line 55
def verify_signature(req)
  return true unless @secret
  return false unless req.body
  sig = 'sha1='+OpenSSL::HMAC.hexdigest(HMAC_DIGEST, @secret, req.body.read)
  req.body.rewind
  SecureCompare.compare(sig, req.env["HTTP_HUB_SIGNATURE"])
end