From bef0a8b23ac34db56aeaebe3eae4ff7c9673f087 Mon Sep 17 00:00:00 2001 From: Andrii Zakurenyi Date: Tue, 15 Aug 2023 18:54:39 +0300 Subject: [PATCH] Fix DevOps Secrets Vault credential plugin to work with python-dsv-sdk>=1.0.4 Signed-off-by: Andrii Zakurenyi --- awx/main/credential_plugins/dsv.py | 45 +++++++++++++++++++----------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/awx/main/credential_plugins/dsv.py b/awx/main/credential_plugins/dsv.py index 8043b03eb2..6e9441ed95 100644 --- a/awx/main/credential_plugins/dsv.py +++ b/awx/main/credential_plugins/dsv.py @@ -2,29 +2,28 @@ from .plugin import CredentialPlugin from django.conf import settings from django.utils.translation import gettext_lazy as _ - -try: - from delinea.secrets.vault import SecretsVault -except ImportError: - from thycotic.secrets.vault import SecretsVault - +from delinea.secrets.vault import PasswordGrantAuthorizer, SecretsVault dsv_inputs = { 'fields': [ { 'id': 'tenant', 'label': _('Tenant'), - 'help_text': _('The tenant e.g. "ex" when the URL is https://ex.secretservercloud.com'), + 'help_text': _('The tenant e.g. "ex" when the URL is https://ex.secretsvaultcloud.com'), 'type': 'string', }, { 'id': 'tld', 'label': _('Top-level Domain (TLD)'), - 'help_text': _('The TLD of the tenant e.g. "com" when the URL is https://ex.secretservercloud.com'), - 'choices': ['ca', 'com', 'com.au', 'com.sg', 'eu'], + 'help_text': _('The TLD of the tenant e.g. "com" when the URL is https://ex.secretsvaultcloud.com'), + 'choices': ['ca', 'com', 'com.au', 'eu'], 'default': 'com', }, - {'id': 'client_id', 'label': _('Client ID'), 'type': 'string'}, + { + 'id': 'client_id', + 'label': _('Client ID'), + 'type': 'string', + }, { 'id': 'client_secret', 'label': _('Client Secret'), @@ -55,12 +54,26 @@ if settings.DEBUG: 'id': 'url_template', 'label': _('URL template'), 'type': 'string', - 'default': 'https://{}.secretsvaultcloud.{}/v1', + 'default': 'https://{}.secretsvaultcloud.{}', } ) -dsv_plugin = CredentialPlugin( - 'Thycotic DevOps Secrets Vault', - dsv_inputs, - lambda **kwargs: SecretsVault(**{k: v for (k, v) in kwargs.items() if k in [field['id'] for field in dsv_inputs['fields']]}).get_secret(kwargs['path'])['data'][kwargs['secret_field']], # fmt: skip -) + +def dsv_backend(**kwargs): + tenant_name = kwargs['tenant'] + tenant_tld = kwargs.get('tld', 'com') + tenant_url_template = kwargs.get('url_template', 'https://{}.secretsvaultcloud.{}') + client_id = kwargs['client_id'] + client_secret = kwargs['client_secret'] + secret_path = kwargs['path'] + secret_field = kwargs['secret_field'] + + tenant_url = tenant_url_template.format(tenant_name, tenant_tld.strip(".")) + + authorizer = PasswordGrantAuthorizer(tenant_url, client_id, client_secret) + dsv_secret = SecretsVault(tenant_url, authorizer).get_secret(secret_path) + + return dsv_secret['data'][secret_field] + + +dsv_plugin = CredentialPlugin(name='Thycotic DevOps Secrets Vault', inputs=dsv_inputs, backend=dsv_backend)