yattr_encrypted 0.1.5 → 0.1.6
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.
- data/README.mdown +18 -8
- data/lib/yattr_encrypted.rb +16 -4
- data/lib/yattr_encrypted/version.rb +1 -1
- data/test/yattr_encrypted_test.rb +16 -1
- metadata +5 -5
data/README.mdown
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# YattrEncrypted #
|
2
2
|
|
3
|
-
Version: 0.1.
|
3
|
+
Version: 0.1.6 (but you should check lib/yattr_encrypted/version.rb to be sure)
|
4
4
|
|
5
5
|
## Applicability ##
|
6
6
|
|
@@ -53,6 +53,9 @@ random *iv* and including it in the encrypted data. See *openssl* documentation
|
|
53
53
|
for details [OpenSSL::Cipher]
|
54
54
|
* detects when fields are modified by actions other than assignment. This supports
|
55
55
|
encrypting complex types - such as hashes and arrays. This is implemented by adding
|
56
|
+
* supports special field processing and initialization by use of `:read_filter` and
|
57
|
+
`:write_filter` options which define Proc's or methods which are run on during
|
58
|
+
read and write accessors for plaintext versions of the encrypted fields.
|
56
59
|
a `before_save` calleback to the private method *yattr_update_encrypted_values*
|
57
60
|
* Rails 3.1 & Rails 3.2 - doesn't pretend to support anything lower (but it might work)
|
58
61
|
|
@@ -131,24 +134,31 @@ and 'this is a very long secret key' is not.
|
|
131
134
|
|
132
135
|
If you supply your own key, it can be a String or a Proc which returns a String.
|
133
136
|
|
134
|
-
### Special Attribute Processing ###
|
137
|
+
### Special Attribute Processing: read\_filter and write\_filter ###
|
135
138
|
|
136
139
|
Special processing for attribute values can be implemented by using the `:read_filter` and
|
137
140
|
`:write_filter` options of the `yattr_encrypted` macro.
|
138
141
|
|
139
|
-
|
140
|
-
|
142
|
+
Both options take *either* a Proc, lambda, or instance method name. In both cases, the callable
|
143
|
+
must take a single argument. The argument will be the plaintext value of the field or value
|
144
|
+
being assigned.
|
145
|
+
|
146
|
+
A `:read_filter` is called on the value of the *attribute* before being returned by the
|
147
|
+
clear text attribute accessor. The processed value is saved in the instance variable
|
148
|
+
used to support the plaintext version of the *attribute*.
|
141
149
|
|
142
150
|
**NOTE:** The read filter is called every time the *attribute* is read via the attribute
|
143
|
-
reader. It should be idempotent in the sense that
|
151
|
+
reader. It should be idempotent in the sense that:
|
152
|
+
|
153
|
+
read_filter(attribute) == read_filter(read_filter(attribute)).
|
144
154
|
|
145
|
-
**NOTE:**
|
146
|
-
plain text version of the *attribute*,
|
155
|
+
**NOTE:** Because the read filter result is saved in the instance variable which supports the
|
156
|
+
plain text version of the *attribute*, it can be used to set the *attribute* to a default
|
147
157
|
value - such as an empty Hash.
|
148
158
|
|
149
159
|
yattr_encrypted :bag, :read_filter => lambda { |val| val.is_a?(Hash) ? val : {} }
|
150
160
|
|
151
|
-
A `:write_filter` is a proc
|
161
|
+
A `:write_filter` is a proc, lambda, or instance method which accepts a single argument. It is called
|
152
162
|
on the value passed to the *attribute* writer prior to any other action in the writer.
|
153
163
|
|
154
164
|
**NOTE:** the write filter is called on every value which is assigned to the *attribute*.
|
data/lib/yattr_encrypted.rb
CHANGED
@@ -73,7 +73,7 @@ module YattrEncrypted
|
|
73
73
|
|
74
74
|
# collect existing instance methods
|
75
75
|
instance_methods_as_symbols = instance_methods.map { |method| method.to_sym }
|
76
|
-
|
76
|
+
|
77
77
|
# iterate through attributes and create accessors, verify encryped accessors exist
|
78
78
|
attributes.map { |x| x.to_sym }.each do |attribute|
|
79
79
|
encrypted_attribute_name = [options[:prefix], attribute, options[:suffix]].join.to_sym
|
@@ -91,11 +91,19 @@ module YattrEncrypted
|
|
91
91
|
@#{attribute} = #{encrypted_attribute_name} ? \
|
92
92
|
yate_decrypt(#{encrypted_attribute_name}, options[:key]) : \
|
93
93
|
''
|
94
|
-
|
94
|
+
if options[:read_filter].respond_to? :call
|
95
|
+
@#{attribute} = options[:read_filter].call(@#{attribute})
|
96
|
+
elsif options[:read_filter]
|
97
|
+
@#{attribute} = self.send options[:read_filter].to_sym, @#{attribute}
|
98
|
+
end
|
95
99
|
self.yate_checksums[:#{attribute}] = yate_attribute_hash_value(:#{attribute})
|
96
100
|
self.yate_dirty[:#{attribute}] = true
|
97
101
|
elsif options[:read_filter]
|
98
|
-
|
102
|
+
if options[:read_filter].respond_to? :call
|
103
|
+
@#{attribute} = options[:read_filter].call(@#{attribute})
|
104
|
+
else
|
105
|
+
@#{attribute} = self.send options[:read_filter].to_sym, @#{attribute}
|
106
|
+
end
|
99
107
|
end
|
100
108
|
@#{attribute}
|
101
109
|
end
|
@@ -105,7 +113,11 @@ module YattrEncrypted
|
|
105
113
|
tmp =<<-XXX
|
106
114
|
def #{attribute}= value
|
107
115
|
options = yate_encrypted_attributes[:#{attribute}]
|
108
|
-
|
116
|
+
if options[:write_filter].respond_to? :call
|
117
|
+
value = options[:write_filter].call(value)
|
118
|
+
elsif options[:write_filter]
|
119
|
+
value = self.send options[:write_filter], value
|
120
|
+
end
|
109
121
|
@#{attribute} = value
|
110
122
|
self.#{encrypted_attribute_name} = yate_encrypt(value, options[:key])
|
111
123
|
self.yate_checksums[:#{attribute}] = yate_attribute_hash_value(:#{attribute})
|
@@ -35,12 +35,19 @@ module ActiveRecord
|
|
35
35
|
end
|
36
36
|
|
37
37
|
class SomeClass < ActiveRecord::Base
|
38
|
-
attr_accessor :field_encrypted, :special_reader_encrypted, :special_writer_encrypted
|
38
|
+
attr_accessor :field_encrypted, :special_reader_encrypted, :special_writer_encrypted,
|
39
|
+
:method_filtered_encrypted
|
39
40
|
yattr_encrypted :field, :key => 'a honkin big key: honk honk honk honk honk'
|
40
41
|
yattr_encrypted :special_reader, :key => 'a honkin big key: honk honk honk honk honk',
|
41
42
|
:read_filter => lambda { |val| val.strip }
|
42
43
|
yattr_encrypted :special_writer, :key => 'a honkin big key: honk honk honk honk honk',
|
43
44
|
:write_filter => lambda { |val| val.upcase }
|
45
|
+
yattr_encrypted :method_filtered, :key => 'a honkin big key: honk honk honk honk honk',
|
46
|
+
:read_filter => 'foo'
|
47
|
+
|
48
|
+
def foo attr
|
49
|
+
'foo filtered'
|
50
|
+
end
|
44
51
|
end
|
45
52
|
|
46
53
|
class TestYattrEncrypted < MiniTest::Unit::TestCase
|
@@ -94,4 +101,12 @@ class TestYattrEncrypted < MiniTest::Unit::TestCase
|
|
94
101
|
"@special_writer should be upcased"
|
95
102
|
assert_equal value.upcase, @sc.special_writer, "@sc.special_writer should be upcased"
|
96
103
|
end
|
104
|
+
|
105
|
+
def test_method_filtered
|
106
|
+
value = 'a string with leading and trailing white space'
|
107
|
+
@sc.method_filtered = value
|
108
|
+
assert_equal value, @sc.instance_variable_get(:@method_filtered),
|
109
|
+
"@method_filtered should be '#{value}'"
|
110
|
+
assert_equal 'foo filtered', @sc.method_filtered, "@sc.method_filtered should be 'foo filtered"
|
111
|
+
end
|
97
112
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yattr_encrypted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-03-
|
12
|
+
date: 2012-03-20 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pry
|
16
|
-
requirement: &
|
16
|
+
requirement: &2157537060 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *2157537060
|
25
25
|
description: Generates yattr_accessors that encrypt and decrypt attributes transparently.
|
26
26
|
Based on attr_encrypted by Sean Huber [https://github.com/shuber]
|
27
27
|
email: mike@clove.com
|
@@ -56,7 +56,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
56
56
|
version: '0'
|
57
57
|
segments:
|
58
58
|
- 0
|
59
|
-
hash:
|
59
|
+
hash: -1485568723198089794
|
60
60
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|