spare_keys 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []