Merge ~newell-jensen/maas:lp1815136 into maas:master

Proposed by Newell Jensen
Status: Merged
Approved by: Newell Jensen
Approved revision: f3c0ab1e417f813654f905ee648e5716988f80b0
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~newell-jensen/maas:lp1815136
Merge into: maas:master
Diff against target: 68 lines (+23/-6)
2 files modified
src/provisioningserver/drivers/pod/tests/test_virsh.py (+12/-3)
src/provisioningserver/drivers/pod/virsh.py (+11/-3)
Reviewer Review Type Date Requested Status
Alberto Donato (community) Approve
MAAS Lander Approve
Review via email: mp+364071@code.launchpad.net

Commit message

LP: #1815136 -- Raise error if user tries to supply extra parameters to Virsh power address.

To post a comment you must log in.
Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1815136 lp:~newell-jensen/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 66ff2d899a564af9d79fc3bbaa8816ca358c5163

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

One comment inline (change itself looks good otherwise)

review: Needs Fixing
Revision history for this message
Newell Jensen (newell-jensen) wrote :

Added the changes. Ended up going with query instead of fragment as this is what is actually set when there are extra remote uri parameters in the virsh url string.

>>> poweraddr = "qemu+ssh://10.0.0.2/system?command=maas_ssh"
>>> from urllib.parse import urlparse
>>> parsed = urlparse(poweraddr)
>>> parsed
ParseResult(scheme='qemu+ssh', netloc='10.0.0.2', path='/system', params='', query='command=maas_ssh', fragment='')

~newell-jensen/maas:lp1815136 updated
f3c0ab1... by Newell Jensen

Review fixes.

Revision history for this message
MAAS Lander (maas-lander) wrote :

UNIT TESTS
-b lp1815136 lp:~newell-jensen/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: f3c0ab1e417f813654f905ee648e5716988f80b0

review: Approve
Revision history for this message
Alberto Donato (ack) wrote :

+1, thanks!

Sorry, I indeed meant using .query :)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/provisioningserver/drivers/pod/tests/test_virsh.py b/src/provisioningserver/drivers/pod/tests/test_virsh.py
2index 3cf64ea..feea500 100644
3--- a/src/provisioningserver/drivers/pod/tests/test_virsh.py
4+++ b/src/provisioningserver/drivers/pod/tests/test_virsh.py
5@@ -543,15 +543,24 @@ class TestVirshSSH(MAASTestCase):
6 conn.login(poweraddr=factory.make_name('poweraddr')))
7 self.assertThat(mock_close, MockCalledOnceWith())
8
9- def test_login_with_poweraddr_extra_parameters(self):
10+ def test_login_errors_with_poweraddr_extra_parameters(self):
11+ conn = virsh.VirshSSH(timeout=0.1)
12+ self.addCleanup(conn.close)
13+ poweraddr = "qemu+ssh://ubuntu@10.0.0.2/system?no_verify=1"
14+ conn._spawn('cat')
15+ self.assertRaises(
16+ virsh.VirshError, conn.login, poweraddr)
17+
18+ def test_login_with_poweraddr_adds_extra_parameters(self):
19 conn = virsh.VirshSSH(timeout=0.1)
20 self.addCleanup(conn.close)
21 mock_execute = self.patch(conn, '_execute')
22 mock_close = self.patch(conn, 'close')
23- poweraddr = "qemu+ssh://ubuntu@10.0.0.2/system?no_verify=1"
24+ poweraddr = "qemu+ssh://ubuntu@10.0.0.2/system"
25 conn._spawn('cat')
26 self.assertFalse(conn.login(poweraddr=poweraddr))
27- self.assertThat(mock_execute, MockCalledOnceWith(poweraddr))
28+ new_poweraddr = poweraddr + "?command=/usr/lib/maas/unverified-ssh"
29+ self.assertThat(mock_execute, MockCalledOnceWith(new_poweraddr))
30 self.assertThat(mock_close, MockCalledOnceWith())
31
32 def test_login_with_poweraddr_no_extra_parameters(self):
33diff --git a/src/provisioningserver/drivers/pod/virsh.py b/src/provisioningserver/drivers/pod/virsh.py
34index e278a9d..83ff19c 100644
35--- a/src/provisioningserver/drivers/pod/virsh.py
36+++ b/src/provisioningserver/drivers/pod/virsh.py
37@@ -13,6 +13,7 @@ import os
38 import string
39 from tempfile import NamedTemporaryFile
40 from textwrap import dedent
41+from urllib.parse import urlparse
42 from uuid import uuid4
43
44 from lxml import etree
45@@ -351,13 +352,20 @@ class VirshSSH(pexpect.spawn):
46
47 def login(self, poweraddr, password=None):
48 """Starts connection to virsh."""
49+ # Extra paramaeters are not allowed as this is a security
50+ # hole for allowing a user to run executables.
51+ parsed = urlparse(poweraddr)
52+ if parsed.query:
53+ raise VirshError(
54+ "Supplying extra parameters to the Virsh address"
55+ " is not supported.")
56+
57 # Append unverified-ssh command if user has not
58 # supplied their own extra parameters. See,
59 # https://bugs.launchpad.net/maas/+bug/1807231
60 # for more details.
61- if '?' not in poweraddr:
62- poweraddr = poweraddr + '?command=' + get_path(
63- '/usr/lib/maas/unverified-ssh')
64+ poweraddr = poweraddr + '?command=' + get_path(
65+ '/usr/lib/maas/unverified-ssh')
66 self._execute(poweraddr)
67 i = self.expect(self.PROMPTS, timeout=self.timeout)
68 if i == self.I_PROMPT_SSHKEY:

Subscribers

People subscribed via source and target branches