keyring 0.3.1 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6a8467d964ad1c788df7e31c7ed552042ac376fa
4
- data.tar.gz: 758fe7b413d3b898ddac9d3213e1f7d6cd9f7dfd
3
+ metadata.gz: d59fdf205915208c45349154db548ac71a6162f5
4
+ data.tar.gz: 2715a0cbc8bf7f24a2f11322af70d2ee70857dc6
5
5
  SHA512:
6
- metadata.gz: fd42453e514c5ed351dfaa6311d94bd4f2ca53a239a16d7f40f5503856b9b361cdb7278c26f62bcacbb06c7c91c276b7dce76cdb79fd6e8cd383636283c22fc2
7
- data.tar.gz: 7ee748c39df64d23c801aba72c9c4d48bc4a7fc793edfa25f7ad194f905cd1c18d8eac725c72a5800e5ad965e0f178b407df8661e4a50646d200be444a011708
6
+ metadata.gz: ab83ae87c6128614d1a47581d4ea725479bcf719a1644c6ac20dbcfa9164d7ac6e5ea357d5b2262fea75df9179c91bc2418cdd81e57664ca8d2a1e6fe6bc5473
7
+ data.tar.gz: bdb3d3d9a482b9f5a2b463685ad430f673078ce59813f096d1fd81cec3e06c1d1b2a9021404a120459ae87a15f911c44cd16b604ba9088f2d612238e8732f8c5
data/Gemfile CHANGED
@@ -5,3 +5,13 @@ source 'https://rubygems.org'
5
5
 
6
6
  # Specify your gem's dependencies in keyring.gemspec
7
7
  gemspec
8
+
9
+ # Duplicated contents of ext/mkrf_conf.rb here - afaict, the
10
+ # spec.extensions stuff in the gemspec file doesn't run on a
11
+ # bundle install
12
+
13
+ gem 'ruby-keychain', '~> 0.3.2'
14
+
15
+ group :test, :development do
16
+ gem 'test-unit'
17
+ end
data/README.md CHANGED
@@ -20,33 +20,43 @@ Additional keyring services we'd like to support:
20
20
 
21
21
  Add this line to your application's Gemfile:
22
22
 
23
- gem 'keyring'
23
+ ```ruby
24
+ gem 'keyring'
25
+ ```
24
26
 
25
27
  And then execute:
26
28
 
27
- $ bundle
29
+ ```shell
30
+ $ bundle
31
+ ```
28
32
 
29
33
  Or install it yourself as:
30
34
 
31
- $ gem install keyring
35
+ ```shell
36
+ $ gem install keyring
37
+ ```
32
38
 
33
39
  ## Usage
34
40
 
35
- The basic usage of keyring is simple: just call Keyring#set_password and
36
- Keyring#get_password:
41
+ The basic usage of keyring is simple: just call `Keyring#set_password` and
42
+ `Keyring#get_password`:
37
43
 
38
- require 'keyring'
39
- keyring = Keyring.new
40
- keyring.set_password('service', 'username', 'password')
41
- password = keyring.get_password('service', 'username')
42
- keyring.delete_password('service', 'username')
44
+ ```ruby
45
+ require 'keyring'
46
+ keyring = Keyring.new
47
+ keyring.set_password('service', 'username', 'password')
48
+ password = keyring.get_password('service', 'username')
49
+ keyring.delete_password('service', 'username')
50
+ ```
43
51
 
44
- 'service' is an arbitrary string identifying your application.
52
+ `'service'` is an arbitrary string identifying your application.
45
53
 
46
54
  By default keyring will attempt to pick the best backend supported on your system. You can specify a particular backend:
47
55
 
48
- require 'keyring'
49
- keyring = Keyring.new(Keyring::Backend::Memory.new)
56
+ ```ruby
57
+ require 'keyring'
58
+ keyring = Keyring.new(Keyring::Backend::Memory.new)
59
+ ```
50
60
 
51
61
  ## Platform notes
52
62
 
@@ -56,7 +66,7 @@ requires the introspection bindings to be installed (as well as gnome-keyring).
56
66
 
57
67
  ## Credits
58
68
 
59
- Copyright 2013-2014, Jason Heiss, wvengen
69
+ Copyright 2013-2016, Jason Heiss, wvengen, jtopper
60
70
 
61
71
  Inspired by the keyring library for Python:
62
72
  https://bitbucket.org/kang/python-keyring-lib
@@ -9,10 +9,17 @@ rescue NoMethodError
9
9
  end
10
10
  inst = Gem::DependencyInstaller.new
11
11
  begin
12
+
12
13
  if RUBY_PLATFORM =~ /linux/
13
14
  warn "*linux: installing gir_ffi-gnome_keyring..."
14
15
  inst.install "gir_ffi-gnome_keyring", '~> 0.0.3'
15
16
  end
17
+
18
+ if RUBY_PLATFORM =~ /darwin10/
19
+ warn '*osx: installing ruby-keychain'
20
+ inst.install 'ruby-keychain', '~> 0.3.2'
21
+ end
22
+
16
23
  rescue
17
24
  exit(1)
18
25
  end
@@ -27,7 +27,5 @@ Gem::Specification.new do |spec|
27
27
  spec.add_dependency 'slop', "< 4.0"
28
28
 
29
29
  spec.extensions = %w[ext/mkrf_conf.rb]
30
- # if RUBY_PLATFORM =~ /linux/
31
- # spec.add_dependency 'gir_ffi-gnome_keyring', '~> 0.0.3'
32
- # end
30
+
33
31
  end
@@ -4,92 +4,70 @@
4
4
  # This is a keyring backend for the Apple Keychain
5
5
  # http://en.wikipedia.org/wiki/Keychain_(Apple)
6
6
 
7
- # Consider switching to ruby-keychain gem to avoid password in command line
8
- # https://rubygems.org/gems/ruby-keychain
9
- # https://github.com/fcheung/keychain
10
-
11
- require 'open3'
12
-
13
7
  class Keyring::Backend::MacosxKeychain < Keyring::Backend
8
+
14
9
  register_implementation(self)
15
-
16
- attr_accessor :security
10
+
17
11
  def initialize
18
- @security = '/usr/bin/security'
12
+ require 'keychain'
13
+ rescue LoadError
19
14
  end
15
+
20
16
  def supported?
21
- File.exist?(@security) && `#{@security} -h`.include?('find-generic-password')
17
+ defined?(::Keychain) && true
22
18
  end
19
+
23
20
  def priority
24
21
  1
25
22
  end
26
-
27
- def security_command(operation)
28
- "#{operation}-generic-password"
29
- end
23
+
24
+ # NB: Uses default keychain for everything.
25
+ # This is consistent with the GnomeKeyring implementation
26
+ # No mechanism is provided in the API to support alternative
27
+ # keyring files.
30
28
 
31
29
  def set_password(service, username, password)
32
- cmd = [
33
- @security,
34
- security_command('add'),
35
- '-s', service,
36
- '-a', username,
37
- # FIXME: password in command line, sad panda!
38
- '-w', password,
39
- '-U',
40
- ]
41
- system(*cmd)
42
- if !$?.success?
43
- raise
44
- end
30
+
31
+ Keychain.generic_passwords.create(
32
+ :service => service,
33
+ :password => password,
34
+ :account => username,
35
+ )
36
+
37
+ return true
38
+
39
+ rescue Keychain::Error
40
+ return false
41
+ rescue KeychainDuplicateItemError
42
+ return true
45
43
  end
44
+
46
45
  def get_password(service, username)
47
- password = nil
48
- cmd = [
49
- @security,
50
- security_command('find'),
51
- '-s', service,
52
- '-a', username,
53
- '-g',
54
- # '-w',
55
- ]
56
- Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thr|
57
- stderr.each do |line|
58
- if line =~ /\Apassword: (.*)/
59
- pw = $1
60
- if pw == ''
61
- password = pw
62
- elsif pw =~ /\A"(.*)"\z/
63
- password = $1
64
- elsif pw =~ /\A0x(\h+)/
65
- password = [$1].pack("H*")
66
- end
67
- end
68
- end
69
- # security exits with 44 if the entry does not exist. We just want to return
70
- # nil rather than raise an exception in that case.
71
- if ![0,44].include?(wait_thr.value.exitstatus)
72
- raise
73
- end
74
- end
75
- password
46
+
47
+ scope = Keychain.generic_passwords.where(
48
+ :service => service,
49
+ :account => username,
50
+ )
51
+
52
+ return false if scope.nil?
53
+ return false if scope.first.nil?
54
+
55
+ scope.first.password
56
+
76
57
  end
58
+
77
59
  def delete_password(service, username)
78
- cmd = [
79
- @security,
80
- security_command('delete'),
81
- '-s', service,
82
- '-a', username,
83
- ]
84
- Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thr|
85
- case wait_thr.value.exitstatus
86
- when 0
87
- return true
88
- when 44
89
- return false
90
- else
91
- raise
92
- end
93
- end
60
+
61
+ scope = Keychain.generic_passwords.where(
62
+ :service => service,
63
+ :account => username,
64
+ )
65
+
66
+ return false if scope.nil?
67
+ return false if scope.first.nil?
68
+
69
+ scope.first.delete
70
+
94
71
  end
72
+
95
73
  end
@@ -2,5 +2,5 @@
2
2
  # License: MIT (http://www.opensource.org/licenses/mit-license.php)
3
3
 
4
4
  class Keyring
5
- VERSION = "0.3.1"
5
+ VERSION = "0.4.0"
6
6
  end
@@ -1,73 +1,56 @@
1
1
  # keyring: System keyring abstraction library
2
2
  # License: MIT (http://www.opensource.org/licenses/mit-license.php)
3
3
 
4
- require File.expand_path('keyring_tests', File.dirname(__FILE__))
4
+ # These tests require Gnome Keyring to be installed and are skipped otherwise
5
+
5
6
  require 'test/unit'
6
7
  require 'mocha/setup'
7
8
  require 'keyring'
8
9
 
9
- class KeyringBackendMacosxKeychainTests < Test::Unit::TestCase
10
- include KeyringTestConstants
11
-
12
- def setup
13
- @backend = Keyring::Backend::MacosxKeychain.new
14
- end
15
-
16
- def test_supported
17
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-wronghelp')
18
- refute @backend.supported?
19
- @backend.security = File.join(TESTCMDDIR, 'macosx/bogus')
20
- refute @backend.supported?
21
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-righthelp')
22
- assert @backend.supported?
23
- end
24
- def test_priority
25
- assert_equal 1, @backend.priority
26
- end
27
-
28
- def test_security_command
29
- assert_equal 'add-generic-password', @backend.security_command('add')
30
- assert_equal 'find-generic-password', @backend.security_command('find')
31
- assert_equal 'delete-generic-password', @backend.security_command('delete')
32
- end
33
-
34
- def test_set_password
35
- @backend.expects(:system).with(
36
- '/usr/bin/security', 'add-generic-password', '-s', 'service', '-a', 'username', '-w', 'password', '-U')
37
- # We need to set $? to make up for the fact that system was not actually run
38
- # FIXME: surely there's a better way?
39
- `true`
40
- @backend.set_password('service', 'username', 'password')
41
- end
42
-
43
- def test_get_password
44
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-find')
45
- assert_equal 'password', @backend.get_password('service', 'username')
46
- end
47
- def test_get_password_hex
48
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-findhex')
49
- assert_equal "\0100\0101\0100\0101\0100\0101\0100\0101", @backend.get_password('service', 'hexuser')
50
- end
51
- def test_get_password_empty
52
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-findempty')
53
- assert_equal '', @backend.get_password('service', 'emptyuser')
54
- end
55
- def test_get_password_notfound
56
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-notfound')
57
- assert_nil @backend.get_password('bogus', 'bogus')
58
- end
59
-
60
- def test_delete_password_options
61
- Open3.expects(:popen3).with(
62
- '/usr/bin/security', 'delete-generic-password', '-s', 'service', '-a', 'username')
63
- @backend.delete_password('service', 'username')
64
- end
65
- def test_delete_password_output
66
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-delete')
67
- assert @backend.delete_password('service', 'gooduser')
68
- end
69
- def test_delete_password_errors
70
- @backend.security = File.join(TESTCMDDIR, 'macosx/security-notfound')
71
- refute @backend.delete_password('bogus', 'bogus')
10
+ begin
11
+ require 'keychain'
12
+
13
+ class KeyringBackendMacosxKeychainTests < Test::Unit::TestCase
14
+
15
+ def setup
16
+ @backend = Keyring::Backend::MacosxKeychain.new
17
+ @backend.delete_password('KeyringBackendMacosxKeychainTests', 'username')
18
+ end
19
+
20
+ def teardown
21
+ @backend.delete_password('KeyringBackendMacosxKeychainTests', 'username')
22
+ end
23
+
24
+ def test_supported
25
+ assert @backend.supported?
26
+ end
27
+
28
+ def test_priority
29
+ assert_equal 1, @backend.priority
30
+ end
31
+
32
+ def test_no_default_password
33
+ refute @backend.get_password('KeyringBackendMacosxKeychainTests', 'username')
34
+ end
35
+
36
+ def test_set_password
37
+ @backend.set_password('KeyringBackendMacosxKeychainTests', 'username', 'password')
38
+ assert_equal 'password', @backend.get_password('KeyringBackendMacosxKeychainTests', 'username')
39
+ end
40
+
41
+ def test_delete_nonexistent_password
42
+ refute @backend.delete_password('KeyringBackendMacosxKeychainTests', 'username')
43
+ end
44
+
45
+ def test_delete_existing_password
46
+ @backend.set_password('KeyringBackendMacosxKeychainTests', 'username', 'password')
47
+ @backend.delete_password('KeyringBackendMacosxKeychainTests', 'username')
48
+ refute @backend.get_password('KeyringBackendMacosxKeychainTests', 'username')
49
+ end
50
+
72
51
  end
52
+
53
+
54
+ rescue LoadError
55
+ puts "Skipping MacosxKeychain tests because the native bindings could not be loaded."
73
56
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: keyring
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.1
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jason Heiss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-09 00:00:00.000000000 Z
11
+ date: 2016-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -99,16 +99,6 @@ files:
99
99
  - test/test_backend_memory.rb
100
100
  - test/test_cli.rb
101
101
  - test/test_keyring.rb
102
- - test/testcmds/macosx/binary
103
- - test/testcmds/macosx/emptything
104
- - test/testcmds/macosx/random
105
- - test/testcmds/macosx/security-delete
106
- - test/testcmds/macosx/security-find
107
- - test/testcmds/macosx/security-findempty
108
- - test/testcmds/macosx/security-findhex
109
- - test/testcmds/macosx/security-notfound
110
- - test/testcmds/macosx/security-righthelp
111
- - test/testcmds/macosx/security-wronghelp
112
102
  homepage: https://github.com/jheiss/keyring
113
103
  licenses:
114
104
  - MIT
@@ -141,13 +131,3 @@ test_files:
141
131
  - test/test_backend_memory.rb
142
132
  - test/test_cli.rb
143
133
  - test/test_keyring.rb
144
- - test/testcmds/macosx/binary
145
- - test/testcmds/macosx/emptything
146
- - test/testcmds/macosx/random
147
- - test/testcmds/macosx/security-delete
148
- - test/testcmds/macosx/security-find
149
- - test/testcmds/macosx/security-findempty
150
- - test/testcmds/macosx/security-findhex
151
- - test/testcmds/macosx/security-notfound
152
- - test/testcmds/macosx/security-righthelp
153
- - test/testcmds/macosx/security-wronghelp
@@ -1 +0,0 @@
1
- 01010101
@@ -1 +0,0 @@
1
- password:
@@ -1 +0,0 @@
1
- ô%A���t;. u�@r
@@ -1,27 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- cat <<-EOF
6
- keychain: "/Users/jheiss/Library/Keychains/login.keychain"
7
- class: "genp"
8
- attributes:
9
- 0x00000007 <blob>="service"
10
- 0x00000008 <blob>=<NULL>
11
- "acct"<blob>="username"
12
- "cdat"<timedate>=0x32303133313132303233353532395A00 "20131120235529Z\000"
13
- "crtr"<uint32>=<NULL>
14
- "cusi"<sint32>=<NULL>
15
- "desc"<blob>=<NULL>
16
- "gena"<blob>=<NULL>
17
- "icmt"<blob>=<NULL>
18
- "invi"<sint32>=<NULL>
19
- "mdat"<timedate>=0x32303133313132313232353534395A00 "20131121225549Z\000"
20
- "nega"<sint32>=<NULL>
21
- "prot"<blob>=<NULL>
22
- "scrp"<sint32>=<NULL>
23
- "svce"<blob>="service"
24
- "type"<uint32>=<NULL>
25
- EOF
26
-
27
- printf "password has been deleted.\n" >&2
@@ -1,26 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- cat <<-EOF
6
- keychain: "/Users/example/Library/Keychains/login.keychain"
7
- class: "genp"
8
- attributes:
9
- 0x00000007 <blob>="service"
10
- 0x00000008 <blob>=<NULL>
11
- "acct"<blob>="username"
12
- "cdat"<timedate>=0x32303133313132303233353532395A00 "20131120235529Z\000"
13
- "crtr"<uint32>=<NULL>
14
- "cusi"<sint32>=<NULL>
15
- "desc"<blob>=<NULL>
16
- "gena"<blob>=<NULL>
17
- "icmt"<blob>=<NULL>
18
- "invi"<sint32>=<NULL>
19
- "mdat"<timedate>=0x32303133313132313132343834315A00 "20131121124841Z\000"
20
- "nega"<sint32>=<NULL>
21
- "prot"<blob>=<NULL>
22
- "scrp"<sint32>=<NULL>
23
- "svce"<blob>="service"
24
- "type"<uint32>=<NULL>
25
- EOF
26
- printf "password: \"password\"\n" >&2
@@ -1,26 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- cat <<-EOF
6
- keychain: "/Users/example/Library/Keychains/login.keychain"
7
- class: "genp"
8
- attributes:
9
- 0x00000007 <blob>="service"
10
- 0x00000008 <blob>=<NULL>
11
- "acct"<blob>="emptyuser"
12
- "cdat"<timedate>=0x32303133313132303233353532395A00 "20131120235529Z\000"
13
- "crtr"<uint32>=<NULL>
14
- "cusi"<sint32>=<NULL>
15
- "desc"<blob>=<NULL>
16
- "gena"<blob>=<NULL>
17
- "icmt"<blob>=<NULL>
18
- "invi"<sint32>=<NULL>
19
- "mdat"<timedate>=0x32303133313132313132343834315A00 "20131121124841Z\000"
20
- "nega"<sint32>=<NULL>
21
- "prot"<blob>=<NULL>
22
- "scrp"<sint32>=<NULL>
23
- "svce"<blob>="service"
24
- "type"<uint32>=<NULL>
25
- EOF
26
- printf "password: \n" >&2
@@ -1,26 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- cat <<-EOF
6
- keychain: "/Users/example/Library/Keychains/login.keychain"
7
- class: "genp"
8
- attributes:
9
- 0x00000007 <blob>="service"
10
- 0x00000008 <blob>=<NULL>
11
- "acct"<blob>="hexuser"
12
- "cdat"<timedate>=0x32303133313132303233353532395A00 "20131120235529Z\000"
13
- "crtr"<uint32>=<NULL>
14
- "cusi"<sint32>=<NULL>
15
- "desc"<blob>=<NULL>
16
- "gena"<blob>=<NULL>
17
- "icmt"<blob>=<NULL>
18
- "invi"<sint32>=<NULL>
19
- "mdat"<timedate>=0x32303133313132313132343834315A00 "20131121124841Z\000"
20
- "nega"<sint32>=<NULL>
21
- "prot"<blob>=<NULL>
22
- "scrp"<sint32>=<NULL>
23
- "svce"<blob>="service"
24
- "type"<uint32>=<NULL>
25
- EOF
26
- printf "password: 0x08300831083008310830083108300831 \"\0100\0101\0100\0101\0100\0101\0100\0101\"\n" >&2
@@ -1,6 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- printf "security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.\n" >&2
6
- exit 44
@@ -1,51 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- # The help output really is indented with spaces like this
6
- cat <<-EOF
7
- help Show all commands, or show usage for a command.
8
- list-keychains Display or manipulate the keychain search list.
9
- default-keychain Display or set the default keychain.
10
- login-keychain Display or set the login keychain.
11
- create-keychain Create keychains and add them to the search list.
12
- delete-keychain Delete keychains and remove them from the search list.
13
- lock-keychain Lock the specified keychain.
14
- unlock-keychain Unlock the specified keychain.
15
- set-keychain-settings Set settings for a keychain.
16
- set-keychain-password Set password for a keychain.
17
- show-keychain-info Show the settings for keychain.
18
- dump-keychain Dump the contents of one or more keychains.
19
- create-keypair Create an asymmetric key pair.
20
- add-generic-password Add a generic password item.
21
- add-internet-password Add an internet password item.
22
- add-certificates Add certificates to a keychain.
23
- find-generic-password Find a generic password item.
24
- delete-generic-password Delete a generic password item.
25
- find-internet-password Find an internet password item.
26
- delete-internet-password Delete an internet password item.
27
- find-certificate Find a certificate item.
28
- find-identity Find an identity (certificate + private key).
29
- delete-certificate Delete a certificate from a keychain.
30
- set-identity-preference Set the preferred identity to use for a service.
31
- get-identity-preference Get the preferred identity to use for a service.
32
- create-db Create a db using the DL.
33
- export Export items from a keychain.
34
- import Import items into a keychain.
35
- cms Encode or decode CMS messages.
36
- install-mds Install (or re-install) the MDS database.
37
- add-trusted-cert Add trusted certificate(s).
38
- remove-trusted-cert Remove trusted certificate(s).
39
- dump-trust-settings Display contents of trust settings.
40
- user-trust-settings-enable Display or manipulate user-level trust settings.
41
- trust-settings-export Export trust settings.
42
- trust-settings-import Import trust settings.
43
- verify-cert Verify certificate(s).
44
- authorize Perform authorization operations.
45
- authorizationdb Make changes to the authorization policy database.
46
-
47
- execute-with-privileges Execute tool with privileges.
48
- leaks Run /usr/bin/leaks on this process.
49
- error Display a descriptive message for the given error code(s).
50
- create-filevaultmaster-keychain Create a keychain containing a key pair for FileVault recovery use.
51
- EOF
@@ -1,7 +0,0 @@
1
- #!/bin/sh
2
- # keyring: System keyring abstraction library
3
- # License: MIT (http://www.opensource.org/licenses/mit-license.php)
4
-
5
- cat <<-EOF
6
- This is help output for a different command
7
- EOF