sshhub 0.0.1 → 0.0.2

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