attr_encrypted 1.3.1 → 1.3.2
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/lib/attr_encrypted.rb +26 -27
- data/lib/attr_encrypted/adapters/active_record.rb +13 -12
- data/lib/attr_encrypted/version.rb +1 -1
- data/test/active_record_test.rb +84 -1
- data/test/attr_encrypted_test.rb +39 -0
- data/test/run.sh +52 -0
- data/test/test_helper.rb +1 -1
- metadata +166 -156
data/lib/attr_encrypted.rb
CHANGED
@@ -124,34 +124,26 @@ module AttrEncrypted
|
|
124
124
|
|
125
125
|
attributes.each do |attribute|
|
126
126
|
encrypted_attribute_name = (options[:attribute] ? options[:attribute] : [options[:prefix], attribute, options[:suffix]].join).to_sym
|
127
|
+
iv_name = "#{encrypted_attribute_name}_iv".to_sym
|
128
|
+
salt_name = "#{encrypted_attribute_name}_salt".to_sym
|
127
129
|
|
128
130
|
instance_methods_as_symbols = instance_methods.collect { |method| method.to_sym }
|
129
131
|
attr_reader encrypted_attribute_name unless instance_methods_as_symbols.include?(encrypted_attribute_name)
|
130
132
|
attr_writer encrypted_attribute_name unless instance_methods_as_symbols.include?(:"#{encrypted_attribute_name}=")
|
131
133
|
|
132
134
|
if options[:mode] == :per_attribute_iv_and_salt
|
133
|
-
attr_reader
|
134
|
-
attr_writer
|
135
|
+
attr_reader iv_name unless instance_methods_as_symbols.include?(iv_name)
|
136
|
+
attr_writer iv_name unless instance_methods_as_symbols.include?(:"#{iv_name}=")
|
135
137
|
|
136
|
-
attr_reader
|
137
|
-
attr_writer
|
138
|
+
attr_reader salt_name unless instance_methods_as_symbols.include?(salt_name)
|
139
|
+
attr_writer salt_name unless instance_methods_as_symbols.include?(:"#{salt_name}=")
|
138
140
|
end
|
139
141
|
|
140
142
|
define_method(attribute) do
|
141
|
-
if options[:mode] == :per_attribute_iv_and_salt
|
142
|
-
load_iv_for_attribute(attribute,encrypted_attribute_name, options[:algorithm])
|
143
|
-
load_salt_for_attribute(attribute,encrypted_attribute_name)
|
144
|
-
end
|
145
|
-
|
146
143
|
instance_variable_get("@#{attribute}") || instance_variable_set("@#{attribute}", decrypt(attribute, send(encrypted_attribute_name)))
|
147
144
|
end
|
148
145
|
|
149
146
|
define_method("#{attribute}=") do |value|
|
150
|
-
if options[:mode] == :per_attribute_iv_and_salt
|
151
|
-
load_iv_for_attribute(attribute, encrypted_attribute_name, options[:algorithm])
|
152
|
-
load_salt_for_attribute(attribute, encrypted_attribute_name)
|
153
|
-
end
|
154
|
-
|
155
147
|
send("#{encrypted_attribute_name}=", encrypt(attribute, value))
|
156
148
|
instance_variable_set("@#{attribute}", value)
|
157
149
|
end
|
@@ -310,7 +302,12 @@ module AttrEncrypted
|
|
310
302
|
|
311
303
|
# Returns attr_encrypted options evaluated in the current object's scope for the attribute specified
|
312
304
|
def evaluated_attr_encrypted_options_for(attribute)
|
313
|
-
self.class.encrypted_attributes[attribute.to_sym]
|
305
|
+
if self.class.encrypted_attributes[attribute.to_sym][:mode] == :per_attribute_iv_and_salt
|
306
|
+
load_iv_for_attribute(attribute, self.class.encrypted_attributes[attribute.to_sym][:algorithm])
|
307
|
+
load_salt_for_attribute(attribute)
|
308
|
+
end
|
309
|
+
|
310
|
+
self.class.encrypted_attributes[attribute.to_sym].inject({}) { |hash, (option, value)| hash[option] = evaluate_attr_encrypted_option(value); hash }
|
314
311
|
end
|
315
312
|
|
316
313
|
# Evaluates symbol (method reference) or proc (responds to call) options
|
@@ -326,22 +323,24 @@ module AttrEncrypted
|
|
326
323
|
end
|
327
324
|
end
|
328
325
|
|
329
|
-
def load_iv_for_attribute
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
326
|
+
def load_iv_for_attribute(attribute, algorithm)
|
327
|
+
encrypted_attribute_name = self.class.encrypted_attributes[attribute.to_sym][:attribute]
|
328
|
+
iv = send("#{encrypted_attribute_name}_iv")
|
329
|
+
if(iv == nil)
|
330
|
+
begin
|
331
|
+
algorithm = algorithm || "aes-256-cbc"
|
332
|
+
algo = OpenSSL::Cipher::Cipher.new(algorithm)
|
333
|
+
iv = [algo.random_iv].pack("m")
|
334
|
+
send("#{encrypted_attribute_name}_iv=", iv)
|
335
|
+
rescue RuntimeError
|
339
336
|
end
|
337
|
+
end
|
340
338
|
self.class.encrypted_attributes[attribute.to_sym] = self.class.encrypted_attributes[attribute.to_sym].merge(:iv => iv.unpack("m").first) if (iv && !iv.empty?)
|
341
339
|
end
|
342
340
|
|
343
|
-
def load_salt_for_attribute(attribute
|
344
|
-
|
341
|
+
def load_salt_for_attribute(attribute)
|
342
|
+
encrypted_attribute_name = self.class.encrypted_attributes[attribute.to_sym][:attribute]
|
343
|
+
salt = send("#{encrypted_attribute_name}_salt") || send("#{encrypted_attribute_name}_salt=", Digest::SHA256.hexdigest((Time.now.to_i * rand(1000)).to_s)[0..15])
|
345
344
|
self.class.encrypted_attributes[attribute.to_sym] = self.class.encrypted_attributes[attribute.to_sym].merge(:salt => salt)
|
346
345
|
end
|
347
346
|
end
|
@@ -7,25 +7,26 @@ if defined?(ActiveRecord::Base)
|
|
7
7
|
attr_encrypted_options[:encode] = true
|
8
8
|
class << self
|
9
9
|
alias_method_chain :method_missing, :attr_encrypted
|
10
|
-
if ::ActiveRecord::VERSION::STRING < "3"
|
11
|
-
|
12
|
-
|
10
|
+
alias_method :undefine_attribute_methods, :reset_column_information if ::ActiveRecord::VERSION::STRING < "3"
|
11
|
+
end
|
12
|
+
|
13
|
+
def perform_attribute_assignment(method, new_attributes, *args)
|
14
|
+
return if new_attributes.blank?
|
15
|
+
attributes = new_attributes.respond_to?(:with_indifferent_access) ? new_attributes.with_indifferent_access : new_attributes.symbolize_keys
|
16
|
+
encrypted_attributes = self.class.encrypted_attributes.keys
|
17
|
+
self.send method, attributes.except(*encrypted_attributes), *args
|
18
|
+
self.send method, attributes.slice(*encrypted_attributes), *args
|
13
19
|
end
|
20
|
+
private :perform_attribute_assignment
|
14
21
|
|
15
22
|
if ::ActiveRecord::VERSION::STRING < "3.0" || ::ActiveRecord::VERSION::STRING > "3.1"
|
16
23
|
def assign_attributes_with_attr_encrypted(*args)
|
17
|
-
|
18
|
-
encrypted_attributes = self.class.encrypted_attributes.keys
|
19
|
-
assign_attributes_without_attr_encrypted attributes.except(*encrypted_attributes), *args
|
20
|
-
assign_attributes_without_attr_encrypted attributes.slice(*encrypted_attributes), *args
|
24
|
+
perform_attribute_assignment :assign_attributes_without_attr_encrypted, *args
|
21
25
|
end
|
22
26
|
alias_method_chain :assign_attributes, :attr_encrypted
|
23
27
|
else
|
24
|
-
def attributes_with_attr_encrypted=(
|
25
|
-
|
26
|
-
encrypted_attributes = self.class.encrypted_attributes.keys
|
27
|
-
self.attributes_without_attr_encrypted = attributes.except(*encrypted_attributes)
|
28
|
-
self.attributes_without_attr_encrypted = attributes.slice(*encrypted_attributes)
|
28
|
+
def attributes_with_attr_encrypted=(*args)
|
29
|
+
perform_attribute_assignment :attributes_without_attr_encrypted=, *args
|
29
30
|
end
|
30
31
|
alias_method_chain :attributes=, :attr_encrypted
|
31
32
|
end
|
data/test/active_record_test.rb
CHANGED
@@ -10,7 +10,7 @@ def create_tables
|
|
10
10
|
t.string :password
|
11
11
|
t.string :encrypted_credentials
|
12
12
|
t.binary :salt
|
13
|
-
|
13
|
+
t.string :encrypted_email_salt
|
14
14
|
t.string :encrypted_credentials_salt
|
15
15
|
t.string :encrypted_email_iv
|
16
16
|
t.string :encrypted_credentials_iv
|
@@ -20,6 +20,11 @@ def create_tables
|
|
20
20
|
t.string :encrypted_password_iv
|
21
21
|
t.string :encrypted_password_salt
|
22
22
|
end
|
23
|
+
create_table :users do |t|
|
24
|
+
t.string :login
|
25
|
+
t.string :encrypted_password
|
26
|
+
t.boolean :is_admin
|
27
|
+
end
|
23
28
|
end
|
24
29
|
end
|
25
30
|
end
|
@@ -28,6 +33,17 @@ end
|
|
28
33
|
create_tables
|
29
34
|
|
30
35
|
ActiveRecord::MissingAttributeError = ActiveModel::MissingAttributeError unless defined?(ActiveRecord::MissingAttributeError)
|
36
|
+
ActiveRecord::Base.logger = Logger.new(nil) if ::ActiveRecord::VERSION::STRING < "3.0"
|
37
|
+
|
38
|
+
if ::ActiveRecord::VERSION::STRING > "4.0"
|
39
|
+
module Rack
|
40
|
+
module Test
|
41
|
+
class UploadedFile; end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
require 'action_controller/metal/strong_parameters'
|
46
|
+
end
|
31
47
|
|
32
48
|
class Person < ActiveRecord::Base
|
33
49
|
self.attr_encrypted_options[:mode] = :per_attribute_iv_and_salt
|
@@ -65,6 +81,12 @@ class PersonWithSerialization < ActiveRecord::Base
|
|
65
81
|
serialize :password
|
66
82
|
end
|
67
83
|
|
84
|
+
class UserWithProtectedAttribute < ActiveRecord::Base
|
85
|
+
self.table_name = 'users'
|
86
|
+
attr_encrypted :password, :key => 'a secret key'
|
87
|
+
attr_protected :is_admin if ::ActiveRecord::VERSION::STRING < "4.0"
|
88
|
+
end
|
89
|
+
|
68
90
|
class ActiveRecordTest < Test::Unit::TestCase
|
69
91
|
|
70
92
|
def setup
|
@@ -114,4 +136,65 @@ class ActiveRecordTest < Test::Unit::TestCase
|
|
114
136
|
Account.create!(:key => SECRET_KEY, :password => "password")
|
115
137
|
Account.create!(:password => "password" , :key => SECRET_KEY)
|
116
138
|
end
|
139
|
+
|
140
|
+
if ::ActiveRecord::VERSION::STRING > "4.0"
|
141
|
+
def test_should_assign_attributes
|
142
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
143
|
+
@user.attributes = ActionController::Parameters.new(:login => 'modified', :is_admin => true).permit(:login)
|
144
|
+
assert_equal 'modified', @user.login
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_should_not_assign_protected_attributes
|
148
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
149
|
+
@user.attributes = ActionController::Parameters.new(:login => 'modified', :is_admin => true).permit(:login)
|
150
|
+
assert !@user.is_admin?
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_should_raise_exception_if_not_permitted
|
154
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
155
|
+
assert_raise ActiveModel::ForbiddenAttributesError do
|
156
|
+
@user.attributes = ActionController::Parameters.new(:login => 'modified', :is_admin => true)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_should_raise_exception_on_init_if_not_permitted
|
161
|
+
assert_raise ActiveModel::ForbiddenAttributesError do
|
162
|
+
@user = UserWithProtectedAttribute.new ActionController::Parameters.new(:login => 'modified', :is_admin => true)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
else
|
166
|
+
def test_should_assign_attributes
|
167
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
168
|
+
@user.attributes = {:login => 'modified', :is_admin => true}
|
169
|
+
assert_equal 'modified', @user.login
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_should_not_assign_protected_attributes
|
173
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
174
|
+
@user.attributes = {:login => 'modified', :is_admin => true}
|
175
|
+
assert !@user.is_admin?
|
176
|
+
end
|
177
|
+
|
178
|
+
def test_should_assign_protected_attributes
|
179
|
+
@user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
|
180
|
+
if ::ActiveRecord::VERSION::STRING > "3.1"
|
181
|
+
@user.send :assign_attributes, {:login => 'modified', :is_admin => true}, :without_protection => true
|
182
|
+
else
|
183
|
+
@user.send :attributes=, {:login => 'modified', :is_admin => true}, false
|
184
|
+
end
|
185
|
+
assert @user.is_admin?
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_should_allow_assignment_of_nil_attributes
|
190
|
+
@person = Person.new
|
191
|
+
assert_nil(@person.attributes = nil)
|
192
|
+
end
|
193
|
+
|
194
|
+
if ::ActiveRecord::VERSION::STRING > "3.1"
|
195
|
+
def test_should_allow_assign_attributes_with_nil
|
196
|
+
@person = Person.new
|
197
|
+
assert_nil(@person.assign_attributes nil)
|
198
|
+
end
|
199
|
+
end
|
117
200
|
end
|
data/test/attr_encrypted_test.rb
CHANGED
@@ -289,4 +289,43 @@ class AttrEncryptedTest < Test::Unit::TestCase
|
|
289
289
|
assert @user.email?
|
290
290
|
end
|
291
291
|
|
292
|
+
def test_should_vary_iv_per_attribute
|
293
|
+
@user = User.new
|
294
|
+
@user.email = 'email@example.com'
|
295
|
+
@user.password = 'p455w0rd'
|
296
|
+
assert_not_equal @user.encrypted_email_iv, @user.crypted_password_test_iv
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_should_vary_iv_per_instance
|
300
|
+
@user1 = User.new
|
301
|
+
@user1.email = 'email@example.com'
|
302
|
+
@user2 = User.new
|
303
|
+
@user2.email = 'email@example.com'
|
304
|
+
assert_not_equal @user1.encrypted_email_iv, @user2.encrypted_email_iv
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_should_vary_salt_per_attribute
|
308
|
+
@user = User.new
|
309
|
+
@user.email = 'email@example.com'
|
310
|
+
@user.password = 'p455w0rd'
|
311
|
+
assert_not_equal @user.encrypted_email_salt, @user.crypted_password_test_salt
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_should_vary_salt_per_instance
|
315
|
+
@user1 = User.new
|
316
|
+
@user1.email = 'email@example.com'
|
317
|
+
@user2 = User.new
|
318
|
+
@user2.email = 'email@example.com'
|
319
|
+
assert_not_equal @user1.encrypted_email_salt, @user2.encrypted_email_salt
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_should_decrypt_second_record
|
323
|
+
@user1 = User.new
|
324
|
+
@user1.email = 'test@example.com'
|
325
|
+
|
326
|
+
@user2 = User.new
|
327
|
+
@user2.email = 'test@example.com'
|
328
|
+
|
329
|
+
assert_equal 'test@example.com', @user1.decrypt(:email, @user1.encrypted_email)
|
330
|
+
end
|
292
331
|
end
|
data/test/run.sh
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
#!/bin/sh
|
2
|
+
|
3
|
+
set -e
|
4
|
+
|
5
|
+
export RBENV_VERSION=ree-1.8.7-2012.02
|
6
|
+
rbenv version
|
7
|
+
|
8
|
+
export ACTIVERECORD=2.3.8
|
9
|
+
bundle
|
10
|
+
bundle exec rake
|
11
|
+
export ACTIVERECORD=3.0.0
|
12
|
+
bundle
|
13
|
+
bundle exec rake
|
14
|
+
export ACTIVERECORD=3.1.0
|
15
|
+
bundle
|
16
|
+
bundle exec rake
|
17
|
+
export ACTIVERECORD=3.2.0
|
18
|
+
bundle
|
19
|
+
bundle exec rake
|
20
|
+
|
21
|
+
export RBENV_VERSION=1.9.3-p484
|
22
|
+
rbenv version
|
23
|
+
|
24
|
+
export ACTIVERECORD=3.0.0
|
25
|
+
bundle
|
26
|
+
bundle exec rake
|
27
|
+
export ACTIVERECORD=3.1.0
|
28
|
+
bundle
|
29
|
+
bundle exec rake
|
30
|
+
export ACTIVERECORD=3.2.0
|
31
|
+
bundle
|
32
|
+
bundle exec rake
|
33
|
+
export ACTIVERECORD=4.0.0
|
34
|
+
bundle
|
35
|
+
bundle exec rake
|
36
|
+
|
37
|
+
export RBENV_VERSION=2.0.0-p353
|
38
|
+
rbenv version
|
39
|
+
|
40
|
+
export ACTIVERECORD=3.2.0
|
41
|
+
bundle
|
42
|
+
bundle exec rake
|
43
|
+
export ACTIVERECORD=4.0.0
|
44
|
+
bundle
|
45
|
+
bundle exec rake
|
46
|
+
|
47
|
+
export RBENV_VERSION=2.1.0
|
48
|
+
rbenv version
|
49
|
+
|
50
|
+
export ACTIVERECORD=4.0.0
|
51
|
+
bundle
|
52
|
+
bundle exec rake
|
data/test/test_helper.rb
CHANGED
@@ -19,7 +19,7 @@ gem 'activerecord', ENV['ACTIVE_RECORD_VERSION'] if ENV['ACTIVE_RECORD_VERSION']
|
|
19
19
|
require 'active_record'
|
20
20
|
require 'data_mapper'
|
21
21
|
require 'sequel'
|
22
|
-
require 'mocha'
|
22
|
+
require 'mocha/test_unit'
|
23
23
|
|
24
24
|
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
25
25
|
$:.unshift(File.dirname(__FILE__))
|
metadata
CHANGED
@@ -1,177 +1,187 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: attr_encrypted
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.3.2
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 1
|
8
|
-
- 3
|
9
|
-
- 1
|
10
|
-
version: 1.3.1
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Sean Huber
|
14
9
|
- S. Brent Faulkner
|
15
10
|
- William Monk
|
16
11
|
autorequire:
|
17
12
|
bindir: bin
|
18
13
|
cert_chain: []
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
- !ruby/object:Gem::Dependency
|
14
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
23
17
|
name: encryptor
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
hash: 27
|
31
|
-
segments:
|
32
|
-
- 1
|
33
|
-
- 3
|
34
|
-
- 0
|
18
|
+
requirement: !ruby/object:Gem::Requirement
|
19
|
+
none: false
|
20
|
+
requirements:
|
21
|
+
- - ! '>='
|
22
|
+
- !ruby/object:Gem::Version
|
35
23
|
version: 1.3.0
|
36
24
|
type: :runtime
|
37
|
-
version_requirements: *id001
|
38
|
-
- !ruby/object:Gem::Dependency
|
39
|
-
name: activerecord
|
40
25
|
prerelease: false
|
41
|
-
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- -
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
26
|
+
version_requirements: !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ! '>='
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 1.3.0
|
32
|
+
- !ruby/object:Gem::Dependency
|
33
|
+
name: activerecord
|
34
|
+
requirement: !ruby/object:Gem::Requirement
|
35
|
+
none: false
|
36
|
+
requirements:
|
37
|
+
- - ! '>='
|
38
|
+
- !ruby/object:Gem::Version
|
51
39
|
version: 2.0.0
|
52
|
-
- - <
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
hash: 63
|
55
|
-
segments:
|
56
|
-
- 4
|
57
|
-
- 0
|
58
|
-
- 0
|
59
|
-
version: 4.0.0
|
60
40
|
type: :development
|
61
|
-
version_requirements: *id002
|
62
|
-
- !ruby/object:Gem::Dependency
|
63
|
-
name: datamapper
|
64
41
|
prerelease: false
|
65
|
-
|
66
|
-
none: false
|
67
|
-
requirements:
|
68
|
-
- -
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
none: false
|
44
|
+
requirements:
|
45
|
+
- - ! '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 2.0.0
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: datamapper
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
74
56
|
type: :development
|
75
|
-
version_requirements: *id003
|
76
|
-
- !ruby/object:Gem::Dependency
|
77
|
-
name: mocha
|
78
57
|
prerelease: false
|
79
|
-
|
80
|
-
none: false
|
81
|
-
requirements:
|
82
|
-
- -
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
60
|
+
requirements:
|
61
|
+
- - ! '>='
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
- !ruby/object:Gem::Dependency
|
65
|
+
name: mocha
|
66
|
+
requirement: !ruby/object:Gem::Requirement
|
67
|
+
none: false
|
68
|
+
requirements:
|
69
|
+
- - ~>
|
70
|
+
- !ruby/object:Gem::Version
|
71
|
+
version: 1.0.0
|
88
72
|
type: :development
|
89
|
-
version_requirements: *id004
|
90
|
-
- !ruby/object:Gem::Dependency
|
91
|
-
name: sequel
|
92
73
|
prerelease: false
|
93
|
-
|
94
|
-
none: false
|
95
|
-
requirements:
|
96
|
-
- -
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
74
|
+
version_requirements: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ~>
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: 1.0.0
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: sequel
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: '0'
|
102
88
|
type: :development
|
103
|
-
version_requirements: *id005
|
104
|
-
- !ruby/object:Gem::Dependency
|
105
|
-
name: sqlite3
|
106
89
|
prerelease: false
|
107
|
-
|
108
|
-
none: false
|
109
|
-
requirements:
|
110
|
-
- -
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
90
|
+
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
97
|
+
name: sqlite3
|
98
|
+
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ! '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
116
104
|
type: :development
|
117
|
-
version_requirements: *id006
|
118
|
-
- !ruby/object:Gem::Dependency
|
119
|
-
name: dm-sqlite-adapter
|
120
105
|
prerelease: false
|
121
|
-
|
122
|
-
none: false
|
123
|
-
requirements:
|
124
|
-
- -
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
108
|
+
requirements:
|
109
|
+
- - ! '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: dm-sqlite-adapter
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ! '>='
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
130
120
|
type: :development
|
131
|
-
|
132
|
-
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
none: false
|
124
|
+
requirements:
|
125
|
+
- - ! '>='
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
version: '0'
|
128
|
+
- !ruby/object:Gem::Dependency
|
133
129
|
name: rake
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
none: false
|
132
|
+
requirements:
|
133
|
+
- - '='
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: 0.9.2.2
|
136
|
+
type: :development
|
134
137
|
prerelease: false
|
135
|
-
|
136
|
-
none: false
|
137
|
-
requirements:
|
138
|
-
- -
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
hash: 11
|
141
|
-
segments:
|
142
|
-
- 0
|
143
|
-
- 9
|
144
|
-
- 2
|
145
|
-
- 2
|
138
|
+
version_requirements: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - '='
|
142
|
+
- !ruby/object:Gem::Version
|
146
143
|
version: 0.9.2.2
|
144
|
+
- !ruby/object:Gem::Dependency
|
145
|
+
name: simplecov
|
146
|
+
requirement: !ruby/object:Gem::Requirement
|
147
|
+
none: false
|
148
|
+
requirements:
|
149
|
+
- - ! '>='
|
150
|
+
- !ruby/object:Gem::Version
|
151
|
+
version: '0'
|
147
152
|
type: :development
|
148
|
-
version_requirements: *id008
|
149
|
-
- !ruby/object:Gem::Dependency
|
150
|
-
name: rcov
|
151
153
|
prerelease: false
|
152
|
-
|
153
|
-
none: false
|
154
|
-
requirements:
|
155
|
-
- -
|
156
|
-
- !ruby/object:Gem::Version
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
154
|
+
version_requirements: !ruby/object:Gem::Requirement
|
155
|
+
none: false
|
156
|
+
requirements:
|
157
|
+
- - ! '>='
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
- !ruby/object:Gem::Dependency
|
161
|
+
name: simplecov-rcov
|
162
|
+
requirement: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
164
|
+
requirements:
|
165
|
+
- - ! '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
161
168
|
type: :development
|
162
|
-
|
169
|
+
prerelease: false
|
170
|
+
version_requirements: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
172
|
+
requirements:
|
173
|
+
- - ! '>='
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '0'
|
163
176
|
description: Generates attr_accessors that encrypt and decrypt attributes transparently
|
164
|
-
email:
|
177
|
+
email:
|
165
178
|
- shuber@huberry.com
|
166
179
|
- sbfaulkner@gmail.com
|
167
180
|
- billy.monk@gmail.com
|
168
181
|
executables: []
|
169
|
-
|
170
182
|
extensions: []
|
171
|
-
|
172
183
|
extra_rdoc_files: []
|
173
|
-
|
174
|
-
files:
|
184
|
+
files:
|
175
185
|
- lib/attr_encrypted/adapters/active_record.rb
|
176
186
|
- lib/attr_encrypted/adapters/data_mapper.rb
|
177
187
|
- lib/attr_encrypted/adapters/sequel.rb
|
@@ -189,45 +199,44 @@ files:
|
|
189
199
|
- test/legacy_compatibility_test.rb
|
190
200
|
- test/legacy_data_mapper_test.rb
|
191
201
|
- test/legacy_sequel_test.rb
|
202
|
+
- test/run.sh
|
192
203
|
- test/sequel_test.rb
|
193
204
|
- test/test_helper.rb
|
194
205
|
homepage: http://github.com/attr-encrypted/attr_encrypted
|
195
206
|
licenses: []
|
196
|
-
|
197
207
|
post_install_message:
|
198
|
-
rdoc_options:
|
208
|
+
rdoc_options:
|
199
209
|
- --line-numbers
|
200
210
|
- --inline-source
|
201
211
|
- --main
|
202
212
|
- README.rdoc
|
203
|
-
require_paths:
|
213
|
+
require_paths:
|
204
214
|
- lib
|
205
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
215
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
206
216
|
none: false
|
207
|
-
requirements:
|
208
|
-
- -
|
209
|
-
- !ruby/object:Gem::Version
|
210
|
-
|
211
|
-
segments:
|
217
|
+
requirements:
|
218
|
+
- - ! '>='
|
219
|
+
- !ruby/object:Gem::Version
|
220
|
+
version: '0'
|
221
|
+
segments:
|
212
222
|
- 0
|
213
|
-
|
214
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
223
|
+
hash: -1158977372203285747
|
224
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
215
225
|
none: false
|
216
|
-
requirements:
|
217
|
-
- -
|
218
|
-
- !ruby/object:Gem::Version
|
219
|
-
|
220
|
-
segments:
|
226
|
+
requirements:
|
227
|
+
- - ! '>='
|
228
|
+
- !ruby/object:Gem::Version
|
229
|
+
version: '0'
|
230
|
+
segments:
|
221
231
|
- 0
|
222
|
-
|
232
|
+
hash: -1158977372203285747
|
223
233
|
requirements: []
|
224
|
-
|
225
234
|
rubyforge_project:
|
226
|
-
rubygems_version: 1.8.
|
235
|
+
rubygems_version: 1.8.23
|
227
236
|
signing_key:
|
228
237
|
specification_version: 3
|
229
238
|
summary: Encrypt and decrypt attributes
|
230
|
-
test_files:
|
239
|
+
test_files:
|
231
240
|
- test/active_record_test.rb
|
232
241
|
- test/attr_encrypted_test.rb
|
233
242
|
- test/compatibility_test.rb
|
@@ -237,5 +246,6 @@ test_files:
|
|
237
246
|
- test/legacy_compatibility_test.rb
|
238
247
|
- test/legacy_data_mapper_test.rb
|
239
248
|
- test/legacy_sequel_test.rb
|
249
|
+
- test/run.sh
|
240
250
|
- test/sequel_test.rb
|
241
251
|
- test/test_helper.rb
|