Skip to content

Commit 103e4e0

Browse files
Merge pull request #44 from vibrato/unset-flag
Add --unset flag to env command
2 parents 04b2c06 + 1aa51e4 commit 103e4e0

File tree

5 files changed

+88
-26
lines changed

5 files changed

+88
-26
lines changed

Diff for: i18n/en.yml

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ en:
4747
path: 'The service PATH to open.'
4848
role: 'The ROLE to assume.'
4949
secret: 'AWS account secret.'
50+
unset: 'Unset environment variables.'
5051
message:
5152
keychain: 'Name for new keychain (default: awskeyring)'
5253
account: 'account name'

Diff for: lib/awskeyring/awsapi.rb

+39
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,16 @@ module Awsapi # rubocop:disable Metrics/ModuleLength
2020
# AWS Signin url
2121
AWS_SIGNIN_URL = 'https://signin.aws.amazon.com/federation'.freeze
2222

23+
# AWS Env vars
24+
AWS_ENV_VARS = %w[
25+
AWS_ACCESS_KEY_ID
26+
AWS_ACCESS_KEY
27+
AWS_SECRET_ACCESS_KEY
28+
AWS_SECRET_KEY
29+
AWS_SECURITY_TOKEN
30+
AWS_SESSION_TOKEN
31+
].freeze
32+
2333
# Twelve hours in seconds
2434
TWELVE_HOUR = (60 * 60 * 12)
2535
# One hour in seconds
@@ -101,6 +111,35 @@ def self.get_cred_json(key:, secret:, token:, expiry:)
101111
)
102112
end
103113

114+
# Generates Environment Variables for the AWS CLI
115+
#
116+
# @param [Hash] params including
117+
# [String] account The aws_access_key_id
118+
# [String] secret The aws_secret_access_key
119+
# [String] token The aws_session_token
120+
# @return [Hash] env_var hash
121+
def self.get_env_array(params = {})
122+
env_var = {}
123+
env_var['AWS_DEFAULT_REGION'] = 'us-east-1' unless region
124+
env_var['AWS_ACCOUNT_NAME'] = params[:account] if params[:account]
125+
126+
if params[:key]
127+
env_var['AWS_ACCESS_KEY_ID'] = params[:key]
128+
env_var['AWS_ACCESS_KEY'] = params[:key]
129+
end
130+
131+
if params[:secret]
132+
env_var['AWS_SECRET_ACCESS_KEY'] = params[:secret]
133+
env_var['AWS_SECRET_KEY'] = params[:secret]
134+
end
135+
136+
if params[:token]
137+
env_var['AWS_SECURITY_TOKEN'] = params[:token]
138+
env_var['AWS_SESSION_TOKEN'] = params[:token]
139+
end
140+
env_var
141+
end
142+
104143
# Verify Credentials are active and valid
105144
#
106145
# @param [String] key The aws_access_key_id

Diff for: lib/awskeyring_command.rb

+14-25
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,19 @@ def list_role
6565

6666
desc 'env ACCOUNT', I18n.t('env.desc')
6767
method_option 'no-token', type: :boolean, aliases: '-n', desc: I18n.t('method_option.notoken'), default: false
68+
method_option 'unset', type: :boolean, aliases: '-u', desc: I18n.t('method_option.unset'), default: false
6869
# Print Env vars
6970
def env(account = nil)
70-
account = ask_check(
71-
existing: account, message: I18n.t('message.account'), validator: Awskeyring.method(:account_exists)
72-
)
73-
cred = age_check_and_get(account: account, no_token: options['no-token'])
74-
put_env_string(cred)
71+
if options['unset']
72+
put_env_string(account: nil, key: nil, secret: nil, token: nil)
73+
else
74+
account = ask_check(
75+
existing: account, message: I18n.t('message.account'),
76+
validator: Awskeyring.method(:account_exists)
77+
)
78+
cred = age_check_and_get(account: account, no_token: options['no-token'])
79+
put_env_string(cred)
80+
end
7581
end
7682

7783
desc 'json ACCOUNT', I18n.t('json.desc')
@@ -100,7 +106,7 @@ def exec(account, *command)
100106
exit 1
101107
end
102108
cred = age_check_and_get(account: account, no_token: options['no-token'])
103-
env_vars = env_vars(cred)
109+
env_vars = Awskeyring::Awsapi.get_env_array(cred)
104110
begin
105111
pid = Process.spawn(env_vars, command.join(' '))
106112
Process.wait pid
@@ -419,27 +425,10 @@ def list_arguments(command:)
419425
self.class.all_commands[command].options.values.map(&:switch_name)
420426
end
421427

422-
def env_vars(cred)
423-
env_var = {}
424-
env_var['AWS_DEFAULT_REGION'] = 'us-east-1' unless Awskeyring::Awsapi.region
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]
433-
end
434-
env_var
435-
end
436-
437428
def put_env_string(cred)
438-
env_var = env_vars(cred)
429+
env_var = Awskeyring::Awsapi.get_env_array(cred)
439430
env_var.each { |var, value| puts "export #{var}=\"#{value}\"" }
440-
441-
puts 'unset AWS_SECURITY_TOKEN' unless cred[:token]
442-
puts 'unset AWS_SESSION_TOKEN' unless cred[:token]
431+
Awskeyring::Awsapi::AWS_ENV_VARS.each { |key| puts "unset #{key}" unless env_var.key?(key) }
443432
end
444433

445434
def ask_check(existing:, message:, secure: false, optional: false, validator: nil)

Diff for: spec/lib/awskeyring/awsapi_spec.rb

+19
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@
304304
end
305305

306306
context 'When there is no region set' do
307+
let(:role_token) { 'AQoDYXdzEPT//////////wEXAMPLEtc764assume_roleDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMi' }
307308
let(:sharedcfg) do
308309
double(
309310
region: nil
@@ -324,5 +325,23 @@
324325
it 'can not retrieve the current region' do
325326
expect(subject.region).to be nil
326327
end
328+
329+
it 'returns an array of env vars for the Credential' do
330+
expect(subject.get_env_array(
331+
account: 'test',
332+
key: 'ASIAIOSFODNN7EXAMPLE',
333+
secret: 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY',
334+
token: role_token
335+
)).to eq(
336+
'AWS_ACCESS_KEY' => 'ASIAIOSFODNN7EXAMPLE',
337+
'AWS_ACCESS_KEY_ID' => 'ASIAIOSFODNN7EXAMPLE',
338+
'AWS_ACCOUNT_NAME' => 'test',
339+
'AWS_DEFAULT_REGION' => 'us-east-1',
340+
'AWS_SECRET_ACCESS_KEY' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY',
341+
'AWS_SECRET_KEY' => 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY',
342+
'AWS_SECURITY_TOKEN' => role_token,
343+
'AWS_SESSION_TOKEN' => role_token
344+
)
345+
end
327346
end
328347
end

Diff for: spec/lib/awskeyring_command_spec.rb

+15-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222

2323
it 'returns the version number' do
2424
expect { AwskeyringCommand.start(%w[__version]) }
25-
.to output(/\d\.\d\.\d/).to_stdout
25+
.to output(/\d+\.\d+\.\d+/).to_stdout
2626
end
2727

2828
it 'prints autocomplete help text' do
@@ -137,6 +137,20 @@
137137
export AWS_SECRET_KEY="biglongbase64"
138138
unset AWS_SECURITY_TOKEN
139139
unset AWS_SESSION_TOKEN
140+
)).to_stdout
141+
end
142+
143+
it 'unsets all AWS Access keys' do
144+
expect(Awskeyring).to_not receive(:get_valid_creds)
145+
146+
expect { AwskeyringCommand.start(%w[env --unset]) }
147+
.to output(%(export AWS_DEFAULT_REGION="us-east-1"
148+
unset AWS_ACCESS_KEY_ID
149+
unset AWS_ACCESS_KEY
150+
unset AWS_SECRET_ACCESS_KEY
151+
unset AWS_SECRET_KEY
152+
unset AWS_SECURITY_TOKEN
153+
unset AWS_SESSION_TOKEN
140154
)).to_stdout
141155
end
142156
end

0 commit comments

Comments
 (0)