active_record_encryption 0.3.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/README.md +2 -3
- 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 +2 -16
- data/lib/active_record_encryption/version.rb +1 -1
- data/lib/active_record_encryption.rb +2 -0
- metadata +7 -7
- data/lib/active_record_encryption/serializer_with_cast.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a44b6801eaa2a8f03073d3fb608ecf2ef1c307fafefed5e4b264c058d4b7d206
|
4
|
+
data.tar.gz: 27c5bb1d838a8599785518feecd5fad117b64846bc8d83153ab5e7e85288b202
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cab1fcaf58a388284e677a3953702248b286b1b55691ffcfad66a1a3072a37aee6a974f0bf150b6a5293ecdf107451dfa0a79c8379f29320a7f96f35136529b4
|
7
|
+
data.tar.gz: 570e91b04e305d02c1c830c8a2433db9dce4605767e49a130cc9fa71adcaeb3f6a22627e8cc8989147d62d786fded62d4d1fd3fa45bc8c4ed6bf113d5daa5719
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 1.0.0
|
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
|
+
|
1
11
|
## 0.3.0
|
2
12
|
|
3
13
|
- Support rails 6.1.0 #22
|
data/README.md
CHANGED
@@ -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
|
@@ -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,15 +37,6 @@ 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
|
|
@@ -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
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- alpaca-tc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-11-11 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
|
@@ -187,8 +187,8 @@ files:
|
|
187
187
|
- lib/active_record_encryption/encryptor/registry.rb
|
188
188
|
- lib/active_record_encryption/exceptions.rb
|
189
189
|
- lib/active_record_encryption/quoter.rb
|
190
|
-
- lib/active_record_encryption/serializer_with_cast.rb
|
191
190
|
- lib/active_record_encryption/type.rb
|
191
|
+
- lib/active_record_encryption/type/binary.rb
|
192
192
|
- lib/active_record_encryption/version.rb
|
193
193
|
homepage: https://github.com/alpaca-tc/active_record_encryption
|
194
194
|
licenses:
|
@@ -202,14 +202,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
202
202
|
requirements:
|
203
203
|
- - ">="
|
204
204
|
- !ruby/object:Gem::Version
|
205
|
-
version:
|
205
|
+
version: 3.1.0
|
206
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
207
|
requirements:
|
208
208
|
- - ">="
|
209
209
|
- !ruby/object:Gem::Version
|
210
210
|
version: '0'
|
211
211
|
requirements: []
|
212
|
-
rubygems_version: 3.
|
212
|
+
rubygems_version: 3.5.18
|
213
213
|
signing_key:
|
214
214
|
specification_version: 4
|
215
215
|
summary: Transparent ActiveRecord encryption
|
@@ -1,43 +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
|
-
if ActiveRecord.gem_version < Gem::Version.create('6.0')
|
19
|
-
# https://github.com/rails/rails/commit/a741208f80dd33420a56486bd9ed2b0b9862234a
|
20
|
-
refine ActiveModel::Type::Decimal do
|
21
|
-
def serialize(value)
|
22
|
-
cast(value)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# https://github.com/rails/rails/commit/34cc301f03aea2e579d6687a9ea9782afc1089a0
|
27
|
-
refine ActiveModel::Type::Boolean do
|
28
|
-
def serialize(value)
|
29
|
-
cast(value)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# Backport Rails5.2
|
35
|
-
if ActiveRecord.gem_version < Gem::Version.create('5.2')
|
36
|
-
refine ActiveModel::Type::DateTime do
|
37
|
-
def serialize(value)
|
38
|
-
super(cast(value))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|