class Colossus::Faye::Extension

Faye extension implementing all the presence, authorization, authentification and push logic.

Constants

VALID_STATUSES

Attributes

colossus[R]
faye[R]

Public Class Methods

new(faye, colossus = Colossus.new) click to toggle source
# File lib/colossus/faye/extension.rb, line 10
def initialize(faye, colossus = Colossus.new)
  @faye     = faye
  @colossus = colossus
  faye.add_extension(self)
end

Public Instance Methods

acceptable?(message) click to toggle source
# File lib/colossus/faye/extension.rb, line 32
def acceptable?(message)
  message['ext'] &&
    (message['ext']['user_token'] || message['ext']['writer_token'])
end
handle_invalid_token(message) click to toggle source
# File lib/colossus/faye/extension.rb, line 51
def handle_invalid_token(message)
  message['error'] = 'Invalid Token'
  message
end
handle_set_status(message) click to toggle source
# File lib/colossus/faye/extension.rb, line 72
def handle_set_status(message)
  token   = message['ext']['user_token']
  user_id = message['channel'].partition('/users/').last
  status  = message['data'] && message['data']['status']

  if invalid_user_channel?(user_id)
    message['error'] = 'The only accepted channel_name is users/:user_id'
    return message
  end

  unless status && VALID_STATUSES.include?(status)
    message['error'] = 'Invalid Status'
    return message
  end

  unless colossus.verifier.verify_token(token, user_id)
    message['error'] = 'Invalid Token'
    return message
  end

  colossus.set(user_id, message['clientId'], status)

  message
end
handle_subscribe(message) click to toggle source
# File lib/colossus/faye/extension.rb, line 56
def handle_subscribe(message)
  token   = message['ext']['user_token']
  user_id = message['subscription'].partition('/users/').last

  if invalid_user_channel?(user_id)
    message['error'] = 'The only accepted channel_name is users/:user_id'
    return message
  end

  unless colossus.verifier.verify_token(token, user_id)
    message['error'] = 'Invalid Token'
  end

  message
end
handle_user_action(message) click to toggle source
# File lib/colossus/faye/extension.rb, line 37
def handle_user_action(message)
  if message['channel'] == '/meta/subscribe'
    handle_subscribe(message)
  elsif message['channel'].start_with?('/meta/')
    message
  elsif message['channel'].start_with?('/users/')
    handle_set_status(message)
  else
    message['error'] = 'Unknown Action'
  end

  message
end
incoming(message, callback) click to toggle source
# File lib/colossus/faye/extension.rb, line 16
def incoming(message, callback)
  if !acceptable?(message)
    handle_invalid_token(message)
    message.delete('data')
    message.delete('ext')
  elsif message['ext']['user_token']
    handle_user_action(message)
    message.delete('data')
    message.delete('ext')
  elsif message['ext']['writer_token']
    message.delete('ext')
  end

  callback.call(message)
end
invalid_user_channel?(user_id) click to toggle source
# File lib/colossus/faye/extension.rb, line 97
def invalid_user_channel?(user_id)
  user_id.empty? || user_id.include?('*') || user_id.include?('/')
end