couch_potato-extensions 0.0.4 → 0.0.5

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.
@@ -5,6 +5,6 @@ require File.expand_path(File.dirname(__FILE__) + "/extensions/encrypted_view_sp
5
5
 
6
6
  module CouchPotato
7
7
  module Extensions
8
- VERSION = '0.0.4'
8
+ VERSION = '0.0.5'
9
9
  end
10
10
  end
@@ -2,49 +2,45 @@ require 'bcrypt'
2
2
 
3
3
  module CouchPotato
4
4
  module Extensions
5
- class EncryptedProperty
6
- attr_reader :type, :name
7
-
8
- def initialize(owner, name, options = {})
9
- @type = owner
10
- @name = name
5
+ class EncryptedProperty < CouchPotato::Persistence::SimpleProperty
6
+ def initialize(owner_clazz, name, options = {})
7
+ super
11
8
  @options = options
12
-
13
- define_accessors(name)
14
9
  end
15
10
 
16
- def define_accessors(name)
17
- type.class_eval do
18
- define_method(name) do
19
- instance_variable_get("@#{name}")
20
- end
21
-
22
- define_method("#{name}=") do |value|
23
- instance_variable_set("@#{name}", value)
24
- end
25
- end
26
- end
27
-
28
11
  def build(object, json)
29
12
  value = json[name.to_s].nil? ? json[name.to_sym] : json[name.to_s]
30
13
  object.send "#{name}=", decrypt(value)
14
+ object.instance_variable_set("@encrypted_#{name}", value)
31
15
  end
32
16
 
33
17
  def dirty?(object)
34
- false
18
+ object.send("#{name}_changed?")
35
19
  end
36
20
 
37
21
  def serialize(json, object)
38
- json[name] = encrypt(object.send(name))
22
+ if dirty?(object) or encrypted_value(object).nil?
23
+ json[name] = encrypt(object.send(name))
24
+ else
25
+ json[name] = encrypted_value(object)
26
+ end
27
+ end
28
+
29
+ def value(result, object)
30
+ result[name] = object.send(name)
39
31
  end
40
32
 
41
33
  def encrypt(value)
42
- Base64.encode64(EzCrypto::Key.encrypt_with_password(@options[:password], @options[:salt], value)) if not value.nil?
34
+ Base64.encode64(EzCrypto::Key.encrypt_with_password(@options[:password], @options[:salt], value))
43
35
  end
44
36
 
45
37
  def decrypt(value)
46
38
  EzCrypto::Key.decrypt_with_password(@options[:password], @options[:salt], Base64.decode64(value))
47
39
  end
40
+
41
+ def encrypted_value(object)
42
+ object.instance_variable_get("@encrypted_#{name}")
43
+ end
48
44
  end
49
45
  end
50
46
  end
@@ -23,6 +23,11 @@ describe CouchPotato::Extensions::EncryptedProperty do
23
23
  document = SecureDocument.new(:body => "very important")
24
24
  document.body.should == 'very important'
25
25
  end
26
+
27
+ it "should allow access through the attributes hash" do
28
+ document = SecureDocument.new(:body => "very important")
29
+ document.attributes[:body].should == "very important"
30
+ end
26
31
  end
27
32
 
28
33
  describe "saving documents" do
@@ -34,15 +39,31 @@ describe CouchPotato::Extensions::EncryptedProperty do
34
39
  body.should_not == 'very important'
35
40
  body.should == Base64.encode64(EzCrypto::Key.encrypt_with_password("coffee! more coffee!", "Va7JYeT7t08vMweYU6F6dO", "very important"))
36
41
  end
42
+
43
+ it "should not encrypt an attribute that hasn't changed" do
44
+ @document = document
45
+ CouchPotato.database.save_document document
46
+ @document = CouchPotato.database.load_document(document.id)
47
+ @document.is_dirty
48
+ EzCrypto::Key.should_not_receive(:encrypt_with_password)
49
+ CouchPotato.database.save_document @document
50
+ end
37
51
  end
38
52
 
39
53
  describe "loading documents" do
40
- let(:document) { SecureDocument.new(:body => "very important") }
54
+ let(:document) do
55
+ document = SecureDocument.new(:body => "very important")
56
+ CouchPotato.database.save_document document
57
+ CouchPotato.database.load_document(document.id)
58
+ end
41
59
 
42
60
  it "should decrypt the attributes" do
43
- CouchPotato.database.save_document document
44
- loaded_document = CouchPotato.database.load_document(document.id)
45
- loaded_document.body.should == "very important"
61
+ document.body.should == "very important"
62
+ end
63
+
64
+ it "should not encrypt the data when it was changed" do
65
+ document.instance_variable_get(:@encrypted_body).should_not == nil
46
66
  end
47
67
  end
68
+
48
69
  end
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: couch_potato-extensions
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 0
8
- - 4
9
- version: 0.0.4
4
+ version: 0.0.5
10
5
  platform: ruby
11
6
  authors:
12
7
  - Mathias Meyer
@@ -14,47 +9,39 @@ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
11
 
17
- date: 2010-04-12 00:00:00 +02:00
12
+ date: 2010-04-19 00:00:00 +02:00
18
13
  default_executable:
19
14
  dependencies:
20
15
  - !ruby/object:Gem::Dependency
21
16
  name: couch_potato
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
24
20
  requirements:
25
21
  - - ">="
26
22
  - !ruby/object:Gem::Version
27
- segments:
28
- - 0
29
23
  version: "0"
30
- type: :runtime
31
- version_requirements: *id001
24
+ version:
32
25
  - !ruby/object:Gem::Dependency
33
26
  name: ezcrypto
34
- prerelease: false
35
- requirement: &id002 !ruby/object:Gem::Requirement
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
36
30
  requirements:
37
31
  - - ">="
38
32
  - !ruby/object:Gem::Version
39
- segments:
40
- - 0
41
33
  version: "0"
42
- type: :runtime
43
- version_requirements: *id002
34
+ version:
44
35
  - !ruby/object:Gem::Dependency
45
36
  name: rspec
46
- prerelease: false
47
- requirement: &id003 !ruby/object:Gem::Requirement
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
48
40
  requirements:
49
41
  - - ~>
50
42
  - !ruby/object:Gem::Version
51
- segments:
52
- - 1
53
- - 2
54
- - 9
55
43
  version: 1.2.9
56
- type: :development
57
- version_requirements: *id003
44
+ version:
58
45
  description: See summary, it says it all, trust me.
59
46
  email: meyer@paperplanes.de
60
47
  executables: []
@@ -87,20 +74,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
74
  requirements:
88
75
  - - ">="
89
76
  - !ruby/object:Gem::Version
90
- segments:
91
- - 0
92
77
  version: "0"
78
+ version:
93
79
  required_rubygems_version: !ruby/object:Gem::Requirement
94
80
  requirements:
95
81
  - - ">="
96
82
  - !ruby/object:Gem::Version
97
- segments:
98
- - 0
99
83
  version: "0"
84
+ version:
100
85
  requirements: []
101
86
 
102
87
  rubyforge_project:
103
- rubygems_version: 1.3.6
88
+ rubygems_version: 1.3.5
104
89
  signing_key:
105
90
  specification_version: 3
106
91
  summary: Some extensions for CouchPotato, because more awesome is always a good thing.