active_record_encryption 0.2.1 → 1.0.0.alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +16 -0
- data/README.md +3 -4
- data/lib/active_record_encryption/encrypted_attribute.rb +1 -1
- data/lib/active_record_encryption/encryptor/base.rb +1 -1
- data/lib/active_record_encryption/encryptor/registry.rb +6 -23
- data/lib/active_record_encryption/quoter.rb +19 -4
- data/lib/active_record_encryption/type/binary.rb +30 -0
- data/lib/active_record_encryption/type.rb +3 -17
- data/lib/active_record_encryption/version.rb +1 -1
- data/lib/active_record_encryption.rb +2 -0
- metadata +16 -31
- data/lib/active_record_encryption/serializer_with_cast.rb +0 -39
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14bd2384751a5ab2042b14864f2f873e666d78f5a01c8bdce9d8c2190284f514
|
4
|
+
data.tar.gz: 7a086e0bdccd0e140a444fd92688302c60a36355a93c73eef2e869f1a4962dc5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 20a722cb97287bb1f792f0f887ce8b1bcf1a229ecac56d141e205cd1cae3d4930ebbace743c279ff19cb2c2d8fd55605430a86a43ec13c2833942dacde7caab3
|
7
|
+
data.tar.gz: 0df865d7401f019eef15ecad0e78094e11b624eacced1bbe318f357e016d04ea8570f179a7c1a8d1af1eb54f96d731850702a0bfa4925d8423ec5c0a48d02545
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
## 1.0.0.alpha
|
2
|
+
|
3
|
+
- EOL Ruby and Rails no longer supported #29
|
4
|
+
- Requires Ruby 3.0.0 or newer.
|
5
|
+
- Requires Rails 6.1.0 or newer.
|
6
|
+
- Support rails 7.0.0 #25
|
7
|
+
- Support rails 7.1.0 #31
|
8
|
+
- Migrate CI from travis.ci to GitHub Action. #27
|
9
|
+
- In Rails 7.0, `ActiveRecordEncryption` do not change encoding for backward compatibility.
|
10
|
+
|
11
|
+
## 0.3.0
|
12
|
+
|
13
|
+
- Support rails 6.1.0 #22
|
14
|
+
- Ensure casting only when Rails less than 6.0 #21
|
15
|
+
- Fix Ruby 2.7 keyword arguments warnings #20
|
16
|
+
|
1
17
|
## 0.2.1
|
2
18
|
|
3
19
|
- Fixes #13 Add `:cipher` option to `active_support` encryptor to change cipher.
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ class PointLog < ActiveRecord::Base
|
|
49
49
|
encrypted_attribute(:serialized_address, :string)
|
50
50
|
|
51
51
|
# Change encryptor
|
52
|
-
encrypted_attribute(:name, :field, encryption: { encryptor: :active_support, key: ENV['ENCRYPTION_KEY'], salt: ['ENCRYPTION_SALT'] })
|
52
|
+
encrypted_attribute(:name, :field, encryption: { encryptor: :active_support, key: ENV['ENCRYPTION_KEY'], salt: ENV['ENCRYPTION_SALT'] })
|
53
53
|
end
|
54
54
|
```
|
55
55
|
|
@@ -118,9 +118,8 @@ end
|
|
118
118
|
|
119
119
|
```bash
|
120
120
|
bundle exec appraisal install
|
121
|
-
bundle exec appraisal
|
122
|
-
bundle exec appraisal
|
123
|
-
bundle exec appraisal 5.2-stable rspec
|
121
|
+
bundle exec appraisal 6.1-stable rspec
|
122
|
+
bundle exec appraisal 7.0-stable rspec
|
124
123
|
```
|
125
124
|
|
126
125
|
## Contributing
|
@@ -2,32 +2,15 @@
|
|
2
2
|
|
3
3
|
module ActiveRecordEncryption
|
4
4
|
module Encryptor
|
5
|
-
class Registry
|
6
|
-
def initialize
|
7
|
-
@registrations = []
|
8
|
-
end
|
9
|
-
|
10
|
-
def register(encryptor_name, klass = nil, **options, &block)
|
11
|
-
block ||= proc { |_, *args| klass.new(*args) }
|
12
|
-
registrations << Registration.new(encryptor_name, block, **options)
|
13
|
-
end
|
14
|
-
|
15
|
-
def lookup(symbol, *args)
|
16
|
-
registration = find_registration(symbol, *args)
|
17
|
-
|
18
|
-
if registration
|
19
|
-
registration.call(self, symbol, *args)
|
20
|
-
else
|
21
|
-
raise ArgumentError, "Unknown encryptor #{symbol.inspect}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
5
|
+
class Registry < ActiveModel::Type::Registry
|
25
6
|
private
|
26
7
|
|
27
|
-
|
8
|
+
def registration_klass
|
9
|
+
Registration
|
10
|
+
end
|
28
11
|
|
29
|
-
def find_registration(symbol, *args)
|
30
|
-
registrations.find { |
|
12
|
+
def find_registration(symbol, *args, **kwargs)
|
13
|
+
registrations.find { |r| r.matches?(symbol, *args, **kwargs) }
|
31
14
|
end
|
32
15
|
end
|
33
16
|
|
@@ -18,12 +18,27 @@ module ActiveRecordEncryption
|
|
18
18
|
'f'
|
19
19
|
end
|
20
20
|
|
21
|
+
if ActiveRecord::VERSION::MAJOR >= 7
|
22
|
+
# Cast value to string
|
23
|
+
def type_cast(value)
|
24
|
+
return value.to_s if value.is_a?(Numeric)
|
25
|
+
super(value)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Symbol]
|
30
|
+
def default_timezone
|
31
|
+
ActiveRecord::Base.connection.default_timezone
|
32
|
+
end
|
33
|
+
|
21
34
|
private
|
22
35
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
36
|
+
if ActiveRecord::VERSION::MAJOR < 7
|
37
|
+
# Cast value to string
|
38
|
+
def _type_cast(value)
|
39
|
+
return value.to_s if value.is_a?(Numeric)
|
40
|
+
super(value)
|
41
|
+
end
|
27
42
|
end
|
28
43
|
end
|
29
44
|
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ActiveRecordEncryption
|
2
|
+
class Type
|
3
|
+
class Binary < ActiveModel::Type::Binary
|
4
|
+
def cast(value)
|
5
|
+
return super if ActiveRecord::VERSION::STRING < '7.0.0'
|
6
|
+
|
7
|
+
if value.is_a?(Data)
|
8
|
+
value.to_s
|
9
|
+
else
|
10
|
+
value = cast_value(value) unless value.nil?
|
11
|
+
# NOTE: Don't convert string to binary for backward compatibility.
|
12
|
+
# value = value.b if ::String === value && value.encoding != Encoding::BINARY
|
13
|
+
value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def serialize(value)
|
18
|
+
return if value.nil?
|
19
|
+
Data.new(value)
|
20
|
+
end
|
21
|
+
|
22
|
+
class Data < ActiveModel::Type::Binary::Data
|
23
|
+
# NOTE: Don't convert string to binary for backward compatibility.
|
24
|
+
def initialize(value)
|
25
|
+
@value = value.to_s
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -1,23 +1,18 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'active_record_encryption/serializer_with_cast'
|
4
|
-
|
5
3
|
module ActiveRecordEncryption
|
6
4
|
class Type < ActiveRecord::Type::Value
|
7
|
-
using(ActiveRecordEncryption::SerializerWithCast)
|
8
|
-
|
9
5
|
delegate :type, :cast, to: :subtype
|
10
6
|
delegate :user_input_in_time_zone, to: :subtype # for ActiveRecord::AttributeMethods::TimeZoneConversion::TimeZoneConverter
|
11
7
|
|
12
8
|
def initialize(
|
13
|
-
subtype: default_value,
|
9
|
+
subtype: ActiveRecord::Type.default_value,
|
14
10
|
encryption: ActiveRecordEncryption.default_encryption.clone,
|
15
11
|
**options
|
16
12
|
)
|
17
|
-
|
18
13
|
# Lookup encryptor from options[:encryption]
|
19
14
|
@encryptor = build_encryptor(encryption)
|
20
|
-
@binary = ActiveRecord::Type.lookup(:
|
15
|
+
@binary = ActiveRecord::Type.lookup(:encryption_binary)
|
21
16
|
|
22
17
|
subtype = ActiveRecord::Type.lookup(subtype, **options) if subtype.is_a?(Symbol)
|
23
18
|
@subtype = subtype
|
@@ -42,22 +37,13 @@ module ActiveRecordEncryption
|
|
42
37
|
|
43
38
|
attr_reader :subtype, :binary, :encryptor
|
44
39
|
|
45
|
-
# NOTE: `ActiveRecord::Type.default_value` is not defined in Rails 5.0
|
46
|
-
def default_value
|
47
|
-
if ActiveRecord.gem_version < Gem::Version.create('5.1.0')
|
48
|
-
ActiveRecord::Type::Value.new
|
49
|
-
else
|
50
|
-
ActiveRecord::Type.default_value
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
40
|
def build_encryptor(options)
|
55
41
|
encryptor = options.delete(:encryptor)
|
56
42
|
|
57
43
|
if encryptor.is_a?(Symbol)
|
58
44
|
ActiveRecordEncryption::Encryptor.lookup(encryptor, **options)
|
59
45
|
elsif encryptor.is_a?(Class)
|
60
|
-
encryptor.new(options)
|
46
|
+
encryptor.new(**options)
|
61
47
|
else
|
62
48
|
encryptor
|
63
49
|
end
|
@@ -13,6 +13,7 @@ end
|
|
13
13
|
|
14
14
|
ActiveSupport.on_load(:active_record) do
|
15
15
|
require 'active_record_encryption/type'
|
16
|
+
require 'active_record_encryption/type/binary'
|
16
17
|
require 'active_record_encryption/encryptor'
|
17
18
|
require 'active_record_encryption/encrypted_attribute'
|
18
19
|
require 'active_record_encryption/binary'
|
@@ -20,6 +21,7 @@ ActiveSupport.on_load(:active_record) do
|
|
20
21
|
|
21
22
|
# Register `:encryption` type
|
22
23
|
ActiveRecord::Type.register(:encryption, ActiveRecordEncryption::Type)
|
24
|
+
ActiveRecord::Type.register(:encryption_binary, ActiveRecordEncryption::Type::Binary)
|
23
25
|
|
24
26
|
# Define `.encrypted_attribute`
|
25
27
|
ActiveRecord::Base.include(ActiveRecordEncryption::EncryptedAttribute)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_encryption
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0.alpha
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alpaca-tc
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-11-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activerecord
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '6.1'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '6.1'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: appraisal
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,20 +38,6 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: bundler
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '1.16'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '1.16'
|
55
41
|
- !ruby/object:Gem::Dependency
|
56
42
|
name: guard-rspec
|
57
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,16 +84,16 @@ dependencies:
|
|
98
84
|
name: mysql2
|
99
85
|
requirement: !ruby/object:Gem::Requirement
|
100
86
|
requirements:
|
101
|
-
- - "
|
87
|
+
- - ">="
|
102
88
|
- !ruby/object:Gem::Version
|
103
|
-
version: 0
|
89
|
+
version: '0'
|
104
90
|
type: :development
|
105
91
|
prerelease: false
|
106
92
|
version_requirements: !ruby/object:Gem::Requirement
|
107
93
|
requirements:
|
108
|
-
- - "
|
94
|
+
- - ">="
|
109
95
|
- !ruby/object:Gem::Version
|
110
|
-
version: 0
|
96
|
+
version: '0'
|
111
97
|
- !ruby/object:Gem::Dependency
|
112
98
|
name: pry
|
113
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -201,14 +187,14 @@ files:
|
|
201
187
|
- lib/active_record_encryption/encryptor/registry.rb
|
202
188
|
- lib/active_record_encryption/exceptions.rb
|
203
189
|
- lib/active_record_encryption/quoter.rb
|
204
|
-
- lib/active_record_encryption/serializer_with_cast.rb
|
205
190
|
- lib/active_record_encryption/type.rb
|
191
|
+
- lib/active_record_encryption/type/binary.rb
|
206
192
|
- lib/active_record_encryption/version.rb
|
207
193
|
homepage: https://github.com/alpaca-tc/active_record_encryption
|
208
194
|
licenses:
|
209
195
|
- MIT
|
210
196
|
metadata: {}
|
211
|
-
post_install_message:
|
197
|
+
post_install_message:
|
212
198
|
rdoc_options: []
|
213
199
|
require_paths:
|
214
200
|
- lib
|
@@ -216,16 +202,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
216
202
|
requirements:
|
217
203
|
- - ">="
|
218
204
|
- !ruby/object:Gem::Version
|
219
|
-
version:
|
205
|
+
version: 3.0.0
|
220
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
221
207
|
requirements:
|
222
|
-
- - "
|
208
|
+
- - ">"
|
223
209
|
- !ruby/object:Gem::Version
|
224
|
-
version:
|
210
|
+
version: 1.3.1
|
225
211
|
requirements: []
|
226
|
-
|
227
|
-
|
228
|
-
signing_key:
|
212
|
+
rubygems_version: 3.4.6
|
213
|
+
signing_key:
|
229
214
|
specification_version: 4
|
230
215
|
summary: Transparent ActiveRecord encryption
|
231
216
|
test_files: []
|
@@ -1,39 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module ActiveRecordEncryption
|
4
|
-
module SerializerWithCast
|
5
|
-
# Unfortunately, current Rails doesn't serialize value from user input with `#cast`.
|
6
|
-
# IMO, it is expected that serialized value from user input should be equal same result.
|
7
|
-
#
|
8
|
-
# Example:
|
9
|
-
# # Current
|
10
|
-
# User.attribute(:id, :boolean)
|
11
|
-
# User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = 'string'
|
12
|
-
# User.where(id: true).to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
|
13
|
-
#
|
14
|
-
# # Expected
|
15
|
-
# User.attribute(:id, :boolean)
|
16
|
-
# User.where(id: 'string').to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
|
17
|
-
# User.where(id: true).to_sql #=> SELECT `users`.* FROM `users` WHERE `users`.`id` = TRUE
|
18
|
-
refine ActiveModel::Type::Decimal do
|
19
|
-
def serialize(value)
|
20
|
-
cast(value)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
refine ActiveModel::Type::Boolean do
|
25
|
-
def serialize(value)
|
26
|
-
cast(value)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Backport Rails5.2
|
31
|
-
if ActiveRecord.gem_version < Gem::Version.create('5.2')
|
32
|
-
refine ActiveModel::Type::DateTime do
|
33
|
-
def serialize(value)
|
34
|
-
super(cast(value))
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|