ezcrypto2 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.
- checksums.yaml +7 -0
- data/CHANGELOG +85 -0
- data/MIT-LICENSE +21 -0
- data/README.rdoc +152 -0
- data/README_ACTIVE_CRYPTO +122 -0
- data/README_DIGITAL_SIGNATURES +55 -0
- data/init.rb +1 -0
- data/lib/active_crypto.rb +325 -0
- data/lib/ezcrypto2.rb +610 -0
- data/lib/ezsig.rb +535 -0
- data/lib/trusted.pem +2363 -0
- data/rakefile +200 -0
- data/test/active_crypto_test.rb +211 -0
- data/test/agree2.com.cert +31 -0
- data/test/association_key_holder_test.rb +38 -0
- data/test/database.yml +18 -0
- data/test/digest_test.rb +51 -0
- data/test/dsakey.pem +12 -0
- data/test/dsapubkey.pem +12 -0
- data/test/dsig_test.rb +288 -0
- data/test/encrypt_test.rb +41 -0
- data/test/ezcrypto_test.rb +212 -0
- data/test/key_holder_test.rb +44 -0
- data/test/protectedsigner.pem +12 -0
- data/test/sf_intermediate.crt +29 -0
- data/test/test_helper.rb +35 -0
- data/test/testchild.pem +15 -0
- data/test/testchild.req +12 -0
- data/test/testpub.pem +4 -0
- data/test/testsigner.cert +20 -0
- data/test/testsigner.pem +9 -0
- data/test/valicert_class2_root.crt +18 -0
- metadata +99 -0
data/rakefile
ADDED
@@ -0,0 +1,200 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'rake/testtask'
|
4
|
+
require 'rake/rdoctask'
|
5
|
+
require 'rake/packagetask'
|
6
|
+
require 'rake/gempackagetask'
|
7
|
+
require 'rake/contrib/rubyforgepublisher'
|
8
|
+
|
9
|
+
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
|
10
|
+
PKG_NAME = 'ezcrypto'
|
11
|
+
PKG_VERSION = '0.7.2' + PKG_BUILD
|
12
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
13
|
+
|
14
|
+
RELEASE_NAME = "REL #{PKG_VERSION}"
|
15
|
+
|
16
|
+
RUBY_FORGE_PROJECT = "ezcrypto"
|
17
|
+
RUBY_FORGE_USER = "pelleb"
|
18
|
+
|
19
|
+
desc "Default Task"
|
20
|
+
task :default => [ :test ]
|
21
|
+
|
22
|
+
# Run the unit tests
|
23
|
+
Rake::TestTask.new { |t|
|
24
|
+
t.libs << "test"
|
25
|
+
t.pattern = 'test/*_test.rb'
|
26
|
+
t.verbose = true
|
27
|
+
}
|
28
|
+
|
29
|
+
|
30
|
+
# Genereate the RDoc documentation
|
31
|
+
Rake::RDocTask.new { |rdoc|
|
32
|
+
rdoc.rdoc_dir = 'doc'
|
33
|
+
rdoc.title = "EzCrypto - Simplified Crypto Library"
|
34
|
+
# rdoc.options << '--line-numbers --inline-source --main README #--template=jamis'
|
35
|
+
rdoc.template = "#{ENV['template']}.rb" if ENV['template']
|
36
|
+
rdoc.rdoc_files.include('README.rdoc')
|
37
|
+
rdoc.rdoc_files.include('README_ACTIVE_CRYPTO')
|
38
|
+
rdoc.rdoc_files.include('README_DIGITAL_SIGNATURES')
|
39
|
+
rdoc.rdoc_files.include('CHANGELOG')
|
40
|
+
rdoc.rdoc_files.include('lib/*.rb')
|
41
|
+
}
|
42
|
+
|
43
|
+
|
44
|
+
# Create compressed packages
|
45
|
+
spec = Gem::Specification.new do |s|
|
46
|
+
s.platform = Gem::Platform::RUBY
|
47
|
+
s.name = PKG_NAME
|
48
|
+
s.summary = "Simplified encryption library."
|
49
|
+
s.description = %q{Makes it easier and safer to write crypto code.}
|
50
|
+
s.version = PKG_VERSION
|
51
|
+
|
52
|
+
s.author = "Pelle Braendgaard"
|
53
|
+
s.email = "pelle@stakeventures.com"
|
54
|
+
s.rubyforge_project = "ezcrypto"
|
55
|
+
s.homepage = "http://ezcrypto.rubyforge.org"
|
56
|
+
|
57
|
+
|
58
|
+
s.has_rdoc = true
|
59
|
+
s.requirements << 'none'
|
60
|
+
s.require_path = 'lib'
|
61
|
+
|
62
|
+
s.files = [ "rakefile", "README.rdoc", "README_ACTIVE_CRYPTO", "README_DIGITAL_SIGNATURES", "MIT-LICENSE","CHANGELOG","init.rb" ]
|
63
|
+
["lib","test"].each do |dir|
|
64
|
+
s.files = s.files + Dir.glob( "#{dir}/*" )
|
65
|
+
end
|
66
|
+
s.extra_rdoc_files = ["CHANGELOG", "README.rdoc","README_ACTIVE_CRYPTO","README_DIGITAL_SIGNATURES"]
|
67
|
+
s.test_files = Dir.glob("test/*")
|
68
|
+
end
|
69
|
+
|
70
|
+
Rake::GemPackageTask.new(spec) do |p|
|
71
|
+
p.gem_spec = spec
|
72
|
+
p.need_tar = true
|
73
|
+
p.need_zip = true
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
desc "Publish the GEM"
|
78
|
+
task :pgem => [:package] do
|
79
|
+
Rake::SshFilePublisher.new("pelleb@rubyforge.org", "/var/www/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Publish the API documentation"
|
83
|
+
task :pdoc => [:rdoc] do
|
84
|
+
Rake::SshDirPublisher.new("pelleb@rubyforge.org", "/var/www/gforge-projects/ezcrypto", "doc").upload
|
85
|
+
end
|
86
|
+
|
87
|
+
desc "Publish the release files to RubyForge."
|
88
|
+
task :rubyforge_upload => :package do
|
89
|
+
files = %w(gem tgz zip).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
|
90
|
+
|
91
|
+
if RUBY_FORGE_PROJECT then
|
92
|
+
require 'net/http'
|
93
|
+
require 'open-uri'
|
94
|
+
|
95
|
+
project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
|
96
|
+
project_data = open(project_uri) { |data| data.read }
|
97
|
+
group_id = project_data[/[?&]group_id=(\d+)/, 1]
|
98
|
+
raise "Couldn't get group id" unless group_id
|
99
|
+
|
100
|
+
# This echos password to shell which is a bit sucky
|
101
|
+
if ENV["RUBY_FORGE_PASSWORD"]
|
102
|
+
password = ENV["RUBY_FORGE_PASSWORD"]
|
103
|
+
else
|
104
|
+
print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
|
105
|
+
password = STDIN.gets.chomp
|
106
|
+
end
|
107
|
+
|
108
|
+
login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
109
|
+
data = [
|
110
|
+
"login=1",
|
111
|
+
"form_loginname=#{RUBY_FORGE_USER}",
|
112
|
+
"form_pw=#{password}"
|
113
|
+
].join("&")
|
114
|
+
http.post("/account/login.php", data)
|
115
|
+
end
|
116
|
+
|
117
|
+
cookie = login_response["set-cookie"]
|
118
|
+
raise "Login failed" unless cookie
|
119
|
+
headers = { "Cookie" => cookie }
|
120
|
+
|
121
|
+
release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
|
122
|
+
release_data = open(release_uri, headers) { |data| data.read }
|
123
|
+
package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
124
|
+
raise "Couldn't get package id" unless package_id
|
125
|
+
|
126
|
+
first_file = true
|
127
|
+
release_id = ""
|
128
|
+
|
129
|
+
files.each do |filename|
|
130
|
+
basename = File.basename(filename)
|
131
|
+
file_ext = File.extname(filename)
|
132
|
+
file_data = File.open(filename, "rb") { |file| file.read }
|
133
|
+
|
134
|
+
puts "Releasing #{basename}..."
|
135
|
+
|
136
|
+
release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
137
|
+
release_date = Time.now.strftime("%Y-%m-%d %H:%M")
|
138
|
+
type_map = {
|
139
|
+
".zip" => "3000",
|
140
|
+
".tgz" => "3110",
|
141
|
+
".gz" => "3110",
|
142
|
+
".gem" => "1400"
|
143
|
+
}; type_map.default = "9999"
|
144
|
+
type = type_map[file_ext]
|
145
|
+
boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
|
146
|
+
|
147
|
+
query_hash = if first_file then
|
148
|
+
{
|
149
|
+
"group_id" => group_id,
|
150
|
+
"package_id" => package_id,
|
151
|
+
"release_name" => PKG_FILE_NAME,
|
152
|
+
"release_date" => release_date,
|
153
|
+
"type_id" => type,
|
154
|
+
"processor_id" => "8000", # Any
|
155
|
+
"release_notes" => "",
|
156
|
+
"release_changes" => "",
|
157
|
+
"preformatted" => "1",
|
158
|
+
"submit" => "1"
|
159
|
+
}
|
160
|
+
else
|
161
|
+
{
|
162
|
+
"group_id" => group_id,
|
163
|
+
"release_id" => release_id,
|
164
|
+
"package_id" => package_id,
|
165
|
+
"step2" => "1",
|
166
|
+
"type_id" => type,
|
167
|
+
"processor_id" => "8000", # Any
|
168
|
+
"submit" => "Add This File"
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
query = "?" + query_hash.map do |(name, value)|
|
173
|
+
[name, URI.encode(value)].join("=")
|
174
|
+
end.join("&")
|
175
|
+
|
176
|
+
data = [
|
177
|
+
"--" + boundary,
|
178
|
+
"Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
|
179
|
+
"Content-Type: application/octet-stream",
|
180
|
+
"Content-Transfer-Encoding: binary",
|
181
|
+
"", file_data, ""
|
182
|
+
].join("\x0D\x0A")
|
183
|
+
|
184
|
+
release_headers = headers.merge(
|
185
|
+
"Content-Type" => "multipart/form-data; boundary=#{boundary}"
|
186
|
+
)
|
187
|
+
|
188
|
+
target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
|
189
|
+
http.post(target + query, data, release_headers)
|
190
|
+
end
|
191
|
+
|
192
|
+
if first_file then
|
193
|
+
release_id = release_response.body[/release_id=(\d+)/, 1]
|
194
|
+
raise("Couldn't get release id") unless release_id
|
195
|
+
end
|
196
|
+
|
197
|
+
first_file = false
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
@@ -0,0 +1,211 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + "/../lib/")
|
2
|
+
require File.join(File.dirname(__FILE__), 'test_helper')
|
3
|
+
require 'test/unit'
|
4
|
+
require 'active_crypto'
|
5
|
+
|
6
|
+
|
7
|
+
class User < ActiveRecord::Base
|
8
|
+
has_many :secrets
|
9
|
+
has_many :groups
|
10
|
+
keyholder
|
11
|
+
end
|
12
|
+
|
13
|
+
class Secret < ActiveRecord::Base
|
14
|
+
encrypt :name,:email, :key=>:user, :base64=>true
|
15
|
+
belongs_to :user
|
16
|
+
has_many :children
|
17
|
+
end
|
18
|
+
|
19
|
+
class Child < ActiveRecord::Base
|
20
|
+
encrypt :email, :key=>:secret, :base64=>true
|
21
|
+
belongs_to :secret
|
22
|
+
end
|
23
|
+
|
24
|
+
class Asset<ActiveRecord::Base
|
25
|
+
encrypt :title, :base64=>true
|
26
|
+
has_many :caps,:dependent=>:destroy
|
27
|
+
|
28
|
+
def self.create(title,email)
|
29
|
+
asset=Asset.new
|
30
|
+
asset.set_session_key(EzCrypto::Key.generate)
|
31
|
+
asset.title=title
|
32
|
+
if asset.save
|
33
|
+
asset.share(email)
|
34
|
+
else
|
35
|
+
nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def share(email=nil)
|
40
|
+
Cap.create_for_asset(self,email)
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
class AssetRaw<ActiveRecord::Base
|
46
|
+
set_table_name "assets"
|
47
|
+
end
|
48
|
+
|
49
|
+
class Cap < ActiveRecord::Base
|
50
|
+
belongs_to :asset
|
51
|
+
encrypt :shared_key, :base64=>true
|
52
|
+
|
53
|
+
def self.find_by_key(cap_key)
|
54
|
+
cap_key.chop
|
55
|
+
hash=Digest::SHA1.hexdigest(cap_key)
|
56
|
+
if (cap_key.length>=20) # Sanity check
|
57
|
+
cap=self.find_by_key_hash(hash)
|
58
|
+
if cap
|
59
|
+
cap.set_encoded_key(cap_key)
|
60
|
+
cap.asset.set_encoded_key(cap.shared_key)
|
61
|
+
cap
|
62
|
+
end
|
63
|
+
else
|
64
|
+
nil
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def self.create_for_asset(asset,email=nil)
|
69
|
+
cap=Cap.new
|
70
|
+
cap.email=email if email
|
71
|
+
cap.asset=asset
|
72
|
+
if cap.save
|
73
|
+
cap.set_session_key(EzCrypto::Key.generate)
|
74
|
+
cap_key=cap.session_key.encode
|
75
|
+
cap.key_hash=Digest::SHA1.hexdigest(cap_key)
|
76
|
+
cap.shared_key=asset.session_key.encode
|
77
|
+
cap.save
|
78
|
+
cap_key
|
79
|
+
else
|
80
|
+
nil
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
class Group < ActiveRecord::Base
|
87
|
+
belongs_to :user
|
88
|
+
has_many :group_secrets
|
89
|
+
|
90
|
+
encrypt :name,:group_key, :key=>:user , :base64=>true
|
91
|
+
end
|
92
|
+
|
93
|
+
class GroupSecret < ActiveRecord::Base
|
94
|
+
belongs_to :group
|
95
|
+
|
96
|
+
encrypt :title,:body, :key=>:group, :base64=>true
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
class ActiveCryptoTest < Test::Unit::TestCase
|
101
|
+
|
102
|
+
def setup
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_key_holder_in_record
|
106
|
+
user=User.new
|
107
|
+
user.name="bob"
|
108
|
+
user.save
|
109
|
+
assert user.kind_of?(ActiveCrypto::KeyHolder)
|
110
|
+
assert user.kind_of?(ActiveRecord::Base)
|
111
|
+
assert user.kind_of?(User)
|
112
|
+
assert_nil user.session_key
|
113
|
+
user.enter_password "shhcccc"
|
114
|
+
assert_not_nil user.session_key
|
115
|
+
assert_not_nil user.session_key.encrypt("test")
|
116
|
+
end
|
117
|
+
|
118
|
+
def test_encrypted_child
|
119
|
+
user=User.new
|
120
|
+
user.save
|
121
|
+
assert_nil user.session_key
|
122
|
+
user.enter_password "shhcccc"
|
123
|
+
assert_not_nil user.session_key
|
124
|
+
assert user.kind_of?(ActiveCrypto::KeyHolder)
|
125
|
+
assert user.kind_of?(ActiveRecord::Base)
|
126
|
+
assert user.kind_of?(User)
|
127
|
+
|
128
|
+
jill=user.secrets.create
|
129
|
+
|
130
|
+
assert_not_nil jill
|
131
|
+
assert jill.kind_of?(ActiveCrypto::AssociationKeyHolder)
|
132
|
+
assert jill.kind_of?(ActiveCrypto::KeyHolder)
|
133
|
+
assert jill.kind_of?(ActiveCrypto::Encrypted)
|
134
|
+
assert jill.kind_of?(ActiveRecord::Base)
|
135
|
+
assert jill.kind_of?(Secret)
|
136
|
+
|
137
|
+
assert jill.respond_to?(:session_key)
|
138
|
+
|
139
|
+
assert_not_nil jill.user
|
140
|
+
assert_not_nil jill.user.session_key
|
141
|
+
|
142
|
+
|
143
|
+
assert_not_nil jill.session_key
|
144
|
+
assert_equal user.session_key,jill.session_key
|
145
|
+
|
146
|
+
jill.name="jill"
|
147
|
+
jill.save
|
148
|
+
|
149
|
+
|
150
|
+
assert_equal "jill",jill.name
|
151
|
+
|
152
|
+
jill=user.secrets.first
|
153
|
+
assert_not_nil jill.session_key
|
154
|
+
assert_equal user.session_key,jill.session_key
|
155
|
+
assert_equal "jill",jill.name
|
156
|
+
|
157
|
+
child=jill.children.create
|
158
|
+
child.email="pelle@neubia.com"
|
159
|
+
child.save
|
160
|
+
|
161
|
+
assert_not_nil child.secret
|
162
|
+
assert_not_nil child.secret.session_key
|
163
|
+
|
164
|
+
|
165
|
+
assert_not_nil child.session_key
|
166
|
+
assert_equal user.session_key,child.session_key
|
167
|
+
|
168
|
+
assert_equal "pelle@neubia.com",child.email
|
169
|
+
|
170
|
+
child=jill.children.first
|
171
|
+
|
172
|
+
assert_not_nil child.secret
|
173
|
+
assert_not_nil child.secret.session_key
|
174
|
+
|
175
|
+
|
176
|
+
assert_not_nil child.session_key
|
177
|
+
assert_equal user.session_key,child.session_key
|
178
|
+
|
179
|
+
assert_equal "pelle@neubia.com",child.email
|
180
|
+
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_caps
|
184
|
+
key=Asset.create("title","pelle@neubia.com")
|
185
|
+
assert_not_nil key
|
186
|
+
cap=Cap.find_by_key key
|
187
|
+
assert_not_nil cap
|
188
|
+
assert_not_nil cap.asset
|
189
|
+
|
190
|
+
assert_equal "title",cap.asset.title
|
191
|
+
assert_equal "title",cap.asset["title"]
|
192
|
+
assert_equal "pelle@neubia.com",cap.email
|
193
|
+
assert_equal "pelle@neubia.com",cap["email"]
|
194
|
+
|
195
|
+
# Non decrypting version
|
196
|
+
raw=AssetRaw.find cap.asset.id
|
197
|
+
assert_not_equal "title",raw.title
|
198
|
+
assert_not_equal "title",raw["title"]
|
199
|
+
|
200
|
+
bob_key=cap.asset.share("bob@bob.com")
|
201
|
+
bob_cap=Cap.find_by_key bob_key
|
202
|
+
|
203
|
+
assert_not_equal key,bob_key
|
204
|
+
assert_not_nil bob_cap
|
205
|
+
assert_not_nil bob_cap.asset
|
206
|
+
assert_equal "title",bob_cap.asset.title
|
207
|
+
assert_equal "bob@bob.com",bob_cap.email
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIFIzCCBAugAwIBAgIEdjTPCDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UEBhMC
|
3
|
+
VVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNV
|
4
|
+
BAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOTA3BgNVBAsTMGh0dHA6
|
5
|
+
Ly9jZXJ0aWZpY2F0ZXMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeTExMC8G
|
6
|
+
A1UEAxMoU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTER
|
7
|
+
MA8GA1UEBRMIMTA2ODg0MzUwHhcNMDkwMzEwMTUyMzQ1WhcNMTAwMzExMjAzNzE0
|
8
|
+
WjB6MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
|
9
|
+
U2FuIEZyYW5jaXNjbzEYMBYGA1UEChMPRXh0cmEgRWFnbGUgTExDMQ8wDQYDVQQL
|
10
|
+
EwZBZ3JlZTIxEzARBgNVBAMTCmFncmVlMi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
|
11
|
+
gY0AMIGJAoGBAPNfoI6m+NIm69qkuOgOwlRI64W6SmJ+xlxz/fduK/0XtqRlANL9
|
12
|
+
aENxkAEvJz6tpsinNOAry96ucajZP9WUMWfy+wmXkTWLQN1jVPZUJs2mBBw6ajgm
|
13
|
+
8xLgPWn3czRve0Q34poWGLFb+CZdcZScbnHcn6Dkt8SwMsFFBhLB0FM/AgMBAAGj
|
14
|
+
ggHQMIIBzDAPBgNVHRMBAf8EBTADAQEAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggr
|
15
|
+
BgEFBQcDAjAOBgNVHQ8BAf8EBAMCBaAwOAYDVR0fBDEwLzAtoCugKYYnaHR0cDov
|
16
|
+
L2NybC5zdGFyZmllbGR0ZWNoLmNvbS9zZnMyLTAuY3JsMFkGA1UdIARSMFAwTgYL
|
17
|
+
YIZIAYb9bgEHFwIwPzA9BggrBgEFBQcCARYxaHR0cDovL2NlcnRpZmljYXRlcy5z
|
18
|
+
dGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzCBjQYIKwYBBQUHAQEEgYAwfjAq
|
19
|
+
BggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMFAGCCsG
|
20
|
+
AQUFBzAChkRodHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3Jl
|
21
|
+
cG9zaXRvcnkvc2ZfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBRJS1In0Ru8
|
22
|
+
8qEhamJ7UUJ6itfVVjAlBgNVHREEHjAcggphZ3JlZTIuY29tgg53d3cuYWdyZWUy
|
23
|
+
LmNvbTAdBgNVHQ4EFgQU8U68CbJHeGRhPSl2LRtx9IaocA4wDQYJKoZIhvcNAQEF
|
24
|
+
BQADggEBACFngInbvv6YmtiwHFWZswcY7eoqMpUggXC2jmX9ZT+w9CcdgVlygow6
|
25
|
+
jeR2HY7FPSKkm0YaDEAYYIoYeFHwaG6E4B6ykGvw5OQ4FESsQT/lxVlbeF0J1ERh
|
26
|
+
YEpvwrVrVK/ppRd5En2hvl6kKvRyqjTcHKT/MKZ2xQXUZ6JEVKIME3HLS+IHR/Sc
|
27
|
+
uo1aH3dXS73lFmWLH4P12KIfqnzQ938FDynW875bvKgl4HAzJj66wnMOoL5INOuK
|
28
|
+
d+r9xUBD/uWXJPaXLzC8vuORHInLWNE4M2cpNeVNsU8siX4c9mC/Hj+Ss1nYBW0D
|
29
|
+
4b8GcJ+tY+2Y+ODBKJn/s0qhB6TXoKM=
|
30
|
+
-----END CERTIFICATE-----
|
31
|
+
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'key_holder_test'
|
2
|
+
|
3
|
+
class User < ActiveRecord::Base
|
4
|
+
keyholder
|
5
|
+
end
|
6
|
+
|
7
|
+
class AssociationKeyHolderTest < KeyHolderTest
|
8
|
+
def setup
|
9
|
+
@key_holder=User.create
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_should_retain_session_key_on_reload
|
13
|
+
key=EzCrypto::Key.generate
|
14
|
+
key_holder.set_session_key key
|
15
|
+
assert_not_nil key_holder.session_key
|
16
|
+
assert_equal key.raw,key_holder.session_key.raw
|
17
|
+
|
18
|
+
reloaded=User.find key_holder.id
|
19
|
+
assert_not_nil reloaded.session_key
|
20
|
+
assert_equal key.raw,reloaded.session_key.raw
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_should_retain_session_key_on_reload_for_record_with_key_set_before_create
|
24
|
+
key=EzCrypto::Key.generate
|
25
|
+
key_holder=User.new
|
26
|
+
assert_nil key_holder.session_key
|
27
|
+
|
28
|
+
key_holder.set_session_key key
|
29
|
+
assert_not_nil key_holder.session_key
|
30
|
+
|
31
|
+
assert_equal key.raw,key_holder.session_key.raw
|
32
|
+
key_holder.save
|
33
|
+
|
34
|
+
reloaded=User.find key_holder.id
|
35
|
+
assert_not_nil reloaded.session_key
|
36
|
+
assert_equal key.raw,reloaded.session_key.raw
|
37
|
+
end
|
38
|
+
end
|