gas 0.1.8 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/gas +70 -35
- data/bin/gas-add +7 -0
- data/bin/gas-delete +7 -0
- data/bin/gas-import +7 -0
- data/bin/gas-list +6 -0
- data/bin/gas-show +6 -0
- data/bin/gas-use +7 -0
- data/lib/gas.rb +67 -103
- data/lib/gas/git_config.rb +25 -0
- data/lib/gas/user.rb +11 -4
- data/lib/gas/users.rb +110 -0
- data/lib/gas/version.rb +2 -3
- data/spec/integration/gas_spec.rb +118 -0
- data/spec/integration/users_spec.rb +40 -0
- data/spec/spec_helper.rb +10 -141
- data/spec/unit/git_config_spec.rb +82 -0
- data/spec/unit/user_spec.rb +18 -0
- data/spec/unit/users_spec.rb +71 -0
- metadata +23 -112
- data/lib/gas/config.rb +0 -148
- data/lib/gas/gitconfig.rb +0 -46
- data/lib/gas/github_speaker.rb +0 -219
- data/lib/gas/prompter.rb +0 -169
- data/lib/gas/settings.rb +0 -28
- data/lib/gas/ssh.rb +0 -305
- data/spec/integration/ssh_spec.rb +0 -338
- data/spec/unit/config_spec.rb +0 -83
- data/spec/unit/gitconfig_spec.rb +0 -85
- data/spec/unit/github_speaker_spec.rb +0 -107
- data/spec/unit/settings_spec.rb +0 -56
data/lib/gas/ssh.rb
DELETED
@@ -1,305 +0,0 @@
|
|
1
|
-
module Gas
|
2
|
-
class Ssh
|
3
|
-
require 'highline/import'
|
4
|
-
require 'net/https'
|
5
|
-
require 'json'
|
6
|
-
require 'digest/md5'
|
7
|
-
extend Prompter
|
8
|
-
|
9
|
-
def self.corresponding_rsa_files_exist?(nickname = '')
|
10
|
-
nickname = @uid if nickname == ''
|
11
|
-
return true if File.exists? "#{GAS_DIRECTORY}/#{nickname}_id_rsa" and File.exists? "#{GAS_DIRECTORY}/#{nickname}_id_rsa.pub"
|
12
|
-
false
|
13
|
-
end
|
14
|
-
|
15
|
-
# Copies a key pair from ~/.ssh to .gas/Nickname*
|
16
|
-
def self.use_current_rsa_files_for_this_user(test = nil)
|
17
|
-
@uid = test unless test.nil?
|
18
|
-
FileUtils.cp("#{SSH_DIRECTORY}/id_rsa", "#{GAS_DIRECTORY}/#{@uid}_id_rsa")
|
19
|
-
FileUtils.cp("#{SSH_DIRECTORY}/id_rsa.pub", "#{GAS_DIRECTORY}/#{@uid}_id_rsa.pub")
|
20
|
-
FileUtils.chmod 0700, "#{GAS_DIRECTORY}/#{@uid}_id_rsa"
|
21
|
-
FileUtils.chmod 0700, "#{GAS_DIRECTORY}/#{@uid}_id_rsa.pub"
|
22
|
-
return true
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.ssh_dir_contains_rsa?
|
26
|
-
return true if File.exists?(SSH_DIRECTORY + "/id_rsa") or File.exists?(SSH_DIRECTORY + "/id_rsa.pub")
|
27
|
-
return false
|
28
|
-
end
|
29
|
-
|
30
|
-
# Generates a new sshkey putting it in ~/.gas/nickname_id_rsa
|
31
|
-
# This function can get a little tricky. It's best to strip off the comment here,
|
32
|
-
# because github API doesn't retain the comment...
|
33
|
-
def self.generate_new_rsa_keys_in_gas_dir
|
34
|
-
puts "Generating new ssh key..."
|
35
|
-
|
36
|
-
begin
|
37
|
-
k = SSHKey.generate() # (:comment => "#{@email}")
|
38
|
-
|
39
|
-
publ = k.ssh_public_key
|
40
|
-
privl = k.private_key
|
41
|
-
|
42
|
-
my_file_privl = File.open(GAS_DIRECTORY + "/#{@uid}_id_rsa",'w',0700)
|
43
|
-
my_file_privl.write(privl)
|
44
|
-
my_file_privl.close
|
45
|
-
|
46
|
-
my_file_publ = File.open(GAS_DIRECTORY + "/#{@uid}_id_rsa.pub",'w',0700)
|
47
|
-
my_file_publ.write(publ)
|
48
|
-
my_file_publ.close
|
49
|
-
|
50
|
-
return true
|
51
|
-
rescue
|
52
|
-
puts "Fatal Error: Something unexpected happened while writing to #{GAS_DIRECTORY}/#{@uid}_id_rsa"
|
53
|
-
puts "SSH key not saved."
|
54
|
-
return false
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
# This function creates the ssh keys if needed and puts them in ~/.gas/NICKNAME_id_rsa and ...rsa.pub
|
59
|
-
def self.setup_ssh_keys(user)
|
60
|
-
@uid = user.nickname
|
61
|
-
@email = user.email
|
62
|
-
|
63
|
-
if Gas::Prompter.user_wants_gas_to_handle_rsa_keys?
|
64
|
-
if corresponding_rsa_files_exist?(@uid) and Gas::Prompter.user_wants_to_use_key_already_in_gas?(@uid)
|
65
|
-
return true # We don't need to do anything because the .gas directory is already setup
|
66
|
-
elsif !corresponding_rsa_files_exist?(@uid) and ssh_dir_contains_rsa? and Gas::Prompter.user_wants_to_use_key_already_in_ssh? # Check ~/.ssh for a current id_rsa file, if yes, "Do you want to use the current id_rsa file to be used as your key?"
|
67
|
-
use_current_rsa_files_for_this_user # copies the keys from ~/.ssh instead of generating new keys if desired/possible
|
68
|
-
return true
|
69
|
-
else
|
70
|
-
return generate_new_rsa_keys_in_gas_dir
|
71
|
-
end
|
72
|
-
|
73
|
-
else # !Gas::Prompter.user_wants_gas_to_handle_rsa_keys?
|
74
|
-
# check if ~/.gas/rsa exists, if it does, promt the user
|
75
|
-
# because that key must be destroyed (if the user really doesn't want gas handling keys for this user)
|
76
|
-
if corresponding_rsa_files_exist?(@uid) #in ~/.gas/
|
77
|
-
delete_associated_local_keys!(@uid) if Gas::Prompter.user_wants_to_remove_the_keys_that_already_exist_for_this_user?(@uid)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
end
|
82
|
-
|
83
|
-
# This huge method handles the swapping of id_rsa files on the hdd
|
84
|
-
def self.swap_in_rsa(nickname)
|
85
|
-
@uid = nickname # woah, this is extremely sloppy I think... in order to use any other class methods,
|
86
|
-
# I need to write to @uid or it will
|
87
|
-
# Have the dumb information from the last time it registered a new git author?
|
88
|
-
|
89
|
-
if corresponding_rsa_files_exist?
|
90
|
-
if ssh_dir_contains_rsa?
|
91
|
-
if current_key_already_backed_up?
|
92
|
-
write_to_ssh_dir!
|
93
|
-
else
|
94
|
-
if Gas::Prompter.user_wants_to_overwrite_existing_rsa_key?
|
95
|
-
write_to_ssh_dir!
|
96
|
-
else
|
97
|
-
puts "Proceeding without swapping rsa keys (aborting)."
|
98
|
-
end
|
99
|
-
end
|
100
|
-
else # if no ~/.ssh/id_rsa exists... no overwrite potential... so just write away
|
101
|
-
write_to_ssh_dir!
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
|
107
|
-
def self.write_to_ssh_dir!
|
108
|
-
supress_process_output = "> /dev/null 2>&1"
|
109
|
-
supress_process_output = "> NUL" if IS_WINDOWS
|
110
|
-
|
111
|
-
# remove the current key from the ssh-agent session (key will no longer be used with github)
|
112
|
-
system("ssh-add -d #{SSH_DIRECTORY}/id_rsa #{supress_process_output}") if is_ssh_agent_there?
|
113
|
-
|
114
|
-
FileUtils.cp(GAS_DIRECTORY + "/#{@uid}_id_rsa", SSH_DIRECTORY + "/id_rsa")
|
115
|
-
FileUtils.cp(GAS_DIRECTORY + "/#{@uid}_id_rsa.pub", SSH_DIRECTORY + "/id_rsa.pub")
|
116
|
-
|
117
|
-
FileUtils.chmod(0700, SSH_DIRECTORY + "/id_rsa")
|
118
|
-
FileUtils.chmod(0700, SSH_DIRECTORY + "/id_rsa.pub")
|
119
|
-
|
120
|
-
if is_ssh_agent_there?
|
121
|
-
`ssh-add #{SSH_DIRECTORY}/id_rsa #{supress_process_output}` # you need to run this command to get the private key to be set to active on unix based machines. Not sure what to do for windows yet...
|
122
|
-
|
123
|
-
if $?.exitstatus == 1 # exit status 1 means failed
|
124
|
-
puts "Looks like there may have been a fatal error in registering the rsa key with ssh-agent. Might be worth looking into"
|
125
|
-
raise "Exit code on ssh-add command line was one meaning: Error!"
|
126
|
-
end
|
127
|
-
|
128
|
-
else
|
129
|
-
puts "Slight Error: The key should now be in ~/.ssh so that's good, BUT ssh-add could not be found. If you're using windows, you'll need to use git bash or cygwin to emulate this unix command and actually do uploads."
|
130
|
-
end
|
131
|
-
|
132
|
-
end
|
133
|
-
|
134
|
-
# This function scans each file in a directory to check
|
135
|
-
# to see if it is the same file which it's being compared against
|
136
|
-
# dir_to_scan The target directory you'd like to scan
|
137
|
-
# file_to_compare The file's path that you're expecting to find
|
138
|
-
def self.scan_for_file_match(file_to_compare, dir_to_scan)
|
139
|
-
pattern = get_md5_hash(file_to_compare)
|
140
|
-
|
141
|
-
@files = Dir.glob(dir_to_scan + "/*" + file_to_compare.split(//).last(1).to_s)
|
142
|
-
|
143
|
-
@files.each do |file|
|
144
|
-
return true if get_md5_hash(file) == pattern
|
145
|
-
end
|
146
|
-
|
147
|
-
return false
|
148
|
-
end
|
149
|
-
|
150
|
-
def self.current_key_already_backed_up?
|
151
|
-
if scan_for_file_match(SSH_DIRECTORY + "/id_rsa", GAS_DIRECTORY) and scan_for_file_match(SSH_DIRECTORY + "/id_rsa.pub", GAS_DIRECTORY)
|
152
|
-
return true
|
153
|
-
else
|
154
|
-
return false
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def self.get_md5_hash(file_path)
|
159
|
-
if File.exists? file_path
|
160
|
-
file = File.open(file_path, "rb")
|
161
|
-
hash = Digest::MD5.hexdigest(file.read)
|
162
|
-
file.close
|
163
|
-
return hash
|
164
|
-
end
|
165
|
-
return nil
|
166
|
-
end
|
167
|
-
|
168
|
-
|
169
|
-
def self.upload_public_key_to_github(user, github_speaker = nil)
|
170
|
-
if Gas::Prompter.user_wants_to_install_key_to_github?
|
171
|
-
key_installation_routine!(user, nil, github_speaker)
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
|
176
|
-
def self.key_installation_routine!(user = nil, rsa_test = nil, github_speaker = nil)
|
177
|
-
@uid = user.nickname unless user.nil? # allows for easy testing
|
178
|
-
|
179
|
-
rsa_key = get_associated_rsa_key(@uid).first
|
180
|
-
rsa_key = rsa_test unless rsa_test.nil?
|
181
|
-
return false if rsa_key.nil?
|
182
|
-
|
183
|
-
# TODO: Impliment a key ring system where you store your key on your github in a repository, only it's encrypted. And to decrypt it, there is
|
184
|
-
# A file in your .gas folder!!! That sounds SO fun!
|
185
|
-
github_speaker = GithubSpeaker.new(user) if github_speaker.nil?
|
186
|
-
|
187
|
-
puts github_speaker.status
|
188
|
-
|
189
|
-
if github_speaker.status == :bad_credentials
|
190
|
-
puts "Invalid credentials. Skipping upload of keys to github. "
|
191
|
-
puts "To try again, type $ gas ssh #{@uid}"
|
192
|
-
return false
|
193
|
-
end
|
194
|
-
|
195
|
-
result = github_speaker.post_key!(rsa_key)
|
196
|
-
|
197
|
-
if result
|
198
|
-
puts "Key uploaded successfully!"
|
199
|
-
return true
|
200
|
-
end
|
201
|
-
end
|
202
|
-
|
203
|
-
# Get's the ~/.gas/user_id_rsa and ~/.gas/user_id_rsa.pub strings associated with
|
204
|
-
# the specified user and returns it as an array. Returns array with two nils if there's no keys
|
205
|
-
# [pub_rsa, priv_rsa]
|
206
|
-
def self.get_associated_rsa_key(nickname)
|
207
|
-
pub_path = "#{GAS_DIRECTORY}/#{nickname}_id_rsa.pub"
|
208
|
-
priv_path = "#{GAS_DIRECTORY}/#{nickname}_id_rsa"
|
209
|
-
|
210
|
-
if File.exists? pub_path and File.exists? priv_path
|
211
|
-
pub_file = File.open(pub_path, "rb")
|
212
|
-
pub_rsa = pub_file.read.strip
|
213
|
-
pub_file.close
|
214
|
-
if pub_rsa.count(' ') == 2 # special trick to split off the trailing comment text because github API won't store it.
|
215
|
-
pub_rsa = pub_rsa.split(" ")
|
216
|
-
pub_rsa = "#{rsa[0]} #{rsa[1]}"
|
217
|
-
end
|
218
|
-
|
219
|
-
priv_file = File.open(priv_path, "rb")
|
220
|
-
priv_rsa = priv_file.read.strip
|
221
|
-
priv_file.close
|
222
|
-
|
223
|
-
return [pub_rsa, priv_rsa]
|
224
|
-
end
|
225
|
-
return [nil, nil]
|
226
|
-
end
|
227
|
-
|
228
|
-
# Cross-platform way of finding an executable in the $PATH.
|
229
|
-
# returns nil if command not present
|
230
|
-
#
|
231
|
-
# which('ruby') #=> /usr/bin/ruby
|
232
|
-
def self.which(cmd)
|
233
|
-
exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
|
234
|
-
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
235
|
-
exts.each { |ext|
|
236
|
-
exe = "#{path}/#{cmd}#{ext}"
|
237
|
-
return exe if File.executable? exe
|
238
|
-
}
|
239
|
-
end
|
240
|
-
return nil
|
241
|
-
end
|
242
|
-
|
243
|
-
def self.is_ssh_agent_there?
|
244
|
-
return false if which("ssh-add").nil?
|
245
|
-
return true
|
246
|
-
end
|
247
|
-
|
248
|
-
# deletes the ssh keys associated with a user
|
249
|
-
def self.delete(nickname)
|
250
|
-
return false unless user_has_ssh_keys?(nickname) # return if no keys
|
251
|
-
|
252
|
-
case Gas::Prompter.user_wants_to_delete_all_ssh_data?
|
253
|
-
when "a"
|
254
|
-
delete_associated_github_keys!(nickname)
|
255
|
-
delete_associated_local_keys!(nickname)
|
256
|
-
when "l"
|
257
|
-
delete_associated_local_keys!(nickname)
|
258
|
-
when "g"
|
259
|
-
delete_associated_github_keys!(nickname)
|
260
|
-
when "n"
|
261
|
-
return false
|
262
|
-
end
|
263
|
-
|
264
|
-
end
|
265
|
-
|
266
|
-
def self.user_has_ssh_keys?(nickname)
|
267
|
-
return false if get_associated_rsa_key(nickname).first.nil?
|
268
|
-
return true
|
269
|
-
end
|
270
|
-
|
271
|
-
def self.delete_associated_github_keys!(nickname)
|
272
|
-
rsa = get_associated_rsa_key(nickname).first
|
273
|
-
|
274
|
-
credentials = get_nils
|
275
|
-
|
276
|
-
github_speaker = GithubSpeaker.new(nickname, credentials[:username], credentials[:password])
|
277
|
-
|
278
|
-
result = github_speaker.remove_key! rsa
|
279
|
-
puts "The key for this user was not in the specified github account's public keys section." if !result
|
280
|
-
end
|
281
|
-
|
282
|
-
# this is just for testing... it gets stubbed... otherwise, the nils are normal and allow for
|
283
|
-
# normal prompting for username and password from within the GithubSpeaker class
|
284
|
-
def self.get_nils; { :username => nil, :password => nil };end
|
285
|
-
|
286
|
-
def self.delete_associated_local_keys!(nickname)
|
287
|
-
puts "Removing associated keys from local machine..."
|
288
|
-
puts
|
289
|
-
|
290
|
-
ssh_file = get_md5_hash("#{SSH_DIRECTORY}/id_rsa")
|
291
|
-
gas_file = get_md5_hash("#{GAS_DIRECTORY}/#{nickname}_id_rsa")
|
292
|
-
|
293
|
-
return false if gas_file.nil? # if the gas file doesn't exist, return from this function safely, otherwise both objects could be nil, pass this check, and then fuck up our interpreter with file not found errors
|
294
|
-
|
295
|
-
if ssh_file == gas_file
|
296
|
-
File.delete("#{SSH_DIRECTORY}/id_rsa")
|
297
|
-
File.delete("#{SSH_DIRECTORY}/id_rsa.pub")
|
298
|
-
end
|
299
|
-
|
300
|
-
File.delete("#{GAS_DIRECTORY}/#{nickname}_id_rsa")
|
301
|
-
File.delete("#{GAS_DIRECTORY}/#{nickname}_id_rsa.pub")
|
302
|
-
end
|
303
|
-
|
304
|
-
end
|
305
|
-
end
|
@@ -1,338 +0,0 @@
|
|
1
|
-
require './spec/spec_helper'
|
2
|
-
|
3
|
-
require './lib/gas'
|
4
|
-
|
5
|
-
require 'rspec/mocks'
|
6
|
-
require 'rspec/mocks/standalone'
|
7
|
-
require 'pry'
|
8
|
-
|
9
|
-
|
10
|
-
describe Gas::Ssh do
|
11
|
-
before :all do
|
12
|
-
@nickname = "thisaccountmaybedeletedmysteriously"
|
13
|
-
@name = "tim T"
|
14
|
-
@email = "tim@timmy.com"
|
15
|
-
end
|
16
|
-
|
17
|
-
before :each do
|
18
|
-
@uid = "teddy"
|
19
|
-
end
|
20
|
-
|
21
|
-
describe "SSH key file handling..." do
|
22
|
-
|
23
|
-
before :all do
|
24
|
-
Gas::Prompter.stub!(:user_wants_to_delete_all_ssh_data?).and_return("l") # only delete's local keys
|
25
|
-
end
|
26
|
-
|
27
|
-
after :all do
|
28
|
-
Gas::Prompter.unstub!(:user_wants_to_delete_all_ssh_data?)
|
29
|
-
end
|
30
|
-
|
31
|
-
describe "Detecting when files are missing..." do
|
32
|
-
it "should detect when an id_rsa isn't in the .gas directory" do
|
33
|
-
Gas::Ssh.corresponding_rsa_files_exist?(@uid).should be_false
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
describe "Detecting when files exist..." do
|
38
|
-
before :each do
|
39
|
-
create_user_no_git @uid, @uid, "a@b.com"
|
40
|
-
end
|
41
|
-
|
42
|
-
after :each do
|
43
|
-
delete_user_no_git @uid
|
44
|
-
end
|
45
|
-
|
46
|
-
it 'should detect when an id_rsa is already in the .gas directory' do
|
47
|
-
Gas::Ssh.corresponding_rsa_files_exist?(@uid).should be_true
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe "File System Changes..." do
|
52
|
-
|
53
|
-
it 'should create ssh keys in .gas && Gas.remove should be able to remove those files' do
|
54
|
-
STDIN.stub!(:gets).and_return("y\n") # forces the dialogs to
|
55
|
-
Gas::Ssh.stub!(:upload_public_key_to_github).and_return(false)
|
56
|
-
|
57
|
-
lambda do
|
58
|
-
Gas.add(@nickname,@name,@email)
|
59
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(2)
|
60
|
-
|
61
|
-
lambda do
|
62
|
-
Gas.delete(@nickname)
|
63
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(-2)
|
64
|
-
|
65
|
-
STDIN.unstub!(:gets)
|
66
|
-
Gas::Ssh.unstub!(:upload_public_key_to_github)
|
67
|
-
end
|
68
|
-
|
69
|
-
|
70
|
-
describe 'For the ssh directory...' do
|
71
|
-
before :each do
|
72
|
-
clean_out_ssh_directory
|
73
|
-
clean_out_gas_directory(@nickname)
|
74
|
-
|
75
|
-
# a second user for deleting
|
76
|
-
@nickname2 = "thisaccountmaybedeletedmysteriously2"
|
77
|
-
@name2 = "tim T2"
|
78
|
-
@email2 = "tim@timmy.com2"
|
79
|
-
|
80
|
-
create_user_no_git(@nickname2, @name2, @email2)
|
81
|
-
end
|
82
|
-
|
83
|
-
after :each do
|
84
|
-
Gas.delete(@nickname)
|
85
|
-
delete_user_no_git(@nickname2)
|
86
|
-
end
|
87
|
-
|
88
|
-
|
89
|
-
it "if there's no key in .ssh, the use command should place a key there" do
|
90
|
-
|
91
|
-
Gas.use @nickname2
|
92
|
-
# 3) The .ssh directory should now contain that file
|
93
|
-
File.exist?(SSH_DIRECTORY + "/id_rsa.pub").should be_true
|
94
|
-
end
|
95
|
-
|
96
|
-
it "shouldn't overwrite an existing key in ~/.ssh that isn't backed up in .gas and the user aborts" do
|
97
|
-
# 2) Create a bogus id_rsa in the .ssh directory
|
98
|
-
id_rsa, id_rsa_pub = plant_bogus_rsa_keys_in_ssh_directory
|
99
|
-
# 3) Switch to that user
|
100
|
-
Gas::Prompter.stub!(:user_wants_to_overwrite_existing_rsa_key?).and_return(false)
|
101
|
-
Gas.use @nickname2
|
102
|
-
Gas::Prompter.unstub!(:user_wants_to_overwrite_existing_rsa_key?)
|
103
|
-
# 4) The .ssh directory should not be changed
|
104
|
-
File.open(SSH_DIRECTORY + "/id_rsa", "r") do |f|
|
105
|
-
f.read.strip.should eq id_rsa
|
106
|
-
end
|
107
|
-
File.open(SSH_DIRECTORY + "/id_rsa.pub", "r") do |f|
|
108
|
-
f.read.strip.should eq id_rsa_pub
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
it "should overwrite an existing, unbacked-up key in ~/.ssh if user wants" do
|
113
|
-
# 2) Create a bogus id_rsa in the .ssh directory
|
114
|
-
id_rsa, id_rsa_pub = plant_bogus_rsa_keys_in_ssh_directory
|
115
|
-
# 3) Switch to that user
|
116
|
-
Gas::Prompter.stub!(:user_wants_to_overwrite_existing_rsa_key?).and_return(true)
|
117
|
-
Gas.use @nickname2
|
118
|
-
Gas::Prompter.unstub!(:user_wants_to_overwrite_existing_rsa_key?)
|
119
|
-
# 4) The .ssh directory should not be changed
|
120
|
-
File.open(SSH_DIRECTORY + "/id_rsa", "r") do |f|
|
121
|
-
f.read.strip.should_not eq id_rsa
|
122
|
-
end
|
123
|
-
end
|
124
|
-
|
125
|
-
it "If there's a key in ~/.ssh that's backed up in .gas" do
|
126
|
-
# 1) Create an alternate user
|
127
|
-
create_user_no_git(@nickname, @name, @email)
|
128
|
-
rsa, rsa_pub = Gas::Ssh.get_associated_rsa_key(@nickname)
|
129
|
-
rsa2, rsa2_pub = Gas::Ssh.get_associated_rsa_key(@nickname2)
|
130
|
-
# 2)
|
131
|
-
Gas.use @nickname2
|
132
|
-
File.open(SSH_DIRECTORY + "/id_rsa.pub", "r") do |f|
|
133
|
-
f.read.strip.should eq rsa2
|
134
|
-
end
|
135
|
-
Gas.use @nickname
|
136
|
-
File.open(SSH_DIRECTORY + "/id_rsa.pub", "r") do |f|
|
137
|
-
f.read.strip.should eq rsa
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
it "should delete the key in .ssh when the user is deleted" do
|
142
|
-
create_user_no_git(@nickname, @name, @email)
|
143
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa").should be_true
|
144
|
-
Gas.delete @nickname
|
145
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa").should be_false
|
146
|
-
end
|
147
|
-
|
148
|
-
it 'should be able to copy ssh keys in the ssh' do
|
149
|
-
# put a key pair in the ssh directory
|
150
|
-
mock_text = "this is a mock ssh file"
|
151
|
-
File.open(SSH_DIRECTORY + "/id_rsa","w+") do |f|
|
152
|
-
f.write(mock_text)
|
153
|
-
end
|
154
|
-
File.open(SSH_DIRECTORY + "/id_rsa.pub","w+") do |f|
|
155
|
-
f.write(mock_text)
|
156
|
-
end
|
157
|
-
|
158
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa").should be_false
|
159
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa.pub").should be_false
|
160
|
-
|
161
|
-
Gas::Ssh.use_current_rsa_files_for_this_user(@nickname)
|
162
|
-
|
163
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa").should be_true
|
164
|
-
File.exists?(GAS_DIRECTORY + "/#{@nickname}_id_rsa.pub").should be_true
|
165
|
-
|
166
|
-
File.read(GAS_DIRECTORY + "/#{@nickname}_id_rsa") do |f|
|
167
|
-
f.read.should == mock_text # this part doesn't work... hmmm...
|
168
|
-
end
|
169
|
-
|
170
|
-
File.delete(GAS_DIRECTORY + "/#{@nickname}_id_rsa")
|
171
|
-
File.delete(GAS_DIRECTORY + "/#{@nickname}_id_rsa.pub")
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
it "should have a UTILITY for deleting rsa files of user" do
|
177
|
-
lambda do
|
178
|
-
Gas::Ssh.delete_associated_local_keys!(@nickname2)
|
179
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(-2)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
|
183
|
-
end
|
184
|
-
|
185
|
-
end
|
186
|
-
|
187
|
-
describe "Networking stuff..." do
|
188
|
-
before :all do
|
189
|
-
# make sure sample key is deleted in the github web client if you incur issues
|
190
|
-
@username = "aTestGitAccount"
|
191
|
-
@password = "plzdon'thackthetestaccount1"
|
192
|
-
|
193
|
-
config = "[#{@nickname}]\n name = #{@name}\n email = #{@email}\n\n[user2]\n name = foo\n email = bar"
|
194
|
-
@config = Gas::Config.new nil, config
|
195
|
-
@user = @config.users[0]
|
196
|
-
|
197
|
-
@credentials = {:username => @username, :password => @password}
|
198
|
-
|
199
|
-
# Code to prepare the github environment for testing
|
200
|
-
@sample_rsa = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDn74QR9yHb+hcid8iH3+FTaEwnKtwjttseJDbIA2PaivN2uvESrvHlp8Ss/cRox3fFu34QR5DpdOhlfULjTX7yKVuxhaNrAJaqg8rX8hgr9U1Botnyy1DBueEyyA3o1fxRkmwTf6FNnkt1BxWP635tD0lbmUubwaadXjQqPOf3Uw=="
|
201
|
-
|
202
|
-
Gas.delete(@nickname)
|
203
|
-
Gas::Ssh.stub!(:get_username_and_password_and_authenticate).and_return(@credentials)
|
204
|
-
|
205
|
-
VCR.use_cassette('instantiate_github_speaker', :record => :new_episodes) do
|
206
|
-
@github_speaker = Gas::GithubSpeaker.new(@user, @username, @password)
|
207
|
-
end
|
208
|
-
end
|
209
|
-
|
210
|
-
after :all do
|
211
|
-
Gas.delete(@nickname)
|
212
|
-
Gas::Ssh.unstub!(:get_username_and_password_and_authenticate)
|
213
|
-
end
|
214
|
-
|
215
|
-
describe "Should remove and insert keys into github" do
|
216
|
-
it 'UTILITY: should insert a new key into github and conversly remove that key' do
|
217
|
-
initial_request = ''
|
218
|
-
subsequent_request = ''
|
219
|
-
|
220
|
-
VCR.use_cassette('get_keys-find_none') do
|
221
|
-
initial_request = get_keys(@username, @password).length
|
222
|
-
end
|
223
|
-
|
224
|
-
VCR.use_cassette('key_installation_routine-Add_key', :record => :new_episodes) do
|
225
|
-
Gas::Ssh.key_installation_routine!(@user, @sample_rsa, @github_speaker)
|
226
|
-
end
|
227
|
-
|
228
|
-
VCR.use_cassette('get_keys-find_one') do
|
229
|
-
subsequent_request = get_keys(@username, @password).length
|
230
|
-
end
|
231
|
-
|
232
|
-
(subsequent_request - initial_request).should be(1)
|
233
|
-
end
|
234
|
-
|
235
|
-
it 'should remove the key that it just inserted, so DONT RUN ALONE' do
|
236
|
-
initial_request = ''
|
237
|
-
subsequent_request = ''
|
238
|
-
|
239
|
-
VCR.use_cassette('get_keys-find_one') do
|
240
|
-
initial_request = get_keys(@username, @password).length
|
241
|
-
end
|
242
|
-
|
243
|
-
VCR.use_cassette('key_installation_routine-Remove_key') do
|
244
|
-
lambda do
|
245
|
-
@github_speaker.remove_key! @sample_rsa
|
246
|
-
end.should change{get_keys(@username, @password).length}.by(-1)
|
247
|
-
end
|
248
|
-
|
249
|
-
VCR.use_cassette('get_keys-find_none') do
|
250
|
-
subsequent_request = get_keys(@username, @password).length
|
251
|
-
end
|
252
|
-
|
253
|
-
(subsequent_request - initial_request).should be(-1)
|
254
|
-
end
|
255
|
-
|
256
|
-
end
|
257
|
-
|
258
|
-
|
259
|
-
it "should add ssh keys to github when user is created, and delete them when destroyed" do
|
260
|
-
# yes, delete all
|
261
|
-
Gas::Prompter.stub!(:user_wants_to_delete_all_ssh_data?).and_return("a") # all keys, local and github
|
262
|
-
# create new user and use ssh handling
|
263
|
-
Gas::Prompter.stub!(:user_wants_gas_to_handle_rsa_keys?).and_return(true)
|
264
|
-
Gas::Prompter.stub!(:user_wants_to_use_key_already_in_ssh?).and_return(false)
|
265
|
-
Gas::Prompter.stub!(:user_wants_to_install_key_to_github?).and_return(true)
|
266
|
-
|
267
|
-
VCR.use_cassette('add-on-crteation-delete-on-deletion', :record => :new_episodes) do
|
268
|
-
lambda do
|
269
|
-
Gas.add(@nickname,@name,@email, @github_speaker)
|
270
|
-
end.should change{get_keys(@username, @password).length}.by(1)
|
271
|
-
|
272
|
-
lambda do
|
273
|
-
Gas::Ssh.stub!(:get_nils).and_return({ :username => @username, :password => @password })
|
274
|
-
Gas.delete(@nickname)
|
275
|
-
Gas::Ssh.unstub!(:get_nils)
|
276
|
-
end.should change{get_keys(@username, @password).length}.by(-1)
|
277
|
-
end
|
278
|
-
|
279
|
-
Gas::Prompter.unstub!(:user_wants_to_delete_all_ssh_data?)
|
280
|
-
Gas::Prompter.unstub!(:user_wants_gas_to_handle_rsa_keys?)
|
281
|
-
Gas::Prompter.unstub!(:user_wants_to_use_key_already_in_ssh?)
|
282
|
-
Gas::Prompter.unstub!(:user_wants_to_install_key_to_github?)
|
283
|
-
end
|
284
|
-
|
285
|
-
it "Gas.Delete should be able to remove the id_rsa from .gas" do
|
286
|
-
Gas::Prompter.stub!(:user_wants_to_delete_all_ssh_data?).and_return("a")
|
287
|
-
Gas::Prompter.stub!(:user_wants_gas_to_handle_rsa_keys?).and_return(true)
|
288
|
-
Gas::Prompter.stub!(:user_wants_to_use_key_already_in_ssh?).and_return(false)
|
289
|
-
Gas::Prompter.stub!(:user_wants_to_install_key_to_github?).and_return(true)
|
290
|
-
|
291
|
-
VCR.use_cassette('add-on-crteation-delete-on-deletion') do
|
292
|
-
lambda do
|
293
|
-
Gas.add(@nickname,@name,@email, @github_speaker)
|
294
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(2)
|
295
|
-
|
296
|
-
lambda do
|
297
|
-
Gas::Ssh.stub!(:get_nils).and_return({:username => @username, :password => @password })
|
298
|
-
Gas.delete(@nickname)
|
299
|
-
Gas::Ssh.unstub!(:get_nils)
|
300
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(-2)
|
301
|
-
end
|
302
|
-
|
303
|
-
Gas::Prompter.unstub!(:user_wants_to_delete_all_ssh_data?)
|
304
|
-
Gas::Prompter.unstub!(:user_wants_gas_to_handle_rsa_keys?)
|
305
|
-
Gas::Prompter.unstub!(:user_wants_to_use_key_already_in_ssh?)
|
306
|
-
Gas::Prompter.unstub!(:user_wants_to_install_key_to_github?)
|
307
|
-
end
|
308
|
-
|
309
|
-
it 'Gas.ssh(nickname) should be able to add ssh support to a legacy user or an opt-out' do
|
310
|
-
Gas::Prompter.stub!(:user_wants_gas_to_handle_rsa_keys?).and_return(false)
|
311
|
-
Gas.add(@nickname,@name,@email)
|
312
|
-
Gas::Prompter.unstub!(:user_wants_gas_to_handle_rsa_keys?)
|
313
|
-
|
314
|
-
Gas::Prompter.stub!(:user_wants_gas_to_handle_rsa_keys?).and_return(true)
|
315
|
-
Gas::Ssh.stub!(:upload_public_key_to_github)
|
316
|
-
|
317
|
-
lambda do
|
318
|
-
Gas.ssh(@nickname)
|
319
|
-
end.should change{count_of_files_in(GAS_DIRECTORY)}.by(2)
|
320
|
-
|
321
|
-
Gas::Ssh.delete_associated_local_keys!(@nickname)
|
322
|
-
|
323
|
-
Gas::Prompter.unstub!(:user_wants_gas_to_handle_rsa_keys?)
|
324
|
-
Gas::Ssh.unstub!(:upload_public_key_to_github)
|
325
|
-
end
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
it "Should be able to tell if it's ever used this key under this ISP provider before and then warn the user"
|
330
|
-
|
331
|
-
it 'Should have the ability to show if the author is associated with a specific github account NAME, stored in gas.accouts file'
|
332
|
-
|
333
|
-
it 'Should have the ability to link up with non-github git-daemons'
|
334
|
-
|
335
|
-
end
|
336
|
-
|
337
|
-
|
338
|
-
end
|