encrypted_attributes 0.0.1 → 0.0.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/CHANGELOG +15 -0
- data/README +11 -11
- data/Rakefile +5 -5
- data/lib/encrypted_attributes/extensions/encryptor.rb +2 -2
- data/lib/encrypted_attributes/extensions/sha_encryptor.rb +28 -28
- data/lib/encrypted_attributes.rb +73 -73
- data/test/{app_root/test/fixtures → fixtures}/users.yml +0 -0
- data/test/unit/encrypted_attributes_test.rb +1 -1
- data/test/unit/encryptor_test.rb +1 -1
- data/test/unit/sha_encryptor_test.rb +1 -1
- metadata +18 -18
data/CHANGELOG
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
*SVN*
|
2
|
+
|
3
|
+
*0.0.2* (September 26th, 2007)
|
4
|
+
|
5
|
+
* Move test fixtures out of the test application root directory
|
6
|
+
|
7
|
+
* Convert dos newlines to unix newlines
|
8
|
+
|
9
|
+
*0.0.1* (August 5th, 2007)
|
10
|
+
|
11
|
+
* Official public release
|
12
|
+
|
13
|
+
* Add documentation
|
14
|
+
|
15
|
+
* Refactor unit test names
|
data/README
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= encrypted_attributes
|
2
2
|
|
3
|
-
encrypted_attributes adds support for automatically encrypting ActiveRecord
|
3
|
+
+encrypted_attributes+ adds support for automatically encrypting ActiveRecord
|
4
4
|
attributes.
|
5
5
|
|
6
6
|
== Resources
|
@@ -15,7 +15,7 @@ Wiki
|
|
15
15
|
|
16
16
|
Announcement
|
17
17
|
|
18
|
-
* http://www.pluginaweek.org
|
18
|
+
* http://www.pluginaweek.org
|
19
19
|
|
20
20
|
Source
|
21
21
|
|
@@ -32,10 +32,12 @@ various models and various projects. encrypted_attributes, in association
|
|
32
32
|
with the encrypted_strings plugin, helps make encrypting ActiveRecord
|
33
33
|
attributes easier by automating the process.
|
34
34
|
|
35
|
-
The options that
|
35
|
+
The options that +encrypts+ takes includes all of the encryption options for
|
36
36
|
the specific type of encryptor being used in the encrypted_strings plugin.
|
37
37
|
Therefore, if setting the key for asymmetric encryption, this would be passed
|
38
|
-
into the
|
38
|
+
into the +encrypts+ method. Examples of this are show in the Usage section.
|
39
|
+
|
40
|
+
== Usage
|
39
41
|
|
40
42
|
=== SHA Encryption
|
41
43
|
|
@@ -87,9 +89,9 @@ With custom key files:
|
|
87
89
|
The attribute which stores the unencrypted value is a "virtual" attribute.
|
88
90
|
This means that there is no column with the same name in the database.
|
89
91
|
Instead, the encrypted value is stored in the crypted attributed. By default,
|
90
|
-
this is assumed to be
|
92
|
+
this is assumed to be +crypted_#{attr_name}+. Therefore, if you are encrypting
|
91
93
|
the "password" attribute, the encrypted value would be stored in
|
92
|
-
|
94
|
+
+crypted_password+.
|
93
95
|
|
94
96
|
The crypted attribute name can be customized like so:
|
95
97
|
|
@@ -105,12 +107,10 @@ the various options that can be passed in.
|
|
105
107
|
|
106
108
|
== Testing
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
gem install plugin_test_helper
|
110
|
+
Before you can run any tests, the following gem must be installed:
|
111
|
+
* plugin_test_helper[http://wiki.pluginaweek.org/Plugin_test_helper]
|
112
112
|
|
113
113
|
== Dependencies
|
114
114
|
|
115
115
|
This plugin depends on the presence of the following plugins:
|
116
|
-
|
116
|
+
* encrypted_strings[http://wiki.pluginaweek.org/Encrypted_strings]
|
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ require 'rake/gempackagetask'
|
|
4
4
|
require 'rake/contrib/sshpublisher'
|
5
5
|
|
6
6
|
PKG_NAME = 'encrypted_attributes'
|
7
|
-
PKG_VERSION = '0.0.
|
7
|
+
PKG_VERSION = '0.0.2'
|
8
8
|
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
9
9
|
RUBY_FORGE_PROJECT = 'pluginaweek'
|
10
10
|
|
@@ -31,14 +31,14 @@ spec = Gem::Specification.new do |s|
|
|
31
31
|
s.name = PKG_NAME
|
32
32
|
s.version = PKG_VERSION
|
33
33
|
s.platform = Gem::Platform::RUBY
|
34
|
-
s.summary = ''
|
34
|
+
s.summary = 'Adds support for automatically encrypting ActiveRecord attributes'
|
35
35
|
|
36
|
-
s.files = FileList['{lib,tasks,test}/**/*'].to_a + %w(init.rb MIT-LICENSE Rakefile README)
|
36
|
+
s.files = FileList['{lib,tasks,test}/**/*'].to_a + %w(CHANGELOG init.rb MIT-LICENSE Rakefile README)
|
37
37
|
s.require_path = 'lib'
|
38
38
|
s.autorequire = 'encrypted_attributes'
|
39
39
|
s.has_rdoc = true
|
40
|
-
s.add_dependency 'encrypted_strings', '>= 0.0.1'
|
41
40
|
s.test_files = Dir['test/**/*_test.rb']
|
41
|
+
s.add_dependency 'encrypted_strings', '>= 0.0.1'
|
42
42
|
|
43
43
|
s.author = 'Aaron Pfeifer, Neil Abraham'
|
44
44
|
s.email = 'info@pluginaweek.org'
|
@@ -77,4 +77,4 @@ task :release => [:gem, :package] do
|
|
77
77
|
|
78
78
|
ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
|
79
79
|
end
|
80
|
-
end
|
80
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module PluginAWeek #:nodoc:
|
2
|
-
module EncryptedAttributes
|
2
|
+
module EncryptedAttributes
|
3
3
|
module Extensions #:nodoc:
|
4
4
|
module Encryptor #:nodoc:
|
5
5
|
def process_options(model, operation, options)
|
@@ -11,4 +11,4 @@ end
|
|
11
11
|
|
12
12
|
PluginAWeek::EncryptedStrings::Encryptor.class_eval do
|
13
13
|
extend PluginAWeek::EncryptedAttributes::Extensions::Encryptor
|
14
|
-
end
|
14
|
+
end
|
@@ -1,28 +1,28 @@
|
|
1
|
-
module PluginAWeek #:nodoc:
|
2
|
-
module EncryptedAttributes
|
3
|
-
module Extensions #:nodoc:
|
4
|
-
module ShaEncryptor
|
5
|
-
# Adds support for using a salt that is generated based on the model and
|
6
|
-
# stored in an attribute.
|
7
|
-
def process_options(model, operation, options)
|
8
|
-
if (salt_attr_name = options[:salt]) && (salt_attr_name == true || salt_attr_name.is_a?(Symbol))
|
9
|
-
salt_attr_name = 'salt' if salt_attr_name == true
|
10
|
-
|
11
|
-
if operation == :write
|
12
|
-
salt_value = model.send("create_#{salt_attr_name}").to_s
|
13
|
-
model.send("#{salt_attr_name}=", salt_value)
|
14
|
-
else
|
15
|
-
salt_value = model.send(salt_attr_name)
|
16
|
-
end
|
17
|
-
|
18
|
-
options[:salt] = salt_value
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
PluginAWeek::EncryptedStrings::ShaEncryptor.class_eval do
|
27
|
-
extend PluginAWeek::EncryptedAttributes::Extensions::ShaEncryptor
|
28
|
-
end
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module EncryptedAttributes
|
3
|
+
module Extensions #:nodoc:
|
4
|
+
module ShaEncryptor
|
5
|
+
# Adds support for using a salt that is generated based on the model and
|
6
|
+
# stored in an attribute.
|
7
|
+
def process_options(model, operation, options)
|
8
|
+
if (salt_attr_name = options[:salt]) && (salt_attr_name == true || salt_attr_name.is_a?(Symbol))
|
9
|
+
salt_attr_name = 'salt' if salt_attr_name == true
|
10
|
+
|
11
|
+
if operation == :write
|
12
|
+
salt_value = model.send("create_#{salt_attr_name}").to_s
|
13
|
+
model.send("#{salt_attr_name}=", salt_value)
|
14
|
+
else
|
15
|
+
salt_value = model.send(salt_attr_name)
|
16
|
+
end
|
17
|
+
|
18
|
+
options[:salt] = salt_value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
PluginAWeek::EncryptedStrings::ShaEncryptor.class_eval do
|
27
|
+
extend PluginAWeek::EncryptedAttributes::Extensions::ShaEncryptor
|
28
|
+
end
|
data/lib/encrypted_attributes.rb
CHANGED
@@ -1,73 +1,73 @@
|
|
1
|
-
require 'encrypted_strings'
|
2
|
-
require 'encrypted_attributes/extensions/encryptor'
|
3
|
-
require 'encrypted_attributes/extensions/sha_encryptor'
|
4
|
-
|
5
|
-
module PluginAWeek #:nodoc:
|
6
|
-
module EncryptedAttributes
|
7
|
-
def self.included(base) #:nodoc:
|
8
|
-
base.extend(MacroMethods)
|
9
|
-
end
|
10
|
-
|
11
|
-
module MacroMethods
|
12
|
-
# Encrypts the specified attribute.
|
13
|
-
#
|
14
|
-
# Configuration options:
|
15
|
-
# *
|
16
|
-
# *
|
17
|
-
#
|
18
|
-
# For additional configuration options, see the individual encryptor class.
|
19
|
-
def encrypts(attr_name, options = {})
|
20
|
-
mode = options.delete(:mode) || :sha
|
21
|
-
encryptor_class = "PluginAWeek::EncryptedStrings::#{mode.to_s.classify}Encryptor".constantize
|
22
|
-
|
23
|
-
options.reverse_merge!(
|
24
|
-
:crypted_name => "crypted_#{attr_name}"
|
25
|
-
)
|
26
|
-
crypted_attr_name = options.delete(:crypted_name)
|
27
|
-
raise ArgumentError, 'Attribute name cannot be same as crypted name' if attr_name == crypted_attr_name
|
28
|
-
|
29
|
-
# Creator accessor for the virtual attribute
|
30
|
-
attr_accessor attr_name
|
31
|
-
|
32
|
-
# Define the reader when reading the crypted value from the db
|
33
|
-
crypted_var_name = "@#{crypted_attr_name}"
|
34
|
-
define_method(crypted_attr_name) do
|
35
|
-
if (value = read_attribute(crypted_attr_name)) && !value.encrypted?
|
36
|
-
encryptor_options = options.dup
|
37
|
-
encryptor_class.process_options(self, :read, encryptor_options)
|
38
|
-
value.encryptor = encryptor_class.new(encryptor_options)
|
39
|
-
end
|
40
|
-
|
41
|
-
value
|
42
|
-
end
|
43
|
-
|
44
|
-
# Set the value immediately before validation takes place
|
45
|
-
before_validation do |model|
|
46
|
-
value = model.send(attr_name)
|
47
|
-
|
48
|
-
if !value.blank?
|
49
|
-
unless value.encrypted?
|
50
|
-
encryptor_options = options.dup
|
51
|
-
encryptor_class.process_options(model, :write, encryptor_options)
|
52
|
-
value = value.encrypt(mode, encryptor_options)
|
53
|
-
end
|
54
|
-
|
55
|
-
model.send("#{crypted_attr_name}=", value)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# After saving, be sure to reset the virtual attribute value. This also
|
60
|
-
# supported resetting the confirmation field if, for example, the plugin
|
61
|
-
# is being used for passwords
|
62
|
-
after_save do |model|
|
63
|
-
model.send("#{attr_name}=", nil)
|
64
|
-
model.send("#{attr_name}_confirmation=", nil) if model.respond_to?("#{attr_name}_confirmation=")
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
ActiveRecord::Base.class_eval do
|
72
|
-
include PluginAWeek::EncryptedAttributes
|
73
|
-
end
|
1
|
+
require 'encrypted_strings'
|
2
|
+
require 'encrypted_attributes/extensions/encryptor'
|
3
|
+
require 'encrypted_attributes/extensions/sha_encryptor'
|
4
|
+
|
5
|
+
module PluginAWeek #:nodoc:
|
6
|
+
module EncryptedAttributes
|
7
|
+
def self.included(base) #:nodoc:
|
8
|
+
base.extend(MacroMethods)
|
9
|
+
end
|
10
|
+
|
11
|
+
module MacroMethods
|
12
|
+
# Encrypts the specified attribute.
|
13
|
+
#
|
14
|
+
# Configuration options:
|
15
|
+
# * +mode+ - The mode of encryption to use. Default is sha.
|
16
|
+
# * +crypted_name+ - The name of the attribute to store the crypted value in. Default is "crypted_#{attr_name}".
|
17
|
+
#
|
18
|
+
# For additional configuration options, see the individual encryptor class.
|
19
|
+
def encrypts(attr_name, options = {})
|
20
|
+
mode = options.delete(:mode) || :sha
|
21
|
+
encryptor_class = "PluginAWeek::EncryptedStrings::#{mode.to_s.classify}Encryptor".constantize
|
22
|
+
|
23
|
+
options.reverse_merge!(
|
24
|
+
:crypted_name => "crypted_#{attr_name}"
|
25
|
+
)
|
26
|
+
crypted_attr_name = options.delete(:crypted_name)
|
27
|
+
raise ArgumentError, 'Attribute name cannot be same as crypted name' if attr_name == crypted_attr_name
|
28
|
+
|
29
|
+
# Creator accessor for the virtual attribute
|
30
|
+
attr_accessor attr_name
|
31
|
+
|
32
|
+
# Define the reader when reading the crypted value from the db
|
33
|
+
crypted_var_name = "@#{crypted_attr_name}"
|
34
|
+
define_method(crypted_attr_name) do
|
35
|
+
if (value = read_attribute(crypted_attr_name)) && !value.encrypted?
|
36
|
+
encryptor_options = options.dup
|
37
|
+
encryptor_class.process_options(self, :read, encryptor_options)
|
38
|
+
value.encryptor = encryptor_class.new(encryptor_options)
|
39
|
+
end
|
40
|
+
|
41
|
+
value
|
42
|
+
end
|
43
|
+
|
44
|
+
# Set the value immediately before validation takes place
|
45
|
+
before_validation do |model|
|
46
|
+
value = model.send(attr_name)
|
47
|
+
|
48
|
+
if !value.blank?
|
49
|
+
unless value.encrypted?
|
50
|
+
encryptor_options = options.dup
|
51
|
+
encryptor_class.process_options(model, :write, encryptor_options)
|
52
|
+
value = value.encrypt(mode, encryptor_options)
|
53
|
+
end
|
54
|
+
|
55
|
+
model.send("#{crypted_attr_name}=", value)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# After saving, be sure to reset the virtual attribute value. This also
|
60
|
+
# supported resetting the confirmation field if, for example, the plugin
|
61
|
+
# is being used for passwords
|
62
|
+
after_save do |model|
|
63
|
+
model.send("#{attr_name}=", nil)
|
64
|
+
model.send("#{attr_name}_confirmation=", nil) if model.respond_to?("#{attr_name}_confirmation=")
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
ActiveRecord::Base.class_eval do
|
72
|
+
include PluginAWeek::EncryptedAttributes
|
73
|
+
end
|
File without changes
|
data/test/unit/encryptor_test.rb
CHANGED
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.4
|
3
3
|
specification_version: 1
|
4
4
|
name: encrypted_attributes
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0.
|
7
|
-
date: 2007-
|
8
|
-
summary:
|
6
|
+
version: 0.0.2
|
7
|
+
date: 2007-09-26 00:00:00 -04:00
|
8
|
+
summary: Adds support for automatically encrypting ActiveRecord attributes
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: info@pluginaweek.org
|
@@ -29,44 +29,44 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Aaron Pfeifer, Neil Abraham
|
31
31
|
files:
|
32
|
+
- lib/encrypted_attributes.rb
|
32
33
|
- lib/encrypted_attributes
|
33
34
|
- lib/encrypted_attributes/extensions
|
34
|
-
- lib/encrypted_attributes/extensions/encryptor.rb
|
35
35
|
- lib/encrypted_attributes/extensions/sha_encryptor.rb
|
36
|
-
- lib/encrypted_attributes.rb
|
36
|
+
- lib/encrypted_attributes/extensions/encryptor.rb
|
37
|
+
- test/test_helper.rb
|
38
|
+
- test/fixtures
|
37
39
|
- test/app_root
|
40
|
+
- test/keys
|
41
|
+
- test/unit
|
42
|
+
- test/fixtures/users.yml
|
38
43
|
- test/app_root/app
|
44
|
+
- test/app_root/db
|
39
45
|
- test/app_root/app/models
|
40
|
-
- test/app_root/app/models/
|
46
|
+
- test/app_root/app/models/sha_user_with_salt.rb
|
41
47
|
- test/app_root/app/models/confirmed_sha_user.rb
|
48
|
+
- test/app_root/app/models/asymmetric_user.rb
|
42
49
|
- test/app_root/app/models/sha_user.rb
|
43
50
|
- test/app_root/app/models/sha_user_with_custom_crypted_attr.rb
|
51
|
+
- test/app_root/app/models/user.rb
|
44
52
|
- test/app_root/app/models/sha_user_with_custom_salt.rb
|
45
|
-
- test/app_root/app/models/sha_user_with_salt.rb
|
46
53
|
- test/app_root/app/models/symmetric_user.rb
|
47
|
-
- test/app_root/app/models/user.rb
|
48
|
-
- test/app_root/db
|
49
54
|
- test/app_root/db/migrate
|
50
55
|
- test/app_root/db/migrate/001_create_users.rb
|
51
|
-
- test/app_root/test
|
52
|
-
- test/app_root/test/fixtures
|
53
|
-
- test/app_root/test/fixtures/users.yml
|
54
|
-
- test/keys
|
55
56
|
- test/keys/private
|
56
57
|
- test/keys/public
|
57
|
-
- test/test_helper.rb
|
58
|
-
- test/unit
|
59
58
|
- test/unit/encrypted_attributes_test.rb
|
60
|
-
- test/unit/encryptor_test.rb
|
61
59
|
- test/unit/sha_encryptor_test.rb
|
60
|
+
- test/unit/encryptor_test.rb
|
61
|
+
- CHANGELOG
|
62
62
|
- init.rb
|
63
63
|
- MIT-LICENSE
|
64
64
|
- Rakefile
|
65
65
|
- README
|
66
66
|
test_files:
|
67
67
|
- test/unit/encrypted_attributes_test.rb
|
68
|
-
- test/unit/encryptor_test.rb
|
69
68
|
- test/unit/sha_encryptor_test.rb
|
69
|
+
- test/unit/encryptor_test.rb
|
70
70
|
rdoc_options: []
|
71
71
|
|
72
72
|
extra_rdoc_files: []
|