shuber-attr_encrypted 1.0.4 → 1.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +4 -0
- data/README.markdown +7 -7
- data/lib/huberry/attr_encrypted/adapters/sequel.rb +19 -0
- data/lib/huberry/attr_encrypted/class.rb +1 -1
- data/test/data_mapper_test.rb +10 -10
- data/test/sequel_test.rb +46 -0
- data/test/test_helper.rb +2 -0
- metadata +3 -1
data/CHANGELOG
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
* Remove read_attribute and write_attribute methods - unnecessary
|
3
3
|
* ActiveRecord and DataMapper extensions are now "adapters"
|
4
4
|
* Check for existing reader and writer methods separately before creating default ones for encrypted attributes
|
5
|
+
* Typo: should send(encrypted_attribute_name.to_sym) instead of send(encrypted_attribute_name.to_s)
|
6
|
+
* Add Sequel adapter
|
7
|
+
* Update DataMapper tests
|
8
|
+
* Update README
|
5
9
|
|
6
10
|
2009-01-11 - Sean Huber (shuber@huberry.com)
|
7
11
|
* Update README
|
data/README.markdown
CHANGED
@@ -3,7 +3,7 @@ attr\_encrypted
|
|
3
3
|
|
4
4
|
Generates attr\_accessors that encrypt and decrypt attributes transparently
|
5
5
|
|
6
|
-
Works with ANY class including ActiveRecord and
|
6
|
+
Works with ANY class including ActiveRecord, DataMapper, and Sequel
|
7
7
|
|
8
8
|
|
9
9
|
Installation
|
@@ -261,18 +261,13 @@ Then you'll have these two class methods available for each attribute: `User.enc
|
|
261
261
|
be useful when you're using ActiveRecord (see below).
|
262
262
|
|
263
263
|
|
264
|
-
### DataMapper ###
|
265
|
-
|
266
|
-
For your convenience, the `:encode` and `:marshal` options are set to true by default since you'll be storing everything in a database.
|
267
|
-
|
268
|
-
|
269
264
|
### ActiveRecord ###
|
270
265
|
|
271
266
|
If you're using this gem with ActiveRecord, you get a few extra features:
|
272
267
|
|
273
268
|
#### Default options ####
|
274
269
|
|
275
|
-
|
270
|
+
For your convenience, the `:encode` and `:marshal` options are set to true by default since you'll be storing everything in a database.
|
276
271
|
|
277
272
|
|
278
273
|
#### Dynamic find\_by\_ and scoped\_by\_ methods ####
|
@@ -294,6 +289,11 @@ The dynamic scope methods like `scoped_by_email_and_password` work the same way.
|
|
294
289
|
NOTE: This only works if all records are encrypted with the same encryption key (per attribute).
|
295
290
|
|
296
291
|
|
292
|
+
### DataMapper and Sequel ###
|
293
|
+
|
294
|
+
Just like the default options for ActiveRecord, the `:encode` and `:marshal` options are set to true by default since you'll be storing everything in a database.
|
295
|
+
|
296
|
+
|
297
297
|
Contact
|
298
298
|
-------
|
299
299
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
if defined?(Sequel)
|
2
|
+
module Huberry
|
3
|
+
module AttrEncrypted
|
4
|
+
module Adapters
|
5
|
+
module Sequel
|
6
|
+
protected
|
7
|
+
# Calls attr_encrypted with the options <tt>:encode</tt> and <tt>:marshal</tt> set to true
|
8
|
+
# unless they've already been specified
|
9
|
+
def attr_encrypted(*attrs)
|
10
|
+
options = { :encode => true, :marshal => true }.merge(attrs.last.is_a?(Hash) ? attrs.pop : {})
|
11
|
+
super *(attrs << options)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
Sequel::Model.extend Huberry::AttrEncrypted::Adapters::Sequel
|
19
|
+
end
|
@@ -130,7 +130,7 @@ module Huberry
|
|
130
130
|
|
131
131
|
define_method "#{attribute}" do
|
132
132
|
value = instance_variable_get("@#{attribute}")
|
133
|
-
encrypted_value = send(encrypted_attribute_name.
|
133
|
+
encrypted_value = send(encrypted_attribute_name.to_sym)
|
134
134
|
original_options = [:key, :if, :unless].inject({}) do |hash, option|
|
135
135
|
hash[option] = options[option]
|
136
136
|
options[option] = self.class.send :evaluate_attr_encrypted_option, options[option], self
|
data/test/data_mapper_test.rb
CHANGED
@@ -29,19 +29,19 @@ class DataMapperTest < Test::Unit::TestCase
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_should_encrypt_email
|
32
|
-
@
|
33
|
-
assert @
|
34
|
-
assert_not_nil @
|
35
|
-
assert_not_equal @
|
36
|
-
assert_equal @
|
32
|
+
@client = Client.new :email => 'test@example.com'
|
33
|
+
assert @client.save
|
34
|
+
assert_not_nil @client.encrypted_email
|
35
|
+
assert_not_equal @client.email, @client.encrypted_email
|
36
|
+
assert_equal @client.email, Client.first.email
|
37
37
|
end
|
38
38
|
|
39
39
|
def test_should_marshal_and_encrypt_credentials
|
40
|
-
@
|
41
|
-
assert @
|
42
|
-
assert_not_nil @
|
43
|
-
assert_not_equal @
|
44
|
-
assert_equal @
|
40
|
+
@client = Client.new
|
41
|
+
assert @client.save
|
42
|
+
assert_not_nil @client.encrypted_credentials
|
43
|
+
assert_not_equal @client.credentials, @client.encrypted_credentials
|
44
|
+
assert_equal @client.credentials, Client.first.credentials
|
45
45
|
assert Client.first.credentials.is_a?(Hash)
|
46
46
|
end
|
47
47
|
|
data/test/sequel_test.rb
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
|
3
|
+
DB = Sequel.sqlite
|
4
|
+
|
5
|
+
DB.create_table :humans do
|
6
|
+
primary_key :id
|
7
|
+
column :encrypted_email, :string
|
8
|
+
column :password, :string
|
9
|
+
column :encrypted_credentials, :string
|
10
|
+
column :salt, :string
|
11
|
+
end
|
12
|
+
|
13
|
+
class Human < Sequel::Model(:humans)
|
14
|
+
attr_encrypted :email, :key => 'a secret key'
|
15
|
+
attr_encrypted :credentials, :key => Proc.new { |human| Huberry::Encryptor.encrypt(:value => human.salt, :key => 'some private key') }
|
16
|
+
|
17
|
+
def after_initialize(attrs = {})
|
18
|
+
self.salt ||= Digest::SHA1.hexdigest((Time.now.to_i * rand(5)).to_s)
|
19
|
+
self.credentials ||= { :username => 'example', :password => 'test' }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class SequelTest < Test::Unit::TestCase
|
24
|
+
|
25
|
+
def setup
|
26
|
+
Human.all.each(&:destroy)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_should_encrypt_email
|
30
|
+
@human = Human.new :email => 'test@example.com'
|
31
|
+
assert @human.save
|
32
|
+
assert_not_nil @human.encrypted_email
|
33
|
+
assert_not_equal @human.email, @human.encrypted_email
|
34
|
+
assert_equal @human.email, Human.first.email
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_should_marshal_and_encrypt_credentials
|
38
|
+
@human = Human.new
|
39
|
+
assert @human.save
|
40
|
+
assert_not_nil @human.encrypted_credentials
|
41
|
+
assert_not_equal @human.credentials, @human.encrypted_credentials
|
42
|
+
assert_equal @human.credentials, Human.first.credentials
|
43
|
+
assert Human.first.credentials.is_a?(Hash)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -6,10 +6,12 @@ gem 'shuber-eigenclass', '>= 1.0.1'
|
|
6
6
|
gem 'shuber-encryptor'
|
7
7
|
gem 'activerecord'
|
8
8
|
gem 'datamapper'
|
9
|
+
gem 'sequel'
|
9
10
|
|
10
11
|
require 'eigenclass'
|
11
12
|
require 'encryptor'
|
12
13
|
require 'active_record'
|
13
14
|
require 'datamapper'
|
15
|
+
require 'sequel'
|
14
16
|
|
15
17
|
require File.dirname(__FILE__) + '/../lib/attr_encrypted'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shuber-attr_encrypted
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Huber
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- lib/attr_encrypted.rb
|
44
44
|
- lib/huberry/attr_encrypted/adapters/active_record.rb
|
45
45
|
- lib/huberry/attr_encrypted/adapters/data_mapper.rb
|
46
|
+
- lib/huberry/attr_encrypted/adapters/sequel.rb
|
46
47
|
- lib/huberry/attr_encrypted/class.rb
|
47
48
|
- lib/huberry/attr_encrypted/object.rb
|
48
49
|
- MIT-LICENSE
|
@@ -82,3 +83,4 @@ test_files:
|
|
82
83
|
- test/active_record_test.rb
|
83
84
|
- test/attr_encrypted_test.rb
|
84
85
|
- test/data_mapper_test.rb
|
86
|
+
- test/sequel_test.rb
|