spare_keys 1.0.0

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.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/spare_keys.rb +65 -0
  3. metadata +92 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c9b94b0eda4e51b2b148b20cf0ee0eee82cdb894
4
+ data.tar.gz: b9b74df48d7e8f8c8cb714ca221121c0717781e0
5
+ SHA512:
6
+ metadata.gz: 2cb40f2a8c219607828b1bd074f7ee603116593c70653986e626c1baf22f0afd7d9624bf414ae14f42d16c47c94970c5fd39f6bc9d885e7f941509808ee7cd58
7
+ data.tar.gz: 4e15ac6554ae06a38589b6688927471dd0ba0a6ac4ac30b89af63410aba5a61f3e737d16adf9c021481e0017ebf02e94e68ad97be33ced79eeac17a9b173da41
data/lib/spare_keys.rb ADDED
@@ -0,0 +1,65 @@
1
+
2
+ # Temporarily reconfigures the active keychain
3
+ class SpareKeys
4
+
5
+ # Temporarily adds the specified keychain to the top of the search list, reverting it after the block is invoked.
6
+ #
7
+ # If no block is supplied, reverting the state becomes the responsibility of the caller.
8
+ # Params:
9
+ # +keychain_path+:: path to keychain to switch to
10
+ # +clear_list+:: when true, the search list will be initially cleared to prevent fallback to a different keychain
11
+ # +type+:: if specified, replaces default/login keychain ("default", "login", nil)
12
+ # +domain+:: if specified, performs keychain operations using the specified domain
13
+ def self.use_keychain(keychain_path, clear_list = false, type = nil, domain = nil)
14
+ domain_flag = "-d #{domain}" if domain
15
+
16
+ original_list = `security list-keychains #{domain_flag} | xargs`
17
+ original_keychain = `security #{type}-keychain #{domain_flag} | xargs` if type
18
+
19
+ `security #{type}-keychain #{domain_flag} -s #{keychain_path}` if type
20
+
21
+ list_tail = original_list unless clear_list
22
+ `security list-keychains #{domain_flag} -s #{keychain_path} #{list_tail}`
23
+
24
+ if block_given?
25
+ begin
26
+ yield if block_given?
27
+ ensure
28
+ original_keychain = `security #{type}-keychain #{domain_flag} -s #{original_keychain}` if type
29
+ `security list-keychains #{domain_flag} -s #{original_list}`
30
+ end
31
+ end
32
+ end
33
+
34
+ # Creates a secure temporary keychain and adds it to the top of the
35
+ # search list, reverting the list and deleting the keychain after the block is invoked.
36
+ #
37
+ # If no block is supplied, reverting the state becomes the responsibility of the caller.
38
+ # Params:
39
+ # +clear_list+:: when true, the search list will be initially cleared to prevent fallback to a different keychain
40
+ # +type+:: if specified, replaces default/login keychain ("default", "login", nil)
41
+ # +domain+:: if specified, performs keychain operations using the specified domain
42
+ def self.temp_keychain(clear_list = false, type = nil, domain = nil) # :yields: keychain_path
43
+ require 'tempfile'
44
+ require 'securerandom'
45
+
46
+ password = SecureRandom.hex
47
+ temp_keychain = Dir::Tmpname.make_tmpname(['spare-keys-', '.keychain'], nil)
48
+
49
+ `security create-keychain -p "#{password}" #{temp_keychain}`
50
+ `security unlock-keychain -p "#{password}" #{temp_keychain}`
51
+
52
+ if block_given?
53
+ begin
54
+ use_keychain(temp_keychain, clear_list, type) {
55
+ yield temp_keychain
56
+ }
57
+ ensure
58
+ `security delete-keychain #{temp_keychain}`
59
+ end
60
+ else
61
+ use_keychain(temp_keychain, clear_list, type)
62
+ end
63
+ end
64
+
65
+ end
metadata ADDED
@@ -0,0 +1,92 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spare_keys
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Richard Szalay
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '3.2'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '3.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.6
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.6
41
+ - !ruby/object:Gem::Dependency
42
+ name: bundler
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '1.12'
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: 1.12.5
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ version: '1.12'
58
+ - - '>='
59
+ - !ruby/object:Gem::Version
60
+ version: 1.12.5
61
+ description: Isolates keychain access for use with keychain-dependent utilities
62
+ email: richard@richardszalay.com
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files: []
66
+ files:
67
+ - lib/spare_keys.rb
68
+ homepage: https://github.com/richardszalay/spare-keys
69
+ licenses:
70
+ - MIT
71
+ metadata: {}
72
+ post_install_message:
73
+ rdoc_options: []
74
+ require_paths:
75
+ - lib
76
+ required_ruby_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - '>='
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ requirements: []
87
+ rubyforge_project:
88
+ rubygems_version: 2.4.8
89
+ signing_key:
90
+ specification_version: 4
91
+ summary: Temporarily keychain switcher
92
+ test_files: []