active_record_encryption 0.2.1 → 1.0.0.alpha
Sign up to get free protection for your applications and to get access to all the features.
- 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
|