attr_encrypted 1.3.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,4 +1,4 @@
1
- = attr_encrypted {<img src="https://travis-ci.org/attr-encrypted/attr_encrypted.png" />}[https://travis-ci.org/attr-encrypted/attr_encrypted]
1
+ = attr_encrypted {<img src="https://travis-ci.org/attr-encrypted/attr_encrypted.png" />}[https://travis-ci.org/attr-encrypted/attr_encrypted] {<img src="https://codeclimate.com/github/attr-encrypted/attr_encrypted/badges/gpa.svg" />}[https://codeclimate.com/github/attr-encrypted/attr_encrypted]{<img src="https://codeclimate.com/github/attr-encrypted/attr_encrypted/badges/gpa.svg" />}[https://codeclimate.com/github/attr-encrypted/attr_encrypted]
2
2
 
3
3
  Generates attr_accessors that encrypt and decrypt attributes transparently
4
4
 
@@ -39,6 +39,48 @@ Encrypting attributes has never been easier:
39
39
 
40
40
  The <tt>attr_encrypted</tt> method is also aliased as <tt>attr_encryptor</tt> to conform to Ruby's <tt>attr_</tt> naming conventions. I should have called this project <tt>attr_encryptor</tt> but it was too late when I realized it ='(.
41
41
 
42
+ === Adding required columns via database migration
43
+
44
+ By default, <tt>attr_encrypted</tt> uses the <tt>:single_iv_and_salt</tt>
45
+ encryption mode for compatibility with previous versions of the gem. This mode
46
+ uses a single IV and salt for each encrypted column. Create or modify your model
47
+ to add a column with the <tt>encrypted_</tt> prefix (which can be modified, see
48
+ below), e.g. <tt>encrypted_ssn</tt> via a migration like the following:
49
+
50
+ create_table :users do |t|
51
+ t.string :name
52
+ t.string :encrypted_ssn
53
+ t.timestamps
54
+ end
55
+
56
+ For enhanced security, you can use the <tt>:per_attribute_iv_and_salt</tt> mode.
57
+ This requires additional <tt>_salt</tt> and <tt>_iv</tt> columns with the
58
+ <tt>encrypted_</tt> prefix as follows and generates a unique salt and IV per
59
+ attribute:
60
+
61
+ create_table :users do |t|
62
+ t.string :name
63
+ t.string :encrypted_ssn
64
+ t.string :encrypted_ssn_salt
65
+ t.string :encrypted_ssn_iv
66
+ t.string :domain
67
+ t.timestamps
68
+ end
69
+
70
+ This mode is enabled by specifying a value of <tt>:per_attribute_iv_and_salt</tt>
71
+ via the <tt>:mode</tt> option as follows:
72
+
73
+ class User
74
+ attr_accessor :name
75
+ attr_encrypted :ssn, :key => 'a secret key', :mode => :per_attribute_iv_and_salt
76
+ end
77
+
78
+ Note that there are alternatives to storing the IV and salt in separate columns:
79
+ for example, see here[https://github.com/attr-encrypted/attr_encrypted/issues/118#issuecomment-45806629].
80
+ Note that migration from the old encryption scheme to the new is nontrivial. One
81
+ approach is described here[http://jjasonclark.com/switching_from_attr_encrypted_to_attr_encryptor],
82
+ though these instructions describe the now-defunct <tt>attr_encryptor</tt> gem
83
+ whose functionality has been merged into this project.
42
84
 
43
85
  === Specifying the encrypted attribute name
44
86
 
data/Rakefile CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'rake'
2
2
  require 'rake/testtask'
3
3
  require 'rake/rdoctask'
4
+ require "bundler/gem_tasks"
4
5
 
5
6
  desc 'Test the attr_encrypted gem.'
6
7
  Rake::TestTask.new(:test) do |t|
@@ -127,7 +127,7 @@ module AttrEncrypted
127
127
  iv_name = "#{encrypted_attribute_name}_iv".to_sym
128
128
  salt_name = "#{encrypted_attribute_name}_salt".to_sym
129
129
 
130
- instance_methods_as_symbols = instance_methods.collect { |method| method.to_sym }
130
+ instance_methods_as_symbols = attribute_instance_methods_as_symbols
131
131
  attr_reader encrypted_attribute_name unless instance_methods_as_symbols.include?(encrypted_attribute_name)
132
132
  attr_writer encrypted_attribute_name unless instance_methods_as_symbols.include?(:"#{encrypted_attribute_name}=")
133
133
 
@@ -156,6 +156,7 @@ module AttrEncrypted
156
156
  encrypted_attributes[attribute.to_sym] = options.merge(:attribute => encrypted_attribute_name)
157
157
  end
158
158
  end
159
+
159
160
  alias_method :attr_encryptor, :attr_encrypted
160
161
 
161
162
  # Default options to use with calls to <tt>attr_encrypted</tt>
@@ -302,7 +303,7 @@ module AttrEncrypted
302
303
 
303
304
  # Returns attr_encrypted options evaluated in the current object's scope for the attribute specified
304
305
  def evaluated_attr_encrypted_options_for(attribute)
305
- if self.class.encrypted_attributes[attribute.to_sym][:mode] == :per_attribute_iv_and_salt
306
+ if evaluate_attr_encrypted_option(self.class.encrypted_attributes[attribute.to_sym][:mode]) == :per_attribute_iv_and_salt
306
307
  load_iv_for_attribute(attribute, self.class.encrypted_attributes[attribute.to_sym][:algorithm])
307
308
  load_salt_for_attribute(attribute)
308
309
  end
@@ -344,6 +345,13 @@ module AttrEncrypted
344
345
  self.class.encrypted_attributes[attribute.to_sym] = self.class.encrypted_attributes[attribute.to_sym].merge(:salt => salt)
345
346
  end
346
347
  end
348
+
349
+ protected
350
+
351
+ def attribute_instance_methods_as_symbols
352
+ instance_methods.collect { |method| method.to_sym }
353
+ end
354
+
347
355
  end
348
356
 
349
357
  Object.extend AttrEncrypted
@@ -4,6 +4,17 @@ if defined?(ActiveRecord::Base)
4
4
  module ActiveRecord
5
5
  def self.extended(base) # :nodoc:
6
6
  base.class_eval do
7
+
8
+ # https://github.com/attr-encrypted/attr_encrypted/issues/68
9
+ def reload_with_attr_encrypted(*args, &block)
10
+ result = reload_without_attr_encrypted(*args, &block)
11
+ self.class.encrypted_attributes.keys.each do |attribute_name|
12
+ instance_variable_set("@#{attribute_name}", nil)
13
+ end
14
+ result
15
+ end
16
+ alias_method_chain :reload, :attr_encrypted
17
+
7
18
  attr_encrypted_options[:encode] = true
8
19
  class << self
9
20
  alias_method :attr_encryptor, :attr_encrypted
@@ -13,10 +24,9 @@ if defined?(ActiveRecord::Base)
13
24
 
14
25
  def perform_attribute_assignment(method, new_attributes, *args)
15
26
  return if new_attributes.blank?
16
- attributes = new_attributes.respond_to?(:with_indifferent_access) ? new_attributes.with_indifferent_access : new_attributes.symbolize_keys
17
- encrypted_attributes = self.class.encrypted_attributes.keys
18
- self.send method, attributes.except(*encrypted_attributes), *args
19
- self.send method, attributes.slice(*encrypted_attributes), *args
27
+
28
+ send method, new_attributes.reject { |k, _| self.class.encrypted_attributes.key?(k.to_sym) }, *args
29
+ send method, new_attributes.reject { |k, _| !self.class.encrypted_attributes.key?(k.to_sym) }, *args
20
30
  end
21
31
  private :perform_attribute_assignment
22
32
 
@@ -25,27 +35,35 @@ if defined?(ActiveRecord::Base)
25
35
  perform_attribute_assignment :assign_attributes_without_attr_encrypted, *args
26
36
  end
27
37
  alias_method_chain :assign_attributes, :attr_encrypted
28
- else
29
- def attributes_with_attr_encrypted=(*args)
30
- perform_attribute_assignment :attributes_without_attr_encrypted=, *args
31
- end
32
- alias_method_chain :attributes=, :attr_encrypted
33
38
  end
39
+
40
+ def attributes_with_attr_encrypted=(*args)
41
+ perform_attribute_assignment :attributes_without_attr_encrypted=, *args
42
+ end
43
+ alias_method_chain :attributes=, :attr_encrypted
34
44
  end
35
45
  end
36
46
 
37
47
  protected
38
48
 
39
- # Ensures the attribute methods for db fields have been defined before calling the original
40
49
  # <tt>attr_encrypted</tt> method
41
50
  def attr_encrypted(*attrs)
42
- define_attribute_methods rescue nil
43
51
  super
44
- undefine_attribute_methods
45
52
  attrs.reject { |attr| attr.is_a?(Hash) }.each { |attr| alias_method "#{attr}_before_type_cast", attr }
46
53
  end
47
54
 
48
- # Allows you to use dynamic methods like <tt>find_by_email</tt> or <tt>scoped_by_email</tt> for
55
+ def attribute_instance_methods_as_symbols
56
+ # We add accessor methods of the db columns to the list of instance
57
+ # methods returned to let ActiveRecord define the accessor methods
58
+ # for the db columns
59
+ if table_exists?
60
+ columns_hash.keys.inject(super) {|instance_methods, column_name| instance_methods.concat [column_name.to_sym, :"#{column_name}="]}
61
+ else
62
+ super
63
+ end
64
+ end
65
+
66
+ # Allows you to use dynamic methods like <tt>find_by_email</tt> or <tt>scoped_by_email</tt> for
49
67
  # encrypted attributes
50
68
  #
51
69
  # NOTE: This only works when the <tt>:key</tt> option is specified as a string (see the README)
@@ -80,4 +98,4 @@ if defined?(ActiveRecord::Base)
80
98
  end
81
99
 
82
100
  ActiveRecord::Base.extend AttrEncrypted::Adapters::ActiveRecord
83
- end
101
+ end
@@ -3,7 +3,7 @@ module AttrEncrypted
3
3
  module Version
4
4
  MAJOR = 1
5
5
  MINOR = 3
6
- PATCH = 3
6
+ PATCH = 4
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
  #
@@ -25,6 +25,9 @@ def create_tables
25
25
  t.string :encrypted_password
26
26
  t.boolean :is_admin
27
27
  end
28
+ create_table :prime_ministers do |t|
29
+ t.string :encrypted_name
30
+ end
28
31
  end
29
32
  end
30
33
  end
@@ -70,6 +73,11 @@ class PersonWithValidation < Person
70
73
  validates_presence_of :email
71
74
  end
72
75
 
76
+ class PersonWithProcMode < Person
77
+ attr_encrypted :email, :key => SECRET_KEY, :mode => Proc.new { :per_attribute_iv_and_salt }
78
+ attr_encrypted :credentials, :key => SECRET_KEY, :mode => Proc.new { :single_iv_and_salt }
79
+ end
80
+
73
81
  class Account < ActiveRecord::Base
74
82
  attr_accessor :key
75
83
  attr_encrypted :password, :key => Proc.new {|account| account.key}
@@ -92,7 +100,11 @@ class PersonUsingAlias < ActiveRecord::Base
92
100
  attr_encryptor :email, :key => 'a secret key'
93
101
  end
94
102
 
95
- class ActiveRecordTest < Test::Unit::TestCase
103
+ class PrimeMinister < ActiveRecord::Base
104
+ attr_encrypted :name, :marshal => true, :key => 'SECRET_KEY'
105
+ end
106
+
107
+ class ActiveRecordTest < Minitest::Test
96
108
 
97
109
  def setup
98
110
  ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
@@ -102,15 +114,15 @@ class ActiveRecordTest < Test::Unit::TestCase
102
114
 
103
115
  def test_should_encrypt_email
104
116
  @person = Person.create :email => 'test@example.com'
105
- assert_not_nil @person.encrypted_email
106
- assert_not_equal @person.email, @person.encrypted_email
117
+ refute_nil @person.encrypted_email
118
+ refute_equal @person.email, @person.encrypted_email
107
119
  assert_equal @person.email, Person.find(:first).email
108
120
  end
109
121
 
110
122
  def test_should_marshal_and_encrypt_credentials
111
123
  @person = Person.create
112
- assert_not_nil @person.encrypted_credentials
113
- assert_not_equal @person.credentials, @person.encrypted_credentials
124
+ refute_nil @person.encrypted_credentials
125
+ refute_equal @person.credentials, @person.encrypted_credentials
114
126
  assert_equal @person.credentials, Person.find(:first).credentials
115
127
  end
116
128
 
@@ -127,7 +139,7 @@ class ActiveRecordTest < Test::Unit::TestCase
127
139
  def test_should_encrypt_decrypt_with_iv
128
140
  @person = Person.create :email => 'test@example.com'
129
141
  @person2 = Person.find(@person.id)
130
- assert_not_nil @person2.encrypted_email_iv
142
+ refute_nil @person2.encrypted_email_iv
131
143
  assert_equal 'test@example.com', @person2.email
132
144
  end
133
145
 
@@ -142,6 +154,16 @@ class ActiveRecordTest < Test::Unit::TestCase
142
154
  Account.create!(:password => "password" , :key => SECRET_KEY)
143
155
  end
144
156
 
157
+ def test_should_set_attributes_regardless_of_arguments_order
158
+ Account.new.attributes = { :password => "password" , :key => SECRET_KEY }
159
+ end
160
+
161
+ def test_should_preserve_hash_key_type
162
+ hash = { :foo => 'bar' }
163
+ account = Account.create!(:key => hash)
164
+ assert_equal account.key, hash
165
+ end
166
+
145
167
  if ::ActiveRecord::VERSION::STRING > "4.0"
146
168
  def test_should_assign_attributes
147
169
  @user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
@@ -157,13 +179,13 @@ class ActiveRecordTest < Test::Unit::TestCase
157
179
 
158
180
  def test_should_raise_exception_if_not_permitted
159
181
  @user = UserWithProtectedAttribute.new :login => 'login', :is_admin => false
160
- assert_raise ActiveModel::ForbiddenAttributesError do
182
+ assert_raises ActiveModel::ForbiddenAttributesError do
161
183
  @user.attributes = ActionController::Parameters.new(:login => 'modified', :is_admin => true)
162
184
  end
163
185
  end
164
186
 
165
187
  def test_should_raise_exception_on_init_if_not_permitted
166
- assert_raise ActiveModel::ForbiddenAttributesError do
188
+ assert_raises ActiveModel::ForbiddenAttributesError do
167
189
  @user = UserWithProtectedAttribute.new ActionController::Parameters.new(:login => 'modified', :is_admin => true)
168
190
  end
169
191
  end
@@ -196,6 +218,22 @@ class ActiveRecordTest < Test::Unit::TestCase
196
218
  assert_nil(@person.attributes = nil)
197
219
  end
198
220
 
221
+ def test_should_allow_proc_based_mode
222
+ @person = PersonWithProcMode.create :email => 'test@example.com', :credentials => 'password123'
223
+
224
+ # Email is :per_attribute_iv_and_salt
225
+ assert_equal @person.class.encrypted_attributes[:email][:mode].class, Proc
226
+ assert_equal @person.class.encrypted_attributes[:email][:mode].call, :per_attribute_iv_and_salt
227
+ refute_nil @person.encrypted_email_salt
228
+ refute_nil @person.encrypted_email_iv
229
+
230
+ # Credentials is :single_iv_and_salt
231
+ assert_equal @person.class.encrypted_attributes[:credentials][:mode].class, Proc
232
+ assert_equal @person.class.encrypted_attributes[:credentials][:mode].call, :single_iv_and_salt
233
+ assert_nil @person.encrypted_credentials_salt
234
+ assert_nil @person.encrypted_credentials_iv
235
+ end
236
+
199
237
  if ::ActiveRecord::VERSION::STRING > "3.1"
200
238
  def test_should_allow_assign_attributes_with_nil
201
239
  @person = Person.new
@@ -203,15 +241,26 @@ class ActiveRecordTest < Test::Unit::TestCase
203
241
  end
204
242
  end
205
243
 
206
- class TestAlias < Test::Unit::TestCase
207
- def test_that_alias_encrypts_column
208
- user = PersonUsingAlias.new
209
- user.email = 'test@example.com'
210
- user.save
244
+ def test_that_alias_encrypts_column
245
+ user = PersonUsingAlias.new
246
+ user.email = 'test@example.com'
247
+ user.save
211
248
 
212
- assert_not_nil user.encrypted_email
213
- assert_not_equal user.email, user.encrypted_email
214
- assert_equal user.email, PersonUsingAlias.find(:first).email
215
- end
249
+ refute_nil user.encrypted_email
250
+ refute_equal user.email, user.encrypted_email
251
+ assert_equal user.email, PersonUsingAlias.find(:first).email
252
+ end
253
+
254
+ # See https://github.com/attr-encrypted/attr_encrypted/issues/68
255
+ def test_should_invalidate_virtual_attributes_on_reload
256
+ pm = PrimeMinister.new(:name => 'Winston Churchill')
257
+ pm.save!
258
+ assert_equal 'Winston Churchill', pm.name
259
+ pm.name = 'Neville Chamberlain'
260
+ assert_equal 'Neville Chamberlain', pm.name
261
+
262
+ result = pm.reload
263
+ assert_equal pm, result
264
+ assert_equal 'Winston Churchill', pm.name
216
265
  end
217
266
  end
@@ -53,7 +53,7 @@ class SomeOtherClass
53
53
  end
54
54
  end
55
55
 
56
- class AttrEncryptedTest < Test::Unit::TestCase
56
+ class AttrEncryptedTest < Minitest::Test
57
57
 
58
58
  def test_should_store_email_in_encrypted_attributes
59
59
  assert User.encrypted_attributes.include?(:email)
@@ -68,7 +68,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
68
68
  end
69
69
 
70
70
  def test_attr_encrypted_should_not_use_the_same_attribute_name_for_two_attributes_in_the_same_line
71
- assert_not_equal User.encrypted_attributes[:email][:attribute], User.encrypted_attributes[:without_encoding][:attribute]
71
+ refute_equal User.encrypted_attributes[:email][:attribute], User.encrypted_attributes[:without_encoding][:attribute]
72
72
  end
73
73
 
74
74
  def test_attr_encrypted_should_return_false_for_salt
@@ -96,15 +96,15 @@ class AttrEncryptedTest < Test::Unit::TestCase
96
96
  end
97
97
 
98
98
  def test_should_encrypt_email
99
- assert_not_nil User.encrypt_email('test@example.com')
100
- assert_not_equal 'test@example.com', User.encrypt_email('test@example.com')
99
+ refute_nil User.encrypt_email('test@example.com')
100
+ refute_equal 'test@example.com', User.encrypt_email('test@example.com')
101
101
  end
102
102
 
103
103
  def test_should_encrypt_email_when_modifying_the_attr_writer
104
104
  @user = User.new
105
105
  assert_nil @user.encrypted_email
106
106
  @user.email = 'test@example.com'
107
- assert_not_nil @user.encrypted_email
107
+ refute_nil @user.encrypted_email
108
108
  assert_equal User.encrypt_email('test@example.com'), @user.encrypted_email
109
109
  end
110
110
 
@@ -118,7 +118,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
118
118
 
119
119
  def test_should_decrypt_email
120
120
  encrypted_email = User.encrypt_email('test@example.com')
121
- assert_not_equal 'test@test.com', encrypted_email
121
+ refute_equal 'test@test.com', encrypted_email
122
122
  assert_equal 'test@example.com', User.decrypt_email(encrypted_email)
123
123
  end
124
124
 
@@ -152,7 +152,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
152
152
  def test_should_encrypt_with_marshaling
153
153
  @user = User.new
154
154
  @user.with_marshaling = [1, 2, 3]
155
- assert_not_nil @user.encrypted_with_marshaling
155
+ refute_nil @user.encrypted_with_marshaling
156
156
  end
157
157
 
158
158
  def test_should_use_custom_encryptor_and_crypt_method_names_and_arguments
@@ -163,7 +163,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
163
163
  @user = User.new
164
164
  assert_nil @user.ssn_encrypted
165
165
  @user.ssn = 'testing'
166
- assert_not_nil @user.ssn_encrypted
166
+ refute_nil @user.ssn_encrypted
167
167
  encrypted = Encryptor.encrypt(:value => 'testing', :key => SECRET_KEY, :iv => @user.ssn_encrypted_iv.unpack("m").first, :salt => @user.ssn_encrypted_salt )
168
168
  assert_equal encrypted, @user.ssn_encrypted
169
169
  end
@@ -172,7 +172,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
172
172
  @user = User.new
173
173
  assert_nil @user.crypted_password_test
174
174
  @user.password = 'testing'
175
- assert_not_nil @user.crypted_password_test
175
+ refute_nil @user.crypted_password_test
176
176
  encrypted = Encryptor.encrypt(:value => 'testing', :key => SECRET_KEY, :iv => @user.crypted_password_test_iv.unpack("m").first, :salt => @user.crypted_password_test_salt)
177
177
  assert_equal encrypted, @user.crypted_password_test
178
178
  end
@@ -181,7 +181,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
181
181
  @user = User.new
182
182
  assert_nil @user.crypted_password_test
183
183
  @user.password = 'testing'
184
- assert_not_nil @user.crypted_password_test
184
+ refute_nil @user.crypted_password_test
185
185
  encrypted = Encryptor.encrypt(:value => 'testing', :key => SECRET_KEY, :iv => @user.crypted_password_test_iv.unpack("m").first, :salt => @user.crypted_password_test_salt)
186
186
  assert_equal encrypted, @user.crypted_password_test
187
187
  end
@@ -224,7 +224,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
224
224
  @user = User.new
225
225
  assert_nil @user.encrypted_with_true_if
226
226
  @user.with_true_if = 'testing'
227
- assert_not_nil @user.encrypted_with_true_if
227
+ refute_nil @user.encrypted_with_true_if
228
228
  encrypted = Encryptor.encrypt(:value => 'testing', :key => SECRET_KEY, :iv => @user.encrypted_with_true_if_iv.unpack("m").first, :salt => @user.encrypted_with_true_if_salt)
229
229
  assert_equal encrypted, @user.encrypted_with_true_if
230
230
  end
@@ -233,7 +233,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
233
233
  @user = User.new
234
234
  assert_nil @user.encrypted_with_false_if
235
235
  @user.with_false_if = 'testing'
236
- assert_not_nil @user.encrypted_with_false_if
236
+ refute_nil @user.encrypted_with_false_if
237
237
  assert_equal 'testing', @user.encrypted_with_false_if
238
238
  end
239
239
 
@@ -241,7 +241,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
241
241
  @user = User.new
242
242
  assert_nil @user.encrypted_with_false_unless
243
243
  @user.with_false_unless = 'testing'
244
- assert_not_nil @user.encrypted_with_false_unless
244
+ refute_nil @user.encrypted_with_false_unless
245
245
  encrypted = Encryptor.encrypt(:value => 'testing', :key => SECRET_KEY, :iv => @user.encrypted_with_false_unless_iv.unpack("m").first, :salt => @user.encrypted_with_false_unless_salt)
246
246
  assert_equal encrypted, @user.encrypted_with_false_unless
247
247
  end
@@ -250,7 +250,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
250
250
  @user = User.new
251
251
  assert_nil @user.encrypted_with_true_unless
252
252
  @user.with_true_unless = 'testing'
253
- assert_not_nil @user.encrypted_with_true_unless
253
+ refute_nil @user.encrypted_with_true_unless
254
254
  assert_equal 'testing', @user.encrypted_with_true_unless
255
255
  end
256
256
 
@@ -263,7 +263,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
263
263
  @user.with_if_changed = "encrypt_stuff"
264
264
  @user.stubs(:instance_variable_get).returns(nil)
265
265
  @user.stubs(:instance_variable_set).raises("BadStuff")
266
- assert_raise RuntimeError do
266
+ assert_raises RuntimeError do
267
267
  @user.with_if_changed
268
268
  end
269
269
 
@@ -293,7 +293,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
293
293
  @user = User.new
294
294
  @user.email = 'email@example.com'
295
295
  @user.password = 'p455w0rd'
296
- assert_not_equal @user.encrypted_email_iv, @user.crypted_password_test_iv
296
+ refute_equal @user.encrypted_email_iv, @user.crypted_password_test_iv
297
297
  end
298
298
 
299
299
  def test_should_vary_iv_per_instance
@@ -301,14 +301,14 @@ class AttrEncryptedTest < Test::Unit::TestCase
301
301
  @user1.email = 'email@example.com'
302
302
  @user2 = User.new
303
303
  @user2.email = 'email@example.com'
304
- assert_not_equal @user1.encrypted_email_iv, @user2.encrypted_email_iv
304
+ refute_equal @user1.encrypted_email_iv, @user2.encrypted_email_iv
305
305
  end
306
306
 
307
307
  def test_should_vary_salt_per_attribute
308
308
  @user = User.new
309
309
  @user.email = 'email@example.com'
310
310
  @user.password = 'p455w0rd'
311
- assert_not_equal @user.encrypted_email_salt, @user.crypted_password_test_salt
311
+ refute_equal @user.encrypted_email_salt, @user.crypted_password_test_salt
312
312
  end
313
313
 
314
314
  def test_should_vary_salt_per_instance
@@ -316,7 +316,7 @@ class AttrEncryptedTest < Test::Unit::TestCase
316
316
  @user1.email = 'email@example.com'
317
317
  @user2 = User.new
318
318
  @user2.email = 'email@example.com'
319
- assert_not_equal @user1.encrypted_email_salt, @user2.encrypted_email_salt
319
+ refute_equal @user1.encrypted_email_salt, @user2.encrypted_email_salt
320
320
  end
321
321
 
322
322
  def test_should_decrypt_second_record
@@ -5,7 +5,7 @@ require File.expand_path('../test_helper', __FILE__)
5
5
  # migrating to new versions of this gem. This ensures that future versions of
6
6
  # this gem will retain backwards compatibility with data generated by earlier
7
7
  # versions.
8
- class CompatibilityTest < Test::Unit::TestCase
8
+ class CompatibilityTest < Minitest::Test
9
9
  class NonmarshallingPet < ActiveRecord::Base
10
10
  PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt')
11
11
  PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key'
@@ -27,7 +27,7 @@ end
27
27
 
28
28
  DataMapper.auto_migrate!
29
29
 
30
- class DataMapperTest < Test::Unit::TestCase
30
+ class DataMapperTest < Minitest::Test
31
31
 
32
32
  def setup
33
33
  Client.all.each(&:destroy)
@@ -36,16 +36,16 @@ class DataMapperTest < Test::Unit::TestCase
36
36
  def test_should_encrypt_email
37
37
  @client = Client.new :email => 'test@example.com'
38
38
  assert @client.save
39
- assert_not_nil @client.encrypted_email
40
- assert_not_equal @client.email, @client.encrypted_email
39
+ refute_nil @client.encrypted_email
40
+ refute_equal @client.email, @client.encrypted_email
41
41
  assert_equal @client.email, Client.first.email
42
42
  end
43
43
 
44
44
  def test_should_marshal_and_encrypt_credentials
45
45
  @client = Client.new
46
46
  assert @client.save
47
- assert_not_nil @client.encrypted_credentials
48
- assert_not_equal @client.credentials, @client.encrypted_credentials
47
+ refute_nil @client.encrypted_credentials
48
+ refute_equal @client.credentials, @client.encrypted_credentials
49
49
  assert_equal @client.credentials, Client.first.credentials
50
50
  assert Client.first.credentials.is_a?(Hash)
51
51
  end
@@ -45,7 +45,7 @@ class LegacyPersonWithValidation < LegacyPerson
45
45
  validates_uniqueness_of :encrypted_email
46
46
  end
47
47
 
48
- class LegacyActiveRecordTest < Test::Unit::TestCase
48
+ class LegacyActiveRecordTest < Minitest::Test
49
49
 
50
50
  def setup
51
51
  ActiveRecord::Base.connection.tables.each { |table| ActiveRecord::Base.connection.drop_table(table) }
@@ -61,15 +61,15 @@ class LegacyActiveRecordTest < Test::Unit::TestCase
61
61
 
62
62
  def test_should_encrypt_email
63
63
  @person = LegacyPerson.create :email => 'test@example.com'
64
- assert_not_nil @person.encrypted_email
65
- assert_not_equal @person.email, @person.encrypted_email
64
+ refute_nil @person.encrypted_email
65
+ refute_equal @person.email, @person.encrypted_email
66
66
  assert_equal @person.email, LegacyPerson.find(:first).email
67
67
  end
68
68
 
69
69
  def test_should_marshal_and_encrypt_credentials
70
70
  @person = LegacyPerson.create
71
- assert_not_nil @person.encrypted_credentials
72
- assert_not_equal @person.credentials, @person.encrypted_credentials
71
+ refute_nil @person.encrypted_credentials
72
+ refute_equal @person.credentials, @person.encrypted_credentials
73
73
  assert_equal @person.credentials, LegacyPerson.find(:first).credentials
74
74
  end
75
75
 
@@ -48,7 +48,7 @@ class LegacySomeOtherClass
48
48
  end
49
49
  end
50
50
 
51
- class LegacyAttrEncryptedTest < Test::Unit::TestCase
51
+ class LegacyAttrEncryptedTest < Minitest::Test
52
52
 
53
53
  def test_should_store_email_in_encrypted_attributes
54
54
  assert LegacyUser.encrypted_attributes.include?(:email)
@@ -63,7 +63,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
63
63
  end
64
64
 
65
65
  def test_attr_encrypted_should_not_use_the_same_attribute_name_for_two_attributes_in_the_same_line
66
- assert_not_equal LegacyUser.encrypted_attributes[:email][:attribute], LegacyUser.encrypted_attributes[:without_encoding][:attribute]
66
+ refute_equal LegacyUser.encrypted_attributes[:email][:attribute], LegacyUser.encrypted_attributes[:without_encoding][:attribute]
67
67
  end
68
68
 
69
69
  def test_attr_encrypted_should_return_false_for_salt
@@ -91,15 +91,15 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
91
91
  end
92
92
 
93
93
  def test_should_encrypt_email
94
- assert_not_nil LegacyUser.encrypt_email('test@example.com')
95
- assert_not_equal 'test@example.com', LegacyUser.encrypt_email('test@example.com')
94
+ refute_nil LegacyUser.encrypt_email('test@example.com')
95
+ refute_equal 'test@example.com', LegacyUser.encrypt_email('test@example.com')
96
96
  end
97
97
 
98
98
  def test_should_encrypt_email_when_modifying_the_attr_writer
99
99
  @user = LegacyUser.new
100
100
  assert_nil @user.encrypted_email
101
101
  @user.email = 'test@example.com'
102
- assert_not_nil @user.encrypted_email
102
+ refute_nil @user.encrypted_email
103
103
  assert_equal LegacyUser.encrypt_email('test@example.com'), @user.encrypted_email
104
104
  end
105
105
 
@@ -113,7 +113,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
113
113
 
114
114
  def test_should_decrypt_email
115
115
  encrypted_email = LegacyUser.encrypt_email('test@example.com')
116
- assert_not_equal 'test@test.com', encrypted_email
116
+ refute_equal 'test@test.com', encrypted_email
117
117
  assert_equal 'test@example.com', LegacyUser.decrypt_email(encrypted_email)
118
118
  end
119
119
 
@@ -153,7 +153,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
153
153
  def test_should_encrypt_with_marshaling
154
154
  @user = LegacyUser.new
155
155
  @user.with_marshaling = [1, 2, 3]
156
- assert_not_nil @user.encrypted_with_marshaling
156
+ refute_nil @user.encrypted_with_marshaling
157
157
  assert_equal LegacyUser.encrypt_with_marshaling([1, 2, 3]), @user.encrypted_with_marshaling
158
158
  end
159
159
 
@@ -173,7 +173,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
173
173
  @user = LegacyUser.new
174
174
  assert_nil @user.ssn_encrypted
175
175
  @user.ssn = 'testing'
176
- assert_not_nil @user.ssn_encrypted
176
+ refute_nil @user.ssn_encrypted
177
177
  assert_equal Encryptor.encrypt(:value => 'testing', :key => @user.salt), @user.ssn_encrypted
178
178
  end
179
179
 
@@ -181,7 +181,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
181
181
  @user = LegacyUser.new
182
182
  assert_nil @user.crypted_password_test
183
183
  @user.password = 'testing'
184
- assert_not_nil @user.crypted_password_test
184
+ refute_nil @user.crypted_password_test
185
185
  assert_equal Encryptor.encrypt(:value => 'testing', :key => 'LegacyUser'), @user.crypted_password_test
186
186
  end
187
187
 
@@ -189,7 +189,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
189
189
  @user = LegacyUser.new
190
190
  assert_nil @user.crypted_password_test
191
191
  @user.password = 'testing'
192
- assert_not_nil @user.crypted_password_test
192
+ refute_nil @user.crypted_password_test
193
193
  assert_equal Encryptor.encrypt(:value => 'testing', :key => 'LegacyUser'), @user.crypted_password_test
194
194
  end
195
195
 
@@ -231,7 +231,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
231
231
  @user = LegacyUser.new
232
232
  assert_nil @user.encrypted_with_true_if
233
233
  @user.with_true_if = 'testing'
234
- assert_not_nil @user.encrypted_with_true_if
234
+ refute_nil @user.encrypted_with_true_if
235
235
  assert_equal Encryptor.encrypt(:value => 'testing', :key => 'secret key'), @user.encrypted_with_true_if
236
236
  end
237
237
 
@@ -239,7 +239,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
239
239
  @user = LegacyUser.new
240
240
  assert_nil @user.encrypted_with_false_if
241
241
  @user.with_false_if = 'testing'
242
- assert_not_nil @user.encrypted_with_false_if
242
+ refute_nil @user.encrypted_with_false_if
243
243
  assert_equal 'testing', @user.encrypted_with_false_if
244
244
  end
245
245
 
@@ -247,7 +247,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
247
247
  @user = LegacyUser.new
248
248
  assert_nil @user.encrypted_with_false_unless
249
249
  @user.with_false_unless = 'testing'
250
- assert_not_nil @user.encrypted_with_false_unless
250
+ refute_nil @user.encrypted_with_false_unless
251
251
  assert_equal Encryptor.encrypt(:value => 'testing', :key => 'secret key'), @user.encrypted_with_false_unless
252
252
  end
253
253
 
@@ -255,7 +255,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
255
255
  @user = LegacyUser.new
256
256
  assert_nil @user.encrypted_with_true_unless
257
257
  @user.with_true_unless = 'testing'
258
- assert_not_nil @user.encrypted_with_true_unless
258
+ refute_nil @user.encrypted_with_true_unless
259
259
  assert_equal 'testing', @user.encrypted_with_true_unless
260
260
  end
261
261
 
@@ -268,7 +268,7 @@ class LegacyAttrEncryptedTest < Test::Unit::TestCase
268
268
  @user.with_if_changed = "encrypt_stuff"
269
269
  @user.stubs(:instance_variable_get).returns(nil)
270
270
  @user.stubs(:instance_variable_set).raises("BadStuff")
271
- assert_raise RuntimeError do
271
+ assert_raises RuntimeError do
272
272
  @user.with_if_changed
273
273
  end
274
274
 
@@ -5,7 +5,7 @@ require File.expand_path('../test_helper', __FILE__)
5
5
  # migrating to new versions of this gem. This ensures that future versions of
6
6
  # this gem will retain backwards compatibility with data generated by earlier
7
7
  # versions.
8
- class LegacyCompatibilityTest < Test::Unit::TestCase
8
+ class LegacyCompatibilityTest < Minitest::Test
9
9
  class LegacyNonmarshallingPet < ActiveRecord::Base
10
10
  PET_NICKNAME_SALT = Digest::SHA256.hexdigest('my-really-really-secret-pet-nickname-salt')
11
11
  PET_NICKNAME_KEY = 'my-really-really-secret-pet-nickname-key'
@@ -22,7 +22,7 @@ end
22
22
 
23
23
  DataMapper.auto_migrate!
24
24
 
25
- class LegacyDataMapperTest < Test::Unit::TestCase
25
+ class LegacyDataMapperTest < Minitest::Test
26
26
 
27
27
  def setup
28
28
  LegacyClient.all.each(&:destroy)
@@ -31,16 +31,16 @@ class LegacyDataMapperTest < Test::Unit::TestCase
31
31
  def test_should_encrypt_email
32
32
  @client = LegacyClient.new :email => 'test@example.com'
33
33
  assert @client.save
34
- assert_not_nil @client.encrypted_email
35
- assert_not_equal @client.email, @client.encrypted_email
34
+ refute_nil @client.encrypted_email
35
+ refute_equal @client.email, @client.encrypted_email
36
36
  assert_equal @client.email, LegacyClient.first.email
37
37
  end
38
38
 
39
39
  def test_should_marshal_and_encrypt_credentials
40
40
  @client = LegacyClient.new
41
41
  assert @client.save
42
- assert_not_nil @client.encrypted_credentials
43
- assert_not_equal @client.credentials, @client.encrypted_credentials
42
+ refute_nil @client.encrypted_credentials
43
+ refute_equal @client.credentials, @client.encrypted_credentials
44
44
  assert_equal @client.credentials, LegacyClient.first.credentials
45
45
  assert LegacyClient.first.credentials.is_a?(Hash)
46
46
  end
@@ -18,7 +18,7 @@ class LegacyHuman < Sequel::Model(:legacy_humans)
18
18
  end
19
19
  end
20
20
 
21
- class LegacySequelTest < Test::Unit::TestCase
21
+ class LegacySequelTest < Minitest::Test
22
22
 
23
23
  def setup
24
24
  LegacyHuman.all.each(&:destroy)
@@ -27,16 +27,16 @@ class LegacySequelTest < Test::Unit::TestCase
27
27
  def test_should_encrypt_email
28
28
  @human = LegacyHuman.new :email => 'test@example.com'
29
29
  assert @human.save
30
- assert_not_nil @human.encrypted_email
31
- assert_not_equal @human.email, @human.encrypted_email
30
+ refute_nil @human.encrypted_email
31
+ refute_equal @human.email, @human.encrypted_email
32
32
  assert_equal @human.email, LegacyHuman.first.email
33
33
  end
34
34
 
35
35
  def test_should_marshal_and_encrypt_credentials
36
36
  @human = LegacyHuman.new
37
37
  assert @human.save
38
- assert_not_nil @human.encrypted_credentials
39
- assert_not_equal @human.credentials, @human.encrypted_credentials
38
+ refute_nil @human.encrypted_credentials
39
+ refute_equal @human.credentials, @human.encrypted_credentials
40
40
  assert_equal @human.credentials, LegacyHuman.first.credentials
41
41
  assert LegacyHuman.first.credentials.is_a?(Hash)
42
42
  end
@@ -22,7 +22,7 @@ class Human < Sequel::Model(:humans)
22
22
  end
23
23
  end
24
24
 
25
- class SequelTest < Test::Unit::TestCase
25
+ class SequelTest < Minitest::Test
26
26
 
27
27
  def setup
28
28
  Human.all.each(&:destroy)
@@ -31,8 +31,8 @@ class SequelTest < Test::Unit::TestCase
31
31
  def test_should_encrypt_email
32
32
  @human = Human.new :email => 'test@example.com'
33
33
  assert @human.save
34
- assert_not_nil @human.encrypted_email
35
- assert_not_equal @human.email, @human.encrypted_email
34
+ refute_nil @human.encrypted_email
35
+ refute_equal @human.email, @human.encrypted_email
36
36
  assert_equal @human.email, Human.first.email
37
37
  end
38
38
 
@@ -40,8 +40,8 @@ class SequelTest < Test::Unit::TestCase
40
40
 
41
41
  @human = Human.new :credentials => { :username => 'example', :password => 'test' }
42
42
  assert @human.save
43
- assert_not_nil @human.encrypted_credentials
44
- assert_not_equal @human.credentials, @human.encrypted_credentials
43
+ refute_nil @human.encrypted_credentials
44
+ refute_equal @human.credentials, @human.encrypted_credentials
45
45
  assert_equal @human.credentials, Human.first.credentials
46
46
  assert Human.first.credentials.is_a?(Hash)
47
47
  end
@@ -12,7 +12,11 @@ if RUBY_VERSION >= '1.9.3'
12
12
  end
13
13
  end
14
14
 
15
- require 'test/unit'
15
+ require 'minitest'
16
+ require "codeclimate-test-reporter"
17
+ CodeClimate::TestReporter.start
18
+
19
+ require 'minitest/autorun'
16
20
  require 'digest/sha2'
17
21
  require 'rubygems'
18
22
  gem 'activerecord', ENV['ACTIVE_RECORD_VERSION'] if ENV['ACTIVE_RECORD_VERSION']
metadata CHANGED
@@ -1,17 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_encrypted
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
4
+ version: 1.3.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Sean Huber
9
9
  - S. Brent Faulkner
10
10
  - William Monk
11
+ - Stephen Aghaulor
11
12
  autorequire:
12
13
  bindir: bin
13
14
  cert_chain: []
14
- date: 2014-08-27 00:00:00.000000000 Z
15
+ date: 2015-05-11 00:00:00.000000000 Z
15
16
  dependencies:
16
17
  - !ruby/object:Gem::Dependency
17
18
  name: encryptor
@@ -45,6 +46,22 @@ dependencies:
45
46
  - - ! '>='
46
47
  - !ruby/object:Gem::Version
47
48
  version: 2.0.0
49
+ - !ruby/object:Gem::Dependency
50
+ name: minitest
51
+ requirement: !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
48
65
  - !ruby/object:Gem::Dependency
49
66
  name: datamapper
50
67
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +195,7 @@ email:
178
195
  - shuber@huberry.com
179
196
  - sbfaulkner@gmail.com
180
197
  - billy.monk@gmail.com
198
+ - saghaulor@gmail.com
181
199
  executables: []
182
200
  extensions: []
183
201
  extra_rdoc_files: []
@@ -218,15 +236,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
218
236
  - - ! '>='
219
237
  - !ruby/object:Gem::Version
220
238
  version: '0'
239
+ segments:
240
+ - 0
241
+ hash: -1997953751590493696
221
242
  required_rubygems_version: !ruby/object:Gem::Requirement
222
243
  none: false
223
244
  requirements:
224
245
  - - ! '>='
225
246
  - !ruby/object:Gem::Version
226
247
  version: '0'
248
+ segments:
249
+ - 0
250
+ hash: -1997953751590493696
227
251
  requirements: []
228
252
  rubyforge_project:
229
- rubygems_version: 1.8.23
253
+ rubygems_version: 1.8.23.2
230
254
  signing_key:
231
255
  specification_version: 3
232
256
  summary: Encrypt and decrypt attributes