class Slanger::Api::RequestValidation

Public Class Methods

new(*args) click to toggle source
Calls superclass method
# File lib/slanger/api/request_validation.rb, line 6
def initialize(*args)
  super(*args)

  validate!
  authenticate!
  parse_body!
end

Public Instance Methods

auth_params() click to toggle source
# File lib/slanger/api/request_validation.rb, line 22
def auth_params
  params.except('channel_id', 'app_id')
end
body() click to toggle source
# File lib/slanger/api/request_validation.rb, line 18
def body
  @body ||= validate_body!
end
channels() click to toggle source
# File lib/slanger/api/request_validation.rb, line 34
def channels
  @channels ||= Array(body["channels"] || params["channels"])
end
data() click to toggle source
# File lib/slanger/api/request_validation.rb, line 14
def data
  @data ||= Oj.load(body["data"] || params["data"])
end
params() click to toggle source
# File lib/slanger/api/request_validation.rb, line 30
def params
  @params ||= validate_raw_params!
end
socket_id() click to toggle source
# File lib/slanger/api/request_validation.rb, line 26
def socket_id
  @socket_id ||= determine_valid_socket_id
end

Private Instance Methods

assert_valid_json!(string) click to toggle source
# File lib/slanger/api/request_validation.rb, line 89
def assert_valid_json!(string)
  Oj.load(string)
rescue Oj::ParserError
  raise Slanger::InvalidRequest.new("Invalid request body: #{raw_body}")
end
authenticate!() click to toggle source
# File lib/slanger/api/request_validation.rb, line 79
def authenticate!
  # Raises Signature::AuthenticationError if request does not authenticate.
  Signature::Request.new('POST', path_info, auth_params).
    authenticate { |key| Signature::Token.new key, Slanger::Config.secret }
end
determine_valid_socket_id() click to toggle source
# File lib/slanger/api/request_validation.rb, line 95
def determine_valid_socket_id
  return validate_socket_id!(body["socket_id"])   if body["socket_id"]
  return validate_socket_id!(params["socket_id"]) if params["socket_id"]
end
parse_body!() click to toggle source
# File lib/slanger/api/request_validation.rb, line 85
def parse_body!
  assert_valid_json!(raw_body)
end
user_params() click to toggle source
# File lib/slanger/api/request_validation.rb, line 100
def user_params
  raw_params.reject{|k,_| %w(splat captures).include?(k)}
end
validate!() click to toggle source
# File lib/slanger/api/request_validation.rb, line 44
def validate!
  raise InvalidRequest.new "no body"        unless raw_body.present?
  raise InvalidRequest.new "invalid params" unless raw_params.is_a? Hash
  raise InvalidRequest.new "invalid path"   unless path_info.is_a? String

  determine_valid_socket_id
  channels.each{|id| validate_channel_id!(id)}
end
validate_body!() click to toggle source
# File lib/slanger/api/request_validation.rb, line 40
def validate_body!
  @body ||= assert_valid_json!(raw_body.tap{ |s| s.force_encoding('utf-8')})
end
validate_channel_id!(channel_id) click to toggle source
# File lib/slanger/api/request_validation.rb, line 57
def validate_channel_id!(channel_id)
  validate_with_regex!(/\A[\w@\-;_.=,]{1,164}\z/, channel_id, "channel_id")
end
validate_raw_params!() click to toggle source
# File lib/slanger/api/request_validation.rb, line 67
def validate_raw_params!
  restricted =  user_params.slice "body_md5", "auth_version", "auth_key", "auth_timestamp", "auth_signature", "app_id"

  invalid_keys = restricted.keys - user_params.keys

  if invalid_keys.any?
    raise Slanger::InvalidRequest.new "Invalid params: #{invalid_keys}"
  end

  restricted
end
validate_socket_id!(socket_id) click to toggle source
# File lib/slanger/api/request_validation.rb, line 53
def validate_socket_id!(socket_id)
  validate_with_regex!(/\A\d+\.\d+\z/, socket_id, "socket_id")
end
validate_with_regex!(regex, value, name) click to toggle source
# File lib/slanger/api/request_validation.rb, line 61
def validate_with_regex!(regex, value, name)
  raise InvalidRequest, "Invalid #{name} #{value.inspect}" unless value =~ regex

  value
end