relishable 0.9 → 0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/relish.rb +37 -37
- data/lib/relish/dynamo_helper.rb +11 -11
- data/lib/relish/encryption_helper.rb +23 -38
- metadata +1 -1
data/lib/relish.rb
CHANGED
@@ -9,72 +9,72 @@ class Relish
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def copy(id, version, data)
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
Release.new.tap do |release|
|
13
|
+
release.item = {}
|
14
|
+
release.id = id
|
15
|
+
release.version = version
|
16
|
+
data.each do |k, v|
|
17
|
+
release.send("#{k}=", v.to_s) unless v.nil?
|
18
|
+
end
|
19
|
+
@db.put(release.item)
|
18
20
|
end
|
19
|
-
@db.put(release.item)
|
20
|
-
release
|
21
21
|
end
|
22
22
|
|
23
23
|
def create(id, data)
|
24
24
|
item = @db.query_current_version(id)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
Release.new.tap do |release|
|
26
|
+
if item.nil?
|
27
|
+
release.item = {}
|
28
|
+
release.id = id
|
29
|
+
release.version = "1"
|
30
|
+
else
|
31
|
+
release.item = item
|
32
|
+
release.version = (release.version.to_i + 1).to_s
|
33
|
+
end
|
34
|
+
data.each do |k, v|
|
35
|
+
release.send("#{k}=", v.to_s) unless v.nil?
|
36
|
+
end
|
37
|
+
@db.put_current_version(release.item)
|
36
38
|
end
|
37
|
-
@db.put_current_version(release.item)
|
38
|
-
release
|
39
39
|
end
|
40
40
|
|
41
41
|
def current(id, *attrs)
|
42
42
|
item = @db.query_current_version(id, *attrs)
|
43
43
|
unless item.nil?
|
44
|
-
|
45
|
-
|
46
|
-
|
44
|
+
Release.new.tap do |release|
|
45
|
+
release.item = item
|
46
|
+
end
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
50
|
def read(id, version, *attrs)
|
51
51
|
item = @db.get_version(id, version, *attrs)
|
52
52
|
unless item.nil?
|
53
|
-
|
54
|
-
|
55
|
-
|
53
|
+
Release.new.tap do |release|
|
54
|
+
release.item = item
|
55
|
+
end
|
56
56
|
end
|
57
57
|
end
|
58
58
|
|
59
59
|
def dump(id, consistent=nil, limit=nil)
|
60
|
-
items = @db.query(id, limit)
|
60
|
+
items = @db.query(id, consistent, limit)
|
61
61
|
items.map do |item|
|
62
|
-
|
63
|
-
|
64
|
-
|
62
|
+
Release.new.tap do |release|
|
63
|
+
release.item = item
|
64
|
+
end
|
65
65
|
end
|
66
66
|
end
|
67
67
|
|
68
68
|
def update(id, version, data)
|
69
69
|
item = @db.get_version(id, version)
|
70
70
|
unless item.nil?
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
Release.new.tap do |release|
|
72
|
+
release.item = item
|
73
|
+
data.each do |k, v|
|
74
|
+
release.send("#{k}=", v.to_s) unless v.nil?
|
75
|
+
end
|
76
|
+
@db.put_version(id, version, release.item)
|
75
77
|
end
|
76
|
-
@db.put_version(id, version, release.item)
|
77
|
-
release
|
78
78
|
end
|
79
79
|
end
|
80
80
|
end
|
data/lib/relish/dynamo_helper.rb
CHANGED
@@ -14,29 +14,27 @@ class Relish
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def query_current_version(id, *attrs)
|
17
|
-
|
18
|
-
response = db.query(@table_name, {:S => id}, opts)
|
17
|
+
response = db.query(@table_name, {:S => id}, attrs_to_get(attrs).merge(:ConsistentRead => true, :Limit => 1, :ScanIndexForward => false))
|
19
18
|
if response.body['Count'] == 1
|
20
19
|
response.body['Items'].first
|
21
20
|
end
|
22
21
|
end
|
23
22
|
|
24
23
|
def put_current_version(item)
|
25
|
-
|
24
|
+
db.put_item(@table_name, item, {:Expected => {:id => {:Exists => false}, :version => {:Exists => false}}})
|
26
25
|
end
|
27
26
|
|
28
27
|
def get_version(id, version, *attrs)
|
29
|
-
|
30
|
-
response = db.get_item(@table_name, {:HashKeyElement => {:S => id}, :RangeKeyElement => {:N => version}}, opts)
|
28
|
+
response = db.get_item(@table_name, {:HashKeyElement => {:S => id}, :RangeKeyElement => {:N => version}}, attrs_to_get(attrs).merge(:ConsistentRead => true))
|
31
29
|
response.body['Item']
|
32
30
|
end
|
33
31
|
|
34
32
|
def put_version(id, version, item)
|
35
|
-
|
33
|
+
db.put_item(@table_name, item, {:Expected => {:id => {:Value => {:S => id}}, :version => {:Value => {:N => version}}}})
|
36
34
|
end
|
37
35
|
|
38
36
|
def put(item)
|
39
|
-
|
37
|
+
db.put_item(@table_name, item)
|
40
38
|
end
|
41
39
|
|
42
40
|
def query(id, consistent, limit)
|
@@ -44,12 +42,14 @@ class Relish
|
|
44
42
|
response.body['Items']
|
45
43
|
end
|
46
44
|
|
45
|
+
def to_s
|
46
|
+
"#<Relish::DynamoHelper>"
|
47
|
+
end
|
48
|
+
|
47
49
|
private
|
48
50
|
|
49
|
-
def
|
50
|
-
attrs
|
51
|
-
opts[:AttributesToGet] = attrs unless attrs.empty?
|
52
|
-
opts
|
51
|
+
def attrs_to_get(attrs)
|
52
|
+
attrs.empty? ? {} : {:AttributesToGet => attrs}
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
@@ -12,20 +12,30 @@ class Relish
|
|
12
12
|
@secrets = secrets
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
|
15
|
+
def encrypt(key, value)
|
16
|
+
Fernet.generate(hmac_secrets.first) do |gen|
|
17
|
+
gen.data = {key => value}
|
18
|
+
end
|
17
19
|
end
|
18
20
|
|
19
|
-
def
|
20
|
-
|
21
|
+
def decrypt(key, token)
|
22
|
+
hmac_secrets.each do |secret|
|
23
|
+
if verifier = verifier(secret, token)
|
24
|
+
return verifier.data[key] if verifier.valid?
|
25
|
+
end
|
26
|
+
end
|
27
|
+
raise RelishDecryptionFailed
|
21
28
|
end
|
22
29
|
|
23
|
-
def
|
24
|
-
if
|
25
|
-
return
|
30
|
+
def upgrade(key, token)
|
31
|
+
if verifier = verifier(hmac_secrets.first, token)
|
32
|
+
return encrypt(key, verifier.data[key]) if verifier.valid?
|
26
33
|
end
|
27
|
-
|
28
|
-
|
34
|
+
raise RelishDecryptionFailed
|
35
|
+
end
|
36
|
+
|
37
|
+
def to_s
|
38
|
+
"#<Relish::EncryptionHelper>"
|
29
39
|
end
|
30
40
|
|
31
41
|
protected
|
@@ -36,36 +46,11 @@ class Relish
|
|
36
46
|
end
|
37
47
|
end
|
38
48
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
if success
|
43
|
-
return env, i
|
44
|
-
end
|
49
|
+
def verifier(secret, token)
|
50
|
+
Fernet.verifier(secret, token).tap do |verifier|
|
51
|
+
verifier.enforce_ttl = false
|
45
52
|
end
|
46
|
-
|
47
|
-
end
|
48
|
-
|
49
|
-
def try_decrypt_key(secret, encrypted_token, hash_key)
|
50
|
-
verifier = Fernet.verifier(secret, encrypted_token)
|
51
|
-
verifier.enforce_ttl = false
|
52
|
-
unless verifier.valid?
|
53
|
-
return false, nil
|
54
|
-
end
|
55
|
-
[true, verifier.data[hash_key]]
|
56
|
-
rescue OpenSSL::Cipher::CipherError => e
|
57
|
-
return false, nil
|
58
|
-
end
|
59
|
-
|
60
|
-
def encrypt_key_with_secret(hash_key, value, secret)
|
61
|
-
Fernet.generate(secret) do |gen|
|
62
|
-
gen.data = {hash_key => value}
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def inspect
|
67
|
-
"#<Relish::EncryptionHelper @static_secret=[masked] @secrets=[masked]>"
|
53
|
+
rescue OpenSSL::Cipher::CipherError
|
68
54
|
end
|
69
|
-
alias to_s inspect
|
70
55
|
end
|
71
56
|
end
|