Merge ~ack/maas:rbac-edit-owned-devices-1811665 into maas:master

Proposed by Alberto Donato
Status: Merged
Approved by: Alberto Donato
Approved revision: 04aa1bcc936869b85ce1c9b58cda97ab30d2a95d
Merge reported by: MAAS Lander
Merged at revision: not available
Proposed branch: ~ack/maas:rbac-edit-owned-devices-1811665
Merge into: maas:master
Diff against target: 95 lines (+39/-2)
3 files modified
src/maasserver/api/tests/test_devices.py (+19/-0)
src/maasserver/models/__init__.py (+4/-1)
src/maasserver/websockets/handlers/tests/test_device.py (+16/-1)
Reviewer Review Type Date Requested Status
Blake Rouse (community) Approve
MAAS Lander Approve
Review via email: mp+362336@code.launchpad.net

Commit message

LP: #1811665 - allow non-admins to edit their devices

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

UNIT TESTS
-b rbac-edit-owned-devices-1811665 lp:~ack/maas/+git/maas into -b master lp:~maas-committers/maas

STATUS: SUCCESS
COMMIT: 04aa1bcc936869b85ce1c9b58cda97ab30d2a95d

review: Approve
Revision history for this message
Blake Rouse (blake-rouse) wrote :

Looks good.

review: Approve

There was an error fetching revisions from git servers. Please try again in a few minutes. If the problem persists, contact Launchpad support.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/src/maasserver/api/tests/test_devices.py b/src/maasserver/api/tests/test_devices.py
2index fd1ec46..a122d67 100644
3--- a/src/maasserver/api/tests/test_devices.py
4+++ b/src/maasserver/api/tests/test_devices.py
5@@ -8,6 +8,7 @@ __all__ = []
6 import http.client
7 import random
8
9+from maasserver.api import auth
10 from maasserver.enum import (
11 NODE_STATUS,
12 NODE_TYPE,
13@@ -19,6 +20,7 @@ from maasserver.models import (
14 )
15 from maasserver.testing.api import APITestCase
16 from maasserver.testing.factory import factory
17+from maasserver.testing.fixtures import RBACEnabled
18 from maasserver.utils.converters import json_load_bytes
19 from maasserver.utils.django_urls import reverse
20 from maasserver.utils.orm import reload_object
21@@ -336,6 +338,23 @@ class TestDeviceAPI(APITestCase.ForUser):
22 self.assertEqual(http.client.FORBIDDEN, response.status_code)
23 self.assertEqual(old_hostname, reload_object(device).hostname)
24
25+ def test_PUT_updates_with_rbac(self):
26+ self.patch(auth, 'validate_user_external_auth').return_value = True
27+ self.useFixture(RBACEnabled())
28+ self.become_non_local()
29+
30+ device = factory.make_Node(
31+ node_type=NODE_TYPE.DEVICE, owner=self.user)
32+ new_hostname = factory.make_name('hostname')
33+
34+ response = self.client.put(
35+ get_device_uri(device), {'hostname': new_hostname})
36+ self.assertEqual(
37+ http.client.OK, response.status_code, response.content)
38+
39+ device = reload_object(device)
40+ self.assertEqual(new_hostname, device.hostname)
41+
42 def test_DELETE_removes_device(self):
43 device = factory.make_Node(
44 node_type=NODE_TYPE.DEVICE, owner=self.user)
45diff --git a/src/maasserver/models/__init__.py b/src/maasserver/models/__init__.py
46index ba2c084..6abec61 100644
47--- a/src/maasserver/models/__init__.py
48+++ b/src/maasserver/models/__init__.py
49@@ -520,7 +520,10 @@ class MAASAuthorizationBackend(ModelBackend):
50 if rbac_enabled:
51 can_admin = self._can_admin(
52 rbac_enabled, user, machine, admin_pools)
53- can_edit = (machine.pool_id in deploy_pools) or can_admin
54+ can_edit = (
55+ machine.pool_id in deploy_pools or
56+ (machine.pool_id is None and machine.owner == user) or
57+ can_admin)
58 return (editable and can_edit) or can_admin
59 return editable or user.is_superuser
60
61diff --git a/src/maasserver/websockets/handlers/tests/test_device.py b/src/maasserver/websockets/handlers/tests/test_device.py
62index 36169e6..ac3e083 100644
63--- a/src/maasserver/websockets/handlers/tests/test_device.py
64+++ b/src/maasserver/websockets/handlers/tests/test_device.py
65@@ -27,7 +27,10 @@ from maasserver.models.staticipaddress import StaticIPAddress
66 from maasserver.node_action import compile_node_actions
67 from maasserver.permissions import NodePermission
68 from maasserver.testing.factory import factory
69-from maasserver.testing.fixtures import RBACForceOffFixture
70+from maasserver.testing.fixtures import (
71+ RBACEnabled,
72+ RBACForceOffFixture,
73+)
74 from maasserver.testing.testcase import MAASTransactionServerTestCase
75 from maasserver.utils.orm import (
76 reload_object,
77@@ -1014,6 +1017,18 @@ class TestDeviceHandler(MAASTransactionServerTestCase):
78 HandlerDoesNotExistError, handler.update, node_data)
79
80 @transactional
81+ def test_update_owned_with_rbac(self):
82+ self.useFixture(RBACEnabled())
83+ user = factory.make_User(is_local=False)
84+ node = factory.make_Node(owner=user, node_type=NODE_TYPE.DEVICE)
85+ handler = DeviceHandler(user, {}, None)
86+ new_hostname = factory.make_name("hostname")
87+ updated_node = handler.update(
88+ {"system_id": node.system_id,
89+ 'hostname': new_hostname})
90+ self.assertEqual(updated_node['hostname'], new_hostname)
91+
92+ @transactional
93 def test_delete_interface_admin(self):
94 user = factory.make_admin()
95 node = factory.make_Node(node_type=NODE_TYPE.DEVICE)

Subscribers

People subscribed via source and target branches