sshhub 0.0.1 → 0.0.2
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 +4 -4
- data/README.md +1 -1
- data/bin/sshhub +39 -13
- data/lib/sshhub/keychain.rb +6 -0
- data/lib/sshhub/port_authority.rb +21 -2
- data/lib/sshhub/version.rb +1 -1
- data/spec/sshhub/keychain_spec.rb +12 -0
- data/spec/sshhub/port_authority_spec.rb +29 -3
- metadata +18 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 057cc32beb05edd13579d775c089222b5c5c3de4
|
4
|
+
data.tar.gz: 9c0e4881081d14e85aada46a501d1287daa2b1b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 686099b46596fbe665a60dce05909d341a856fcdf0dcd80e080c7fb49ae7580137e5f30071e4499160a6307774314cc31437484a102d4e3098f356dd73f3934d
|
7
|
+
data.tar.gz: 87440933162577d1cc8664546d9858403b8b98280157f06cee703128f50f3437011c06bdc12b7fbeb9afc3d267366ca22b75dc4d43f8df458188a120b589959c
|
data/README.md
CHANGED
data/bin/sshhub
CHANGED
@@ -8,36 +8,62 @@ class SshhubCommand < Thor
|
|
8
8
|
desc "authorize USERNAME", "Add keys from a github username to your authorized_keys file"
|
9
9
|
def authorize(username)
|
10
10
|
say "Requesting keys for #{username}...\n"
|
11
|
+
keys = selected_keys(username)
|
12
|
+
Sshhub::PortAuthority.authorize keys
|
13
|
+
say "Added #{key_statement(keys)} to authorized_keys"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "status USERNAME", "Check the current authorization from a github username"
|
17
|
+
def status(username)
|
18
|
+
say "Requesting status for #{username}...\n"
|
11
19
|
keychain = Sshhub::Keychain.new(username)
|
12
|
-
keys = keychain.length == 1 ? [keychain.keys.first] : key_selection(keychain.keys)
|
13
20
|
|
14
|
-
|
15
|
-
|
21
|
+
say "\nFound #{key_statement(keychain.keys)} for #{username}\n"
|
22
|
+
keychain.keys.each do |key|
|
23
|
+
say key.abridged
|
24
|
+
end
|
25
|
+
|
26
|
+
if Sshhub::PortAuthority.present?(keychain.keys)
|
27
|
+
say "\n#{username} is authorized on this machine"
|
28
|
+
else
|
29
|
+
say "\nNo authorization found for #{username} on this machine"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
desc "revoke USERNAME", "Removes any keys present in authorized_keys from a github username"
|
34
|
+
def revoke(username)
|
35
|
+
say "Revoking all authorization for #{username}...\n"
|
36
|
+
keychain = Sshhub::Keychain.new(username)
|
37
|
+
Sshhub::PortAuthority.revoke(keychain.keys)
|
16
38
|
end
|
17
39
|
|
18
40
|
private
|
19
41
|
|
20
|
-
def
|
21
|
-
|
42
|
+
def selected_keys(username)
|
43
|
+
keychain = Sshhub::Keychain.new(username)
|
44
|
+
return [keychain.keys.first] unless keychain.many?
|
45
|
+
|
46
|
+
say "#{keychain.keys.length} keys found:\n"
|
22
47
|
i = 0
|
23
|
-
keys.each do |key|
|
48
|
+
keychain.keys.each do |key|
|
24
49
|
i += 1
|
25
50
|
printf(" %-3s %5s\n" % ["#{i})", key.abridged])
|
26
51
|
end
|
52
|
+
|
27
53
|
printf(" %-3s %5s\n" % ['A)', 'Authorize all keys'])
|
28
54
|
pos = ask("\nSelect a key to authorize:")
|
29
55
|
return [] if pos == ''
|
30
56
|
|
31
|
-
pos.to_i.zero? ? keys : [keys[pos.to_i - 1]]
|
57
|
+
pos.to_i.zero? ? keychain.keys : [keychain.keys[pos.to_i - 1]]
|
32
58
|
end
|
33
59
|
|
34
|
-
def
|
35
|
-
if keys.length ==
|
36
|
-
|
37
|
-
elsif keys.
|
38
|
-
|
60
|
+
def key_statement(keys)
|
61
|
+
if keys.length == 1
|
62
|
+
keys.first.abridged
|
63
|
+
elsif keys.empty?
|
64
|
+
"no keys"
|
39
65
|
else
|
40
|
-
|
66
|
+
"#{keys.length} keys"
|
41
67
|
end
|
42
68
|
end
|
43
69
|
end
|
data/lib/sshhub/keychain.rb
CHANGED
@@ -1,12 +1,31 @@
|
|
1
1
|
module Sshhub
|
2
2
|
class PortAuthority
|
3
|
-
def self.authorize(
|
3
|
+
def self.authorize(keys)
|
4
4
|
system('mkdir', '-p', "/Users/#{whoami}/.ssh")
|
5
|
-
|
5
|
+
|
6
|
+
[*keys].each do |key|
|
7
|
+
File.open(filename, 'a'){|f| f.write("#{key}\n") }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.revoke(keys)
|
12
|
+
system('mkdir', '-p', "/Users/#{whoami}/.ssh")
|
13
|
+
revoked = authorized_keys - [*keys].map(&:key)
|
14
|
+
File.open(filename, "w"){|f| f.puts revoked }
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.present?(keys)
|
18
|
+
([*keys].map(&:key) & authorized_keys).any?
|
6
19
|
end
|
7
20
|
|
8
21
|
private
|
9
22
|
|
23
|
+
def self.authorized_keys
|
24
|
+
File.open(filename, 'r').read.split("\n")
|
25
|
+
rescue Errno::ENOENT => e
|
26
|
+
[]
|
27
|
+
end
|
28
|
+
|
10
29
|
def self.filename
|
11
30
|
"/Users/#{whoami}/.ssh/authorized_keys"
|
12
31
|
end
|
data/lib/sshhub/version.rb
CHANGED
@@ -20,5 +20,17 @@ describe Sshhub::Keychain do
|
|
20
20
|
Octokit::Client.any_instance.should_receive(:user_keys).and_return([{id: 1, key: 'abc'}])
|
21
21
|
expect(keychain.length).to eq(1)
|
22
22
|
end
|
23
|
+
|
24
|
+
it 'knows the multitude of keys' do
|
25
|
+
Octokit::Client.any_instance.should_receive(:user_keys).and_return([{id: 1, key: 'abc'}])
|
26
|
+
expect(keychain.many?).to eq(false)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'handles a nonexistant username' do
|
30
|
+
Octokit::Client.any_instance.should_receive(:user_keys).and_raise(Octokit::NotFound)
|
31
|
+
expect(keychain.keys).to eq([])
|
32
|
+
end
|
23
33
|
end
|
34
|
+
|
35
|
+
|
24
36
|
end
|
@@ -2,16 +2,42 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Sshhub::PortAuthority do
|
4
4
|
let(:key){ Sshhub::Key.new(id: 1, key: 'ssh-rsa abc123') }
|
5
|
+
let(:file){ double(read: "ssh-rsa abc123\nssh-dss 987zyx") }
|
6
|
+
|
7
|
+
before do
|
8
|
+
allow(File).to receive(:open).and_return(file)
|
9
|
+
end
|
5
10
|
|
6
11
|
context 'Authorizing a key' do
|
7
12
|
before do
|
8
|
-
|
9
|
-
|
13
|
+
allow(Sshhub::PortAuthority).to receive(:`).and_return('foo')
|
14
|
+
allow(Sshhub::PortAuthority).to receive(:system).and_return(true)
|
10
15
|
end
|
11
16
|
|
12
17
|
it 'writes to authorized_keys' do
|
13
|
-
File.should_receive(:open)
|
14
18
|
Sshhub::PortAuthority.authorize(key)
|
15
19
|
end
|
16
20
|
end
|
21
|
+
|
22
|
+
context 'Revoking a key' do
|
23
|
+
before do
|
24
|
+
allow(Sshhub::PortAuthority).to receive(:`).and_return('foo')
|
25
|
+
allow(Sshhub::PortAuthority).to receive(:system).and_return(true)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'writes to authorized_keys' do
|
29
|
+
Sshhub::PortAuthority.revoke(key)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
context 'Key presence' do
|
34
|
+
it 'does not require authorized_keys to be present' do
|
35
|
+
expect(File).to receive(:open).and_raise(Errno::ENOENT)
|
36
|
+
expect(Sshhub::PortAuthority.present?(key)).to be(false)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'can tell if a key is present in authorized_keys' do
|
40
|
+
expect(Sshhub::PortAuthority.present?(key)).to eq(true)
|
41
|
+
end
|
42
|
+
end
|
17
43
|
end
|
metadata
CHANGED
@@ -1,97 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshhub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthew Werner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0.19'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.19'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: octokit
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '3.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '3.1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rake
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '>='
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: bundler
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ~>
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '1.6'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ~>
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '1.6'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: simplecov
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ~>
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0.7'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ~>
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0.7'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- -
|
87
|
+
- - ~>
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '2.13'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- -
|
94
|
+
- - ~>
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '2.13'
|
97
97
|
description: sshhub is an easy way to get ssh keys authorized on your public server
|
@@ -102,7 +102,7 @@ executables:
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
-
-
|
105
|
+
- .gitignore
|
106
106
|
- Gemfile
|
107
107
|
- LICENSE.txt
|
108
108
|
- README.md
|
@@ -128,17 +128,17 @@ require_paths:
|
|
128
128
|
- lib
|
129
129
|
required_ruby_version: !ruby/object:Gem::Requirement
|
130
130
|
requirements:
|
131
|
-
- -
|
131
|
+
- - '>='
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
version: '0'
|
134
134
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- -
|
136
|
+
- - '>='
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
139
|
requirements: []
|
140
140
|
rubyforge_project:
|
141
|
-
rubygems_version: 2.2.
|
141
|
+
rubygems_version: 2.2.0
|
142
142
|
signing_key:
|
143
143
|
specification_version: 4
|
144
144
|
summary: sshhub is an easy way to get ssh keys authorized on your public server
|