attr_encrypted 1.4.0 → 3.0.3
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
- checksums.yaml.gz.sig +0 -0
- data/.gitignore +6 -0
- data/.travis.yml +31 -0
- data/CHANGELOG.md +87 -0
- data/Gemfile +3 -0
- data/README.md +444 -0
- data/Rakefile +3 -15
- data/attr_encrypted.gemspec +63 -0
- data/certs/saghaulor.pem +21 -0
- data/checksum/attr_encrypted-3.0.0.gem.sha256 +1 -0
- data/checksum/attr_encrypted-3.0.0.gem.sha512 +1 -0
- data/checksum/attr_encrypted-3.0.1.gem.sha256 +1 -0
- data/checksum/attr_encrypted-3.0.1.gem.sha512 +1 -0
- data/checksum/attr_encrypted-3.0.2.gem.sha256 +1 -0
- data/checksum/attr_encrypted-3.0.2.gem.sha512 +1 -0
- data/lib/attr_encrypted/adapters/active_record.rb +38 -19
- data/lib/attr_encrypted/adapters/data_mapper.rb +1 -0
- data/lib/attr_encrypted/adapters/sequel.rb +1 -0
- data/lib/attr_encrypted/version.rb +3 -3
- data/lib/attr_encrypted.rb +198 -115
- data/test/active_record_test.rb +145 -88
- data/test/attr_encrypted_test.rb +101 -39
- data/test/compatibility_test.rb +37 -56
- data/test/data_mapper_test.rb +1 -1
- data/test/legacy_active_record_test.rb +17 -15
- data/test/legacy_attr_encrypted_test.rb +17 -16
- data/test/legacy_compatibility_test.rb +33 -44
- data/test/legacy_data_mapper_test.rb +6 -3
- data/test/legacy_sequel_test.rb +8 -4
- data/test/run.sh +12 -52
- data/test/sequel_test.rb +1 -1
- data/test/test_helper.rb +27 -17
- data.tar.gz.sig +0 -0
- metadata +75 -29
- metadata.gz.sig +0 -0
- data/README.rdoc +0 -344
data/certs/saghaulor.pem
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDdDCCAlygAwIBAgIBATANBgkqhkiG9w0BAQUFADBAMRIwEAYDVQQDDAlzYWdo
|
3
|
+
YXVsb3IxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
|
4
|
+
bTAeFw0xNjAxMTEyMjQyMDFaFw0xNzAxMTAyMjQyMDFaMEAxEjAQBgNVBAMMCXNh
|
5
|
+
Z2hhdWxvcjEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYD
|
6
|
+
Y29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx0xdQYk2GwCpQ1n/
|
7
|
+
n2mPVYHLYqU5TAn/82t5kbqBUWjbcj8tHAi41tJ19+fT/hH0dog8JHvho1zmOr71
|
8
|
+
ZIqreJQo60TqP6oE9a5HncUpjqbRp7tOmHo9E+mOW1yT4NiXqFf1YINExQKy2XND
|
9
|
+
WPQ+T50ZNUsGMfHFWB4NAymejRWXlOEY3bvKW0UHFeNmouP5he51TjoP8uCc9536
|
10
|
+
4AIWVP/zzzjwrFtC7av7nRw4Y+gX2bQjrkK2k2JS0ejiGzKBIEMJejcI2B+t79zT
|
11
|
+
kUQq9SFwp2BrKSIy+4kh4CiF20RT/Hfc1MbvTxSIl/bbIxCYEOhmtHExHi0CoCWs
|
12
|
+
YCGCXQIDAQABo3kwdzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU
|
13
|
+
SCpVzSBvYbO6B3oT3n3RCZmurG8wHgYDVR0RBBcwFYETc2FnaGF1bG9yQGdtYWls
|
14
|
+
LmNvbTAeBgNVHRIEFzAVgRNzYWdoYXVsb3JAZ21haWwuY29tMA0GCSqGSIb3DQEB
|
15
|
+
BQUAA4IBAQAeiGdC3e0WiZpm0cF/b7JC6hJYXC9Yv9VsRAWD9ROsLjFKwOhmonnc
|
16
|
+
+l/QrmoTjMakYXBCai/Ca3L+k5eRrKilgyITILsmmFxK8sqPJXUw2Jmwk/dAky6x
|
17
|
+
hHKVZAofT1OrOOPJ2USoZyhR/VI8epLaD5wUmkVDNqtZWviW+dtRa55aPYjRw5Pj
|
18
|
+
wuj9nybhZr+BbEbmZE//2nbfkM4hCuMtxxxilPrJ22aYNmeWU0wsPpDyhPYxOUgU
|
19
|
+
ZjeLmnSDiwL6doiP5IiwALH/dcHU67ck3NGf6XyqNwQrrmtPY0mv1WVVL4Uh+vYE
|
20
|
+
kHoFzE2no0BfBg78Re8fY69P5yES5ncC
|
21
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1 @@
|
|
1
|
+
845fc3cb09a19c3ac76192aba443788f92c880744617bca99b16fd31ce843e07
|
@@ -0,0 +1 @@
|
|
1
|
+
81a065442258cc3702aab62c7b2307a48ed3e0deb803600d11a7480cce0db7c43fd9929acd2755081042f8989236553fd694b6cb62776bbfc53f9165a22cbca1
|
@@ -0,0 +1 @@
|
|
1
|
+
33140af4b223177db7a19efb2fa38472a299a745b29ca1c5ba9d3fa947390b77
|
@@ -0,0 +1 @@
|
|
1
|
+
0c467cab98b9b2eb331f9818323a90ae01392d6cb03cf1f32faccc954d0fc54be65f0fc7bf751b0fce57925eef1c9e2af90181bc40d81ad93e21d15a001c53c6
|
@@ -0,0 +1 @@
|
|
1
|
+
c1256b459336d4a2012a0d0c70ce5cd3dac46acb5e78da6f77f6f104cb1e8b7b
|
@@ -0,0 +1 @@
|
|
1
|
+
dca0c8a729974c0e26fde4cd4216c7d0f66d9eca9f6cf0ccca64999f5180a00bf7c05b630c1d420ec1673141a2923946e8bd28b12e711faf64a4cd42c7a3ac9e
|
@@ -6,21 +6,20 @@ if defined?(ActiveRecord::Base)
|
|
6
6
|
base.class_eval do
|
7
7
|
|
8
8
|
# https://github.com/attr-encrypted/attr_encrypted/issues/68
|
9
|
-
|
9
|
+
alias_method :reload_without_attr_encrypted, :reload
|
10
|
+
def reload(*args, &block)
|
10
11
|
result = reload_without_attr_encrypted(*args, &block)
|
11
12
|
self.class.encrypted_attributes.keys.each do |attribute_name|
|
12
13
|
instance_variable_set("@#{attribute_name}", nil)
|
13
14
|
end
|
14
15
|
result
|
15
16
|
end
|
16
|
-
alias_method_chain :reload, :attr_encrypted
|
17
17
|
|
18
18
|
attr_encrypted_options[:encode] = true
|
19
19
|
|
20
20
|
class << self
|
21
|
-
alias_method :
|
22
|
-
|
23
|
-
alias_method :undefine_attribute_methods, :reset_column_information if ::ActiveRecord::VERSION::STRING < "3"
|
21
|
+
alias_method :method_missing_without_attr_encrypted, :method_missing
|
22
|
+
alias_method :method_missing, :method_missing_with_attr_encrypted
|
24
23
|
end
|
25
24
|
|
26
25
|
def perform_attribute_assignment(method, new_attributes, *args)
|
@@ -31,17 +30,17 @@ if defined?(ActiveRecord::Base)
|
|
31
30
|
end
|
32
31
|
private :perform_attribute_assignment
|
33
32
|
|
34
|
-
if ::ActiveRecord::VERSION::STRING
|
35
|
-
|
33
|
+
if ::ActiveRecord::VERSION::STRING > "3.1"
|
34
|
+
alias_method :assign_attributes_without_attr_encrypted, :assign_attributes
|
35
|
+
def assign_attributes(*args)
|
36
36
|
perform_attribute_assignment :assign_attributes_without_attr_encrypted, *args
|
37
37
|
end
|
38
|
-
alias_method_chain :assign_attributes, :attr_encrypted
|
39
38
|
end
|
40
39
|
|
41
|
-
|
40
|
+
alias_method :attributes_without_attr_encrypted=, :attributes=
|
41
|
+
def attributes=(*args)
|
42
42
|
perform_attribute_assignment :attributes_without_attr_encrypted=, *args
|
43
43
|
end
|
44
|
-
alias_method_chain :attributes=, :attr_encrypted
|
45
44
|
end
|
46
45
|
end
|
47
46
|
|
@@ -54,14 +53,32 @@ if defined?(ActiveRecord::Base)
|
|
54
53
|
attr = attrs.pop
|
55
54
|
options.merge! encrypted_attributes[attr]
|
56
55
|
|
57
|
-
define_method("#{attr}
|
58
|
-
|
56
|
+
define_method("#{attr}_was") do
|
57
|
+
attribute_was(attr)
|
59
58
|
end
|
60
59
|
|
61
|
-
|
62
|
-
|
60
|
+
if ::ActiveRecord::VERSION::STRING >= "4.1"
|
61
|
+
define_method("#{attr}_changed?") do |options = {}|
|
62
|
+
attribute_changed?(attr, options)
|
63
|
+
end
|
64
|
+
else
|
65
|
+
define_method("#{attr}_changed?") do
|
66
|
+
attribute_changed?(attr)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
define_method("#{attr}_change") do
|
71
|
+
attribute_change(attr)
|
72
|
+
end
|
73
|
+
|
74
|
+
define_method("#{attr}_with_dirtiness=") do |value|
|
75
|
+
attribute_will_change!(attr) if value != __send__(attr)
|
76
|
+
__send__("#{attr}_without_dirtiness=", value)
|
63
77
|
end
|
64
78
|
|
79
|
+
alias_method "#{attr}_without_dirtiness=", "#{attr}="
|
80
|
+
alias_method "#{attr}=", "#{attr}_with_dirtiness="
|
81
|
+
|
65
82
|
alias_method "#{attr}_before_type_cast", attr
|
66
83
|
end
|
67
84
|
|
@@ -69,10 +86,10 @@ if defined?(ActiveRecord::Base)
|
|
69
86
|
# We add accessor methods of the db columns to the list of instance
|
70
87
|
# methods returned to let ActiveRecord define the accessor methods
|
71
88
|
# for the db columns
|
72
|
-
|
89
|
+
|
73
90
|
# Use with_connection so the connection doesn't stay pinned to the thread.
|
74
91
|
connected = ::ActiveRecord::Base.connection_pool.with_connection(&:active?) rescue false
|
75
|
-
|
92
|
+
|
76
93
|
if connected && table_exists?
|
77
94
|
columns_hash.keys.inject(super) {|instance_methods, column_name| instance_methods.concat [column_name.to_sym, :"#{column_name}="]}
|
78
95
|
else
|
@@ -85,13 +102,13 @@ if defined?(ActiveRecord::Base)
|
|
85
102
|
#
|
86
103
|
# NOTE: This only works when the <tt>:key</tt> option is specified as a string (see the README)
|
87
104
|
#
|
88
|
-
# This is useful for encrypting fields like email addresses. Your user's email addresses
|
105
|
+
# This is useful for encrypting fields like email addresses. Your user's email addresses
|
89
106
|
# are encrypted in the database, but you can still look up a user by email for logging in
|
90
107
|
#
|
91
108
|
# Example
|
92
109
|
#
|
93
110
|
# class User < ActiveRecord::Base
|
94
|
-
# attr_encrypted :email, :
|
111
|
+
# attr_encrypted :email, key: 'secret key'
|
95
112
|
# end
|
96
113
|
#
|
97
114
|
# User.find_by_email_and_password('test@example.com', 'testing')
|
@@ -101,8 +118,9 @@ if defined?(ActiveRecord::Base)
|
|
101
118
|
if match = /^(find|scoped)_(all_by|by)_([_a-zA-Z]\w*)$/.match(method.to_s)
|
102
119
|
attribute_names = match.captures.last.split('_and_')
|
103
120
|
attribute_names.each_with_index do |attribute, index|
|
104
|
-
if attr_encrypted?(attribute)
|
121
|
+
if attr_encrypted?(attribute) && encrypted_attributes[attribute.to_sym][:mode] == :single_iv_and_salt
|
105
122
|
args[index] = send("encrypt_#{attribute}", args[index])
|
123
|
+
warn "DEPRECATION WARNING: This feature will be removed in the next major release."
|
106
124
|
attribute_names[index] = encrypted_attributes[attribute.to_sym][:attribute]
|
107
125
|
end
|
108
126
|
end
|
@@ -114,5 +132,6 @@ if defined?(ActiveRecord::Base)
|
|
114
132
|
end
|
115
133
|
end
|
116
134
|
|
135
|
+
ActiveRecord::Base.extend AttrEncrypted
|
117
136
|
ActiveRecord::Base.extend AttrEncrypted::Adapters::ActiveRecord
|
118
137
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module AttrEncrypted
|
2
2
|
# Contains information about this gem's version
|
3
3
|
module Version
|
4
|
-
MAJOR =
|
5
|
-
MINOR =
|
6
|
-
PATCH =
|
4
|
+
MAJOR = 3
|
5
|
+
MINOR = 0
|
6
|
+
PATCH = 3
|
7
7
|
|
8
8
|
# Returns a version string by joining <tt>MAJOR</tt>, <tt>MINOR</tt>, and <tt>PATCH</tt> with <tt>'.'</tt>
|
9
9
|
#
|