awskeyring 0.5.0 → 0.5.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 +4 -4
- data/.rubocop.yml +4 -4
- data/CHANGELOG.md +7 -0
- data/README.md +4 -0
- data/exe/awskeyring +6 -1
- data/i18n/en.yml +1 -1
- data/lib/awskeyring/awsapi.rb +13 -7
- data/lib/awskeyring/version.rb +1 -1
- data/lib/awskeyring_command.rb +32 -12
- metadata +2 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: b18067d6aad4daed7c723e3b67cdd3983d66ae67
         | 
| 4 | 
            +
              data.tar.gz: 4975855826aadafe2631abcd7fa98658f15b0e18
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c50766e6d2fe027102d49c8cf71b1974806f2a248e28083927f0fd4a709179a33649d1432fd14f96c18d2df9c4c05b3188e114fc6feaa34b85d32ca6bc3d8a57
         | 
| 7 | 
            +
              data.tar.gz: 650c4c01e6202148a7ab063cc017739596bda2bffa9bc0b605a383d7fa211159abef6c61101d464d64d9878ea0abc69f24f59937af04bee8d7b438d23bfc1b06
         | 
    
        data/.rubocop.yml
    CHANGED
    
    
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,12 @@ | |
| 1 1 | 
             
            # Change Log
         | 
| 2 2 |  | 
| 3 | 
            +
            ## [v0.5.1](https://github.com/vibrato/awskeyring/tree/v0.5.1) (2018-09-13)
         | 
| 4 | 
            +
            [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.5.0...v0.5.1)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            **Implemented enhancements:**
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            - Autocomplete flags too. [\#29](https://github.com/vibrato/awskeyring/pull/29) ([tristanmorgan](https://github.com/tristanmorgan))
         | 
| 9 | 
            +
             | 
| 3 10 | 
             
            ## [v0.5.0](https://github.com/vibrato/awskeyring/tree/v0.5.0) (2018-09-10)
         | 
| 4 11 | 
             
            [Full Changelog](https://github.com/vibrato/awskeyring/compare/v0.4.0...v0.5.0)
         | 
| 5 12 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -87,6 +87,10 @@ After checking out the repo, run `bundle update` to install dependencies. Then, | |
| 87 87 |  | 
| 88 88 | 
             
            To install this gem onto your local machine, run `bundle exec rake install`.
         | 
| 89 89 |  | 
| 90 | 
            +
            ## Security
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            If you believe you have found a security issue in Awskeyring, please responsibly disclose by contacting me at [tristan@vibrato.com.au](mailto:tristan@vibrato.com.au). Awskeyring is a Ruby script and as such Ruby is whitelisted to access your "awskeyring" keychain. Use a strong password and keep the unlock time short.
         | 
| 93 | 
            +
             | 
| 90 94 | 
             
            ## Contributing
         | 
| 91 95 |  | 
| 92 96 | 
             
            Bug reports and pull requests are welcome on GitHub at https://github.com/vibrato/awskeyring. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
         | 
    
        data/exe/awskeyring
    CHANGED
    
    
    
        data/i18n/en.yml
    CHANGED
    
    | @@ -40,10 +40,10 @@ en: | |
| 40 40 | 
             
                duration: 'Session DURATION in seconds.'
         | 
| 41 41 | 
             
                key: 'AWS account key id.'
         | 
| 42 42 | 
             
                keychain: 'Name of KEYCHAIN to initialise.'
         | 
| 43 | 
            -
                local: 'Only validate locally.'
         | 
| 44 43 | 
             
                mfa: 'AWS virtual mfa arn.'
         | 
| 45 44 | 
             
                noopen: 'Do not open the url.'
         | 
| 46 45 | 
             
                notoken: 'Do not use saved token.'
         | 
| 46 | 
            +
                noremote: 'Do not validate with remote api.'
         | 
| 47 47 | 
             
                path: 'The service PATH to open.'
         | 
| 48 48 | 
             
                role: 'The ROLE to assume.'
         | 
| 49 49 | 
             
                secret: 'AWS account secret.'
         | 
    
        data/lib/awskeyring/awsapi.rb
    CHANGED
    
    | @@ -17,6 +17,9 @@ module Awskeyring | |
| 17 17 | 
             
                  }]
         | 
| 18 18 | 
             
                }.to_json.freeze
         | 
| 19 19 |  | 
| 20 | 
            +
                # AWS Signin url
         | 
| 21 | 
            +
                AWS_SIGNIN_URL = 'https://signin.aws.amazon.com/federation'.freeze
         | 
| 22 | 
            +
             | 
| 20 23 | 
             
                # Twelve hours in seconds
         | 
| 21 24 | 
             
                TWELVE_HOUR = (60 * 60 * 12)
         | 
| 22 25 | 
             
                # One hour in seconds
         | 
| @@ -122,9 +125,8 @@ module Awskeyring | |
| 122 125 | 
             
                # @param [String] user The local username
         | 
| 123 126 | 
             
                # @param [String] path within the Console to access
         | 
| 124 127 | 
             
                # @return [String] login_url to access
         | 
| 125 | 
            -
                def self.get_login_url(key:, secret:, token:, path:, user:) # rubocop:disable | 
| 128 | 
            +
                def self.get_login_url(key:, secret:, token:, path:, user:) # rubocop:disable Metrics/MethodLength
         | 
| 126 129 | 
             
                  console_url = "https://console.aws.amazon.com/#{path}/home"
         | 
| 127 | 
            -
                  signin_url = 'https://signin.aws.amazon.com/federation'
         | 
| 128 130 |  | 
| 129 131 | 
             
                  if token
         | 
| 130 132 | 
             
                    session_json = {
         | 
| @@ -147,16 +149,20 @@ module Awskeyring | |
| 147 149 | 
             
                    }.to_json
         | 
| 148 150 | 
             
                  end
         | 
| 149 151 |  | 
| 150 | 
            -
                   | 
| 152 | 
            +
                  destination_param = '&Destination=' + CGI.escape(console_url)
         | 
| 153 | 
            +
             | 
| 154 | 
            +
                  AWS_SIGNIN_URL + '?Action=login' + token_param(session_json: session_json) + destination_param
         | 
| 155 | 
            +
                end
         | 
| 156 | 
            +
             | 
| 157 | 
            +
                # Get the signin token param
         | 
| 158 | 
            +
                private_class_method def self.token_param(session_json:)
         | 
| 159 | 
            +
                  get_signin_token_url = AWS_SIGNIN_URL + '?Action=getSigninToken' \
         | 
| 151 160 | 
             
                                         '&Session=' + CGI.escape(session_json)
         | 
| 152 161 |  | 
| 153 162 | 
             
                  returned_content = Net::HTTP.get(URI.parse(get_signin_token_url))
         | 
| 154 163 |  | 
| 155 164 | 
             
                  signin_token = JSON.parse(returned_content)['SigninToken']
         | 
| 156 | 
            -
                   | 
| 157 | 
            -
                  destination_param = '&Destination=' + CGI.escape(console_url)
         | 
| 158 | 
            -
             | 
| 159 | 
            -
                  signin_url + '?Action=login' + signin_token_param + destination_param
         | 
| 165 | 
            +
                  '&SigninToken=' + CGI.escape(signin_token)
         | 
| 160 166 | 
             
                end
         | 
| 161 167 |  | 
| 162 168 | 
             
                # Get the current region
         | 
    
        data/lib/awskeyring/version.rb
    CHANGED
    
    
    
        data/lib/awskeyring_command.rb
    CHANGED
    
    | @@ -13,6 +13,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 13 13 | 
             
              I18n.backend.load_translations
         | 
| 14 14 |  | 
| 15 15 | 
             
              map %w[--version -v] => :__version
         | 
| 16 | 
            +
              map %w[--help -h] => :help
         | 
| 16 17 | 
             
              map ['init'] => :initialise
         | 
| 17 18 | 
             
              map ['con'] => :console
         | 
| 18 19 | 
             
              map ['ls'] => :list
         | 
| @@ -114,7 +115,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 114 115 | 
             
              method_option :key, type: :string, aliases: '-k', desc: I18n.t('method_option.key')
         | 
| 115 116 | 
             
              method_option :secret, type: :string, aliases: '-s', desc: I18n.t('method_option.secret')
         | 
| 116 117 | 
             
              method_option :mfa, type: :string, aliases: '-m', desc: I18n.t('method_option.mfa')
         | 
| 117 | 
            -
              method_option  | 
| 118 | 
            +
              method_option 'no-remote', type: :boolean, aliases: '-r', desc: I18n.t('method_option.noremote'), default: false
         | 
| 118 119 | 
             
              # Add an Account
         | 
| 119 120 | 
             
              def add(account = nil) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
         | 
| 120 121 | 
             
                account = ask_check(
         | 
| @@ -131,7 +132,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 131 132 | 
             
                  existing: options[:mfa], message: I18n.t('message.mfa'),
         | 
| 132 133 | 
             
                  optional: true, validator: Awskeyring::Validate.method(:mfa_arn)
         | 
| 133 134 | 
             
                )
         | 
| 134 | 
            -
                Awskeyring::Awsapi.verify_cred(key: key, secret: secret) unless options[ | 
| 135 | 
            +
                Awskeyring::Awsapi.verify_cred(key: key, secret: secret) unless options['no-remote']
         | 
| 135 136 | 
             
                Awskeyring.add_account(
         | 
| 136 137 | 
             
                  account: account,
         | 
| 137 138 | 
             
                  key: key,
         | 
| @@ -144,7 +145,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 144 145 | 
             
              desc 'update ACCOUNT', I18n.t('update.desc')
         | 
| 145 146 | 
             
              method_option :key, type: :string, aliases: '-k', desc: I18n.t('method_option.key')
         | 
| 146 147 | 
             
              method_option :secret, type: :string, aliases: '-s', desc: I18n.t('method_option.secret')
         | 
| 147 | 
            -
              method_option  | 
| 148 | 
            +
              method_option 'no-remote', type: :boolean, aliases: '-r', desc: I18n.t('method_option.noremote'), default: false
         | 
| 148 149 | 
             
              # Update an Account
         | 
| 149 150 | 
             
              def update(account = nil) # rubocop:disable Metrics/MethodLength
         | 
| 150 151 | 
             
                account = ask_check(
         | 
| @@ -157,7 +158,7 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 157 158 | 
             
                  existing: options[:secret], message: I18n.t('message.secret'),
         | 
| 158 159 | 
             
                  secure: true, validator: Awskeyring::Validate.method(:secret_access_key)
         | 
| 159 160 | 
             
                )
         | 
| 160 | 
            -
                Awskeyring::Awsapi.verify_cred(key: key, secret: secret) unless options[ | 
| 161 | 
            +
                Awskeyring::Awsapi.verify_cred(key: key, secret: secret) unless options['no-remote']
         | 
| 161 162 | 
             
                Awskeyring.update_account(
         | 
| 162 163 | 
             
                  account: account,
         | 
| 163 164 | 
             
                  key: key,
         | 
| @@ -349,7 +350,18 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 349 350 | 
             
                  warn I18n.t('message.awskeyring', path: $PROGRAM_NAME, bin: exec_name)
         | 
| 350 351 | 
             
                  exit 1
         | 
| 351 352 | 
             
                end
         | 
| 353 | 
            +
             | 
| 354 | 
            +
                curr, comp_len, sub_cmd = comp_type(comp_line: comp_line, curr: curr, prev: prev)
         | 
| 355 | 
            +
                print_auto_resp(curr, comp_len, sub_cmd)
         | 
| 356 | 
            +
              end
         | 
| 357 | 
            +
             | 
| 358 | 
            +
              private
         | 
| 359 | 
            +
             | 
| 360 | 
            +
              def comp_type(comp_line:, curr:, prev:)
         | 
| 352 361 | 
             
                comp_len = comp_line.split.index(prev)
         | 
| 362 | 
            +
                sub_cmd = comp_line.split[1] if comp_len > 0
         | 
| 363 | 
            +
             | 
| 364 | 
            +
                comp_len = 3 if curr.start_with?('-') && !sub_cmd.nil?
         | 
| 353 365 |  | 
| 354 366 | 
             
                case prev
         | 
| 355 367 | 
             
                when 'help'
         | 
| @@ -358,11 +370,9 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 358 370 | 
             
                  comp_len = 2
         | 
| 359 371 | 
             
                end
         | 
| 360 372 |  | 
| 361 | 
            -
                 | 
| 373 | 
            +
                [curr, comp_len, sub_cmd]
         | 
| 362 374 | 
             
              end
         | 
| 363 375 |  | 
| 364 | 
            -
              private
         | 
| 365 | 
            -
             | 
| 366 376 | 
             
              def age_check_and_get(account:, no_token:)
         | 
| 367 377 | 
             
                cred = Awskeyring.get_valid_creds(account: account, no_token: no_token)
         | 
| 368 378 |  | 
| @@ -373,21 +383,31 @@ class AwskeyringCommand < Thor # rubocop:disable Metrics/ClassLength | |
| 373 383 | 
             
                cred
         | 
| 374 384 | 
             
              end
         | 
| 375 385 |  | 
| 376 | 
            -
              def print_auto_resp(curr, len)
         | 
| 386 | 
            +
              def print_auto_resp(curr, len, sub_cmd)
         | 
| 387 | 
            +
                list = []
         | 
| 377 388 | 
             
                case len
         | 
| 378 389 | 
             
                when 0
         | 
| 379 | 
            -
                   | 
| 390 | 
            +
                  list = list_commands
         | 
| 380 391 | 
             
                when 1
         | 
| 381 | 
            -
                   | 
| 392 | 
            +
                  list = Awskeyring.list_account_names
         | 
| 382 393 | 
             
                when 2
         | 
| 383 | 
            -
                   | 
| 394 | 
            +
                  list = Awskeyring.list_role_names
         | 
| 395 | 
            +
                when 3
         | 
| 396 | 
            +
                  list = list_arguments(command: sub_cmd)
         | 
| 384 397 | 
             
                else
         | 
| 385 398 | 
             
                  exit 1
         | 
| 386 399 | 
             
                end
         | 
| 400 | 
            +
                puts list.select { |elem| elem.start_with?(curr) }.sort!.join("\n")
         | 
| 387 401 | 
             
              end
         | 
| 388 402 |  | 
| 389 403 | 
             
              def list_commands
         | 
| 390 | 
            -
                self.class.all_commands.keys.map { |elem| elem.tr('_', '-') }.reject { |elem| elem == 'awskeyring' }
         | 
| 404 | 
            +
                self.class.all_commands.keys.map { |elem| elem.tr('_', '-') }.reject! { |elem| elem == 'awskeyring' }
         | 
| 405 | 
            +
              end
         | 
| 406 | 
            +
             | 
| 407 | 
            +
              def list_arguments(command:)
         | 
| 408 | 
            +
                command = list_commands.find { |elem| elem.start_with?(command) }
         | 
| 409 | 
            +
                self.class.all_commands[command].options.values.map(&:aliases).flatten! +
         | 
| 410 | 
            +
                  self.class.all_commands[command].options.values.map(&:switch_name)
         | 
| 391 411 | 
             
              end
         | 
| 392 412 |  | 
| 393 413 | 
             
              def env_vars(account:, key:, secret:, token:)
         | 
    
        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.5. | 
| 4 | 
            +
              version: 0.5.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-09- | 
| 11 | 
            +
            date: 2018-09-12 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: aws-sdk-iam
         |