Brian Cain b45ee4f455 (#6656) Format windows paths for ssh_config command
Prior to this commit, if the ssh-config command was invoked within
cygwin or msys2, it would show a regular windows style path for private
keys rather than a path that could be used within msys2 or cygwin. This
commit updates that behavior by converting all of the private key paths
to the proper msys2 or cygwin path if the platform is windows and the
command was invoked from one of those two shells.
2017-08-25 13:17:19 -07:00

156 lines
4.3 KiB
Ruby

require File.expand_path("../../../../base", __FILE__)
require Vagrant.source_root.join("plugins/commands/ssh_config/command")
describe VagrantPlugins::CommandSSHConfig::Command do
include_context "unit"
include_context "virtualbox"
let(:iso_env) do
# We have to create a Vagrantfile so there is a root path
env = isolated_environment
env.vagrantfile("")
env.create_vagrant_env
end
let(:guest) { double("guest") }
let(:host) { double("host") }
let(:machine) { iso_env.machine(iso_env.machine_names[0], :dummy) }
let(:argv) { [] }
let(:ssh_info) {{
host: "testhost.vagrant.dev",
port: 1234,
username: "testuser",
keys_only: true,
paranoid: false,
private_key_path: ["/home/vagrant/.private/keys.key"],
forward_agent: false,
forward_x11: false
}}
subject { described_class.new(argv, iso_env) }
before do
allow(machine).to receive(:ssh_info).and_return(ssh_info)
allow(subject).to receive(:with_target_vms) { |&block| block.call machine }
end
describe "execute" do
it "prints out the ssh config for the given machine" do
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to eq(<<-SSHCONFIG)
Host #{machine.name}
HostName testhost.vagrant.dev
User testuser
Port 1234
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /home/vagrant/.private/keys.key
IdentitiesOnly yes
LogLevel FATAL
SSHCONFIG
end
it "turns on agent forwarding when it is configured" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(forward_agent: true) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include("ForwardAgent yes")
end
it "turns on x11 forwarding when it is configured" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(forward_x11: true) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include("ForwardX11 yes")
end
it "handles multiple private key paths" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(private_key_path: ["foo", "bar"]) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include("IdentityFile foo")
expect(output).to include("IdentityFile bar")
end
it "puts quotes around an identityfile path if it has a space" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(private_key_path: ["with a space"]) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include('IdentityFile "with a space"')
end
it "omits IdentitiesOnly when keys_only is false" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(keys_only: false) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).not_to include('IdentitiesOnly')
end
it "omits StrictHostKeyChecking and UserKnownHostsFile when paranoid is true" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(paranoid: true) }
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).not_to include('StrictHostKeyChecking ')
expect(output).not_to include('UserKnownHostsFile ')
end
it "formats windows paths if windows" do
allow(machine).to receive(:ssh_info) { ssh_info.merge(private_key_path: ["C:\\path\\to\\vagrant\\home.key"]) }
allow(Vagrant::Util::Platform).to receive(:format_windows_path).and_return("/home/vagrant/home.key")
allow(Vagrant::Util::Platform).to receive(:windows?).and_return(true)
output = ""
allow(subject).to receive(:safe_puts) do |data|
output += data if data
end
subject.execute
expect(output).to include('IdentityFile /home/vagrant/home.key')
end
end
end