relishable 0.9 → 0.10
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.
- 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
|