class SelfSDK::Messages::Base

Attributes

description[RW]
exp_timeout[RW]
expires[RW]
fields[RW]
from[RW]
from_device[RW]
id[RW]
input[RW]
intermediary[RW]
payload[RW]
status[RW]
sub[RW]
to[RW]
to_device[RW]
typ[RW]

Public Class Methods

new(messaging) click to toggle source
# File lib/messages/base.rb, line 12
def initialize(messaging)
  @client = messaging.client
  @jwt = @client.jwt
  @messaging = messaging
  @device_id = "1"
end

Public Instance Methods

accepted?() click to toggle source
# File lib/messages/base.rb, line 59
def accepted?
  status == "accepted"
end
encrypt_message(message, recipient, recipient_device) click to toggle source
# File lib/messages/base.rb, line 47
def encrypt_message(message, recipient, recipient_device)
  @messaging.encryption_client.encrypt(message, recipient, recipient_device)
end
errored?() click to toggle source
# File lib/messages/base.rb, line 63
def errored?
  status == "errored"
end
rejected?() click to toggle source
# File lib/messages/base.rb, line 55
def rejected?
  status == "rejected"
end
request() click to toggle source
# File lib/messages/base.rb, line 19
def request
  check_credits!
  msgs = []
  devices.each do |d|
    msgs << proto(d)
  end
  current_devices.each do |d|
    if d != @messaging.device_id
      msgs << proto(d)
    end
  end
  SelfSDK.logger.info "synchronously messaging to #{@to}"
  res = @messaging.send_and_wait_for_response(msgs, self)
  res
end
send_message(device_id = nil) click to toggle source
# File lib/messages/base.rb, line 35
def send_message(device_id = nil)
  check_credits!
  dds = devices
  dds = [device_id] if device_id
  res = []
  dds.each do |d|
    res << @messaging.send_message(proto(d))
    SelfSDK.logger.info "asynchronously requested information to #{@to}:#{d}"
  end
  res.first
end
unauthorized?() click to toggle source
# File lib/messages/base.rb, line 51
def unauthorized?
  status == "unauthorized"
end
validate!(original) click to toggle source
# File lib/messages/base.rb, line 67
def validate!(original)
  unless original.nil?
    raise ::StandardError.new("bad response audience") if @audience != original.from
    if original.intermediary.nil?
      raise ::StandardError.new("bad issuer") if @from != original.to
    else
      raise ::StandardError.new("bad issuer") if @from != original.intermediary
    end
  end
  raise ::StandardError.new("expired message") if @expires < SelfSDK::Time.now
  raise ::StandardError.new("issued too soon") if @issued > SelfSDK::Time.now
end

Protected Instance Methods

check_credits!() click to toggle source
# File lib/messages/base.rb, line 96
def check_credits!
  app = @client.app(@jwt.id)
  raise "Your credits have expired, please log in to the developer portal and top up your account." if app[:paid_actions] == false
end
current_devices() click to toggle source
# File lib/messages/base.rb, line 92
def current_devices
  @client.devices(@jwt.id)
end
devices() click to toggle source
# File lib/messages/base.rb, line 86
def devices
  return @client.devices(@to) if @intermediary.nil?
            
  @client.devices(@intermediary)
end
proto(to_device) click to toggle source
# File lib/messages/base.rb, line 82
def proto(to_device)
  raise ::StandardError.new("must define this method")
end

Private Instance Methods

get_payload(input) click to toggle source
# File lib/messages/base.rb, line 103
def get_payload(input)
  body = if input.is_a? String
           input
         else
           input.ciphertext
         end

  jwt = JSON.parse(body, symbolize_names: true)
  payload = JSON.parse(@jwt.decode(jwt[:payload]), symbolize_names: true)
  header = JSON.parse(@jwt.decode(jwt[:protected]), symbolize_names: true)
  @from = payload[:iss]
  verify! jwt, header[:kid]
  payload
end
verify!(input, kid) click to toggle source
# File lib/messages/base.rb, line 118
def verify!(input, kid)
  k = @client.public_key(@from, kid).raw_public_key
  return if @jwt.verify(input, k)

  SelfSDK.logger.info "skipping message, invalid signature"
  raise ::StandardError.new("invalid signature on incoming message")
end