rcredstash 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 01346a89bdc206884178c9b88a70383b487614a7
4
- data.tar.gz: 5c0a22d91b59d25bbc7bce6b5845638c204f845b
3
+ metadata.gz: af1edb53839064594e20faac9a3763659e715973
4
+ data.tar.gz: eea86d0447ff13342b6945b773ddd526f55d430b
5
5
  SHA512:
6
- metadata.gz: a58c364392fa4b35a78f6ce4fd71bee33e81ba3a5dfa812b45fe726e1f67df44e1f9937213cfa19fa6e8da49094edbe677da988e1f2f5273f0061ec9de225ff9
7
- data.tar.gz: 6b7f4c0eaf091342ab0ddbe29c98ea149f995a7af13590ba781d21cc9801ce8b4ff1a29d6339858d6af79702f0882d51fb95965f875b6c06d5e40d395ff1bd09
6
+ metadata.gz: d75896d2100518f478f4befc553b54a224371e6df97c2f0c79b3ea0aaeb930f9c11c44a70c8a7f510e7a114e8187bd1607e09a1b9510a57ade3607d1a3933dc0
7
+ data.tar.gz: 2b7fc0bcc9d905e3b3fac36dc392715099fd1b473ce240b62cf98653ffe6cb3bd22019aa2c1ba26edaf7b249031cfb9fd13f5b5403479672810d478b5eb76173
@@ -10,7 +10,7 @@ module CredStash
10
10
  end
11
11
 
12
12
  class Config
13
- attr_accessor :table_name
13
+ attr_accessor :table_name, :storage
14
14
 
15
15
  def initialize
16
16
  reset!
@@ -18,6 +18,7 @@ module CredStash
18
18
 
19
19
  def reset!
20
20
  @table_name = 'credential-store'
21
+ @storage = :dynamodb
21
22
  end
22
23
  end
23
24
  end
@@ -0,0 +1,96 @@
1
+ module CredStash::Repository
2
+ class DynamoDB
3
+ def initialize(client: nil)
4
+ @client = client || Aws::DynamoDB::Client.new
5
+ end
6
+
7
+ def get(name)
8
+ select(name, limit: 1).first.tap do |item|
9
+ unless item
10
+ raise CredStash::ItemNotFound, "#{name} is not found"
11
+ end
12
+ end
13
+ end
14
+
15
+ def select(name, pluck: nil, limit: nil)
16
+ params = {
17
+ table_name: CredStash.config.table_name,
18
+ consistent_read: true,
19
+ key_condition_expression: "#name = :name",
20
+ expression_attribute_names: { "#name" => "name"},
21
+ expression_attribute_values: { ":name" => name }
22
+ }
23
+
24
+ if pluck
25
+ params[:projection_expression] = pluck
26
+ end
27
+
28
+ if limit
29
+ params[:limit] = limit
30
+ params[:scan_index_forward] = false
31
+ end
32
+
33
+ @client.query(params).items.map do |item|
34
+ Item.new(
35
+ key: item["key"],
36
+ contents: item["contents"],
37
+ name: item["name"],
38
+ version: item["version"]
39
+ )
40
+ end
41
+ end
42
+
43
+ def put(item)
44
+ @client.put_item(
45
+ table_name: CredStash.config.table_name,
46
+ item: {
47
+ name: item.name,
48
+ version: item.version,
49
+ key: item.key,
50
+ contents: item.contents,
51
+ hmac: item.hmac
52
+ },
53
+ condition_expression: "attribute_not_exists(#name)",
54
+ expression_attribute_names: { "#name" => "name" },
55
+ )
56
+ end
57
+
58
+ def list
59
+ @client.scan(
60
+ table_name: CredStash.config.table_name,
61
+ projection_expression: '#name, version',
62
+ expression_attribute_names: { "#name" => "name" },
63
+ ).items.map do |item|
64
+ Item.new(name: item['name'], version: item['version'])
65
+ end
66
+ end
67
+
68
+ def delete(item)
69
+ @client.delete_item(
70
+ table_name: CredStash.config.table_name,
71
+ key: {
72
+ name: item.name,
73
+ version: item.version
74
+ }
75
+ )
76
+ end
77
+
78
+ def setup
79
+ @client.create_table(
80
+ table_name: CredStash.config.table_name,
81
+ key_schema: [
82
+ { attribute_name: 'name', key_type: 'HASH' },
83
+ { attribute_name: 'version', key_type: 'RANGE' },
84
+ ],
85
+ attribute_definitions: [
86
+ { attribute_name: 'name', attribute_type: 'S' },
87
+ { attribute_name: 'version', attribute_type: 'S' },
88
+ ],
89
+ provisioned_throughput: {
90
+ read_capacity_units: 1,
91
+ write_capacity_units: 1,
92
+ },
93
+ )
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,13 @@
1
+ module CredStash::Repository
2
+ class Item
3
+ attr_reader :key, :contents, :name, :version, :hmac
4
+
5
+ def initialize(key: nil, contents: nil, name: nil, version: nil, hmac: nil)
6
+ @key = key
7
+ @contents = contents
8
+ @name = name
9
+ @version = version
10
+ @hmac = hmac
11
+ end
12
+ end
13
+ end
@@ -1,110 +1,13 @@
1
- class CredStash::Repository
2
- class Item
3
- attr_reader :key, :contents, :name, :version, :hmac
1
+ require 'cred_stash/repository/item'
2
+ require 'cred_stash/repository/dynamo_db'
4
3
 
5
- def initialize(key: nil, contents: nil, name: nil, version: nil, hmac: nil)
6
- @key = key
7
- @contents = contents
8
- @name = name
9
- @version = version
10
- @hmac = hmac
4
+ module CredStash::Repository
5
+ def self.instance
6
+ case CredStash.config.storage
7
+ when :dynamodb
8
+ DynamoDB.new
9
+ else
10
+ raise ArgumentError, "Unknown storage #{CredStash.config.storage}"
11
11
  end
12
12
  end
13
-
14
- class DynamoDB
15
- def initialize(client: nil)
16
- @client = client || Aws::DynamoDB::Client.new
17
- end
18
-
19
- def get(name)
20
- select(name, limit: 1).first.tap do |item|
21
- unless item
22
- raise CredStash::ItemNotFound, "#{name} is not found"
23
- end
24
- end
25
- end
26
-
27
- def select(name, pluck: nil, limit: nil)
28
- params = {
29
- table_name: CredStash.config.table_name,
30
- consistent_read: true,
31
- key_condition_expression: "#name = :name",
32
- expression_attribute_names: { "#name" => "name"},
33
- expression_attribute_values: { ":name" => name }
34
- }
35
-
36
- if pluck
37
- params[:projection_expression] = pluck
38
- end
39
-
40
- if limit
41
- params[:limit] = limit
42
- params[:scan_index_forward] = false
43
- end
44
-
45
- @client.query(params).items.map do |item|
46
- Item.new(
47
- key: item["key"],
48
- contents: item["contents"],
49
- name: item["name"],
50
- version: item["version"]
51
- )
52
- end
53
- end
54
-
55
- def put(item)
56
- @client.put_item(
57
- table_name: CredStash.config.table_name,
58
- item: {
59
- name: item.name,
60
- version: item.version,
61
- key: item.key,
62
- contents: item.contents,
63
- hmac: item.hmac
64
- },
65
- condition_expression: "attribute_not_exists(#name)",
66
- expression_attribute_names: { "#name" => "name" },
67
- )
68
- end
69
-
70
- def list
71
- @client.scan(
72
- table_name: CredStash.config.table_name,
73
- projection_expression: '#name, version',
74
- expression_attribute_names: { "#name" => "name" },
75
- ).items.map do |item|
76
- Item.new(name: item['name'], version: item['version'])
77
- end
78
- end
79
-
80
- def delete(item)
81
- @client.delete_item(
82
- table_name: CredStash.config.table_name,
83
- key: {
84
- name: item.name,
85
- version: item.version
86
- }
87
- )
88
- end
89
- end
90
-
91
- def self.default_storage
92
- DynamoDB.new
93
- end
94
-
95
- def initialize(storage: CredStash::Repository.default_storage)
96
- @storage = storage
97
- end
98
-
99
- def get(name)
100
- @storage.get(name)
101
- end
102
-
103
- def put(item)
104
- @storage.put(item)
105
- end
106
-
107
- def select(name, pluck: nil, limit: nil)
108
- @storage.select(name, pluck: pluck, limit: limit)
109
- end
110
13
  end
@@ -39,7 +39,7 @@ class CredStash::Secret
39
39
  end
40
40
 
41
41
  def repository
42
- CredStash::Repository.new
42
+ CredStash::Repository.instance
43
43
  end
44
44
  end
45
45
 
@@ -57,7 +57,7 @@ class CredStash::Secret
57
57
  end
58
58
 
59
59
  def current_version
60
- item = CredStash::Repository.new.select(name, pluck: 'version', limit: 1).first
60
+ item = CredStash::Repository.instance.select(name, pluck: 'version', limit: 1).first
61
61
  if item
62
62
  item.version.to_i
63
63
  else
@@ -1,3 +1,3 @@
1
1
  module CredStash
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
data/lib/cred_stash.rb CHANGED
@@ -22,20 +22,24 @@ module CredStash
22
22
  end
23
23
 
24
24
  def list
25
- Repository.new.list.inject({}) {|h, item| h[item.name] = item.version; h }
25
+ Repository.instance.list.inject({}) {|h, item| h[item.name] = item.version; h }
26
26
  end
27
27
 
28
28
  def delete(name)
29
29
  # TODO needs delete target version option
30
- repository = Repository.new
30
+ repository = Repository.instance
31
31
  item = repository.select(name).first
32
32
  repository.delete(item)
33
33
  end
34
34
 
35
+ def setup
36
+ Repository.instance.setup
37
+ end
38
+
35
39
  private
36
40
 
37
41
  def get_highest_version(name)
38
- item = Repository.new.select(name, pluck: 'version', limit: 1).first
42
+ item = Repository.instance.select(name, pluck: 'version', limit: 1).first
39
43
  if item
40
44
  item.version.to_i
41
45
  else
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rcredstash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - adorechic
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-09-14 00:00:00.000000000 Z
11
+ date: 2016-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -89,6 +89,8 @@ files:
89
89
  - lib/cred_stash/config.rb
90
90
  - lib/cred_stash/error.rb
91
91
  - lib/cred_stash/repository.rb
92
+ - lib/cred_stash/repository/dynamo_db.rb
93
+ - lib/cred_stash/repository/item.rb
92
94
  - lib/cred_stash/secret.rb
93
95
  - lib/cred_stash/version.rb
94
96
  - lib/rcredstash.rb
@@ -113,9 +115,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
115
  version: '0'
114
116
  requirements: []
115
117
  rubyforge_project:
116
- rubygems_version: 2.5.2
118
+ rubygems_version: 2.6.8
117
119
  signing_key:
118
120
  specification_version: 4
119
121
  summary: A Ruby port of CredStash
120
122
  test_files: []
121
- has_rdoc: