We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
CyberArk Conjur lookup plugin does not work with open source Conjur version
### Please confirm the following

- [X] I agree to follow this project's [code of conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html).
- [X] I have checked the [current issues](https://github.com/ansible/awx/issues) for duplicates.
- [X] I understand that AWX is open source software provided for free and that I might not receive a timely response.

### Bug Summary

The CyberArk Conjur Secrets Manager Lookup plugin no longer supports the lookup against the Conjur OSS. Most likely because the opensource conjure version API endpoint does not have the `/api/` portion recently added by this change: https://github.com/ansible/awx/pull/13121

### AWX version

2.4

### Select the relevant components

- [ ] UI
- [X] API
- [ ] Docs
- [ ] Collection
- [ ] CLI
- [ ] Other

### Installation method

docker development environment

### Modifications

no

### Ansible version

_No response_

### Operating system

_No response_

### Web browser

_No response_

### Steps to reproduce

1. Deploy Conjur OSS. We use the latest `cyberark/conjur` image for that. The Conjur version is
```
    Version 1.19.1-3398
    API Version 5.3.0 
```
2. Under the AWX, create the CyberArk Conjur Secrets Manager Lookup credential. Provide Conjure URL, user, and token. 
3. Click Test and provide a path. 


### Expected results

Connection to Conjur should be established. HTTP 200 response. 

### Actual results

401 error returned. 

```
Traceback (most recent call last):
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/tasks/jobs.py", line 504, in run
    args = self.build_args(self.instance, private_data_dir, passwords)
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/tasks/jobs.py", line 937, in build_args
    ssh_username = creds.get_input('username', default='')
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py", line 275, in get_input
    return self._get_dynamic_input(field_name)
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py", line 309, in _get_dynamic_input
    return input_source.get_input_value()
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py", line 1250, in get_input_value
    return backend(**backend_kwargs)
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/credential_plugins/conjur.py", line 72, in conjur_backend
    raise_for_status(resp)
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/credential_plugins/plugin.py", line 12, in raise_for_status
    resp.raise_for_status()
  File "/var/lib/awx/venv/awx/lib64/python3.9/site-packages/requests/models.py", line 1021, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://conjureurl.com/api/authn/test/admin/authenticate
```

### Additional information

_No response_

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `awx/main/credential_plugins/conjur.py`
Content:
```
1 from .plugin import CredentialPlugin, CertFiles, raise_for_status
2 
3 from urllib.parse import urljoin, quote
4 
5 from django.utils.translation import gettext_lazy as _
6 import requests
7 
8 
9 conjur_inputs = {
10     'fields': [
11         {
12             'id': 'url',
13             'label': _('Conjur URL'),
14             'type': 'string',
15             'format': 'url',
16         },
17         {
18             'id': 'api_key',
19             'label': _('API Key'),
20             'type': 'string',
21             'secret': True,
22         },
23         {
24             'id': 'account',
25             'label': _('Account'),
26             'type': 'string',
27         },
28         {
29             'id': 'username',
30             'label': _('Username'),
31             'type': 'string',
32         },
33         {'id': 'cacert', 'label': _('Public Key Certificate'), 'type': 'string', 'multiline': True},
34     ],
35     'metadata': [
36         {
37             'id': 'secret_path',
38             'label': _('Secret Identifier'),
39             'type': 'string',
40             'help_text': _('The identifier for the secret e.g., /some/identifier'),
41         },
42         {
43             'id': 'secret_version',
44             'label': _('Secret Version'),
45             'type': 'string',
46             'help_text': _('Used to specify a specific secret version (if left empty, the latest version will be used).'),
47         },
48     ],
49     'required': ['url', 'api_key', 'account', 'username'],
50 }
51 
52 
53 def conjur_backend(**kwargs):
54     url = kwargs['url']
55     api_key = kwargs['api_key']
56     account = quote(kwargs['account'], safe='')
57     username = quote(kwargs['username'], safe='')
58     secret_path = quote(kwargs['secret_path'], safe='')
59     version = kwargs.get('secret_version')
60     cacert = kwargs.get('cacert', None)
61 
62     auth_kwargs = {
63         'headers': {'Content-Type': 'text/plain', 'Accept-Encoding': 'base64'},
64         'data': api_key,
65         'allow_redirects': False,
66     }
67 
68     with CertFiles(cacert) as cert:
69         # https://www.conjur.org/api.html#authentication-authenticate-post
70         auth_kwargs['verify'] = cert
71         resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)
72     raise_for_status(resp)
73     token = resp.content.decode('utf-8')
74 
75     lookup_kwargs = {
76         'headers': {'Authorization': 'Token token="{}"'.format(token)},
77         'allow_redirects': False,
78     }
79 
80     # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get
81     path = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))
82     if version:
83         ver = "version={}".format(version)
84         path = '?'.join([path, ver])
85 
86     with CertFiles(cacert) as cert:
87         lookup_kwargs['verify'] = cert
88         resp = requests.get(path, timeout=30, **lookup_kwargs)
89     raise_for_status(resp)
90     return resp.text
91 
92 
93 conjur_plugin = CredentialPlugin('CyberArk Conjur Secrets Manager Lookup', inputs=conjur_inputs, backend=conjur_backend)
94
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/awx/main/credential_plugins/conjur.py b/awx/main/credential_plugins/conjur.py
--- a/awx/main/credential_plugins/conjur.py
+++ b/awx/main/credential_plugins/conjur.py
@@ -68,7 +68,10 @@
     with CertFiles(cacert) as cert:
         # https://www.conjur.org/api.html#authentication-authenticate-post
         auth_kwargs['verify'] = cert
-        resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)
+        try:
+            resp = requests.post(urljoin(url, '/'.join(['authn', account, username, 'authenticate'])), **auth_kwargs)
+        except requests.exceptions.ConnectionError:
+            resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)
     raise_for_status(resp)
     token = resp.content.decode('utf-8')
 
@@ -78,14 +81,19 @@
     }
 
     # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get
-    path = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))
+    path = urljoin(url, '/'.join(['secrets', account, 'variable', secret_path]))
+    path_conjurcloud = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))
     if version:
         ver = "version={}".format(version)
         path = '?'.join([path, ver])
+        path_conjurcloud = '?'.join([path_conjurcloud, ver])
 
     with CertFiles(cacert) as cert:
         lookup_kwargs['verify'] = cert
-        resp = requests.get(path, timeout=30, **lookup_kwargs)
+        try:
+            resp = requests.get(path, timeout=30, **lookup_kwargs)
+        except requests.exceptions.ConnectionError:
+            resp = requests.get(path_conjurcloud, timeout=30, **lookup_kwargs)
     raise_for_status(resp)
     return resp.text

{"golden_diff": "diff --git a/awx/main/credential_plugins/conjur.py b/awx/main/credential_plugins/conjur.py\n--- a/awx/main/credential_plugins/conjur.py\n+++ b/awx/main/credential_plugins/conjur.py\n@@ -68,7 +68,10 @@\n     with CertFiles(cacert) as cert:\n         # https://www.conjur.org/api.html#authentication-authenticate-post\n         auth_kwargs['verify'] = cert\n-        resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)\n+        try:\n+            resp = requests.post(urljoin(url, '/'.join(['authn', account, username, 'authenticate'])), **auth_kwargs)\n+        except requests.exceptions.ConnectionError:\n+            resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)\n     raise_for_status(resp)\n     token = resp.content.decode('utf-8')\n \n@@ -78,14 +81,19 @@\n     }\n \n     # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get\n-    path = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))\n+    path = urljoin(url, '/'.join(['secrets', account, 'variable', secret_path]))\n+    path_conjurcloud = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))\n     if version:\n         ver = \"version={}\".format(version)\n         path = '?'.join([path, ver])\n+        path_conjurcloud = '?'.join([path_conjurcloud, ver])\n \n     with CertFiles(cacert) as cert:\n         lookup_kwargs['verify'] = cert\n-        resp = requests.get(path, timeout=30, **lookup_kwargs)\n+        try:\n+            resp = requests.get(path, timeout=30, **lookup_kwargs)\n+        except requests.exceptions.ConnectionError:\n+            resp = requests.get(path_conjurcloud, timeout=30, **lookup_kwargs)\n     raise_for_status(resp)\n     return resp.text\n", "issue": "CyberArk Conjur lookup plugin does not work with open source Conjur version\n### Please confirm the following\r\n\r\n- [X] I agree to follow this project's [code of conduct](https://docs.ansible.com/ansible/latest/community/code_of_conduct.html).\r\n- [X] I have checked the [current issues](https://github.com/ansible/awx/issues) for duplicates.\r\n- [X] I understand that AWX is open source software provided for free and that I might not receive a timely response.\r\n\r\n### Bug Summary\r\n\r\nThe CyberArk Conjur Secrets Manager Lookup plugin no longer supports the lookup against the Conjur OSS. Most likely because the opensource conjure version API endpoint does not have the `/api/` portion recently added by this change: https://github.com/ansible/awx/pull/13121\r\n\r\n### AWX version\r\n\r\n2.4\r\n\r\n### Select the relevant components\r\n\r\n- [ ] UI\r\n- [X] API\r\n- [ ] Docs\r\n- [ ] Collection\r\n- [ ] CLI\r\n- [ ] Other\r\n\r\n### Installation method\r\n\r\ndocker development environment\r\n\r\n### Modifications\r\n\r\nno\r\n\r\n### Ansible version\r\n\r\n_No response_\r\n\r\n### Operating system\r\n\r\n_No response_\r\n\r\n### Web browser\r\n\r\n_No response_\r\n\r\n### Steps to reproduce\r\n\r\n1. Deploy Conjur OSS. We use the latest `cyberark/conjur` image for that. The Conjur version is\r\n```\r\n    Version 1.19.1-3398\r\n    API Version 5.3.0 \r\n```\r\n2. Under the AWX, create the CyberArk Conjur Secrets Manager Lookup credential. Provide Conjure URL, user, and token. \r\n3. Click Test and provide a path. \r\n\r\n\r\n### Expected results\r\n\r\nConnection to Conjur should be established. HTTP 200 response. \r\n\r\n### Actual results\r\n\r\n401 error returned. \r\n\r\n```\r\nTraceback (most recent call last):\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/tasks/jobs.py\", line 504, in run\r\n    args = self.build_args(self.instance, private_data_dir, passwords)\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/tasks/jobs.py\", line 937, in build_args\r\n    ssh_username = creds.get_input('username', default='')\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py\", line 275, in get_input\r\n    return self._get_dynamic_input(field_name)\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py\", line 309, in _get_dynamic_input\r\n    return input_source.get_input_value()\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/models/credential/__init__.py\", line 1250, in get_input_value\r\n    return backend(**backend_kwargs)\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/credential_plugins/conjur.py\", line 72, in conjur_backend\r\n    raise_for_status(resp)\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/awx/main/credential_plugins/plugin.py\", line 12, in raise_for_status\r\n    resp.raise_for_status()\r\n  File \"/var/lib/awx/venv/awx/lib64/python3.9/site-packages/requests/models.py\", line 1021, in raise_for_status\r\n    raise HTTPError(http_error_msg, response=self)\r\nrequests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://conjureurl.com/api/authn/test/admin/authenticate\r\n```\r\n\r\n### Additional information\r\n\r\n_No response_\n", "before_files": [{"content": "from .plugin import CredentialPlugin, CertFiles, raise_for_status\n\nfrom urllib.parse import urljoin, quote\n\nfrom django.utils.translation import gettext_lazy as _\nimport requests\n\n\nconjur_inputs = {\n    'fields': [\n        {\n            'id': 'url',\n            'label': _('Conjur URL'),\n            'type': 'string',\n            'format': 'url',\n        },\n        {\n            'id': 'api_key',\n            'label': _('API Key'),\n            'type': 'string',\n            'secret': True,\n        },\n        {\n            'id': 'account',\n            'label': _('Account'),\n            'type': 'string',\n        },\n        {\n            'id': 'username',\n            'label': _('Username'),\n            'type': 'string',\n        },\n        {'id': 'cacert', 'label': _('Public Key Certificate'), 'type': 'string', 'multiline': True},\n    ],\n    'metadata': [\n        {\n            'id': 'secret_path',\n            'label': _('Secret Identifier'),\n            'type': 'string',\n            'help_text': _('The identifier for the secret e.g., /some/identifier'),\n        },\n        {\n            'id': 'secret_version',\n            'label': _('Secret Version'),\n            'type': 'string',\n            'help_text': _('Used to specify a specific secret version (if left empty, the latest version will be used).'),\n        },\n    ],\n    'required': ['url', 'api_key', 'account', 'username'],\n}\n\n\ndef conjur_backend(**kwargs):\n    url = kwargs['url']\n    api_key = kwargs['api_key']\n    account = quote(kwargs['account'], safe='')\n    username = quote(kwargs['username'], safe='')\n    secret_path = quote(kwargs['secret_path'], safe='')\n    version = kwargs.get('secret_version')\n    cacert = kwargs.get('cacert', None)\n\n    auth_kwargs = {\n        'headers': {'Content-Type': 'text/plain', 'Accept-Encoding': 'base64'},\n        'data': api_key,\n        'allow_redirects': False,\n    }\n\n    with CertFiles(cacert) as cert:\n        # https://www.conjur.org/api.html#authentication-authenticate-post\n        auth_kwargs['verify'] = cert\n        resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)\n    raise_for_status(resp)\n    token = resp.content.decode('utf-8')\n\n    lookup_kwargs = {\n        'headers': {'Authorization': 'Token token=\"{}\"'.format(token)},\n        'allow_redirects': False,\n    }\n\n    # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get\n    path = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))\n    if version:\n        ver = \"version={}\".format(version)\n        path = '?'.join([path, ver])\n\n    with CertFiles(cacert) as cert:\n        lookup_kwargs['verify'] = cert\n        resp = requests.get(path, timeout=30, **lookup_kwargs)\n    raise_for_status(resp)\n    return resp.text\n\n\nconjur_plugin = CredentialPlugin('CyberArk Conjur Secrets Manager Lookup', inputs=conjur_inputs, backend=conjur_backend)\n", "path": "awx/main/credential_plugins/conjur.py"}], "after_files": [{"content": "from .plugin import CredentialPlugin, CertFiles, raise_for_status\n\nfrom urllib.parse import urljoin, quote\n\nfrom django.utils.translation import gettext_lazy as _\nimport requests\n\n\nconjur_inputs = {\n    'fields': [\n        {\n            'id': 'url',\n            'label': _('Conjur URL'),\n            'type': 'string',\n            'format': 'url',\n        },\n        {\n            'id': 'api_key',\n            'label': _('API Key'),\n            'type': 'string',\n            'secret': True,\n        },\n        {\n            'id': 'account',\n            'label': _('Account'),\n            'type': 'string',\n        },\n        {\n            'id': 'username',\n            'label': _('Username'),\n            'type': 'string',\n        },\n        {'id': 'cacert', 'label': _('Public Key Certificate'), 'type': 'string', 'multiline': True},\n    ],\n    'metadata': [\n        {\n            'id': 'secret_path',\n            'label': _('Secret Identifier'),\n            'type': 'string',\n            'help_text': _('The identifier for the secret e.g., /some/identifier'),\n        },\n        {\n            'id': 'secret_version',\n            'label': _('Secret Version'),\n            'type': 'string',\n            'help_text': _('Used to specify a specific secret version (if left empty, the latest version will be used).'),\n        },\n    ],\n    'required': ['url', 'api_key', 'account', 'username'],\n}\n\n\ndef conjur_backend(**kwargs):\n    url = kwargs['url']\n    api_key = kwargs['api_key']\n    account = quote(kwargs['account'], safe='')\n    username = quote(kwargs['username'], safe='')\n    secret_path = quote(kwargs['secret_path'], safe='')\n    version = kwargs.get('secret_version')\n    cacert = kwargs.get('cacert', None)\n\n    auth_kwargs = {\n        'headers': {'Content-Type': 'text/plain', 'Accept-Encoding': 'base64'},\n        'data': api_key,\n        'allow_redirects': False,\n    }\n\n    with CertFiles(cacert) as cert:\n        # https://www.conjur.org/api.html#authentication-authenticate-post\n        auth_kwargs['verify'] = cert\n        try:\n            resp = requests.post(urljoin(url, '/'.join(['authn', account, username, 'authenticate'])), **auth_kwargs)\n        except requests.exceptions.ConnectionError:\n            resp = requests.post(urljoin(url, '/'.join(['api', 'authn', account, username, 'authenticate'])), **auth_kwargs)\n    raise_for_status(resp)\n    token = resp.content.decode('utf-8')\n\n    lookup_kwargs = {\n        'headers': {'Authorization': 'Token token=\"{}\"'.format(token)},\n        'allow_redirects': False,\n    }\n\n    # https://www.conjur.org/api.html#secrets-retrieve-a-secret-get\n    path = urljoin(url, '/'.join(['secrets', account, 'variable', secret_path]))\n    path_conjurcloud = urljoin(url, '/'.join(['api', 'secrets', account, 'variable', secret_path]))\n    if version:\n        ver = \"version={}\".format(version)\n        path = '?'.join([path, ver])\n        path_conjurcloud = '?'.join([path_conjurcloud, ver])\n\n    with CertFiles(cacert) as cert:\n        lookup_kwargs['verify'] = cert\n        try:\n            resp = requests.get(path, timeout=30, **lookup_kwargs)\n        except requests.exceptions.ConnectionError:\n            resp = requests.get(path_conjurcloud, timeout=30, **lookup_kwargs)\n    raise_for_status(resp)\n    return resp.text\n\n\nconjur_plugin = CredentialPlugin('CyberArk Conjur Secrets Manager Lookup', inputs=conjur_inputs, backend=conjur_backend)\n", "path": "awx/main/credential_plugins/conjur.py"}]}