
    Vha                     .   d dl mZmZmZ eZdZdZdZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d Z G d d ee	j8                  e            Z G d de      Z G d de      Z  G d de      Z! G d de      Z"y)    )absolute_importdivisionprint_functionai  
name: onepassword
author:
  - Scott Buchanan (@scottsb)
  - Andrew Zenk (@azenk)
  - Sam Doran (@samdoran)
short_description: Fetch field values from 1Password
description:
  - P(community.general.onepassword#lookup) wraps the C(op) command line utility to fetch specific field values from 1Password.
requirements:
  - C(op) 1Password command line utility
options:
  _terms:
    description: Identifier(s) (case-insensitive UUID or name) of item(s) to retrieve.
    required: true
    type: list
    elements: string
  account_id:
    version_added: 7.5.0
  domain:
    version_added: 3.2.0
  field:
    description: Field to return from each matching item (case-insensitive).
    default: 'password'
    type: str
  service_account_token:
    version_added: 7.1.0
extends_documentation_fragment:
  - community.general.onepassword
  - community.general.onepassword.lookup
a  
---
# These examples only work when already signed in to 1Password
- name: Retrieve password for KITT when already signed in to 1Password
  ansible.builtin.debug:
    var: lookup('community.general.onepassword', 'KITT')

- name: Retrieve password for Wintermute when already signed in to 1Password
  ansible.builtin.debug:
    var: lookup('community.general.onepassword', 'Tessier-Ashpool', section='Wintermute')

- name: Retrieve username for HAL when already signed in to 1Password
  ansible.builtin.debug:
    var: lookup('community.general.onepassword', 'HAL 9000', field='username', vault='Discovery')

- name: Retrieve password for HAL when not signed in to 1Password
  ansible.builtin.debug:
    var: lookup('community.general.onepassword', 'HAL 9000', subdomain='Discovery', master_password=vault_master_password)

- name: Retrieve password for HAL when never signed in to 1Password
  ansible.builtin.debug:
    var: >-
      lookup('community.general.onepassword', 'HAL 9000', subdomain='Discovery', master_password=vault_master_password,
             username='tweety@acme.com', secret_key=vault_secret_key)

- name: Retrieve password from specific account
  ansible.builtin.debug:
    var: lookup('community.general.onepassword', 'HAL 9000', account_id='abc123')
zI
_raw:
  description: Field data requested.
  type: list
  elements: str
N)
LookupBase)AnsibleLookupErrorAnsibleOptionsError)get_bin_path)to_bytesto_text)with_metaclass)OnePasswordConfigc                 F    	 | j                         S # t        $ r | cY S w xY w)z?Return the lower case version value, otherwise return the value)lowerAttributeError)values    p/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/general/plugins/lookup/onepassword.py_lower_if_possibler   ^   s'    {{} s      c                      e Zd ZdZ	 	 	 	 	 	 	 	 	 ddZd Zej                  d        ZddZ	ej                  d        Z
ej                  d        Zej                  dd	       Zej                  d
        Zed        Zed        Zed        Zy)OnePassCLIBaseopNc
                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d | _	        d | _
        y N)	subdomaindomainusernamemaster_password
secret_keyservice_account_token
account_idconnect_hostconnect_token_path_version)
selfr   r   r   r   r   r   r   r    r!   s
             r   __init__zOnePassCLIBase.__init__i   sU     # .$%:"$(*
    c                    |D ci c]  }t        | |d       s|t        | |       }}t        |      j                  |      }|r<d}d}ddj                  |       d}t	        |      dkD  rd}| | | }t        |      y c c}w )Nz:Unable to sign in to 1Password. Missing required parameter z: z, .   s)getattrset
differencejoinlenr   )	r$   required_paramsparamnon_empty_attrsmissingprefixpluralsuffixmsgs	            r   _check_required_paramsz%OnePassCLIBase._check_required_params   s    DSr5W^_cejlpWq5'$"66rro&11/BQFF$))G,-Q/F7|aHVHVH-C$S))  ss
   BBc                      y)zCMain method for parsing data returned from the op command line toolN )r$   	data_json
field_namesection_titles       r   _parse_fieldzOnePassCLIBase._parse_field       r&   c                    | j                   g|z   }t        j                  t        j                  t        j                  d}|r4t        j                  j                         }|j                  |       ||d<   t        j                  |fi |}	|	j                  |      \  }
}|	j                         }|s||k7  rt        t        |            ||
|fS )N)stdoutstderrstdinenv)input)path
subprocessPIPEosenvironcopyupdatePopencommunicatewaitr   str)r$   argsexpected_rccommand_inputignore_errorsenvironment_updatecommandcall_kwargsrE   pouterrrcs                r   _runzOnePassCLIBase._run   s    99+$ oo oo__
 **//#CJJ)*!$KW44==}=5SVVX{!2$SX..3|r&   c                      y)z$Check whether a login session existsNr;   r$   s    r   assert_logged_inzOnePassCLIBase.assert_logged_in   r@   r&   c                      y)zPerforma full loginNr;   r_   s    r   full_signinzOnePassCLIBase.full_signin   r@   r&   c                      y)z&Gets the specified item from the vaultNr;   )r$   item_idvaulttokens       r   get_rawzOnePassCLIBase.get_raw   r@   r&   c                      y)z!Sign in using the master passwordNr;   r_   s    r   signinzOnePassCLIBase.signin   r@   r&   c                 f    | j                   t        | j                        | _         | j                   S r   )r"   r	   binr_   s    r   rG   zOnePassCLIBase.path   s&    ::%dhh/DJzzr&   c                 \    | j                   | j                         | _         | j                   S r   )r#   get_current_versionr_   s    r   versionzOnePassCLIBase.version   s&    ==  446DM}}r&   c                 N   	 t        | j                        }	 t	        j
                  |dgt        j                        }t        |      j                         S # t        $ r t        d| j                   d      w xY w# t        j                  $ r}t        d|       d}~ww xY w)z~Standalone method to get the op CLI version. Useful when determining which class to load
        based on the current version.zUnable to locate 'z' command line toolz	--version)rC   zUnable to get the op version: N)
r	   rk   
ValueErrorr   rH   check_outputrI   CalledProcessErrorr   strip)clsbin_pathb_outcpes       r   rm   z"OnePassCLIBase.get_current_version   s    	X#CGG,H	M++X{,CJOO\E u~##%%  	X$'9#''BU%VWW	X
 ,, 	M$'EcU%KLL	Ms"   A 'A> #A;>B$BB$)	N1password.comNNNNNNN)r   NFNNN)__name__
__module____qualname__rk   r%   r9   abcabstractmethodr?   r]   r`   rb   rg   ri   propertyrG   rn   classmethodrm   r;   r&   r   r   r   f   s    
C "2* 	R R, 	3 3 	" " 	5 5 	0 0     & &r&   r   c                   0    e Zd ZdZd Zd Zd ZddZd Zy)	OnePassCLIv11c                 L   t        j                  |      }|n||d   v r|d   |   S |d   j                  dg       D ]G  }|j                  dd      j                         |j                         k(  s5|j                  dd      c S  |d   j                  dg       D ]  }|%|j                         |d   j                         k7  r*|j                  dg       D ]I  }|j                  dd      j                         |j                         k(  s5|j                  d	d      c c S   y)
a  
        Retrieves the desired field from the `op` response payload

        When the item is a `password` type, the password is a key within the `details` key:

        $ op get item 'test item' | jq
        {
          [...]
          "templateUuid": "005",
          "details": {
            "notesPlain": "",
            "password": "foobar",
            "passwordHistory": [],
            "sections": [
              {
                "name": "linked items",
                "title": "Related Items"
              }
            ]
          },
          [...]
        }

        However, when the item is a `login` type, the password is within a fields array:

        $ op get item 'test item' | jq
        {
          [...]
          "details": {
            "fields": [
              {
                "designation": "username",
                "name": "username",
                "type": "T",
                "value": "foo"
              },
              {
                "designation": "password",
                "name": "password",
                "type": "P",
                "value": "bar"
              }
            ],
            [...]
          },
          [...]
        detailsfieldsnamer(   r   sectionstitletv)jsonloadsgetr   )r$   r<   r=   r>   data
field_datasection_datas          r   r?   zOnePassCLIv1._parse_field   s/   ` zz)$ 
 T)_,Iz22 #9o11(B? 7
>>&"-3359I9I9KK%>>'2667 !O//
B? 	3L(]-@-@-BlSZF[FaFaFc-c*..x< 3
>>#r*002j6F6F6HH%>>#r223		3 r&   c                    ddg}| j                   r|j                  d| j                   g       n:| j                  r.| j                   d| j                   }|j                  d|g       | j	                  |d      \  }}}t        |       S )Nr   account	--accountr)   TrU   )r   extendr   r   r]   bool)r$   rR   r   r\   rZ   r[   s         r   r`   zOnePassCLIv1.assert_logged_in#  s}    y!??KKdoo67^^($++7GKKg./yyTy:C8|r&   c                 x   | j                   s| j                  rt        d      | j                  rt        d      g d}| j	                  |       d| j
                   d| j                   t        | j                        t        | j                        dg}| j                  |t        | j                              S )Nz_1Password Connect is not available with 1Password CLI version 1. Please use version 2 or later.zY1Password CLI version 1 does not support Service Accounts. Please use version 2 or later.r   r   r   r   ri   r)   --rawrT   )r    r!   r   r   r9   r   r   r
   r   r   r]   r   )r$   r1   rR   s      r   rb   zOnePassCLIv1.full_signin/  s     2 2$qs s %%$km m
 	##O4 ~~a}-T]]#T__%
 yyXd6J6J-KyLLr&   Nc                     dd|g}| j                   r|j                  d| j                   g       |	|d| gz  }||t        d      |z   gz  }| j                  |      S )Nr   itemr   --vault=
--session=)r   r   r
   r]   r$   rd   re   rf   rR   s        r   rg   zOnePassCLIv1.get_rawJ  so    vw'??KKdoo67xw'((DXl+e344Dyyr&   c                     | j                  dg       ddg}| j                  r|j                  | j                         | j                  |t	        | j
                              S )Nr   ri   r   r   )r9   r   appendr]   r
   r   r$   rR   s     r   ri   zOnePassCLIv1.signinX  sS    ##%6$78'">>KK'yyXd6J6J-KyLLr&   ry   )	rz   r{   r|   supports_versionr?   r`   rb   rg   ri   r;   r&   r   r   r      s%    FP
M6Mr&   r   c                   >    e Zd ZdZdZd
dZd Zd ZddZddZ	d	 Z
y)OnePassCLIv2zm
    CLIv2 Syntax Reference: https://developer.1password.com/docs/cli/upgrade#step-2-update-your-scripts
    2Nc                     t        j                  |      }t        |      }|j                  dg       D ]X  }||j                  |      r|j                  |      c S |j                  dd      j	                         |k(  r|j                  dd      c S |j                  dd      j	                         |k(  r|j                  dd      c S |j                  di       }t        |      }|j                  d|j                  dd            j	                         }||k(  s|j                  dd      j	                         |k(  r|j                  dd      c S |j                  dd      j	                         |k(  sG|j                  dd      c S  y)a  
        Schema reference: https://developer.1password.com/docs/cli/item-template-json

        Example Data:

            # Password item
            {
              "id": "ywvdbojsguzgrgnokmcxtydgdv",
              "title": "Authy Backup",
              "version": 1,
              "vault": {
                "id": "bcqxysvcnejjrwzoqrwzcqjqxc",
                "name": "Personal"
              },
              "category": "PASSWORD",
              "last_edited_by": "7FUPZ8ZNE02KSHMAIMKHIVUE17",
              "created_at": "2015-01-18T13:13:38Z",
              "updated_at": "2016-02-20T16:23:54Z",
              "additional_information": "Jan 18, 2015, 08:13:38",
              "fields": [
                {
                  "id": "password",
                  "type": "CONCEALED",
                  "purpose": "PASSWORD",
                  "label": "password",
                  "value": "OctoberPoppyNuttyDraperySabbath",
                  "reference": "op://Personal/Authy Backup/password",
                  "password_details": {
                    "strength": "FANTASTIC"
                  }
                },
                {
                  "id": "notesPlain",
                  "type": "STRING",
                  "purpose": "NOTES",
                  "label": "notesPlain",
                  "value": "Backup password to restore Authy",
                  "reference": "op://Personal/Authy Backup/notesPlain"
                }
              ]
            }

            # Login item
            {
              "id": "awk4s2u44fhnrgppszcsvc663i",
              "title": "Dummy Login",
              "version": 2,
              "vault": {
                "id": "stpebbaccrq72xulgouxsk4p7y",
                "name": "Personal"
              },
              "category": "LOGIN",
              "last_edited_by": "LSGPJERUYBH7BFPHMZ2KKGL6AU",
              "created_at": "2018-04-25T21:55:19Z",
              "updated_at": "2018-04-25T21:56:06Z",
              "additional_information": "agent.smith",
              "urls": [
                {
                  "primary": true,
                  "href": "https://acme.com"
                }
              ],
              "sections": [
                {
                  "id": "linked items",
                  "label": "Related Items"
                }
              ],
              "fields": [
                {
                  "id": "username",
                  "type": "STRING",
                  "purpose": "USERNAME",
                  "label": "username",
                  "value": "agent.smith",
                  "reference": "op://Personal/Dummy Login/username"
                },
                {
                  "id": "password",
                  "type": "CONCEALED",
                  "purpose": "PASSWORD",
                  "label": "password",
                  "value": "Q7vFwTJcqwxKmTU]Dzx7NW*wrNPXmj",
                  "entropy": 159.6083697084228,
                  "reference": "op://Personal/Dummy Login/password",
                  "password_details": {
                    "entropy": 159,
                    "generated": true,
                    "strength": "FANTASTIC"
                  }
                },
                {
                  "id": "notesPlain",
                  "type": "STRING",
                  "purpose": "NOTES",
                  "label": "notesPlain",
                  "reference": "op://Personal/Dummy Login/notesPlain"
                }
              ]
            }
        r   labelr(   r   idsection)r   r   r   r   r   )r$   r<   r=   r>   r   fieldr   current_section_titles           r   r?   zOnePassCLIv2._parse_fieldh  s]   L zz)$'
3
XXh+ 	2E$99Z( 99Z00 99Wb)//1Z? 99Wb1199T2&,,.*< 99Wb11
 ii	2.G.}=M$+KKT29N$O$U$U$W! 5599Wb)//1Z? 99Wb1199T2&,,.*< 99Wb117	2: r&   c                 v   | j                   r| j                  ry| j                  r4dg}d| j                  i}| j                  ||      \  }}}t	        |       S ddg}| j
                  r.| j
                   d| j                   }|j                  d|g       | j                  |      \  }}}|rdd	g}| j                  r|j                  d| j                  g       n:| j
                  r.| j
                   d| j                   }|j                  d|g       | j                  |d
      \  }}}t	        |       S y)NTwhoamiOP_SERVICE_ACCOUNT_TOKENrV   r   listr)   r   r   r   F)	r    r!   r   r]   r   r   r   r   r   )r$   rR   rV   r\   rZ   r[   r   s          r   r`   zOnePassCLIv2.assert_logged_in  s-   !3!3%%:D"<d>X>X!Y99T>P9QLBSBx<6">>($++7GKKg./yyC u%D[$//:;!^^,Adkk];['2399T9>LBSBx<r&   c           	         g d}| j                  |       dddd| j                   d| j                   dt        | j                        dg}d	| j
                  i}| j                  |t        | j                        |
      S )Nr   r   addr   z	--addressr)   z--emailz--signinOP_SECRET_KEY)rT   rV   )r9   r   r   r
   r   r   r]   r   )r$   r1   rR   rV   s       r   rb   zOnePassCLIv2.full_signin  s    
 	##O4 ugDNN+1T[[M:x.	
 .t?yyXd6J6J-K`ryssr&   c                    | j                   r|j                  d| j                   g       |	|d| gz  }| j                  rE| j                  r9|t	        d      | j                  | j                  d}| j                  ||      S | j                  r.|t	        d      d| j                  i}| j                  ||      S ||t        d      |z   gz  }| j                  |      S )	Nr   r   z*'vault' is required with 1Password Connect)OP_CONNECT_HOSTOP_CONNECT_TOKENr   z0'vault' is required with 'service_account_token'r   r   )r   r   r    r!   r   r]   r   r
   )r$   rR   re   rf   rV   s        r   _add_parameters_and_runz$OnePassCLIv2._add_parameters_and_run%  s    ??KKdoo67xw'((D!3!3}()UVV#'#4#4$($6$6" 99T6H9II%%}()[\\"<d>X>X!Y99T6H9IIXl+e344Dyyr&   c                 8    dd|ddg}| j                  |||      S )Nr   r   z--formatr   )re   rf   )r   r   s        r   rg   zOnePassCLIv2.get_raw@  s*    w
F;++DU+KKr&   c                     | j                  dg       ddg}| j                  r|j                  d| j                  g       | j                  |t	        | j
                              S )Nr   ri   r   r   r   )r9   r   r   r]   r
   r   r   s     r   ri   zOnePassCLIv2.signinD  sX    ##%6$78'">>KKdnn56yyXd6J6J-KyLLr&   r   ry   )rz   r{   r|   __doc__r   r?   r`   rb   r   rg   ri   r;   r&   r   r   r   b  s3     EN!Ft&6LMr&   r   c                   <    e Zd Z	 	 ddZd	dZd Zd Zd	dZd
dZy)OnePassNc                 d   || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d| _	        d | _
        t               | _        | j                  |
      | _        | j                  s| j                  r&d | j                  | j                  fv rt        d      y y )NFz4connect_host and connect_token are required together)r   r   r   r   r   r   r   r    r!   	logged_inrf   r   _config_get_cli_class_clir   )r$   r   r   r   r   r   r   r   r    r!   	cli_classs              r   r%   zOnePass.__init__O  s    " $.%:"$(*
(*''	2	!3!3$BSBSUYUgUgAh9h%&\]] :i!3r&   c                 d   |I || j                   | j                  | j                  | j                  | j                  | j
                        S t        j                         }t        j                         D ]  }|j                  |j                  d      d   k(  s%	  || j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  	      c S  t        d| d      # t        $ r}t        |      d }~ww xY w)Nr)   r   zop version z is unsupported)r   r   r   r   r   r   r   rm   __subclasses__r   splitr   r    r!   	TypeErrorr   )r$   r   rn   rt   es        r   r   zOnePass._get_cli_classd  s    T^^T[[$--Z^ZnZnpt  qK  qK  L  L 446!002 	0C##w}}S'9!'<<0t~~t{{DMM4??\`\p\prv  sM  sM#0A0A4CUCUW W	0 !;wi!GHH ! 0,Q//0s   A)D	D/D**D/c                    | j                   j                  rht        j                  j	                  | j                   j                        r5	 | j
                  j                         \  }}}|j                         | _        y | j
                  j                         \  }}}|j                         | _        y # t        $ r?d}t        fd|D              r | j
                  j                         \  }}}Y d d ww xY w)N)zmissing required parametersunauthorizedc              3   V   K   | ]   }|j                   j                         v  " y wr   )messager   ).0stringexcs     r   	<genexpr>z$OnePass.set_token.<locals>.<genexpr>}  s#     Pv!2!2!44Ps   &))r   config_file_pathrJ   rG   isfiler   ri   r   anyrb   rs   rf   )r$   r\   rZ   r[   test_stringsr   s        @r   	set_tokenzOnePass.set_tokens  s    <<((RWW^^DLL<Y<Y-Z7#yy//1C DJ  99002LBSDJ# & 
7  P<PP #yy446C
7s   B4 4	C<=5C77C<c                 l    | j                   j                         }|r|| _        y | j                          y r   )r   r`   r   r   )r$   r   s     r   r`   zOnePass.assert_logged_in  s+    II..0	&DNNNr&   c                 \    | j                   j                  ||| j                        \  }}}|S r   )r   rg   rf   )r$   rd   re   r\   rZ   r[   s         r   rg   zOnePass.get_raw  s)    yy((%DC
r&   c                 f    | j                  ||      }|r| j                  j                  |||      S y)Nr(   )rg   r   r?   )r$   rd   r   r   re   outputs         r   	get_fieldzOnePass.get_field  s1    gu-99))&%AAr&   )
Nrx   NNNNNNNNr   ry   )	rz   r{   r|   r%   r   r   r`   rg   r   r;   r&   r   r   r   N  s(    osos^*I%0r&   r   c                       e Zd ZddZy)LookupModuleNc                 d   | j                  ||       | j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }| j                  d      }	| j                  d      }
| j                  d	      }| j                  d
      }| j                  d      }| j                  d      }| j                  d      }t        |||	|
|||||	      }|j                          g }|D ]%  }|j	                  |j                  ||||             ' |S )N)var_optionsdirectr   r   re   r   r   r   r   r   r   r   r    r!   )	r   r   r   r   r   r   r   r    r!   )set_options
get_optionr   r`   r   r   )r$   terms	variableskwargsr   r   re   r   r   r   r   r   r   r   r    r!   r   valuesterms                      r   runzLookupModule.run  s+   Yv>(//),(OOK0	*??:.__\2
//*;< $0G H__\2
~68!+"7!%'

 	 	EDMM",,tUGUCD	E r&   r   )rz   r{   r|   r   r;   r&   r   r   r     s    !r&   r   )#
__future__r   r   r   type__metaclass__DOCUMENTATIONEXAMPLESRETURNr}   rJ   r   rH   ansible.plugins.lookupr   ansible.errorsr   r   #ansible.module_utils.common.processr	   +ansible.module_utils.common.text.convertersr
   r   ansible.module_utils.sixr   Fansible_collections.community.general.plugins.module_utils.onepasswordr   r   ABCMetaobjectr   r   r   r   r   r;   r&   r   <module>r      s    C B@<
  	   - B < I 3 do&^CKK8 o&dGM> GMTiM> iMXNf Nb#: #r&   