awskeyring 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e245afbb0324eea304fcc2c010617ebc3b78c53f
4
- data.tar.gz: 7be3de5bff9b16373021863d33a5aaa677046f60
3
+ metadata.gz: 1643974c4cbfea33a3a2388ee0a26ca035561b69
4
+ data.tar.gz: f2c4c855e383f24bbeac967b19b6c47880638ab1
5
5
  SHA512:
6
- metadata.gz: 04610b85c96d2da14c5d7874790fd9b33425aea0c0d1e1b087c8e17534daa2c6238bb1dee84830890f4b13256d55dd0c37521f33c90bd97f171d50c5fd488fc8
7
- data.tar.gz: fde8d5db0fc622b19423a171e3027c222ee9f54e5263533248eaaf10e27c05ab613404cf07656c58ec427069f8e660114fc1614ee0a252f435827b426ba486a2
6
+ metadata.gz: 9bc85b2fae258fdc80f0b5466caf8bfff34fcaa9d6b8440744812177feb0c35381b84be69bb53f38019518168b937eadcc53a3197c12e42cbdbd2972ee3a8751
7
+ data.tar.gz: 96c1704c005c2c304c76cb8613b6a0982e6a508482b22e792149abcd8780c8d76ff01a49581ccc0a70b8e251103e39729161d7a9319cfb8a805f98d2b86b3888
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Change Log
2
2
 
3
+ ## [v0.1.1](https://github.com/vibrato/awskeyring/tree/v0.1.1) (2018-03-26)
4
+ [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.1.0...v0.1.1)
5
+
6
+ **Merged pull requests:**
7
+
8
+ - More coverage with tests. [\#15](https://github.com/vibrato/awskeyring/pull/15) ([tristanmorgan](https://github.com/tristanmorgan))
9
+ - Validate MFA code and tweak Autocomplete [\#14](https://github.com/vibrato/awskeyring/pull/14) ([tristanmorgan](https://github.com/tristanmorgan))
10
+
3
11
  ## [v0.1.0](https://github.com/vibrato/awskeyring/tree/v0.1.0) (2018-03-14)
4
12
  [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.0.6...v0.1.0)
5
13
 
data/README.md CHANGED
@@ -5,6 +5,7 @@
5
5
  * [![license MIT](http://img.shields.io/badge/license-MIT-brightgreen.svg)](https://opensource.org/licenses/MIT)
6
6
  * [![All Downloads](http://ruby-gem-downloads-badge.herokuapp.com/awskeyring?type=total)](https://rubygems.org/gems/awskeyring)
7
7
  * [![Version Downloads](http://ruby-gem-downloads-badge.herokuapp.com/awskeyring?label=downloads-current-version)](https://rubygems.org/gems/awskeyring)
8
+ * [![Documentation](http://img.shields.io/badge/yard-docs-brightgreen.svg)](http://www.rubydoc.info/gems/awskeyring)
8
9
 
9
10
  Awskeyring is a small tool to manage AWS account keys in the macOS Keychain.
10
11
 
@@ -12,7 +13,8 @@ Awskeyring is a small tool to manage AWS account keys in the macOS Keychain.
12
13
 
13
14
  The motivation of this application is to provide a local secure store of AWS
14
15
  credentials using specifically in the macOS Keychain, to have them easily accessed
15
- from the Terminal, and to provide useful functions like assuming roles.
16
+ from the Terminal, and to provide useful functions like assuming roles and opening
17
+ the AWS Console from the cli.
16
18
  For Enterprise environments there are better suited tools to use
17
19
  like [HashiCorp Vault](https://vaultproject.io/).
18
20
 
data/Rakefile CHANGED
@@ -15,16 +15,18 @@ RSpec::Core::RakeTask.new(:spec)
15
15
 
16
16
  desc 'Check filemode bits'
17
17
  task :filemode do
18
- files = Dir.glob('**/*')
18
+ files = `git ls-files -z`.split("\x0")
19
19
  failure = false
20
20
  files.each do |file|
21
21
  mode = File.stat(file).mode
22
+ print '.'
22
23
  if (mode & 0x7) != (mode >> 3 & 0x7)
23
24
  puts file
24
25
  failure = true
25
26
  end
26
27
  end
27
28
  abort 'Error: Incorrect file mode found' if failure
29
+ print "\n"
28
30
  end
29
31
 
30
32
  task default: %i[filemode rubocop spec]
data/lib/awskeyring.rb CHANGED
@@ -47,23 +47,23 @@ module Awskeyring # rubocop:disable Metrics/ModuleLength
47
47
 
48
48
  keychain = Keychain.open(prefs['awskeyring'])
49
49
  if keychain && keychain.lock_interval > 300
50
- warn 'It is STRONGLY reccomended to set your keychain to lock in 5 minutes or less.'
50
+ warn 'It is STRONGLY recommended to set your keychain to lock in 5 minutes or less.'
51
51
  end
52
52
  keychain
53
53
  end
54
54
 
55
55
  # Return a list of all acount items
56
56
  private_class_method def self.list_items
57
- items = all_items.all.sort do |a, b|
58
- a.attributes[:label] <=> b.attributes[:label]
57
+ items = all_items.all.sort do |elem_a, elem_b|
58
+ elem_a.attributes[:label] <=> elem_b.attributes[:label]
59
59
  end
60
60
  items.select { |elem| elem.attributes[:label].start_with?(ACCOUNT_PREFIX) }
61
61
  end
62
62
 
63
63
  # Return a list of all role items
64
64
  private_class_method def self.list_roles
65
- items = all_items.all.sort do |a, b|
66
- a.attributes[:label] <=> b.attributes[:label]
65
+ items = all_items.all.sort do |elem_a, elem_b|
66
+ elem_a.attributes[:label] <=> elem_b.attributes[:label]
67
67
  end
68
68
  items.select { |elem| elem.attributes[:label].start_with?(ROLE_PREFIX) }
69
69
  end
@@ -48,8 +48,8 @@ module Awskeyring
48
48
  token_code: params[:code]
49
49
  )
50
50
  end
51
- rescue Aws::STS::Errors::AccessDenied => e
52
- puts e.to_s
51
+ rescue Aws::STS::Errors::AccessDenied => err
52
+ puts err.to_s
53
53
  exit 1
54
54
  end
55
55
 
@@ -153,13 +153,13 @@ module Awskeyring
153
153
  retries ||= 1
154
154
  begin
155
155
  yield block
156
- rescue Aws::IAM::Errors::InvalidClientTokenId => e
156
+ rescue Aws::IAM::Errors::InvalidClientTokenId => err
157
157
  if retries < 4
158
158
  sleep 2**retries
159
159
  retries += 1
160
160
  retry
161
161
  end
162
- warn e.message
162
+ warn err.message
163
163
  exit 1
164
164
  end
165
165
  end
@@ -50,5 +50,13 @@ module Awskeyring
50
50
  raise 'Invalid Role ARN' unless role_arn =~ %r(\Aarn:aws:iam::[0-9]{12}:role\/\S*\z)
51
51
  role_arn
52
52
  end
53
+
54
+ # Validate an MFA CODE
55
+ #
56
+ # @param [String] mfa_code The mfa code
57
+ def self.mfa_code(mfa_code)
58
+ raise 'Invalid MFA CODE' unless mfa_code =~ /\A\d{6}\z/
59
+ mfa_code
60
+ end
53
61
  end
54
62
  end
@@ -1,4 +1,4 @@
1
1
  module Awskeyring
2
2
  # The Gems version number
3
- VERSION = '0.1.0'.freeze
3
+ VERSION = '0.1.1'.freeze
4
4
  end
@@ -10,11 +10,13 @@ require 'awskeyring/version'
10
10
  class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
11
11
  map %w[--version -v] => :__version
12
12
  map ['init'] => :initialise
13
+ map ['con'] => :console
13
14
  map ['ls'] => :list
14
15
  map ['lsr'] => :list_role
15
16
  map ['rm'] => :remove
16
17
  map ['rmr'] => :remove_role
17
18
  map ['rmt'] => :remove_token
19
+ map ['rot'] => :rotate
18
20
 
19
21
  desc '--version, -v', 'Prints the version'
20
22
  # print the version number
@@ -189,7 +191,17 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
189
191
  existing: account, message: 'account name', validator: Awskeyring::Validate.method(:account_name)
190
192
  )
191
193
  role ||= options[:role]
194
+ if role
195
+ role = ask_check(
196
+ existing: role, message: 'role name', validator: Awskeyring::Validate.method(:role_name)
197
+ )
198
+ end
192
199
  code ||= options[:code]
200
+ if code
201
+ code = ask_check(
202
+ existing: code, message: 'current mfa code', validator: Awskeyring::Validate.method(:mfa_code)
203
+ )
204
+ end
193
205
  duration = options[:duration]
194
206
  duration ||= (60 * 60 * 1).to_s if role
195
207
  duration ||= (60 * 60 * 12).to_s if code
@@ -258,11 +270,15 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
258
270
  warn "enable autocomplete with 'complete -C /path-to-command/#{exec_name} #{exec_name}'"
259
271
  exit 1
260
272
  end
261
- comp_len = comp_line.split.length
262
- comp_len += 1 if curr == ''
273
+ comp_len = comp_line.split.index(prev)
274
+
275
+ case prev
276
+ when 'help'
277
+ comp_len = 0
278
+ when 'remove-role', '-r', 'rmr'
279
+ comp_len = 2
280
+ end
263
281
 
264
- comp_len = 2 if prev == 'help'
265
- comp_len = 4 if prev == 'remove-role'
266
282
  print_auto_resp(curr, comp_len)
267
283
  end
268
284
 
@@ -270,11 +286,11 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
270
286
 
271
287
  def print_auto_resp(curr, len)
272
288
  case len
273
- when 2
289
+ when 0
274
290
  puts list_commands.select { |elem| elem.start_with?(curr) }.join("\n")
275
- when 3
291
+ when 1
276
292
  puts Awskeyring.list_account_names.select { |elem| elem.start_with?(curr) }.join("\n")
277
- when 4
293
+ when 2
278
294
  puts Awskeyring.list_role_names.select { |elem| elem.start_with?(curr) }.join("\n")
279
295
  else
280
296
  exit 1
@@ -315,6 +331,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
315
331
  value = validator.call(value) unless value.empty? && optional
316
332
  rescue RuntimeError => e
317
333
  warn e.message
334
+ existing = nil
318
335
  retry unless (retries -= 1).zero?
319
336
  exit 1
320
337
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: awskeyring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tristan Morgan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-14 00:00:00.000000000 Z
11
+ date: 2018-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-iam