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.
156 lines
4.3 KiB
Ruby
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
|