slosilo 0.2.4 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/LICENSE +1 -1
- data/lib/slosilo/adapters/abstract_adapter.rb +4 -0
- data/lib/slosilo/adapters/file_adapter.rb +10 -2
- data/lib/slosilo/adapters/memory_adapter.rb +31 -0
- data/lib/slosilo/adapters/mock_adapter.rb +14 -1
- data/lib/slosilo/adapters/sequel_adapter/migration.rb +1 -1
- data/lib/slosilo/adapters/sequel_adapter.rb +51 -4
- data/lib/slosilo/key.rb +18 -6
- data/lib/slosilo/keystore.rb +19 -8
- data/lib/slosilo/version.rb +1 -1
- data/lib/tasks/slosilo.rake +5 -0
- data/slosilo.gemspec +2 -1
- data/spec/file_adapter_spec.rb +25 -16
- data/spec/io_helper.rb +18 -0
- data/spec/key_spec.rb +30 -0
- data/spec/keystore_spec.rb +7 -2
- data/spec/sequel_adapter_spec.rb +76 -16
- data/spec/slosilo_spec.rb +32 -17
- data/spec/spec_helper.rb +32 -0
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6c7c324bd61b795ff8dae75a39e3e462336994ba
|
4
|
+
data.tar.gz: 3297b732040b746dcef15177bbc986eac7ebeae5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8348e5761ba1e179a17ab339f4248550f0ebca633c63325cea058dd719e8f536e3627ee7a9336a69c1c08447abe1fb27f964d4f5178c72beee3107b663983a6b
|
7
|
+
data.tar.gz: dcfe2d6010915867a1f07c8fcb74f4e6203023110df5f332b2233bc66afdf88b146028bf9d06bc50c80e5a5a3364d1472c0cd3b94fba60fa9ea936ec214a750c
|
data/.gitignore
CHANGED
data/LICENSE
CHANGED
@@ -8,16 +8,19 @@ module Slosilo
|
|
8
8
|
def initialize(dir)
|
9
9
|
@dir = dir
|
10
10
|
@keys = {}
|
11
|
+
@fingerprints = {}
|
11
12
|
Dir[File.join(@dir, "*.key")].each do |f|
|
12
13
|
key = Slosilo::EncryptedAttributes.decrypt File.read(f)
|
13
|
-
|
14
|
+
id = File.basename(f, '.key')
|
15
|
+
key = @keys[id] = Slosilo::Key.new(key)
|
16
|
+
@fingerprints[key.fingerprint] = id
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
17
20
|
def put_key id, value
|
18
21
|
raise "id should not contain a period" if id.index('.')
|
19
22
|
fname = File.join(dir, "#{id}.key")
|
20
|
-
File.write(fname, Slosilo::EncryptedAttributes.encrypt(value))
|
23
|
+
File.write(fname, Slosilo::EncryptedAttributes.encrypt(value.to_der))
|
21
24
|
File.chmod(0400, fname)
|
22
25
|
@keys[id] = value
|
23
26
|
end
|
@@ -25,6 +28,11 @@ module Slosilo
|
|
25
28
|
def get_key id
|
26
29
|
@keys[id]
|
27
30
|
end
|
31
|
+
|
32
|
+
def get_by_fingerprint fp
|
33
|
+
id = @fingerprints[fp]
|
34
|
+
[@keys[id], id]
|
35
|
+
end
|
28
36
|
|
29
37
|
def each(&block)
|
30
38
|
@keys.each(&block)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'slosilo/adapters/abstract_adapter'
|
2
|
+
|
3
|
+
module Slosilo
|
4
|
+
module Adapters
|
5
|
+
class MemoryAdapter < AbstractAdapter
|
6
|
+
def initialize
|
7
|
+
@keys = {}
|
8
|
+
@fingerprints = {}
|
9
|
+
end
|
10
|
+
|
11
|
+
def put_key id, key
|
12
|
+
key = Slosilo::Key.new(key) if key.is_a?(String)
|
13
|
+
@keys[id] = key
|
14
|
+
@fingerprints[key.fingerprint] = id
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_key id
|
18
|
+
@keys[id]
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_by_fingerprint fp
|
22
|
+
id = @fingerprints[fp]
|
23
|
+
[@keys[id], id]
|
24
|
+
end
|
25
|
+
|
26
|
+
def each(&block)
|
27
|
+
@keys.each(&block)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,8 +1,21 @@
|
|
1
1
|
module Slosilo
|
2
2
|
module Adapters
|
3
3
|
class MockAdapter < Hash
|
4
|
-
|
4
|
+
def initialize
|
5
|
+
@fp = {}
|
6
|
+
end
|
7
|
+
|
8
|
+
def put_key id, key
|
9
|
+
@fp[key.fingerprint] = id
|
10
|
+
self[id] = key
|
11
|
+
end
|
12
|
+
|
5
13
|
alias :get_key :[]
|
14
|
+
|
15
|
+
def get_by_fingerprint fp
|
16
|
+
id = @fp[fp]
|
17
|
+
[self[id], id]
|
18
|
+
end
|
6
19
|
end
|
7
20
|
end
|
8
21
|
end
|
@@ -20,8 +20,8 @@ module Slosilo
|
|
20
20
|
# and we can't use table_exists? because it rolls back
|
21
21
|
create_table? keystore_table do
|
22
22
|
String :id, primary_key: true
|
23
|
-
# Note: currently only postgres is supported
|
24
23
|
bytea :key, null: false
|
24
|
+
String :fingerprint, unique: true, null: false
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -15,18 +15,65 @@ module Slosilo
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def put_key id, value
|
18
|
-
|
18
|
+
attrs = { id: id, key: value.to_der }
|
19
|
+
attrs[:fingerprint] = value.fingerprint if fingerprint_in_db?
|
20
|
+
model.create attrs
|
19
21
|
end
|
20
22
|
|
21
23
|
def get_key id
|
22
24
|
stored = model[id]
|
23
25
|
return nil unless stored
|
24
|
-
stored.key
|
26
|
+
Slosilo::Key.new stored.key
|
25
27
|
end
|
26
|
-
|
28
|
+
|
29
|
+
def get_by_fingerprint fp
|
30
|
+
if fingerprint_in_db?
|
31
|
+
stored = model[fingerprint: fp]
|
32
|
+
return nil unless stored
|
33
|
+
[Slosilo::Key.new(stored.key), stored.id]
|
34
|
+
else
|
35
|
+
warn "Please migrate to a new database schema using rake slosilo:migrate for efficient fingerprint lookups"
|
36
|
+
find_by_fingerprint fp
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
27
40
|
def each
|
28
41
|
model.each do |m|
|
29
|
-
yield m.id, m.key
|
42
|
+
yield m.id, Slosilo::Key.new(m.key)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def migrate!
|
47
|
+
unless fingerprint_in_db?
|
48
|
+
model.db.transaction do
|
49
|
+
model.db.alter_table :slosilo_keystore do
|
50
|
+
add_column :fingerprint, String
|
51
|
+
end
|
52
|
+
|
53
|
+
# reload the schema
|
54
|
+
model.set_dataset model.dataset
|
55
|
+
|
56
|
+
model.each do |m|
|
57
|
+
m.update fingerprint: Slosilo::Key.new(m.key).fingerprint
|
58
|
+
end
|
59
|
+
|
60
|
+
model.db.alter_table :slosilo_keystore do
|
61
|
+
set_column_not_null :fingerprint
|
62
|
+
add_unique_constraint :fingerprint
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
def fingerprint_in_db?
|
71
|
+
model.columns.include? :fingerprint
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_by_fingerprint fp
|
75
|
+
each do |id, k|
|
76
|
+
return [k, id] if k.fingerprint == fp
|
30
77
|
end
|
31
78
|
end
|
32
79
|
end
|
data/lib/slosilo/key.rb
CHANGED
@@ -48,7 +48,7 @@ module Slosilo
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def to_der
|
51
|
-
@key.to_der
|
51
|
+
@to_der ||= @key.to_der
|
52
52
|
end
|
53
53
|
|
54
54
|
def sign value
|
@@ -74,22 +74,34 @@ module Slosilo
|
|
74
74
|
|
75
75
|
def token_valid? token, expiry = 8 * 60
|
76
76
|
token = token.clone
|
77
|
-
signature = Base64::urlsafe_decode64(token.delete "signature")
|
78
77
|
expected_key = token.delete "key"
|
79
|
-
return false if expected_key and expected_key != fingerprint
|
78
|
+
return false if (expected_key and (expected_key != fingerprint))
|
79
|
+
signature = Base64::urlsafe_decode64(token.delete "signature")
|
80
80
|
(Time.parse(token["timestamp"]) + expiry > Time.now) && verify_signature(token, signature)
|
81
81
|
end
|
82
82
|
|
83
83
|
def sign_string value
|
84
|
-
|
85
|
-
key.private_encrypt(hash_function.digest(
|
84
|
+
salt = self.salt
|
85
|
+
key.private_encrypt(hash_function.digest(salt + value)) + salt
|
86
86
|
end
|
87
87
|
|
88
88
|
def fingerprint
|
89
|
-
OpenSSL::Digest::MD5.hexdigest key.public_key.to_der
|
89
|
+
@fingerprint ||= OpenSSL::Digest::MD5.hexdigest key.public_key.to_der
|
90
|
+
end
|
91
|
+
|
92
|
+
def == other
|
93
|
+
to_der == other.to_der
|
94
|
+
end
|
95
|
+
|
96
|
+
alias_method :eql?, :==
|
97
|
+
|
98
|
+
def hash
|
99
|
+
to_der.hash
|
90
100
|
end
|
91
101
|
|
92
102
|
private
|
103
|
+
# Note that this is currently somewhat shallow stringification --
|
104
|
+
# to implement originating tokens we may need to make it deeper.
|
93
105
|
def stringify value
|
94
106
|
case value
|
95
107
|
when Hash
|
data/lib/slosilo/keystore.rb
CHANGED
@@ -7,16 +7,25 @@ module Slosilo
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def put id, key
|
10
|
-
adapter.put_key id.to_s, key
|
10
|
+
adapter.put_key id.to_s, key
|
11
11
|
end
|
12
12
|
|
13
|
-
def get
|
14
|
-
|
15
|
-
|
13
|
+
def get opts
|
14
|
+
id, fingerprint = opts.is_a?(Hash) ? [nil, opts[:fingerprint]] : [opts, nil]
|
15
|
+
if id
|
16
|
+
key = adapter.get_key(id.to_s)
|
17
|
+
elsif fingerprint
|
18
|
+
key, _ = get_by_fingerprint(fingerprint)
|
19
|
+
end
|
20
|
+
key
|
21
|
+
end
|
22
|
+
|
23
|
+
def get_by_fingerprint fingerprint
|
24
|
+
adapter.get_by_fingerprint fingerprint
|
16
25
|
end
|
17
26
|
|
18
27
|
def each &_
|
19
|
-
adapter.each { |k, v| yield k,
|
28
|
+
adapter.each { |k, v| yield k, v }
|
20
29
|
end
|
21
30
|
|
22
31
|
def any? &block
|
@@ -49,10 +58,12 @@ module Slosilo
|
|
49
58
|
end
|
50
59
|
|
51
60
|
def token_signer token
|
52
|
-
|
53
|
-
|
61
|
+
key, id = keystore.get_by_fingerprint token['key']
|
62
|
+
if key && key.token_valid?(token)
|
63
|
+
return id
|
64
|
+
else
|
65
|
+
return nil
|
54
66
|
end
|
55
|
-
return nil
|
56
67
|
end
|
57
68
|
|
58
69
|
attr_accessor :adapter
|
data/lib/slosilo/version.rb
CHANGED
data/lib/tasks/slosilo.rake
CHANGED
data/slosilo.gemspec
CHANGED
@@ -7,6 +7,7 @@ Gem::Specification.new do |gem|
|
|
7
7
|
gem.description = %q{This gem provides an easy way of storing and retrieving encryption keys in the database.}
|
8
8
|
gem.summary = %q{Store SSL keys in a database}
|
9
9
|
gem.homepage = ""
|
10
|
+
gem.license = "MIT"
|
10
11
|
|
11
12
|
gem.files = `git ls-files`.split($\)
|
12
13
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
@@ -14,7 +15,7 @@ Gem::Specification.new do |gem|
|
|
14
15
|
gem.name = "slosilo"
|
15
16
|
gem.require_paths = ["lib"]
|
16
17
|
gem.version = Slosilo::VERSION
|
17
|
-
gem.required_ruby_version = '
|
18
|
+
gem.required_ruby_version = '>= 1.9.3'
|
18
19
|
|
19
20
|
gem.add_development_dependency 'rake'
|
20
21
|
gem.add_development_dependency 'rspec'
|
data/spec/file_adapter_spec.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'tmpdir'
|
2
3
|
|
3
4
|
require 'slosilo/adapters/file_adapter'
|
4
5
|
|
5
6
|
describe Slosilo::Adapters::FileAdapter do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
}
|
7
|
+
include_context "with example key"
|
8
|
+
|
9
|
+
let(:dir) { Dir.mktmpdir }
|
10
10
|
let(:adapter) { Slosilo::Adapters::FileAdapter.new dir }
|
11
11
|
subject { adapter }
|
12
12
|
|
@@ -19,7 +19,6 @@ describe Slosilo::Adapters::FileAdapter do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
describe "#put_key" do
|
22
|
-
let(:key) { "key" }
|
23
22
|
context "unacceptable id" do
|
24
23
|
let(:id) { "foo.bar" }
|
25
24
|
it "isn't accepted" do
|
@@ -31,7 +30,7 @@ describe Slosilo::Adapters::FileAdapter do
|
|
31
30
|
let(:key_encrypted) { "encrypted key" }
|
32
31
|
let(:fname) { "#{dir}/#{id}.key" }
|
33
32
|
it "creates the key" do
|
34
|
-
Slosilo::EncryptedAttributes.should_receive(:encrypt).with(key).and_return key_encrypted
|
33
|
+
Slosilo::EncryptedAttributes.should_receive(:encrypt).with(key.to_der).and_return key_encrypted
|
35
34
|
File.should_receive(:write).with(fname, key_encrypted)
|
36
35
|
File.should_receive(:chmod).with(0400, fname)
|
37
36
|
subject.put_key id, key
|
@@ -49,9 +48,8 @@ describe Slosilo::Adapters::FileAdapter do
|
|
49
48
|
results.should == [ { one: :onek}, {two: :twok } ]
|
50
49
|
end
|
51
50
|
end
|
52
|
-
|
53
|
-
|
54
|
-
let(:key) { 'fake key' }
|
51
|
+
|
52
|
+
context 'with real key store' do
|
55
53
|
let(:id) { 'some id' }
|
56
54
|
|
57
55
|
before do
|
@@ -59,14 +57,25 @@ describe Slosilo::Adapters::FileAdapter do
|
|
59
57
|
pre_adapter = Slosilo::Adapters::FileAdapter.new dir
|
60
58
|
pre_adapter.put_key(id, key)
|
61
59
|
end
|
62
|
-
|
63
|
-
|
64
|
-
|
60
|
+
|
61
|
+
describe '#get_key' do
|
62
|
+
it "loads and decrypts the key" do
|
63
|
+
adapter.get_key(id).should == key
|
64
|
+
end
|
65
65
|
end
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
66
|
+
|
67
|
+
describe '#get_by_fingerprint' do
|
68
|
+
it "can look up a key by a fingerprint" do
|
69
|
+
adapter.get_by_fingerprint(key_fingerprint).should == [key, id]
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#each' do
|
74
|
+
it "enumerates the keys" do
|
75
|
+
results = []
|
76
|
+
adapter.each { |id,k| results << { id => k } }
|
77
|
+
results.should == [ { id => key } ]
|
78
|
+
end
|
70
79
|
end
|
71
80
|
end
|
72
81
|
end
|
data/spec/io_helper.rb
ADDED
data/spec/key_spec.rb
CHANGED
@@ -7,7 +7,37 @@ describe Slosilo::Key do
|
|
7
7
|
its(:to_der) { should == rsa.to_der }
|
8
8
|
its(:to_s) { should == rsa.public_key.to_pem }
|
9
9
|
its(:fingerprint) { should == key_fingerprint }
|
10
|
+
|
11
|
+
context "with identical key" do
|
12
|
+
let(:other) { Slosilo::Key.new rsa.to_der }
|
13
|
+
it "is equal" do
|
14
|
+
subject.should == other
|
15
|
+
end
|
16
|
+
|
17
|
+
it "is eql?" do
|
18
|
+
subject.eql?(other).should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "has equal hash" do
|
22
|
+
subject.hash.should == other.hash
|
23
|
+
end
|
24
|
+
end
|
10
25
|
|
26
|
+
context "with a different key" do
|
27
|
+
let(:other) { Slosilo::Key.new another_rsa }
|
28
|
+
it "is not equal" do
|
29
|
+
subject.should_not == other
|
30
|
+
end
|
31
|
+
|
32
|
+
it "is not eql?" do
|
33
|
+
subject.eql?(other).should_not be_true
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has different hash" do
|
37
|
+
subject.hash.should_not == other.hash
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
11
41
|
let(:plaintext) { 'quick brown fox jumped over the lazy dog' }
|
12
42
|
describe '#encrypt' do
|
13
43
|
it "generates a symmetric encryption key and encrypts the plaintext with the public key" do
|
data/spec/keystore_spec.rb
CHANGED
@@ -5,9 +5,14 @@ describe Slosilo::Keystore do
|
|
5
5
|
include_context "with mock adapter"
|
6
6
|
|
7
7
|
describe '#put' do
|
8
|
-
it "handles Slosilo::Keys
|
8
|
+
it "handles Slosilo::Keys" do
|
9
9
|
subject.put(:test, key)
|
10
|
-
adapter['test'].should == rsa.to_der
|
10
|
+
adapter['test'].to_der.should == rsa.to_der
|
11
|
+
end
|
12
|
+
|
13
|
+
it "passes the Slosilo key to the adapter" do
|
14
|
+
adapter.should_receive(:put_key).with "test", key
|
15
|
+
subject.put :test, key
|
11
16
|
end
|
12
17
|
end
|
13
18
|
end
|
data/spec/sequel_adapter_spec.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'sequel'
|
3
|
+
require 'io_helper'
|
2
4
|
|
3
5
|
require 'slosilo/adapters/sequel_adapter'
|
4
6
|
|
5
7
|
describe Slosilo::Adapters::SequelAdapter do
|
8
|
+
include_context "with example key"
|
9
|
+
|
6
10
|
let(:model) { double "model" }
|
7
11
|
before { subject.stub create_model: model }
|
8
12
|
|
@@ -13,13 +17,27 @@ describe Slosilo::Adapters::SequelAdapter do
|
|
13
17
|
subject.get_key(:whatever).should_not be
|
14
18
|
end
|
15
19
|
end
|
20
|
+
|
21
|
+
context "when it exists" do
|
22
|
+
let(:id) { "id" }
|
23
|
+
before { model.stub(:[]).with(id).and_return (double "key entry", id: id, key: rsa.to_der) }
|
24
|
+
it "returns it" do
|
25
|
+
subject.get_key(id).should == key
|
26
|
+
end
|
27
|
+
end
|
16
28
|
end
|
17
29
|
|
18
30
|
describe "#put_key" do
|
19
31
|
let(:id) { "id" }
|
20
|
-
let(:key) { "key" }
|
21
32
|
it "creates the key" do
|
22
|
-
model.should_receive(:create).with id: id, key: key
|
33
|
+
model.should_receive(:create).with id: id, key: key.to_der
|
34
|
+
model.stub columns: [:id, :key]
|
35
|
+
subject.put_key id, key
|
36
|
+
end
|
37
|
+
|
38
|
+
it "adds the fingerprint if feasible" do
|
39
|
+
model.should_receive(:create).with id: id, key: key.to_der, fingerprint: key.fingerprint
|
40
|
+
model.stub columns: [:id, :key, :fingerprint]
|
23
41
|
subject.put_key id, key
|
24
42
|
end
|
25
43
|
end
|
@@ -32,29 +50,71 @@ describe Slosilo::Adapters::SequelAdapter do
|
|
32
50
|
|
33
51
|
it "iterates over each key" do
|
34
52
|
results = []
|
53
|
+
Slosilo::Key.stub(:new) {|x|x}
|
35
54
|
adapter.each { |id,k| results << { id => k } }
|
36
55
|
results.should == [ { one: :onek}, {two: :twok } ]
|
37
56
|
end
|
38
57
|
end
|
39
|
-
|
40
|
-
|
58
|
+
|
59
|
+
context do
|
41
60
|
let(:db) { Sequel.sqlite }
|
42
61
|
before do
|
43
62
|
Slosilo::encryption_key = Slosilo::Symmetric.new.random_key
|
44
63
|
subject.unstub :create_model
|
45
|
-
|
64
|
+
Sequel::Model.cache_anonymous_models = false
|
46
65
|
Sequel::Model.db = db
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
66
|
+
end
|
67
|
+
|
68
|
+
context "with old schema" do
|
69
|
+
before do
|
70
|
+
db.create_table :slosilo_keystore do
|
71
|
+
String :id, primary_key: true
|
72
|
+
bytea :key, null: false
|
73
|
+
end
|
74
|
+
subject.put_key 'test', key
|
75
|
+
end
|
76
|
+
|
77
|
+
context "after migration" do
|
78
|
+
before { subject.migrate! }
|
79
|
+
|
80
|
+
it "supports look up by id" do
|
81
|
+
subject.get_key("test").should == key
|
82
|
+
end
|
83
|
+
|
84
|
+
it "supports look up by fingerprint, without a warning" do
|
85
|
+
STDERR.grab do
|
86
|
+
subject.get_by_fingerprint(key.fingerprint).should == [key, 'test']
|
87
|
+
end.should be_empty
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it "supports look up by id" do
|
92
|
+
subject.get_key("test").should == key
|
93
|
+
end
|
94
|
+
|
95
|
+
it "supports look up by fingerprint, but issues a warning" do
|
96
|
+
STDERR.grab do
|
97
|
+
subject.get_by_fingerprint(key.fingerprint).should == [key, 'test']
|
98
|
+
end.should_not be_empty
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "with current schema" do
|
103
|
+
before do
|
104
|
+
Sequel.extension :migration
|
105
|
+
require 'slosilo/adapters/sequel_adapter/migration.rb'
|
106
|
+
Sequel::Migration::descendants.first.apply db, :up
|
107
|
+
subject.put_key 'test', key
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
it "supports look up by id" do
|
112
|
+
subject.get_key("test").should == key
|
113
|
+
end
|
114
|
+
|
115
|
+
it "supports look up by fingerprint" do
|
116
|
+
subject.get_by_fingerprint(key.fingerprint).should == [key, 'test']
|
117
|
+
end
|
58
118
|
end
|
59
119
|
end
|
60
120
|
end
|
data/spec/slosilo_spec.rb
CHANGED
@@ -2,13 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Slosilo do
|
4
4
|
include_context "with mock adapter"
|
5
|
-
|
6
|
-
before {
|
5
|
+
include_context "with example key"
|
6
|
+
before { Slosilo['test'] = key }
|
7
7
|
|
8
8
|
describe '[]' do
|
9
9
|
it "returns a Slosilo::Key" do
|
10
10
|
Slosilo[:test].should be_instance_of Slosilo::Key
|
11
11
|
end
|
12
|
+
|
13
|
+
it "allows looking up by fingerprint" do
|
14
|
+
Slosilo[fingerprint: key_fingerprint].should == key
|
15
|
+
end
|
12
16
|
|
13
17
|
context "when the requested key does not exist" do
|
14
18
|
it "returns nil instead of creating a new key" do
|
@@ -49,7 +53,7 @@ describe Slosilo do
|
|
49
53
|
let(:invalid_key) { double token_valid?: true }
|
50
54
|
before do
|
51
55
|
Slosilo::Key.stub new: invalid_key
|
52
|
-
|
56
|
+
adapter[:key2] = valid_key
|
53
57
|
end
|
54
58
|
|
55
59
|
it { should be_true }
|
@@ -57,21 +61,32 @@ describe Slosilo do
|
|
57
61
|
end
|
58
62
|
|
59
63
|
describe '.token_signer' do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
|
65
|
+
context "when token matches a key" do
|
66
|
+
let(:token) {{ 'data' => 'foo', 'key' => key.fingerprint, 'signature' => 'XXX' }}
|
67
|
+
|
68
|
+
context "and the signature is valid" do
|
69
|
+
before { key.stub(:token_valid?).with(token).and_return true }
|
70
|
+
|
71
|
+
it "returns the key id" do
|
72
|
+
subject.token_signer(token).should == 'test'
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
context "and the signature is invalid" do
|
77
|
+
before { key.stub(:token_valid?).with(token).and_return false }
|
78
|
+
|
79
|
+
it "returns nil" do
|
80
|
+
subject.token_signer(token).should_not be
|
81
|
+
end
|
82
|
+
end
|
70
83
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
84
|
+
|
85
|
+
context "when token doesn't match a key" do
|
86
|
+
let(:token) {{ 'data' => 'foo', 'key' => "footprint", 'signature' => 'XXX' }}
|
87
|
+
it "returns nil" do
|
88
|
+
subject.token_signer(token).should_not be
|
89
|
+
end
|
75
90
|
end
|
76
91
|
end
|
77
92
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -42,6 +42,38 @@ Dg1ikwi8GUF4HPZe9DyhXgDhg19wM/qcpjX8bSypsUWHWP+FanhjdWU=
|
|
42
42
|
""" }
|
43
43
|
let (:key) { Slosilo::Key.new rsa.to_der }
|
44
44
|
let (:key_fingerprint) { "d28e3a347e368416b3129a40c1b887fe" }
|
45
|
+
|
46
|
+
let (:another_rsa) do
|
47
|
+
OpenSSL::PKey::RSA.new """
|
48
|
+
-----BEGIN RSA PRIVATE KEY-----
|
49
|
+
MIIEowIBAAKCAQEAryP0uGEIcDFmHDj1MjxbW+eWMeQ1k2FTKI7qx2M3MP9FR3Bz
|
50
|
+
KjFzGKnAA6QV46K/QtEt+wpWedB/bcikPXY4/vh/b2TEi8Ybw2ztT1oW9le8Djsz
|
51
|
+
3sQv5QrHsOXzSIARw4NZYxunxMFKCVC9jA8tXJb16RLgS3wAOMiPADlWIKEmPIX6
|
52
|
+
+hg2PDgFcrCuL3XAwJ4GKy3Q5BpIFF2j+wRNfjCXDFf1bU9Gy9DND8Y50Khhw/Zn
|
53
|
+
GYN1Y3AZ3YPzz1SPf08WM663ImYwORjdkA5VlIAMKcmSStNZZUrCOo7DQjNZVD2O
|
54
|
+
vfGhGUlPqYkmTPnCG2aNP8aJm3IbF+Cb6N6PjwIDAQABAoIBAEaYtr9PlagrsV40
|
55
|
+
81kxjR3pptgrhhEHTQ7vNOH0Mz4T16gpQrLCRgOuARE2pgAhDPlw+hjUHPFzQrpN
|
56
|
+
Ay8nJWhZYHzVYIh67ZwDn1C6HsFjshEGei0UZb3sb3v15O/Xd9GYc4KIlkKwKxjA
|
57
|
+
K/d18rH8w9kUW8bxj+FTrpjHg9kYkWGjl1WUM4o4dALVVAbbILCHKUIv3wmU5Off
|
58
|
+
oqBDunItrfVvvc9UOt1SMO15fwuZZpk0B5cjjo6+1NNpIOzqnuu48iI5dQRAIr50
|
59
|
+
n44U4/Ix4E1p4i/9i5trCeSZRMrVxBruNxFBtCeDU6YW5fXYNBLptndfb83iqSJf
|
60
|
+
46myqakCgYEA2MAsbtOcvQv+C7KsRMQih4WqpybV/TRdeC+dZ3flPvSuI8VLJAHp
|
61
|
+
p2Tp3WXATCwgUWL/iktwWE7WFMn3VvAuMm2ITmAze/Uk71uUS5R+iaGIeRXHgd9J
|
62
|
+
fyJrIeD63ncWbb23rif2sO6zH4cp9NLS/OopHiRNlRsWEUoGpybxczMCgYEAztrf
|
63
|
+
mX4oqjqk4af4o4/UHVp3Y9lpcUXRi6dYYECoqv6wS7qCIbJkD4I4P6oTwvk25vbk
|
64
|
+
p9fwOttuqHC53/rDXVjedNe9VExIe5NhVaug1SyArw/qsafYs0QeDRBkSgCcLfP6
|
65
|
+
LP4g824Wbv52X33BO0rJbDCICDqGDCOkqB4XcjUCgYBCkcMTxqo85ZIAxb9i31o7
|
66
|
+
hTIEZEkUmyCZ6QXO4WPnEf7pvY52YKACaVvqQ3Xr7yF93YneT40RkiTt/ZmZeeq2
|
67
|
+
Ui2q5KDrUT8mxFmnXNQAMTxY8/dyS8Gm6ks8/HwQF0MsMThYpK1/adBZvomER7vF
|
68
|
+
MaWvPDcXtFnytWmVrMA7QQKBgQDIHpHR4m6e+atIMIPoYR5Z44q7i7tp/ZzTGevy
|
69
|
+
+rry6wFN0jtRNE9/fYDDftwtdYL7AYKHKu7bUi0FQkFhAi39YhudOJaPNlmtTBEP
|
70
|
+
m8I2Wh6IvsJUa0jHbbAQ/Xm46kwuXOn8m0LvnuKPMRj+GyBVJ24kf/Mq2suSdO04
|
71
|
+
RBx0vQKBgFz93G6bSzmFg0BRTqRWEXEIuYkMIZDe48OjeP4pLYH9aERsL/f/8Dyc
|
72
|
+
X2nOMv/TdLP7mvGnwCt/sQ2626DdiNqimekyBki9J2r6BzBNVmEvnLAcYaQAiQYz
|
73
|
+
ooQ2FuL0K6ukQfHPjuMswqi41lmVH8gIVqVC+QnImUCrGxH9WXWy
|
74
|
+
-----END RSA PRIVATE KEY-----
|
75
|
+
"""
|
76
|
+
end
|
45
77
|
|
46
78
|
def self.mock_own_key
|
47
79
|
before { Slosilo.stub(:[]).with(:own).and_return key }
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: slosilo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafał Rzepecki
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-12-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -111,6 +111,7 @@ files:
|
|
111
111
|
- lib/slosilo.rb
|
112
112
|
- lib/slosilo/adapters/abstract_adapter.rb
|
113
113
|
- lib/slosilo/adapters/file_adapter.rb
|
114
|
+
- lib/slosilo/adapters/memory_adapter.rb
|
114
115
|
- lib/slosilo/adapters/mock_adapter.rb
|
115
116
|
- lib/slosilo/adapters/sequel_adapter.rb
|
116
117
|
- lib/slosilo/adapters/sequel_adapter/migration.rb
|
@@ -127,6 +128,7 @@ files:
|
|
127
128
|
- spec/file_adapter_spec.rb
|
128
129
|
- spec/http_request_spec.rb
|
129
130
|
- spec/http_stack_spec.rb
|
131
|
+
- spec/io_helper.rb
|
130
132
|
- spec/key_spec.rb
|
131
133
|
- spec/keystore_spec.rb
|
132
134
|
- spec/rack_middleware_spec.rb
|
@@ -136,7 +138,8 @@ files:
|
|
136
138
|
- spec/spec_helper.rb
|
137
139
|
- spec/symmetric_spec.rb
|
138
140
|
homepage: ''
|
139
|
-
licenses:
|
141
|
+
licenses:
|
142
|
+
- MIT
|
140
143
|
metadata: {}
|
141
144
|
post_install_message:
|
142
145
|
rdoc_options: []
|
@@ -144,7 +147,7 @@ require_paths:
|
|
144
147
|
- lib
|
145
148
|
required_ruby_version: !ruby/object:Gem::Requirement
|
146
149
|
requirements:
|
147
|
-
- - '
|
150
|
+
- - '>='
|
148
151
|
- !ruby/object:Gem::Version
|
149
152
|
version: 1.9.3
|
150
153
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -162,6 +165,7 @@ test_files:
|
|
162
165
|
- spec/file_adapter_spec.rb
|
163
166
|
- spec/http_request_spec.rb
|
164
167
|
- spec/http_stack_spec.rb
|
168
|
+
- spec/io_helper.rb
|
165
169
|
- spec/key_spec.rb
|
166
170
|
- spec/keystore_spec.rb
|
167
171
|
- spec/rack_middleware_spec.rb
|