Sha256: 4a906b7518ca003a76a40df6eaa9f628a0f5f4ea4845fe7159652d9582308d3a

Contents?: true

Size: 1.55 KB

Versions: 1

Compression:

Stored size: 1.55 KB

Contents

require 'userinput'

module Keylime
  ENABLED = begin
    require 'keychain'
    true
  rescue LoadError
    raise if RUBY_PLATFORM =~ /darwin/
    false
  end

  ##
  # Easy wrapper around getting and setting secrets
  class Credential
    def initialize(params = {})
      @options = params
    end

    def get
      keychain_segment.where(@options).first
    end

    def get!(message)
      get || prompt(message)
    end

    def set(value)
      delete!
      keychain_segment.create(@options.merge(password: value))
    end

    def delete!
      get && keychain_segment.where(@options).first.delete
      nil
    end

    private

    def prompt(message)
      set UserInput.new(
        message: message,
        secret: true,
        attempts: 3,
        validation: /.+/
      ).ask
    end

    def keychain
      return @keychain if @keychain
      @keychain = StubKeychain.new unless Keylime::ENABLED
      @keychain ||= Keychain.open(@options[:keychain]) if @options[:keychain]
      @keychain ||= Keychain
    end

    def key_type
      @options[:server] ? :internet_passwords : :generic_passwords
    end

    def keychain_segment
      @keychain_segment ||= keychain.send(key_type)
    end
  end

  ##
  # Stub keychain for if keylime is running on a non-Mac
  class StubKeychain
    def segment
      StubKeychainSegment.new
    end
    alias internet_passwords segment
    alias generic_passwords segment
  end

  ##
  # Stub segment for if keylime is running on a non-Mac
  class StubKeychainSegment
    def where
      []
    end

    def create() end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
keylime-0.1.0 lib/keylime/credential.rb