From 7ed7d374e43819282b21a20048eff768d8a0a018 Mon Sep 17 00:00:00 2001 From: Olivier Scherler Date: Fri, 28 Jun 2019 18:37:14 +0200 Subject: [PATCH] Fix onepassword lookup plugin and onepassword_facts module when a field has no name. (#58308) * Fix onepassword lookup plugin crashing on fields with no 'name' or 't' property. * Fix onepassword_facts module crashing on fields with no 'name' or 't' property. * Add unit test for onepassword lookup plugin failing on entries without a name. * Add changelog fragment for onepassword lookup plugin and onepassword_facts module fixes on fields without a name. --- .../fix_onepassword_failing_on_field_with_no_name.yaml | 3 +++ lib/ansible/modules/identity/onepassword_facts.py | 4 ++-- lib/ansible/plugins/lookup/onepassword.py | 4 ++-- test/units/plugins/lookup/test_onepassword.py | 7 ++++--- 4 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 changelogs/fragments/fix_onepassword_failing_on_field_with_no_name.yaml diff --git a/changelogs/fragments/fix_onepassword_failing_on_field_with_no_name.yaml b/changelogs/fragments/fix_onepassword_failing_on_field_with_no_name.yaml new file mode 100644 index 00000000000..9106f914bf3 --- /dev/null +++ b/changelogs/fragments/fix_onepassword_failing_on_field_with_no_name.yaml @@ -0,0 +1,3 @@ +bugfixes: + - onepassword - fix onepassword lookup plugin failing on fields without a name or t property (https://github.com/ansible/ansible/pull/58308) + - onepassword_facts - fix onepassword_facts module failing on fields without a name or t property (https://github.com/ansible/ansible/pull/58308) diff --git a/lib/ansible/modules/identity/onepassword_facts.py b/lib/ansible/modules/identity/onepassword_facts.py index 3ed91d4bd35..61f69485da2 100644 --- a/lib/ansible/modules/identity/onepassword_facts.py +++ b/lib/ansible/modules/identity/onepassword_facts.py @@ -206,7 +206,7 @@ class OnePasswordFacts(object): else: if section_title is None: for field_data in data['details'].get('fields', []): - if field_data.get('name').lower() == field_name.lower(): + if field_data.get('name', '').lower() == field_name.lower(): return {field_name: field_data.get('value', '')} # Not found it yet, so now lets see if there are any sections defined @@ -216,7 +216,7 @@ class OnePasswordFacts(object): if section_title is not None and section_title.lower() != section_data['title'].lower(): continue for field_data in section_data.get('fields', []): - if field_data.get('t').lower() == field_name.lower(): + if field_data.get('t', '').lower() == field_name.lower(): return {field_name: field_data.get('v', '')} # We will get here if the field could not be found in any section and the item wasn't a document to be downloaded. diff --git a/lib/ansible/plugins/lookup/onepassword.py b/lib/ansible/plugins/lookup/onepassword.py index 5162464f4ac..e927d794d93 100644 --- a/lib/ansible/plugins/lookup/onepassword.py +++ b/lib/ansible/plugins/lookup/onepassword.py @@ -203,13 +203,13 @@ class OnePass(object): data = json.loads(data_json) if section_title is None: for field_data in data['details'].get('fields', []): - if field_data.get('name').lower() == field_name.lower(): + if field_data.get('name', '').lower() == field_name.lower(): return field_data.get('value', '') for section_data in data['details'].get('sections', []): if section_title is not None and section_title.lower() != section_data['title'].lower(): continue for field_data in section_data.get('fields', []): - if field_data.get('t').lower() == field_name.lower(): + if field_data.get('t', '').lower() == field_name.lower(): return field_data.get('v', '') return '' diff --git a/test/units/plugins/lookup/test_onepassword.py b/test/units/plugins/lookup/test_onepassword.py index 5db40fb78fa..dee53b1b011 100644 --- a/test/units/plugins/lookup/test_onepassword.py +++ b/test/units/plugins/lookup/test_onepassword.py @@ -95,7 +95,8 @@ MOCK_ENTRIES = [ { 'name': 'password', 'value': 'vauxhall' - } + }, + {}, ] } } @@ -105,8 +106,8 @@ MOCK_ENTRIES = [ def get_mock_query_generator(require_field=None): def _process_field(field, section_title=None): - field_name = field.get('name', field.get('t')) - field_value = field.get('value', field.get('v')) + field_name = field.get('name', field.get('t', '')) + field_value = field.get('value', field.get('v', '')) if require_field is None or field_name == require_field: return entry, query, section_title, field_name, field_value