Class: ActiveRecord::Encryption::Scheme

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/encryption/scheme.rb

Overview

A container of attribute encryption options.

It validates and serves attribute encryption options.

See EncryptedAttributeType, Context

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(key_provider: nil, key: nil, deterministic: nil, downcase: nil, ignore_case: nil, previous_schemes: nil, **context_properties) ⇒ Scheme

Returns a new instance of Scheme.


13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 13

def initialize(key_provider: nil, key: nil, deterministic: nil, downcase: nil, ignore_case: nil,
               previous_schemes: nil, **context_properties)
  # Initializing all attributes to +nil+ as we want to allow a "not set" semantics so that we
  # can merge schemes without overriding values with defaults. See +#merge+

  @key_provider_param = key_provider
  @key = key
  @deterministic = deterministic
  @downcase = downcase || ignore_case
  @ignore_case = ignore_case
  @previous_schemes_param = previous_schemes
  @previous_schemes = Array.wrap(previous_schemes)
  @context_properties = context_properties

  validate_config!
end

Instance Attribute Details

#previous_schemesObject

Returns the value of attribute previous_schemes.


11
12
13
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 11

def previous_schemes
  @previous_schemes
end

Instance Method Details

#deterministic?Boolean

Returns:

  • (Boolean)

38
39
40
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 38

def deterministic?
  @deterministic
end

#downcase?Boolean

Returns:

  • (Boolean)

34
35
36
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 34

def downcase?
  @downcase
end

#fixed?Boolean

Returns:

  • (Boolean)

42
43
44
45
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 42

def fixed?
  # by default deterministic encryption is fixed
  @fixed ||= @deterministic && (!@deterministic.is_a?(Hash) || @deterministic[:fixed])
end

#ignore_case?Boolean

Returns:

  • (Boolean)

30
31
32
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 30

def ignore_case?
  @ignore_case
end

#key_providerObject


47
48
49
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 47

def key_provider
  @key_provider ||= @key_provider_param || build_key_provider || default_key_provider
end

#merge(other_scheme) ⇒ Object


51
52
53
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 51

def merge(other_scheme)
  self.class.new(**to_h.merge(other_scheme.to_h))
end

#to_hObject


55
56
57
58
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 55

def to_h
  { key_provider: @key_provider_param, key: @key, deterministic: @deterministic, downcase: @downcase, ignore_case: @ignore_case,
    previous_schemes: @previous_schemes_param, **@context_properties }.compact
end

#with_context(&block) ⇒ Object


60
61
62
63
64
65
66
# File 'activerecord/lib/active_record/encryption/scheme.rb', line 60

def with_context(&block)
  if @context_properties.present?
    ActiveRecord::Encryption.with_encryption_context(**@context_properties, &block)
  else
    block.call
  end
end