class Silkey::Models::JwtPayload

Generates message to sign based on plain object data (keys => values)

@param email [string] verified email of the user

IMPORTANT: if email in user profile is different, you should always update it with this one.

@param scope [string] @param address [string] ID of the user, this is also valid ethereum address, use this to identify user @param userSignature [string] proof that request came from the user @param userSignatureTimestamp [number] time when signature was crated @param silkeySignature [string] proof that Silkey verified the email @param silkeySignatureTimestamp [number] time when signature was crated @param migration [boolean] true if user started migration to Silkey

Public Instance Methods

import(data = {}) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 120
def import(data = {})
  return data if data.is_a?(Silkey::Models::JwtPayload)

  data.each do |k, v|
    var = k.to_s.underscore

    if var == 'scope'
      set_scope(v)
    else
      instance_variable_set("@#{var}", v)
    end
  end

  self
end
message_to_sign_by_silkey() click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/silkey/models/jwt_payload.rb, line 98
def message_to_sign_by_silkey
  return '' if Silkey::Utils.empty?(email)

  if Silkey::Utils.empty?(silkey_signature_timestamp)
    self.silkey_signature_timestamp = Silkey::Utils.current_timestamp
  end

  "#{email.to_s.unpack('H*')[0]}#{Silkey::Utils.int_to_hex(silkey_signature_timestamp)}"
end
message_to_sign_by_user() click to toggle source

rubocop:disable Metrics/AbcSize

Creates message that's need to be sign by user
# File lib/silkey/models/jwt_payload.rb, line 85
def message_to_sign_by_user
  data = {
    address: Silkey::Utils.strings_to_hex(['address']) + Silkey::Utils.remove0x(address).downcase,
    migration: Silkey::Utils.strings_to_hex(['migration']) + (migration ? '01' : '00'),
    scope: Silkey::Utils.strings_to_hex(['scope', scope]),
    userSignatureTimestamp: Silkey::Utils.strings_to_hex(['userSignatureTimestamp']) +
                            Silkey::Utils.int_to_hex(user_signature_timestamp)
  }

  data.keys.sort.map { |k| data[k] }.join('')
end
scope() click to toggle source

rubocop:enable Style/HashSyntax

# File lib/silkey/models/jwt_payload.rb, line 33
def scope
  _scope.keys.sort.join(Silkey::Settings.SCOPE_DIVIDER)
end
set_address(addr) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 45
def set_address(addr)
  raise "`#{addr}` is not ethereum address" unless Silkey::Utils.ethereum_address?(addr)

  self.address = addr
  self
end
set_email(email) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 52
def set_email(email)
  self.email = email
  self
end
set_migrations(migrating) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 57
def set_migrations(migrating)
  self.migration = migrating
  self
end
set_scope(scope) click to toggle source

rubocop:disable Naming/AccessorMethodName

# File lib/silkey/models/jwt_payload.rb, line 38
def set_scope(scope)
  return self if Silkey::Utils.empty?(scope)

  _scope[scope] = true
  self
end
set_silkey_signature(sig, timestamp) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 71
def set_silkey_signature(sig, timestamp)
  raise "silkey signature invalid: `#{sig}`" unless Silkey::Utils.signature?(sig)
  raise 'empty silkey signature timestamp' if Silkey::Utils.empty?(timestamp)

  self.silkey_signature = sig
  self.silkey_signature_timestamp = timestamp
  self
end
set_user_signature(sig, timestamp) click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 62
def set_user_signature(sig, timestamp)
  raise "user signature invalid: `#{sig}`" unless Silkey::Utils.signature?(sig)
  raise 'empty user signature timestamp' if Silkey::Utils.empty?(timestamp)

  self.user_signature = sig
  self.user_signature_timestamp = timestamp
  self
end
validate() click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 108
def validate
  raise "address is invalid: #{address}" unless Silkey::Utils.ethereum_address?(address)

  raise "user_signature is invalid: #{user_signature}" unless Silkey::Utils.signature?(user_signature)

  raise 'user_signature_timestamp is invalid' unless Silkey::Utils.timestamp?(user_signature_timestamp)

  return self if Silkey::Utils.empty?(scope) || scope == 'id'

  validate_scope_email
end

Private Instance Methods

pack_payload_to_hex() click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 138
def pack_payload_to_hex
  str1_hex = 'address'.unpack('H*')[0]
  adr_hex = Silkey::Utils.remove0x(address).downcase

  str2_hex = [
    'scope', scope,
    'userSignatureTimestamp'
  ].map { |str| str.to_s.unpack('H*') }.join('')

  "#{str1_hex}#{adr_hex}#{str2_hex}"
end
validate_scope_email() click to toggle source
# File lib/silkey/models/jwt_payload.rb, line 150
def validate_scope_email
  raise 'email is empty' if Silkey::Utils.empty?(email)

  raise "silkey_signature is invalid: #{silkey_signature}" unless Silkey::Utils.signature?(silkey_signature)

  raise 'silkey_signature_timestamp is invalid' unless Silkey::Utils.timestamp?(silkey_signature_timestamp)

  self
end