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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: dd64ad761563decffdb9c53de53a4b16ead4e1e9
4
- data.tar.gz: fa17f935ae296a8cc3096faacb798fe166dd63d5
3
+ metadata.gz: 057cc32beb05edd13579d775c089222b5c5c3de4
4
+ data.tar.gz: 9c0e4881081d14e85aada46a501d1287daa2b1b2
5
5
  SHA512:
6
- metadata.gz: fa4cd7aefe827cb2110c5e7d4608983b0a8164f030a4e7eb0a8fdde1c5a6234372029dfc01ffdbcb1fe1e007ba7112c5cf35a92513ac8d42b74d1a4ab3aa4dd7
7
- data.tar.gz: f7bb65e4668965074c9c9c194e96829e3be2d423d546da3af3643f4844171e5ada43dc1a8ae092b790d8f0c299373e28ba55c4794b253e014f7e3cafd9638c7e
6
+ metadata.gz: 686099b46596fbe665a60dce05909d341a856fcdf0dcd80e080c7fb49ae7580137e5f30071e4499160a6307774314cc31437484a102d4e3098f356dd73f3934d
7
+ data.tar.gz: 87440933162577d1cc8664546d9858403b8b98280157f06cee703128f50f3437011c06bdc12b7fbeb9afc3d267366ca22b75dc4d43f8df458188a120b589959c
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Sshhub
1
+ # sshhub [![Code Climate](https://codeclimate.com/github/mwerner/sshhub.png)](https://codeclimate.com/github/mwerner/sshhub)
2
2
 
3
3
  sshhub is an easy way to authorize the keys of a github user on your machine.
4
4
 
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
- keys.each{|key| Sshhub::PortAuthority.authorize(key) }
15
- print_report(keys)
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 key_selection(keys)
21
- say "#{keys.length} keys found:\n"
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 print_report(keys)
35
- if keys.length == 0
36
- say "No keys authorized"
37
- elsif keys.length == 1
38
- say "Added #{keys.first.abridged} to authorized_keys"
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
- say "Added #{keys.length} keys to authorized_keys"
66
+ "#{keys.length} keys"
41
67
  end
42
68
  end
43
69
  end
@@ -16,10 +16,16 @@ module Sshhub
16
16
  keys.length
17
17
  end
18
18
 
19
+ def many?
20
+ length > 1
21
+ end
22
+
19
23
  private
20
24
 
21
25
  def api_data
22
26
  client.user_keys(username)
27
+ rescue Octokit::NotFound
28
+ []
23
29
  end
24
30
 
25
31
  def client
@@ -1,12 +1,31 @@
1
1
  module Sshhub
2
2
  class PortAuthority
3
- def self.authorize(key)
3
+ def self.authorize(keys)
4
4
  system('mkdir', '-p', "/Users/#{whoami}/.ssh")
5
- File.open(filename, 'a'){|f| f.write("#{key}\n") }
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
@@ -1,3 +1,3 @@
1
1
  module Sshhub
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -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
- described_class.should_receive(:`).and_return('foo')
9
- described_class.should_receive(:system).with('mkdir', '-p', "/Users/foo/.ssh").and_return(true)
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.1
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-06 00:00:00.000000000 Z
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
- - ".gitignore"
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.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