Class: WifiWand::Platforms::Mac::KeychainPasswordReader

Inherits:
Object
  • Object
show all
Defined in:
lib/wifi_wand/platforms/mac/keychain_password_reader.rb

Constant Summary collapse

DEFAULT_LOOKUP_TIMEOUT_SECONDS =
5
EXIT_CODE_HANDLERS =

Keychain exit code handlers for password retrieval: 44: item not found, 45: access denied, 128: user cancelled, 51: non-interactive access, 25: invalid search parameters, 1: general error that may contain "could not be found".

{
  44  => ->(_network_name, _error) {},
  45  => ->(network_name, _error) { raise KeychainAccessDeniedError, network_name },
  128 => ->(network_name, _error) { raise KeychainAccessCancelledError, network_name },
  51  => ->(network_name, _error) { raise KeychainNonInteractiveError, network_name },
  25  => ->(network_name, _error) {
    raise KeychainError, "Invalid keychain search parameters for network '#{network_name}'"
  },
  1   => ->(network_name, error) {
    if error.text.include?('could not be found')
      nil
    else
      raise KeychainError,
        "Keychain error accessing password for network '#{network_name}': #{error.text.strip}"
    end
  },
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(command_runner:) ⇒ KeychainPasswordReader

Returns a new instance of KeychainPasswordReader.



34
35
36
# File 'lib/wifi_wand/platforms/mac/keychain_password_reader.rb', line 34

def initialize(command_runner:)
  @command_runner = command_runner
end

Instance Method Details

#password_for(network_name, timeout_in_secs: DEFAULT_LOOKUP_TIMEOUT_SECONDS) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/wifi_wand/platforms/mac/keychain_password_reader.rb', line 38

def password_for(network_name, timeout_in_secs: DEFAULT_LOOKUP_TIMEOUT_SECONDS)
  @command_runner.call(
    [
      'security',
      'find-generic-password',
      '-D',
      'AirPort network password',
      '-a',
      network_name,
      '-w',
    ],
    raise_on_error:  true,
    timeout_in_secs: timeout_in_secs
  ).stdout.chomp
rescue WifiWand::CommandExecutor::OsCommandError => e
  handle_keychain_error(network_name, e)
end