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