class Garufa::Subscription

Attributes

error[R]

Public Class Methods

new(data, connection) click to toggle source
# File lib/garufa/subscription.rb, line 10
def initialize(data, connection)
  @data = data
  @connection = connection
  @error = nil
end

Public Instance Methods

channel() click to toggle source
# File lib/garufa/subscription.rb, line 55
def channel
  @data['channel']
end
channel_data() click to toggle source
# File lib/garufa/subscription.rb, line 59
def channel_data
  @data['channel_data']
end
channel_prefix() click to toggle source
# File lib/garufa/subscription.rb, line 63
def channel_prefix
  channel[/^private-|presence-/].to_s[0...-1]
end
notify(message) click to toggle source
# File lib/garufa/subscription.rb, line 67
def notify(message)
  @connection.send_message message
end
presence_channel?() click to toggle source
# File lib/garufa/subscription.rb, line 43
def presence_channel?
  channel_prefix == 'presence'
end
private_channel?() click to toggle source
# File lib/garufa/subscription.rb, line 39
def private_channel?
  channel_prefix == 'private'
end
public_channel?() click to toggle source
# File lib/garufa/subscription.rb, line 35
def public_channel?
  !(private_channel? || presence_channel?)
end
set_error(code, message) click to toggle source
# File lib/garufa/subscription.rb, line 47
def set_error(code, message)
  @error = SubscriptionError.new(code, message)
end
socket_id() click to toggle source
# File lib/garufa/subscription.rb, line 71
def socket_id
  @connection.socket_id
end
subscribe() click to toggle source
# File lib/garufa/subscription.rb, line 16
def subscribe
  case true
  when !valid_channel?
    set_error(nil, 'Invalid channel')
  when !public_channel? && !valid_signature?
    set_error(nil, 'Invalid signature')
  when !public_channel? && !valid_app_key?
    set_error(nil, 'Invalid key')
  when already_subscribed?
    set_error(nil, "Already subscribed to channel: #{channel}")
  else
    Subscriptions.add self
  end
end
success?() click to toggle source
# File lib/garufa/subscription.rb, line 51
def success?
  @error.nil?
end
unsubscribe() click to toggle source
# File lib/garufa/subscription.rb, line 31
def unsubscribe
  Subscriptions.remove self
end

Private Instance Methods

already_subscribed?() click to toggle source
# File lib/garufa/subscription.rb, line 101
def already_subscribed?
  Subscriptions.include? self
end
app_key() click to toggle source
# File lib/garufa/subscription.rb, line 105
def app_key
  @data['auth'].split(':').first if @data['auth']
end
signature() click to toggle source
# File lib/garufa/subscription.rb, line 109
def signature
  @data['auth'].split(':').last if @data['auth']
end
token(string_to_sign) click to toggle source
# File lib/garufa/subscription.rb, line 96
def token(string_to_sign)
  digest = OpenSSL::Digest::SHA256.new
  OpenSSL::HMAC.hexdigest(digest, Config[:secret], string_to_sign)
end
valid_app_key?() click to toggle source
# File lib/garufa/subscription.rb, line 82
def valid_app_key?
  app_key && app_key == Config[:app_key]
end
valid_channel?() click to toggle source
# File lib/garufa/subscription.rb, line 77
def valid_channel?
  # See https://gist.github.com/mdpye/f062cacb8a9d5e3d102c
  channel =~ /^[A-Za-z0-9_\-=@,.;]+$/
end
valid_signature?() click to toggle source
# File lib/garufa/subscription.rb, line 86
def valid_signature?
  string_to_sign = [
    @connection.socket_id,
    channel,
    channel_data
  ].compact.join(':')

  token(string_to_sign) == signature
end