Merge ~rodrigo-barbieri2010/ubuntu/+source/horizon:lp1827120_wallaby into ~ubuntu-openstack-dev/ubuntu/+source/horizon:stable/wallaby

Proposed by Rodrigo Barbieri
Status: Merged
Merged at revision: 9cf115ef338359e8af3b92eb68b1a86ec850fd08
Proposed branch: ~rodrigo-barbieri2010/ubuntu/+source/horizon:lp1827120_wallaby
Merge into: ~ubuntu-openstack-dev/ubuntu/+source/horizon:stable/wallaby
Diff against target: 155 lines (+133/-0)
3 files modified
debian/changelog (+7/-0)
debian/patches/lp1827120.patch (+125/-0)
debian/patches/series (+1/-0)
Reviewer Review Type Date Requested Status
Ubuntu OpenStack uploaders Pending
Review via email: mp+434097@code.launchpad.net
To post a comment you must log in.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/debian/changelog b/debian/changelog
index af4151a..c0f05a0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
1horizon (4:19.3.0-0ubuntu2~cloud0) focal-wallaby; urgency=medium
2
3 * d/p/lp1827120.patch: Fix missing project_id in application credential
4 create when user has both project+domain admin role (LP#1827120).
5
6 -- Rodrigo Barbieri <rodrigo.barbieri@canonical.com> Mon, 05 Dec 2022 14:24:41 +0000
7
1horizon (4:19.3.0-0ubuntu1~cloud0) focal-wallaby; urgency=medium8horizon (4:19.3.0-0ubuntu1~cloud0) focal-wallaby; urgency=medium
29
3 * New stable point release for OpenStack Wallaby (LP: #1985087).10 * New stable point release for OpenStack Wallaby (LP: #1985087).
diff --git a/debian/patches/lp1827120.patch b/debian/patches/lp1827120.patch
4new file mode 10064411new file mode 100644
index 0000000..f66cf3c
--- /dev/null
+++ b/debian/patches/lp1827120.patch
@@ -0,0 +1,125 @@
1From 2f8aaa03e8ed4c2c8e3628f1f723f304b24b1f82 Mon Sep 17 00:00:00 2001
2From: Rodrigo Barbieri <rodrigo.barbieri2010@gmail.com>
3Date: Wed, 7 Sep 2022 10:52:48 -0300
4Subject: [PATCH] Fix app cred create without project_id for domain admins
5
6Users with domain admin role that are not cloud admins are
7not able to get scoped context and create an application
8credential with project_id, so this change forces the
9scoped context in that particular case.
10
11Closes-bug: #1827120
12Change-Id: I076a97a6f943ab74a2db8bc5179a7db194009db4
13(cherry picked from commit 6eeaf9852478e25ff77c21117664ac126c5357a4)
14(cherry picked from commit 778a52e66aeab883b31db729e04944eeecfec6a2)
15(cherry picked from commit 13e821a079134a458b24593d9593e0e5318e6cd6)
16(cherry picked from commit 084ee8aaea703d99720c0cdc2751b6479dab3b2f)
17---
18 openstack_dashboard/api/keystone.py | 17 +++++--
19 .../test/unit/api/test_keystone.py | 44 +++++++++++++++++++
20 2 files changed, 58 insertions(+), 3 deletions(-)
21
22diff --git a/openstack_dashboard/api/keystone.py b/openstack_dashboard/api/keystone.py
23index 6195ee79c..3d21c808c 100644
24--- a/openstack_dashboard/api/keystone.py
25+++ b/openstack_dashboard/api/keystone.py
26@@ -120,7 +120,7 @@ def _get_endpoint_url(request, endpoint_type, catalog=None):
27 return url
28
29
30-def keystoneclient(request, admin=False):
31+def keystoneclient(request, admin=False, force_scoped=False):
32 """Returns a client connected to the Keystone backend.
33
34 Several forms of authentication are supported:
35@@ -152,7 +152,8 @@ def keystoneclient(request, admin=False):
36
37 # If user is Cloud Admin, Domain Admin or Mixed Domain Admin and there
38 # is no domain context specified, use domain scoped token
39- if is_domain_admin(request) and not is_domain_context_specified:
40+ if (is_domain_admin(request) and not is_domain_context_specified and
41+ not force_scoped):
42 domain_token = request.session.get('domain_token')
43 if domain_token:
44 token_id = getattr(domain_token, 'auth_token', None)
45@@ -998,7 +999,17 @@ def application_credential_create(request, name, secret=None,
46 roles=None, unrestricted=False,
47 access_rules=None):
48 user = request.user.id
49- manager = keystoneclient(request).application_credentials
50+ # NOTE(ganso): users with domain admin role that are not cloud admins are
51+ # not able to get scoped context and create an application credential with
52+ # project_id, so only in this particular case we force a scoped context
53+ force_scoped = False
54+ if (request.user.project_id and request.session.get("domain_token") and
55+ not policy.check(
56+ (("identity", "identity:update_domain"),), request)):
57+ force_scoped = True
58+
59+ manager = keystoneclient(
60+ request, force_scoped=force_scoped).application_credentials
61 try:
62 return manager.create(name=name, user=user, secret=secret,
63 description=description, expires_at=expires_at,
64diff --git a/openstack_dashboard/test/unit/api/test_keystone.py b/openstack_dashboard/test/unit/api/test_keystone.py
65index 82221b757..3b682815e 100644
66--- a/openstack_dashboard/test/unit/api/test_keystone.py
67+++ b/openstack_dashboard/test/unit/api/test_keystone.py
68@@ -20,6 +20,7 @@ from unittest import mock
69
70 from django.test.utils import override_settings
71 from openstack_dashboard import api
72+from openstack_dashboard import policy
73 from openstack_dashboard.test import helpers as test
74
75
76@@ -142,3 +143,46 @@ class APIVersionTests(test.APIMockTestCase):
77 keystoneclient.session.get_endpoint_data.assert_called_once_with(
78 service_type='identity')
79 self.assertEqual((3, 10), api_version)
80+
81+
82+class ApplicationCredentialsAPITests(test.APIMockTestCase):
83+
84+ @mock.patch.object(policy, 'check')
85+ @mock.patch.object(api.keystone, 'keystoneclient')
86+ def test_application_credential_create_domain_token_removed(
87+ self, mock_keystoneclient, mock_policy):
88+ self.request.session['domain_token'] = 'some_token'
89+ mock_policy.return_value = False
90+ api.keystone.application_credential_create(self.request, None)
91+ mock_keystoneclient.assert_called_once_with(
92+ self.request, force_scoped=True)
93+
94+ @mock.patch.object(policy, 'check')
95+ @mock.patch.object(api.keystone, 'keystoneclient')
96+ def test_application_credential_create_domain_token_not_removed_policy_true(
97+ self, mock_keystoneclient, mock_policy):
98+ self.request.session['domain_token'] = 'some_token'
99+ mock_policy.return_value = True
100+ api.keystone.application_credential_create(self.request, None)
101+ mock_keystoneclient.assert_called_once_with(
102+ self.request, force_scoped=False)
103+
104+ @mock.patch.object(policy, 'check')
105+ @mock.patch.object(api.keystone, 'keystoneclient')
106+ def test_application_credential_create_domain_token_not_removed_no_token(
107+ self, mock_keystoneclient, mock_policy):
108+ mock_policy.return_value = True
109+ api.keystone.application_credential_create(self.request, None)
110+ mock_keystoneclient.assert_called_once_with(
111+ self.request, force_scoped=False)
112+
113+ @mock.patch.object(policy, 'check')
114+ @mock.patch.object(api.keystone, 'keystoneclient')
115+ def test_application_credential_create_domain_token_not_removed_no_project(
116+ self, mock_keystoneclient, mock_policy):
117+ self.request.session['domain_token'] = 'some_token'
118+ mock_policy.return_value = True
119+ self.request.user.project_id = None
120+ api.keystone.application_credential_create(self.request, None)
121+ mock_keystoneclient.assert_called_once_with(
122+ self.request, force_scoped=False)
123--
1242.34.1
125
diff --git a/debian/patches/series b/debian/patches/series
index 88198a3..f7cdd35 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,3 +2,4 @@ fix-horizon-test-settings.patch
2fix-dashboard-manage.patch2fix-dashboard-manage.patch
3ubuntu_settings.patch3ubuntu_settings.patch
4embedded-xstatic.patch4embedded-xstatic.patch
5lp1827120.patch

Subscribers

People subscribed via source and target branches