attr_secure 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 02085a6f851168ff8987fc2a80c883410a50f77b
4
- data.tar.gz: 7b89f0a4cb405aba7db25e13928d595cbc11ac3c
3
+ metadata.gz: 6587948291c3a27b3b2d8b6d4510668b5fe2d7b0
4
+ data.tar.gz: 63313a924a9b32dffdc259ee965a45e4dfc20db3
5
5
  SHA512:
6
- metadata.gz: a3b0bd5b42782f0d5f30d0c134853217b4b565e6f944106c341cd7a827920b433f4016c748bf6abc15cab3c81bfdb00562fc9636fe00abe1c5f851533c810f7a
7
- data.tar.gz: 8051093176e391da5b56452e8d4a93170875017eb3b87ed83bf8dfdd7f633a62beda70106c012d87b0a1d056614f97d84f2127b171a8bf7b437d4219df99d015
6
+ metadata.gz: ca1c7c4d1868b2d980c47dbab3cda9ec2fc9ec71101bcd591aa2f241f96acfe6fc9a95382cb120a8c0def0b8f2faa38095443fa3e3ca541f54fd557a9bd59fee
7
+ data.tar.gz: 5a39de22e1ec572862abf2c4d78e70b26c372a553b36c63c760e168c007daea6636dba1a2ffabe48f0f01a8c9f69d4f61e98b085d4085f3a9ff9834d481053f4
data/.travis.yml ADDED
@@ -0,0 +1,11 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - jruby-19mode
6
+
7
+ matrix:
8
+ allow_failures:
9
+ - rvm: jruby-19mode
10
+
11
+ script: rspec spec
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # attr_secure
2
2
 
3
+ [![Build Status](https://travis-ci.org/neilmiddleton/attr_secure.png?branch=master)](https://travis-ci.org/neilmiddleton/attr_secure)
4
+
3
5
  Securely stores ActiveRecord attributes for a given model/attribute and a predefined secret.
4
6
 
5
7
  ```
data/Rakefile CHANGED
@@ -1 +1,8 @@
1
1
  require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new do |t|
5
+ t.libs.push "lib"
6
+ t.test_files = FileList['test/*_test.rb']
7
+ t.verbose = true
8
+ end
data/attr_secure.gemspec CHANGED
@@ -18,9 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rake"
21
+ spec.add_development_dependency "rspec"
23
22
 
24
23
  spec.add_dependency 'fernet'
25
- spec.add_dependency 'activesupport', ' ~> 3.2.0'
24
+ spec.add_dependency 'activerecord', ' ~> 3.2.0'
26
25
  end
@@ -0,0 +1,25 @@
1
+ module AttrSecure
2
+ class Secure
3
+
4
+ def encrypt(value)
5
+ Fernet.generate(attr_secure_secret) do |generator|
6
+ generator.data = { value: value }
7
+ end
8
+ end
9
+
10
+ def decrypt(value)
11
+ return nil if value.nil?
12
+ verifier = Fernet.verifier(attr_secure_secret, value)
13
+ verifier.data["value"] if verifier.valid?
14
+ end
15
+
16
+ private
17
+ def env!(key)
18
+ ENV.fetch(key) { raise("Missing ENV(#{key})") }
19
+ end
20
+
21
+ def attr_secure_secret
22
+ env!('ATTR_SECURE_SECRET')
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module AttrSecure
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
data/lib/attr_secure.rb CHANGED
@@ -1,42 +1,24 @@
1
1
  require "attr_secure/version"
2
2
  require 'fernet'
3
+ require 'active_record'
4
+
5
+ require 'attr_secure/secure'
3
6
 
4
7
  Fernet::Configuration.run do |config|
5
8
  config.enforce_ttl = false
6
9
  end
7
10
 
8
11
  module AttrSecure
9
- extend ActiveSupport::Concern
10
-
11
- def env!(key)
12
- ENV[key] || raise("Missing ENV(#{key})")
13
- end
14
12
 
15
- def encrypt(value)
16
- Fernet.generate(env!('ATTR_SECURE_SECRET')) do |generator|
17
- generator.data = { value: value }
13
+ def attr_secure(attribute)
14
+ define_method("#{attribute}=") do |value|
15
+ write_attribute(attribute, Secure.new.encrypt(value.nil? ? nil : value.to_sym))
18
16
  end
19
- end
20
17
 
21
- def decrypt(value)
22
- return nil if value.nil?
23
- verifier = Fernet.verifier(env!('ATTR_SECURE_SECRET'), value)
24
- verifier.data["value"] if verifier.valid?
25
- end
26
-
27
- module ClassMethods
28
-
29
- def attr_secure(attribute)
30
- define_method("#{attribute}=") do |value|
31
- write_attribute(attribute, encrypt(value.nil? ? nil : value.to_sym))
32
- end
33
-
34
- define_method("#{attribute}") do
35
- decrypt read_attribute(attribute.to_sym)
36
- end
18
+ define_method("#{attribute}") do
19
+ Secure.new.decrypt read_attribute(attribute.to_sym)
37
20
  end
38
-
39
21
  end
40
22
  end
41
23
 
42
- ActiveRecord::Base.send(:include, AttrSecure)
24
+ ActiveRecord::Base.send(:extend, AttrSecure)
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+
3
+ class FakeModelWithSecureAttributes
4
+ extend AttrSecure
5
+ attr_accessor :attributes
6
+
7
+ attr_secure :foo
8
+
9
+ def initialize(attributes={})
10
+ @attributes = attributes
11
+ end
12
+
13
+ def read_attribute(attr_name)
14
+ attributes[attr_name]
15
+ end
16
+
17
+ def write_attribute(attr_name, value)
18
+ attributes[attr_name] = value
19
+ end
20
+ end
21
+
22
+
23
+ ENV['ATTR_SECURE_SECRET'] = 'xxx'
24
+
25
+ describe AttrSecure do
26
+ subject { FakeModelWithSecureAttributes.new }
27
+
28
+ it 'encrypts' do
29
+ encrypter = lambda { |secret|
30
+ assert_equal 'xxx', secret
31
+ 'world'
32
+ }
33
+
34
+ Fernet.stub :generate, encrypter do |f|
35
+ subject.foo = 'hello'
36
+ expect(subject.attributes[:foo]).to eq('world')
37
+ end
38
+ end
39
+
40
+ it 'decrypts' do
41
+ decrypter_mock = double(Object)
42
+ decrypter_mock.stub(:valid?) { true }
43
+ decrypter_mock.stub(:data) { {'value' => 'world'} }
44
+
45
+ Fernet.stub(:generate, 'world') do
46
+ Fernet.stub(:verifier, decrypter_mock) do
47
+ subject.foo = 'hello'
48
+ expect(subject.foo).to eq('world')
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,13 @@
1
+ require 'attr_secure'
2
+
3
+ RSpec.configure do |config|
4
+ config.treat_symbols_as_metadata_keys_with_true_values = true
5
+ config.run_all_when_everything_filtered = true
6
+ config.filter_run :focus
7
+
8
+ config.order = 'random'
9
+
10
+ config.expect_with :rspec do |c|
11
+ c.syntax = :expect
12
+ end
13
+ end
metadata CHANGED
@@ -1,31 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attr_secure
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Neil Middleton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-05-30 00:00:00.000000000 Z
11
+ date: 2013-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: bundler
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ~>
18
- - !ruby/object:Gem::Version
19
- version: '1.3'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ~>
25
- - !ruby/object:Gem::Version
26
- version: '1.3'
27
- - !ruby/object:Gem::Dependency
28
- name: rake
14
+ name: rspec
29
15
  requirement: !ruby/object:Gem::Requirement
30
16
  requirements:
31
17
  - - '>='
@@ -53,7 +39,7 @@ dependencies:
53
39
  - !ruby/object:Gem::Version
54
40
  version: '0'
55
41
  - !ruby/object:Gem::Dependency
56
- name: activesupport
42
+ name: activerecord
57
43
  requirement: !ruby/object:Gem::Requirement
58
44
  requirements:
59
45
  - - ~>
@@ -74,13 +60,17 @@ extensions: []
74
60
  extra_rdoc_files: []
75
61
  files:
76
62
  - .gitignore
63
+ - .travis.yml
77
64
  - Gemfile
78
65
  - LICENSE.txt
79
66
  - README.md
80
67
  - Rakefile
81
68
  - attr_secure.gemspec
82
69
  - lib/attr_secure.rb
70
+ - lib/attr_secure/secure.rb
83
71
  - lib/attr_secure/version.rb
72
+ - spec/attr_secure_spec.rb
73
+ - spec/spec_helper.rb
84
74
  homepage: http://www.neilmiddleton.com
85
75
  licenses:
86
76
  - MIT
@@ -101,8 +91,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
101
91
  version: '0'
102
92
  requirements: []
103
93
  rubyforge_project:
104
- rubygems_version: 2.0.0
94
+ rubygems_version: 2.0.2
105
95
  signing_key:
106
96
  specification_version: 4
107
97
  summary: Securely stores activerecord model attributes
108
- test_files: []
98
+ test_files:
99
+ - spec/attr_secure_spec.rb
100
+ - spec/spec_helper.rb