96 lines
2.6 KiB
Python
96 lines
2.6 KiB
Python
from .plugin import CredentialPlugin, CertFiles, raise_for_status
|
|
|
|
from urllib.parse import quote, urlencode, urljoin
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
import requests
|
|
|
|
aim_inputs = {
|
|
'fields': [{
|
|
'id': 'url',
|
|
'label': _('CyberArk AIM URL'),
|
|
'type': 'string',
|
|
'format': 'url',
|
|
}, {
|
|
'id': 'app_id',
|
|
'label': _('Application ID'),
|
|
'type': 'string',
|
|
'secret': True,
|
|
}, {
|
|
'id': 'client_key',
|
|
'label': _('Client Key'),
|
|
'type': 'string',
|
|
'secret': True,
|
|
'multiline': True,
|
|
}, {
|
|
'id': 'client_cert',
|
|
'label': _('Client Certificate'),
|
|
'type': 'string',
|
|
'secret': True,
|
|
'multiline': True,
|
|
}, {
|
|
'id': 'verify',
|
|
'label': _('Verify SSL Certificates'),
|
|
'type': 'boolean',
|
|
'default': True,
|
|
}],
|
|
'metadata': [{
|
|
'id': 'object_query',
|
|
'label': _('Object Query'),
|
|
'type': 'string',
|
|
'help_text': _('Lookup query for the object. Ex: Safe=TestSafe;Object=testAccountName123'),
|
|
}, {
|
|
'id': 'object_query_format',
|
|
'label': _('Object Query Format'),
|
|
'type': 'string',
|
|
'default': 'Exact',
|
|
'choices': ['Exact', 'Regexp']
|
|
}, {
|
|
'id': 'reason',
|
|
'label': _('Reason'),
|
|
'type': 'string',
|
|
'help_text': _('Object request reason. This is only needed if it is required by the object\'s policy.')
|
|
}],
|
|
'required': ['url', 'app_id', 'object_query'],
|
|
}
|
|
|
|
|
|
def aim_backend(**kwargs):
|
|
url = kwargs['url']
|
|
client_cert = kwargs.get('client_cert', None)
|
|
client_key = kwargs.get('client_key', None)
|
|
verify = kwargs['verify']
|
|
app_id = kwargs['app_id']
|
|
object_query = kwargs['object_query']
|
|
object_query_format = kwargs['object_query_format']
|
|
reason = kwargs.get('reason', None)
|
|
|
|
query_params = {
|
|
'AppId': app_id,
|
|
'Query': object_query,
|
|
'QueryFormat': object_query_format,
|
|
}
|
|
if reason:
|
|
query_params['reason'] = reason
|
|
|
|
request_qs = '?' + urlencode(query_params, quote_via=quote)
|
|
request_url = urljoin(url, '/'.join(['AIMWebService', 'api', 'Accounts']))
|
|
|
|
with CertFiles(client_cert, client_key) as cert:
|
|
res = requests.get(
|
|
request_url + request_qs,
|
|
timeout=30,
|
|
cert=cert,
|
|
verify=verify,
|
|
allow_redirects=False,
|
|
)
|
|
raise_for_status(res)
|
|
return res.json()['Content']
|
|
|
|
|
|
aim_plugin = CredentialPlugin(
|
|
'CyberArk AIM Central Credential Provider Lookup',
|
|
inputs=aim_inputs,
|
|
backend=aim_backend
|
|
)
|