class Learnosity::Sdk::Request::Init

Attributes

action[RW]
request_packet[RW]
request_string[RW]

XXX: Needs to be public for unit tests

secret[RW]
security_packet[RW]

XXX: Needs to be public for unit tests

service[RW]
sign_request_data[RW]

Public Class Methods

disable_telemetry() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 31
def self.disable_telemetry
  @@telemetry_enabled = false
end
enable_telemetry() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 27
def self.enable_telemetry
  @@telemetry_enabled = true
end
new(service, security_packet, secret, request_packet = nil, action = nil) click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 35
def initialize(service, security_packet, secret, request_packet = nil, action = nil)
  @sign_request_data = false
  @service = service
  @security_packet = security_packet.clone unless security_packet.nil?
  @secret = secret
  @request_packet = request_packet.clone unless request_packet.nil?
  @action = action

  validate

  if @@telemetry_enabled
    add_meta
  end

  set_service_options

  @request_string = generate_request_string
  @security_packet['signature'] = generate_signature
end

Public Instance Methods

generate(encode = true) click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 76
def generate(encode = true)
  output = {}

  case @service
  when 'assess', 'author', 'data', 'items', 'reports'
    output['security'] =  @security_packet

    unless @request_packet.nil?
      output['request'] = @request_packet
    end

    case @service
    when 'data'
      data_output = { 'security' => JSON.generate(output['security']) }

      if output.key?('request')
        data_output['request'] = JSON.generate(output['request'])
      end

      unless @action.nil?
        data_output['action'] = @action
      end

      return data_output

    when 'assess'
      output = output['request']
    end

  when 'questions'
    output = hash_except(@security_packet, 'domain')

    unless @request_packet.nil?
      output = output.merge(@request_packet)
    end

  when 'events'
    output['security'] =  @security_packet
    output['config'] =  @request_packet
  else
    raise Exception, "generate() for #{@service} not implemented"
  end

  unless encode
    return output
  end

  JSON.generate(output)
end
generate_signature() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 55
def generate_signature
  signature_array = []
  @@valid_security_keys.each do |k|
    if @security_packet.include? k
      signature_array.<< @security_packet[k]
    end
  end

  signature_array << @secret

  if @sign_request_data and ! @request_string.nil?
    signature_array << @request_string
  end

  unless @action.nil?
    signature_array << @action
  end

  hash_signature(signature_array)
end

Protected Instance Methods

add_meta() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 143
def add_meta
  if @request_packet.nil?
    @request_packet = {}
  end

  sdk_metrics = {
    :version => VERSION,
    :lang => 'ruby',
    :lang_version => RUBY_VERSION,
    :platform => get_platform,
    :platform_version => Sys::Uname.release
  }

  if @request_packet.include? 'meta'
    @request_packet['meta'].delete('sdk') if @request_packet['meta'].include? 'sdk'

    @request_packet['meta'][:sdk] = sdk_metrics
  elsif @request_packet.include? :meta
    @request_packet[:meta].delete('sdk') if @request_packet[:meta].include? 'sdk'

    @request_packet[:meta][:sdk] = sdk_metrics
  else
    @request_packet[:meta] = {}

    @request_packet[:meta][:sdk] = sdk_metrics
  end
end
generate_request_string() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 268
def generate_request_string
  JSON.generate @request_packet unless request_packet.nil?
end
get_platform() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 131
def get_platform
  if Sys::Platform.linux?
    'linux'
  elsif Sys::Platform.windows?
    'win'
  elsif Sys::Platform.mac?
    'darwin'
  else
    Sys::Uname.platform
  end
end
hash_signature(signature_array) click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 276
def hash_signature(signature_array)
  hash_value(signature_array.join('_'))
end
hash_value(value) click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 272
def hash_value(value)
  Digest::SHA256.hexdigest value
end
set_service_options() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 211
def set_service_options
  case @service
  when 'questions'
    # nothing to do
  when 'assess'
    if @request_packet.key?('questionsApiActivity')
      questions_api_activity = @request_packet['questionsApiActivity']

      signature_parts = {}
      signature_parts['consumer_key'] \
        = questions_api_activity['consumer_key'] \
        = @security_packet['consumer_key']

      signature_parts['domain'] = @security_packet['domain'] \
        || questions_api_activity['domain'] \
        || 'assess.learnosity.com'

      signature_parts['timestamp'] \
        = questions_api_activity['timestamp'] \
        = @security_packet['timestamp']

      signature_parts['expires'] = \
        questions_api_activity['expires'] \
        = @security_packet['expires'] if @security_packet.key?('expires')

      signature_parts['user_id'] = \
        questions_api_activity['user_id'] = \
        @security_packet['user_id']

      signature_parts['secret'] = @security_packet['secret']

      # Remove expires attribute if present but nil
      questions_api_activity = hash_except(questions_api_activity, 'expires') if questions_api_activity['expires'].nil?

      @security_packet = signature_parts
      questions_api_activity['signature'] = generate_signature
      @request_packet['questionsApiActivity'] = questions_api_activity
    end
  when 'items', 'reports'
    @sign_request_data = true
    if ! @request_packet.nil? and @request_packet.include? 'user_id' and
        ! @security_packet.include? 'user_id'
      @security_packet['user_id'] = @request_packet['user_id']
    end
  when 'events'
    hashed_users = {}
    @request_packet['users'].each do |k, v|
      hashed_users[k] =  hash_value(k + @secret)
    end
    @request_packet['users'] = hashed_users
  when 'author', 'data'
    @sign_request_data = true
  else
    raise Exception, "set_service_options() for #{@service} not implemented"
  end
end
validate() click to toggle source
# File lib/learnosity/sdk/request/init.rb, line 171
def validate
  if @service.nil?
    raise Learnosity::Sdk::ValidationException, 'The `service` argument wasn\'t found or was empty'
  elsif ! @@valid_services.include? @service
    raise Learnosity::Sdk::ValidationException, "The service provided (#{service}) is not valid"
  end

  # XXX we don't do JSON to native object conversion for now, as the PHP SDK does
  if @security_packet.nil? or ! @security_packet.is_a? Hash
    raise Learnosity::Sdk::ValidationException, 'The security packet must be a Hash'
  else
    @security_packet.each do |k, v|
      unless @@valid_security_keys.include? k
        raise ValidationException, "Invalid key found in the security packet: #{k}"
      end
    end

    if @service == 'questions' and ! @security_packet.include? 'user_id'
      raise ValidationException, 'Questions API requires a `user_id` in the security packet'
    end

    unless @security_packet.include? 'timestamp'
      @security_packet['timestamp'] = Time.now.gmtime.strftime('%Y%m%d-%H%m')
    end
  end

  if @secret.nil? or ! @secret.is_a? String
    raise ValidationException, 'The `secret` argument must be a valid string'
  end

  # XXX we don't do JSON to native object conversion for now, as the PHP SDK does
  if ! @request_packet.nil? and ! @request_packet.is_a? Hash
    raise ValidationException, 'The request packet must be a hash'
  end

  if ! @action.nil? and ! @action.is_a? String
    raise ValidationException, 'The `action` argument must be a string'
  end
end