awskeyring 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/i18n/en.yml +1 -0
- data/lib/awskeyring.rb +12 -0
- data/lib/awskeyring/input.rb +37 -0
- data/lib/awskeyring/version.rb +1 -1
- data/lib/awskeyring_command.rb +30 -29
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ad1f180eac2ee0404c4c8d96eb0206d4e1812de
|
4
|
+
data.tar.gz: 431a1d18c5547c6ab5f6c7f8c3b3a15ab2ca2467
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: dc88bb7611ca1fe6c391e21a099a964726e87093b78278c19f972909f22a259b97af373927917df6b5a4f61d67362265dc1033914b4ddf61d30d018d7d51268f
|
7
|
+
data.tar.gz: 83132abd48684e6b58593781494a7ff43ec9c061e467a3efdbf5b68d2b066d1626999681620dc51323e7bc9e11fd5f1b4bf2d6f06b8a6c225683f859de6aa647
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## [v0.8.0](https://github.com/vibrato/awskeyring/tree/v0.8.0) (2018-12-19)
|
4
|
+
[Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.7.2...v0.8.0)
|
5
|
+
|
6
|
+
**Implemented enhancements:**
|
7
|
+
|
8
|
+
- Provide input feedback for secret fields. [\#41](https://github.com/vibrato/awskeyring/pull/41) ([tristanmorgan](https://github.com/tristanmorgan))
|
9
|
+
|
10
|
+
**Fixed bugs:**
|
11
|
+
|
12
|
+
- Cannot enter secret access key when adding new accounts in 0.7.0 [\#36](https://github.com/vibrato/awskeyring/issues/36)
|
13
|
+
|
14
|
+
## [v0.7.2](https://github.com/vibrato/awskeyring/tree/v0.7.2) (2018-12-17)
|
15
|
+
[Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.7.1...v0.7.2)
|
16
|
+
|
17
|
+
**Fixed bugs:**
|
18
|
+
|
19
|
+
- Validate that account doesn't already exists. [\#40](https://github.com/vibrato/awskeyring/pull/40) ([tristanmorgan](https://github.com/tristanmorgan))
|
20
|
+
- Check for COMMAND param to exec. [\#38](https://github.com/vibrato/awskeyring/pull/38) ([tristanmorgan](https://github.com/tristanmorgan))
|
21
|
+
|
3
22
|
## [v0.7.1](https://github.com/vibrato/awskeyring/tree/v0.7.1) (2018-12-03)
|
4
23
|
[Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.7.0...v0.7.1)
|
5
24
|
|
data/i18n/en.yml
CHANGED
@@ -68,6 +68,7 @@ en:
|
|
68
68
|
delrole: '# Removing role %{role}'
|
69
69
|
deltoken: '# Removing token for account %{account}'
|
70
70
|
delexpired: '# Removing expired session credentials'
|
71
|
+
exec: '# COMMAND not provided'
|
71
72
|
missing: '# Config missing, run `%{bin} initialise` to recreate.'
|
72
73
|
rotate: '# You have two access keys for account %{account}'
|
73
74
|
temporary: '# Using temporary session credentials.'
|
data/lib/awskeyring.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'keychain'
|
3
|
+
require 'awskeyring/validate'
|
3
4
|
|
4
5
|
# Awskeyring Module,
|
5
6
|
# gives you an interface to access keychains and items.
|
@@ -284,8 +285,19 @@ module Awskeyring # rubocop:disable Metrics/ModuleLength
|
|
284
285
|
#
|
285
286
|
# @param [String] account_name the associated account name.
|
286
287
|
def self.account_exists(account_name)
|
288
|
+
Awskeyring::Validate.account_name(account_name)
|
287
289
|
raise 'Account does not exist' unless list_account_names.include?(account_name)
|
288
290
|
|
289
291
|
account_name
|
290
292
|
end
|
293
|
+
|
294
|
+
# Validate account does not exists
|
295
|
+
#
|
296
|
+
# @param [String] account_name the associated account name.
|
297
|
+
def self.account_not_exists(account_name)
|
298
|
+
Awskeyring::Validate.account_name(account_name)
|
299
|
+
raise 'Account already exists' if list_account_names.include?(account_name)
|
300
|
+
|
301
|
+
account_name
|
302
|
+
end
|
291
303
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'io/console'
|
2
|
+
|
3
|
+
# Awskeyring Module,
|
4
|
+
module Awskeyring
|
5
|
+
# Input methods for Awskeyring
|
6
|
+
module Input
|
7
|
+
# Read a secret in without echoing the characters
|
8
|
+
#
|
9
|
+
# @param [String] prompt text to prompt user with.
|
10
|
+
def self.read_secret(prompt)
|
11
|
+
$stdout.print(prompt)
|
12
|
+
hide_input
|
13
|
+
end
|
14
|
+
|
15
|
+
private_class_method def self.hide_input # rubocop:disable Metrics/MethodLength
|
16
|
+
password = ''
|
17
|
+
loop do
|
18
|
+
character = $stdin.getch
|
19
|
+
break unless character
|
20
|
+
|
21
|
+
if ["\n", "\r"].include? character
|
22
|
+
puts ''
|
23
|
+
break
|
24
|
+
elsif ["\b", "\u007f"].include? character
|
25
|
+
password.chop!
|
26
|
+
print "\b\e[P"
|
27
|
+
elsif character == "\u0003"
|
28
|
+
exit 1
|
29
|
+
else
|
30
|
+
print '*'
|
31
|
+
password << character
|
32
|
+
end
|
33
|
+
end
|
34
|
+
password
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/awskeyring/version.rb
CHANGED
data/lib/awskeyring_command.rb
CHANGED
@@ -3,6 +3,7 @@ require 'thor'
|
|
3
3
|
|
4
4
|
require 'awskeyring'
|
5
5
|
require 'awskeyring/awsapi'
|
6
|
+
require 'awskeyring/input'
|
6
7
|
require 'awskeyring/validate'
|
7
8
|
require 'awskeyring/version'
|
8
9
|
|
@@ -70,12 +71,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
|
|
70
71
|
existing: account, message: I18n.t('message.account'), validator: Awskeyring.method(:account_exists)
|
71
72
|
)
|
72
73
|
cred = age_check_and_get(account: account, no_token: options['no-token'])
|
73
|
-
put_env_string(
|
74
|
-
account: cred[:account],
|
75
|
-
key: cred[:key],
|
76
|
-
secret: cred[:secret],
|
77
|
-
token: cred[:token]
|
78
|
-
)
|
74
|
+
put_env_string(cred)
|
79
75
|
end
|
80
76
|
|
81
77
|
desc 'json ACCOUNT', I18n.t('json.desc')
|
@@ -99,15 +95,20 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
|
|
99
95
|
method_option 'no-token', type: :boolean, aliases: '-n', desc: I18n.t('method_option.notoken'), default: false
|
100
96
|
# execute an external command with env set
|
101
97
|
def exec(account, *command)
|
98
|
+
if command.empty?
|
99
|
+
warn I18n.t('message.exec')
|
100
|
+
exit 1
|
101
|
+
end
|
102
102
|
cred = age_check_and_get(account: account, no_token: options['no-token'])
|
103
|
-
env_vars = env_vars(
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
103
|
+
env_vars = env_vars(cred)
|
104
|
+
begin
|
105
|
+
pid = Process.spawn(env_vars, command.join(' '))
|
106
|
+
Process.wait pid
|
107
|
+
$CHILD_STATUS
|
108
|
+
rescue Errno::ENOENT => err
|
109
|
+
warn err.to_s
|
110
|
+
exit 1
|
111
|
+
end
|
111
112
|
end
|
112
113
|
|
113
114
|
desc 'add ACCOUNT', I18n.t('add.desc')
|
@@ -118,7 +119,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
|
|
118
119
|
# Add an Account
|
119
120
|
def add(account = nil) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
|
120
121
|
account = ask_check(
|
121
|
-
existing: account, message: I18n.t('message.account'), validator: Awskeyring
|
122
|
+
existing: account, message: I18n.t('message.account'), validator: Awskeyring.method(:account_not_exists)
|
122
123
|
)
|
123
124
|
key = ask_check(
|
124
125
|
existing: options[:key], message: I18n.t('message.key'), validator: Awskeyring::Validate.method(:access_key)
|
@@ -418,27 +419,27 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
|
|
418
419
|
self.class.all_commands[command].options.values.map(&:switch_name)
|
419
420
|
end
|
420
421
|
|
421
|
-
def env_vars(
|
422
|
+
def env_vars(cred)
|
422
423
|
env_var = {}
|
423
424
|
env_var['AWS_DEFAULT_REGION'] = 'us-east-1' unless Awskeyring::Awsapi.region
|
424
|
-
env_var['AWS_ACCOUNT_NAME'] = account
|
425
|
-
env_var['AWS_ACCESS_KEY_ID'] = key
|
426
|
-
env_var['AWS_ACCESS_KEY'] = key
|
427
|
-
env_var['AWS_SECRET_ACCESS_KEY'] = secret
|
428
|
-
env_var['AWS_SECRET_KEY'] = secret
|
429
|
-
if token
|
430
|
-
env_var['AWS_SECURITY_TOKEN'] = token
|
431
|
-
env_var['AWS_SESSION_TOKEN'] = token
|
425
|
+
env_var['AWS_ACCOUNT_NAME'] = cred[:account]
|
426
|
+
env_var['AWS_ACCESS_KEY_ID'] = cred[:key]
|
427
|
+
env_var['AWS_ACCESS_KEY'] = cred[:key]
|
428
|
+
env_var['AWS_SECRET_ACCESS_KEY'] = cred[:secret]
|
429
|
+
env_var['AWS_SECRET_KEY'] = cred[:secret]
|
430
|
+
if cred[:token]
|
431
|
+
env_var['AWS_SECURITY_TOKEN'] = cred[:token]
|
432
|
+
env_var['AWS_SESSION_TOKEN'] = cred[:token]
|
432
433
|
end
|
433
434
|
env_var
|
434
435
|
end
|
435
436
|
|
436
|
-
def put_env_string(
|
437
|
-
env_var = env_vars(
|
437
|
+
def put_env_string(cred)
|
438
|
+
env_var = env_vars(cred)
|
438
439
|
env_var.each { |var, value| puts "export #{var}=\"#{value}\"" }
|
439
440
|
|
440
|
-
puts 'unset AWS_SECURITY_TOKEN' unless token
|
441
|
-
puts 'unset AWS_SESSION_TOKEN' unless token
|
441
|
+
puts 'unset AWS_SECURITY_TOKEN' unless cred[:token]
|
442
|
+
puts 'unset AWS_SESSION_TOKEN' unless cred[:token]
|
442
443
|
end
|
443
444
|
|
444
445
|
def ask_check(existing:, message:, secure: false, optional: false, validator: nil)
|
@@ -461,7 +462,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength
|
|
461
462
|
|
462
463
|
def ask(message:, secure: false, optional: false)
|
463
464
|
if secure
|
464
|
-
|
465
|
+
Awskeyring::Input.read_secret(message.rjust(20) + ': ')
|
465
466
|
elsif optional
|
466
467
|
Thor::LineEditor.readline((message + ' (optional)').rjust(20) + ': ')
|
467
468
|
else
|
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.
|
4
|
+
version: 0.8.0
|
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-12-
|
11
|
+
date: 2018-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-iam
|
@@ -85,6 +85,7 @@ files:
|
|
85
85
|
- i18n/en.yml
|
86
86
|
- lib/awskeyring.rb
|
87
87
|
- lib/awskeyring/awsapi.rb
|
88
|
+
- lib/awskeyring/input.rb
|
88
89
|
- lib/awskeyring/validate.rb
|
89
90
|
- lib/awskeyring/version.rb
|
90
91
|
- lib/awskeyring_command.rb
|