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
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