Tatiana Ovchinnikova edad0dbfc4 Improve two factor authentication config in Horizon
User Credentials panel is added to Identity dashboard.
Credentials table has Create, Update and Delete credential actions.

Credentials tab is added to the user details for
Identity -> Users table.

Credentials panel is added to user settings.

Change-Id: Icaabed327604d39b0bf6ac3e3cacf9c62f9e5d5d
2025-03-17 09:19:51 -05:00

108 lines
3.9 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from django.urls import reverse
from django.urls import reverse_lazy
from django.utils.translation import gettext_lazy as _
from horizon import exceptions
from horizon import forms
from horizon import tables
from horizon.utils import memoized
from openstack_dashboard.api import keystone
from openstack_dashboard.dashboards.identity.credentials \
import forms as credential_forms
from openstack_dashboard.dashboards.identity.credentials \
import tables as credential_tables
@memoized.memoized
def get_project_name(request, project_id):
if project_id is not None:
project = keystone.tenant_get(
request, project_id, admin=False)
return project.name
return None
@memoized.memoized
def get_user_name(request, user_id):
if user_id is not None:
user = keystone.user_get(request, user_id, admin=False)
return user.name
return None
class CredentialsView(tables.DataTableView):
table_class = credential_tables.CredentialsTable
page_title = _("User Credentials")
policy_rules = (("identity", "identity:list_credentials"),)
def get_data(self):
try:
credentials = keystone.credentials_list(self.request)
for cred in credentials:
cred.project_name = get_project_name(
self.request, cred.project_id)
cred.user_name = get_user_name(self.request, cred.user_id)
except Exception:
credentials = []
exceptions.handle(self.request,
_('Unable to retrieve users credentials list.'))
return credentials
class UpdateView(forms.ModalFormView):
template_name = 'identity/credentials/update.html'
form_id = "update_credential_form"
form_class = credential_forms.UpdateCredentialForm
submit_label = _("Update User Credential")
submit_url = "horizon:identity:credentials:update"
success_url = reverse_lazy('horizon:identity:credentials:index')
page_title = _("Update User Credential")
@memoized.memoized_method
def get_object(self):
try:
return keystone.credential_get(
self.request, self.kwargs['credential_id'])
except Exception:
redirect = reverse("horizon:identity:credentials:index")
exceptions.handle(self.request,
_('Unable to update user credential.'),
redirect=redirect)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
args = (self.get_object().id,)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
credential = self.get_object()
return {'id': credential.id,
'user_name': credential.user_id,
'data': credential.blob,
'cred_type': credential.type,
'project_name': credential.project_id}
class CreateView(forms.ModalFormView):
template_name = 'identity/credentials/create.html'
form_id = "create_credential_form"
form_class = credential_forms.CreateCredentialForm
submit_label = _("Create User Credential")
submit_url = reverse_lazy("horizon:identity:credentials:create")
success_url = reverse_lazy('horizon:identity:credentials:index')
page_title = _("Create User Credential")