123456789_123456789_123456789_123456789_123456789_

Class: Mongo::Crypt::ExplicitEncryptionContext Private

Do not use. This class is for internal use only.
Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Subclasses:
Mongo::Crypt::ExplicitEncryptionExpressionContext
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Context, Forwardable
Instance Chain:
self, Context
Inherits: Mongo::Crypt::Context
Defined in: lib/mongo/crypt/explicit_encryption_context.rb

Overview

A Context object initialized for explicit encryption

Class Method Summary

Context - Inherited

.new

Create a new Context object.

Instance Attribute Summary

Context - Inherited

Instance Method Summary

Context - Inherited

#run_state_machine

Runs the mongocrypt_ctx_t state machine and handles all I/O on behalf of.

#state

Returns the state of the mongocrypt_ctx_t.

#azure_access_token

Returns an Azure access token, retrieving it if necessary.

#feed_kms,
#gcp_access_token

Retrieves a GCP access token.

#mongocrypt_done

Indicate that state machine is done feeding I/O responses back to libmongocrypt.

#mongocrypt_feed

Feeds the result of a ::Mongo operation back to libmongocrypt.

#provide_collection_info, #provide_keys, #provide_markings,
#retrieve_kms_credentials

Retrieves KMS credentials for providers that are configured for automatic credentials retrieval.

Instance Method Details

#convert_range_opts(range_opts) (private)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 140

def convert_range_opts(range_opts)
  range_opts.dup.tap do |opts|
    if opts[:sparsity] && !opts[:sparsity].is_a?(BSON::Int64)
      opts[:sparsity] = BSON::Int64.new(opts[:sparsity])
    end
    if opts[:trim_factor]
      opts[:trimFactor] = opts.delete(:trim_factor)
    end
  end
end

#init(doc)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 74

def init(doc)
  Binding.ctx_explicit_encrypt_init(self, doc)
end

#set_algorithm_opts(options) (private)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 118

def set_algorithm_opts(options)
  Binding.ctx_setopt_algorithm(self, options[:algorithm])
  if %w(Indexed Range).include?(options[:algorithm])
    if options[:contention_factor]
      Binding.ctx_setopt_contention_factor(self, options[:contention_factor])
    end
    if options[:query_type]
      Binding.ctx_setopt_query_type(self, options[:query_type])
    end
  else
    if options[:contention_factor]
      raise ArgumentError.new(':contention_factor is allowed only for "Indexed" or "Range" algorithms')
    end
    if options[:query_type]
      raise ArgumentError.new(':query_type is allowed only for "Indexed" or "Range" algorithms')
    end
  end
  if options[:algorithm] == 'Range'
    Binding.ctx_setopt_algorithm_range(self, convert_range_opts(options[:range_opts]))
  end
end

#set_key_alt_name(key_alt_name) (private)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 111

def set_key_alt_name(key_alt_name)
  unless key_alt_name.is_a?(String)
      raise ArgumentError.new(':key_alt_name option must be a String')
    end
    Binding.ctx_setopt_key_alt_names(self, [key_alt_name])
end

#set_key_id(key_id) (private)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 100

def set_key_id(key_id)
  unless key_id.is_a?(BSON::Binary) &&
      key_id.type == :uuid
        raise ArgumentError.new(
          "Expected the :key_id option to be a BSON::Binary object with " +
          "type :uuid. #{key_id} is an invalid :key_id option"
        )
    end
    Binding.ctx_setopt_key_id(self, key_id.data)
end

#set_key_opts(options) (private)

[ GitHub ]

  
# File 'lib/mongo/crypt/explicit_encryption_context.rb', line 79

def set_key_opts(options)
  if options[:key_id].nil? && options[:key_alt_name].nil?
    raise ArgumentError.new(
      'The :key_id and :key_alt_name options cannot both be nil. ' +
      'Specify a :key_id option or :key_alt_name option (but not both)'
    )
  end
  if options[:key_id] && options[:key_alt_name]
    raise ArgumentError.new(
      'The :key_id and :key_alt_name options cannot both be present. ' +
      'Identify the data key by specifying its id with the :key_id ' +
      'option or specifying its alternate name with the :key_alt_name option'
    )
  end
  if options[:key_id]
    set_key_id(options[:key_id])
  elsif options[:key_alt_name]
    set_key_alt_name(options[:key_alt_name])
  end
end