active_crypto_test.rb
4.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
$:.unshift(File.dirname(__FILE__) + "/../lib/")
require File.join(File.dirname(__FILE__), 'test_helper')
require 'test/unit'
require 'active_crypto'
class User < ActiveRecord::Base
has_many :secrets
has_many :groups
keyholder
end
class Secret < ActiveRecord::Base
encrypt :name,:email, :key=>:user, :base64=>true
belongs_to :user
has_many :children
end
class Child < ActiveRecord::Base
encrypt :email, :key=>:secret, :base64=>true
belongs_to :secret
end
class Asset<ActiveRecord::Base
encrypt :title, :base64=>true
has_many :caps,:dependent=>:destroy
def self.create(title,email)
asset=Asset.new
asset.set_session_key(EzCrypto::Key.generate)
asset.title=title
if asset.save
asset.share(email)
else
nil
end
end
def share(email=nil)
Cap.create_for_asset(self,email)
end
end
class AssetRaw<ActiveRecord::Base
set_table_name "assets"
end
class Cap < ActiveRecord::Base
belongs_to :asset
encrypt :shared_key, :base64=>true
def self.find_by_key(cap_key)
cap_key.chop
hash=Digest::SHA1.hexdigest(cap_key)
if (cap_key.length>=20) # Sanity check
cap=self.find_by_key_hash(hash)
if cap
cap.set_encoded_key(cap_key)
cap.asset.set_encoded_key(cap.shared_key)
cap
end
else
nil
end
end
def self.create_for_asset(asset,email=nil)
cap=Cap.new
cap.email=email if email
cap.asset=asset
if cap.save
cap.set_session_key(EzCrypto::Key.generate)
cap_key=cap.session_key.encode
cap.key_hash=Digest::SHA1.hexdigest(cap_key)
cap.shared_key=asset.session_key.encode
cap.save
cap_key
else
nil
end
end
end
class Group < ActiveRecord::Base
belongs_to :user
has_many :group_secrets
encrypt :name,:group_key, :key=>:user , :base64=>true
end
class GroupSecret < ActiveRecord::Base
belongs_to :group
encrypt :title,:body, :key=>:group, :base64=>true
end
class ActiveCryptoTest < Test::Unit::TestCase
def setup
end
def test_key_holder_in_record
user=User.new
user.name="bob"
user.save
assert user.kind_of?(ActiveCrypto::KeyHolder)
assert user.kind_of?(ActiveRecord::Base)
assert user.kind_of?(User)
assert_nil user.session_key
user.enter_password "shhcccc"
assert_not_nil user.session_key
assert_not_nil user.session_key.encrypt("test")
end
def test_encrypted_child
user=User.new
user.save
assert_nil user.session_key
user.enter_password "shhcccc"
assert_not_nil user.session_key
assert user.kind_of?(ActiveCrypto::KeyHolder)
assert user.kind_of?(ActiveRecord::Base)
assert user.kind_of?(User)
jill=user.secrets.create
assert_not_nil jill
assert jill.kind_of?(ActiveCrypto::AssociationKeyHolder)
assert jill.kind_of?(ActiveCrypto::KeyHolder)
assert jill.kind_of?(ActiveCrypto::Encrypted)
assert jill.kind_of?(ActiveRecord::Base)
assert jill.kind_of?(Secret)
assert jill.respond_to?(:session_key)
assert_not_nil jill.user
assert_not_nil jill.user.session_key
assert_not_nil jill.session_key
assert_equal user.session_key,jill.session_key
jill.name="jill"
jill.save
assert_equal "jill",jill.name
jill=user.secrets.first
assert_not_nil jill.session_key
assert_equal user.session_key,jill.session_key
assert_equal "jill",jill.name
child=jill.children.create
child.email="pelle@neubia.com"
child.save
assert_not_nil child.secret
assert_not_nil child.secret.session_key
assert_not_nil child.session_key
assert_equal user.session_key,child.session_key
assert_equal "pelle@neubia.com",child.email
child=jill.children.first
assert_not_nil child.secret
assert_not_nil child.secret.session_key
assert_not_nil child.session_key
assert_equal user.session_key,child.session_key
assert_equal "pelle@neubia.com",child.email
end
def test_caps
key=Asset.create("title","pelle@neubia.com")
assert_not_nil key
cap=Cap.find_by_key key
assert_not_nil cap
assert_not_nil cap.asset
assert_equal "title",cap.asset.title
assert_equal "title",cap.asset["title"]
assert_equal "pelle@neubia.com",cap.email
assert_equal "pelle@neubia.com",cap["email"]
# Non decrypting version
raw=AssetRaw.find cap.asset.id
assert_not_equal "title",raw.title
assert_not_equal "title",raw["title"]
bob_key=cap.asset.share("bob@bob.com")
bob_cap=Cap.find_by_key bob_key
assert_not_equal key,bob_key
assert_not_nil bob_cap
assert_not_nil bob_cap.asset
assert_equal "title",bob_cap.asset.title
assert_equal "bob@bob.com",bob_cap.email
end
end