mirror of
https://github.com/ansible-collections/community.general.git
synced 2024-09-14 20:13:21 +02:00
bitwarden lookup fix get_field
(#7061)
* bitwarden lookup rewrite `get_field` * add changelog fragment * PEP8 add newline * Update changelogs/fragments/7061-fix-bitwarden-get_field.yml Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/lookup/bitwarden.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/lookup/bitwarden.py Co-authored-by: Felix Fontein <felix@fontein.de> * Update plugins/lookup/bitwarden.py Co-authored-by: Felix Fontein <felix@fontein.de> --------- Co-authored-by: Simon <simonleary@umass.edu> Co-authored-by: Felix Fontein <felix@fontein.de>
This commit is contained in:
parent
e7a6412ec4
commit
e75dc74613
2 changed files with 23 additions and 12 deletions
2
changelogs/fragments/7061-fix-bitwarden-get_field.yml
Normal file
2
changelogs/fragments/7061-fix-bitwarden-get_field.yml
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
bugfixes:
|
||||||
|
- bitwarden lookup plugin - the plugin made assumptions about the structure of a Bitwarden JSON object which may have been broken by an update in the Bitwarden API. Remove assumptions, and allow queries for general fields such as ``notes`` (https://github.com/ansible-collections/community.general/pull/7061).
|
|
@ -132,20 +132,29 @@ class Bitwarden(object):
|
||||||
If field is None, return the whole record for each match.
|
If field is None, return the whole record for each match.
|
||||||
"""
|
"""
|
||||||
matches = self._get_matches(search_value, search_field, collection_id)
|
matches = self._get_matches(search_value, search_field, collection_id)
|
||||||
|
if not field:
|
||||||
if field in ['autofillOnPageLoad', 'password', 'passwordRevisionDate', 'totp', 'uris', 'username']:
|
|
||||||
return [match['login'][field] for match in matches]
|
|
||||||
elif not field:
|
|
||||||
return matches
|
return matches
|
||||||
else:
|
field_matches = []
|
||||||
custom_field_matches = []
|
for match in matches:
|
||||||
for match in matches:
|
# if there are no custom fields, then `match` has no key 'fields'
|
||||||
|
if 'fields' in match:
|
||||||
|
custom_field_found = False
|
||||||
for custom_field in match['fields']:
|
for custom_field in match['fields']:
|
||||||
if custom_field['name'] == field:
|
if field == custom_field['name']:
|
||||||
custom_field_matches.append(custom_field['value'])
|
field_matches.append(custom_field['value'])
|
||||||
if matches and not custom_field_matches:
|
custom_field_found = True
|
||||||
raise AnsibleError("Custom field {field} does not exist in {search_value}".format(field=field, search_value=search_value))
|
break
|
||||||
return custom_field_matches
|
if custom_field_found:
|
||||||
|
continue
|
||||||
|
if 'login' in match and field in match['login']:
|
||||||
|
field_matches.append(match['login'][field])
|
||||||
|
continue
|
||||||
|
if field in match:
|
||||||
|
field_matches.append(match[field])
|
||||||
|
continue
|
||||||
|
if matches and not field_matches:
|
||||||
|
raise AnsibleError("field {field} does not exist in {search_value}".format(field=field, search_value=search_value))
|
||||||
|
return field_matches
|
||||||
|
|
||||||
|
|
||||||
class LookupModule(LookupBase):
|
class LookupModule(LookupBase):
|
||||||
|
|
Loading…
Reference in a new issue