Ë
    M/Åe¢y  ã                   ód  — d Z ddlZddlZddlmZ ddlmZ ddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlZddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlm Z  ddlm!Z!  ejD                  e#«      Z$dZ% G d„ d«      Z& G d„ d«      Z'y)zACME client API.é    N)Úparsedate_tz)ÚAny)Úcast)ÚList)ÚMapping)ÚOptional)ÚSet)ÚTuple)ÚUnion)ÚHTTPAdapter)Úparse_header_links)Ú
challenges)Úcrypto_util)Úerrors)Újws)Úmessagesé-   c            
       ót  — e Zd ZdZdej
                  ddddfd„Zdej                  dej                  fd	„Z	d
ej                  dej                  fd„Z
	 d7d
ej                  deej                     dej                  fd„Zd8d
ej                  dedej                  fd„Zdedej"                  fd„Zdej&                  deej&                  ej,                  f   fd„Z	 d7dej"                  deej0                     dej"                  fd„Zdej"                  dej0                  dej"                  fd„Zdej"                  dej"                  fd„Z	 d8dej"                  dej0                  dedej"                  fd„Z	 d8dej"                  dej0                  dedej"                  fd„Zdej>                  de ddfd„Z!defd„Z"d e#d!e#dej,                  fd"„Z$d#ej,                  d$e%de&e%   fd%„Z'e(d&e%dddej
                  fd'„«       Z)e(	 	 d9d#ej,                  d(ee%   d)ee%   dej                  fd*„«       Z*d
ej                  d+ej                  dej                  fd,„Z+d e#d!e#dej,                  fd-„Z,d
ej                  dej                  fd.„Z-dej&                  dej&                  fd/„Z.	 	 d9d#ej,                  d0eej^                     d(ee%   dej&                  fd1„Z0d2ejb                  d#e2jf                  dejh                  fd3„Z5e(d#ej,                  d4e dej0                  fd5„«       Z6dej>                  de d&e%ddfd6„Z7y):ÚClientV2zuACME client for a v2 API.

    :ivar messages.Directory directory:
    :ivar .ClientNetwork net: Client network.
    Ú	directoryÚnetÚClientNetworkÚreturnNc                 ó    — || _         || _        y)z‰Initialize.

        :param .messages.Directory directory: Directory Resource
        :param .ClientNetwork net: Client network.
        N)r   r   )Úselfr   r   s      ú-/usr/lib/python3/dist-packages/acme/client.pyÚ__init__zClientV2.__init__*   s   € ð #ˆŒØˆ�ó    Únew_accountc                 ó  — | j                  | j                  d   |«      }|j                  dk(  r0d|j                  v r"t	        j
                  |j                  d   «      ‚| j                  |«      }|| j                  _        |S )zÖRegister.

        :param .NewRegistration new_account:

        :raises .ConflictError: in case the account already exists

        :returns: Registration Resource.
        :rtype: `.RegistrationResource`
        Ú
newAccountéÈ   ÚLocation)	Ú_postr   Ústatus_codeÚheadersr   ÚConflictErrorÚ_regr_from_responser   Úaccount)r   r   ÚresponseÚregrs       r   r   zClientV2.new_account3   su   € ð —:‘:˜dŸn™n¨\Ñ:¸KÓHˆà×Ñ 3Ò&¨:¸×9IÑ9IÑ+IÜ×&Ñ& x×'7Ñ'7¸
Ñ'CÓDÐDà×'Ñ'¨Ó1ˆØˆ�‰ÔØˆr   r+   c                 óp   — | j                  |d«      | j                  _        | j                  j                  S )zŠQuery server about registration.

        :param messages.RegistrationResource regr: Existing Registration
            Resource.

        T)Ú_get_v2_accountr   r)   ©r   r+   s     r   Úquery_registrationzClientV2.query_registrationF   s-   € ð  ×/Ñ/°°dÓ;ˆ�‰Ôà�x‰x×ÑÐr   Úupdatec                 óÌ   — | j                  |«      }|€|j                  n|}t        j                  di t	        |«      ¤Ž}| j                  ||¬«      }|| j                  _        |S )aK  Update registration.

        :param messages.RegistrationResource regr: Registration Resource.
        :param messages.Registration update: Updated body of the
            resource. If not provided, body will be taken from `regr`.

        :returns: Updated Registration Resource.
        :rtype: `.RegistrationResource`

        ©Úbody© )r-   r3   r   ÚUpdateRegistrationÚdictÚ_send_recv_regrr   r)   )r   r+   r0   r3   Úupdated_regrs        r   Úupdate_registrationzClientV2.update_registrationR   sa   € ð ×#Ñ# DÓ)ˆà$˜n�—’°&ˆÜ×*Ñ*Ñ:¬T°&«\Ñ:ˆØ×+Ñ+¨D°tÐ+Ó<ˆØ'ˆ�‰ÔØÐr   Úupdate_bodyc                 óv  — d | j                   _        |j                  j                  d¬«      }| j	                  | j
                  d   |«      }|j                  d   }|j                  |r-t        j                  j                  |j                  «       «      n|j                  |¬«      }|| j                   _        |S )NT)Úonly_return_existingr!   r#   ©r3   Úuri)r   r)   r3   r0   r$   r   r&   r   ÚRegistrationÚ	from_jsonÚjson)r   r+   r:   Úonly_existing_regr*   Úupdated_uriÚnew_regrs          r   r-   zClientV2._get_v2_accounth   sŸ   € àˆ�‰ÔØ ŸI™I×,Ñ,À$Ð,ÓGÐØ—:‘:˜dŸn™n¨\Ñ:Ð<MÓNˆØ×&Ñ& zÑ2ˆØ—;‘;Ù"-ô %-×$9Ñ$9×$CÑ$CÀHÇMÁMÃOÔ$TØ37·9±9Ø#.ð ó 0ˆð $ˆ�‰ÔØˆr   Úcsr_pemc                 óf  — t         j                  j                  t         j                  j                  |«      }t	        j
                  |«      }t	        j                  |«      }g }|D ]6  }|j                  t        j                  t        j                  |¬«      «       Œ8 |D ]6  }|j                  t        j                  t        j                  |¬«      «       Œ8 t        j                  |¬«      }| j                  | j                  d   |«      }	t        j                  j!                  |	j#                  «       «      }
g }|
j$                  D ]3  }|j                  | j'                  | j)                  |«      |¬«      «       Œ5 t        j*                  |
|	j,                  j/                  d«      ||¬«      S )z²Request a new Order object from the server.

        :param bytes csr_pem: A CSR in PEM format.

        :returns: The newly created order.
        :rtype: OrderResource
        )ÚtypÚvalue)ÚidentifiersÚnewOrder©r>   r#   )r3   r>   ÚauthorizationsrE   )ÚOpenSSLÚcryptoÚload_certificate_requestÚFILETYPE_PEMr   Ú _pyopenssl_cert_or_req_all_namesÚ_pyopenssl_cert_or_req_san_ipÚappendr   Ú
IdentifierÚIDENTIFIER_FQDNÚIDENTIFIER_IPÚNewOrderr$   r   ÚOrderr@   rA   rL   Ú_authzr_from_responseÚ_post_as_getÚOrderResourcer&   Úget)r   rE   ÚcsrÚdnsNamesÚipNamesrI   ÚnameÚipsÚorderr*   r3   rL   Úurls                r   Ú	new_orderzClientV2.new_ordert   ss  € ô �n‰n×5Ñ5´g·n±n×6QÑ6QÐSZÓ[ˆä×?Ñ?ÀÓDˆÜ×;Ñ;¸CÓ@ˆàˆØò 	ˆDØ×Ñœx×2Ñ2´x×7OÑ7OØô õ ð	ð ò 	ˆCØ×Ñœx×2Ñ2´x×7MÑ7MØô õ ð	ô ×!Ñ!¨kÔ:ˆØ—:‘:˜dŸn™n¨ZÑ8¸%Ó@ˆÜ�~‰~×'Ñ'¨¯©«Ó8ˆØˆð ×&Ñ&ò 	_ˆCØ×!Ñ! $×"<Ñ"<¸T×=NÑ=NÈsÓ=SÐY\Ð"<Ó"]Õ^ð	_ä×%Ñ%ØØ× Ñ ×$Ñ$ ZÓ0Ø)Øô	ð 	r   Úauthzrc                 ó¢   — | j                  |j                  «      }| j                  ||j                  j                  |j                  «      }||fS )a  Poll Authorization Resource for status.

        :param authzr: Authorization Resource
        :type authzr: `.AuthorizationResource`

        :returns: Updated Authorization Resource and HTTP response.

        :rtype: (`.AuthorizationResource`, `requests.Response`)

        )rZ   r>   rY   r3   Ú
identifier)r   re   r*   Úupdated_authzrs       r   ÚpollzClientV2.poll—   sH   € ð ×$Ñ$ V§Z¡ZÓ0ˆØ×3Ñ3Ø�f—k‘k×,Ñ,¨f¯j©jó:ˆà˜xÐ'Ð'r   ÚorderrÚdeadlinec                 ó¸   — |€5t         j                   j                  «       t        j                  d¬«      z   }| j                  ||«      }| j	                  ||«      S )ad  Poll authorizations and finalize the order.

        If no deadline is provided, this method will timeout after 90
        seconds.

        :param messages.OrderResource orderr: order to finalize
        :param datetime.datetime deadline: when to stop polling and timeout

        :returns: finalized order
        :rtype: messages.OrderResource

        éZ   ©Úseconds)ÚdatetimeÚnowÚ	timedeltaÚpoll_authorizationsÚfinalize_order)r   rj   rk   s      r   Úpoll_and_finalizezClientV2.poll_and_finalize¨   sS   € ð ÐÜ×(Ñ(×,Ñ,Ó.´×1CÑ1CÈBÔ1OÑOˆHØ×)Ñ)¨&°(Ó;ˆØ×"Ñ" 6¨8Ó4Ð4r   c                 óH  — g }|j                   j                  D ]¶  }t        j                  j                  «       |k  sŒ%| j	                  | j                  |«      |¬«      }|j                   j                  t        j                  k7  r|j                  |«       Œ€t        j                  d«       t        j                  j                  «       |k  rŒ’Œ¸ t        |«      t        |j                   j                  «      k  rt        j                  «       ‚g }|D ]c  }|j                   j                  t        j                  k7  sŒ+|j                   j                   D ]   }|j"                  €Œ|j                  |«       Œ" Œe |rt        j$                  |«      ‚|j'                  |¬«      S )zPoll Order Resource for status.rK   é   )rL   )r3   rL   rp   rq   rY   rZ   Ústatusr   ÚSTATUS_PENDINGrS   ÚtimeÚsleepÚlenr   ÚTimeoutErrorÚSTATUS_VALIDr   ÚerrorÚValidationErrorr0   )r   rj   rk   Ú	responsesrc   re   ÚfailedÚchalls           r   rs   zClientV2.poll_authorizations»   sU  € ð ˆ	Ø—;‘;×-Ñ-ò 	ˆCÜ×#Ñ#×'Ñ'Ó)¨HÓ4Ø×3Ñ3°D×4EÑ4EÀcÓ4JÐPSÐ3ÓT�Ø—;‘;×%Ñ%¬×)@Ñ)@Ò@Ø×$Ñ$ VÔ,ØÜ—
‘
˜1”ô ×#Ñ#×'Ñ'Ó)¨HÔ4ð	ô ˆy‹>œC §¡× :Ñ :Ó;Ò;Ü×%Ñ%Ó'Ð'ØˆØò 	.ˆFØ�{‰{×!Ñ!¤X×%:Ñ%:Ó:Ø#Ÿ[™[×3Ñ3ò .�EØ—{‘{Ñ.ØŸ™ fÕ-ñ.ð	.ñ
 Ü×(Ñ(¨Ó0Ð0Ø�}‰}¨Iˆ}Ó6Ð6r   c                 ó¢  — t         j                  j                  t         j                  j                  |j                  «      }t        j                  t        j                  |«      ¬«      }| j                  |j                  j                  |«      }|j                  t
        j                  j                  |j                  «       «      ¬«      }|S )a  Start the process of finalizing an order.

        :param messages.OrderResource orderr: order to finalize
        :param datetime.datetime deadline: when to stop polling and timeout

        :returns: updated order
        :rtype: messages.OrderResource
        )r]   r2   )rM   rN   rO   rP   rE   r   ÚCertificateRequestÚjoseÚComparableX509r$   r3   Úfinalizer0   rX   r@   rA   )r   rj   r]   Úwrapped_csrÚress        r   Úbegin_finalizationzClientV2.begin_finalizationÔ   sŠ   € ô �n‰n×5Ñ5Ü�N‰N×'Ñ'¨¯©ó9ˆä×1Ñ1´d×6IÑ6IÈ#Ó6NÔOˆØ�j‰j˜Ÿ™×-Ñ-¨{Ó;ˆØ—‘¤H§N¡N×$<Ñ$<¸S¿X¹X»ZÓ$H�ÓIˆØˆr   Úfetch_alternative_chainsc                 ó”  — t         j                   j                  «       |k  �rŽt        j                  d«       | j	                  |j
                  «      }t        j                  j                  |j                  «       «      }|j                  t        j                  k(  r@|j                  �t        j                  |j                  «      ‚t        j                  d«      ‚|j                  t        j                   k(  r”|j"                  �ˆ| j	                  |j"                  «      }|j%                  ||j&                  ¬«      }|rL| j)                  |d«      }|D �cg c]  }| j	                  |«      j&                  ‘Œ }	}|j%                  |	¬«      }|S t         j                   j                  «       |k  r�ŒŽt        j*                  «       ‚c c}w )zÙ
        Poll an order that has been finalized for its status.
        If it becomes valid, obtain the certificate.

        :returns: finalized order (with certificate)
        :rtype: messages.OrderResource
        rw   zPThe certificate order failed. No further information was provided by the server.)r3   Úfullchain_pemÚ	alternate)Úalternative_fullchains_pem)rp   rq   rz   r{   rZ   r>   r   rX   r@   rA   rx   ÚSTATUS_INVALIDr   r   ÚIssuanceErrorÚErrorr~   Úcertificater0   ÚtextÚ
_get_linksr}   )
r   rj   rk   rŒ   r*   r3   Úcertificate_responseÚalt_chains_urlsrc   Ú
alt_chainss
             r   Úpoll_finalizationzClientV2.poll_finalizationå   sg  € ô ×Ñ×#Ñ#Ó%¨Ó0Ü�J‰J�qŒMØ×(Ñ(¨¯©Ó4ˆHÜ—>‘>×+Ñ+¨H¯M©M«OÓ<ˆDØ�{‰{œh×5Ñ5Ò5Ø—:‘:Ð)Ü ×.Ñ.¨t¯z©zÓ:Ð:Ü—l‘lð%ó&ð &ð —‘¤× 5Ñ 5Ò5¸$×:JÑ:JÐ:VØ'+×'8Ñ'8¸×9IÑ9IÓ'JÐ$ØŸ™¨DÐ@T×@YÑ@Y˜ÓZ�Ù+Ø&*§o¡oÐ6JÈKÓ&X�OØIXÖ!YÀ# $×"3Ñ"3°CÓ"8×"=Ó"=Ð!Y�JÐ!YØ#Ÿ]™]Àj˜]ÓQ�FØ�ô# ×Ñ×#Ñ#Ó%¨Ô0ô$ ×!Ñ!Ó#Ð#ùò "Zs   Å"Gc                 óJ   — | j                  |«       | j                  |||«      S )a{  Finalize an order and obtain a certificate.

        :param messages.OrderResource orderr: order to finalize
        :param datetime.datetime deadline: when to stop polling and timeout
        :param bool fetch_alternative_chains: whether to also fetch alternative
            certificate chains

        :returns: finalized order
        :rtype: messages.OrderResource

        )r‹   rš   )r   rj   rk   rŒ   s       r   rt   zClientV2.finalize_order  s(   € ð 	×Ñ Ô'Ø×%Ñ% f¨hÐ8PÓQÐQr   ÚcertÚrsnc                 óD   — | j                  ||| j                  d   «       y)a  Revoke certificate.

        :param .ComparableX509 cert: `OpenSSL.crypto.X509` wrapped in
            `.ComparableX509`

        :param int rsn: Reason code for certificate revocation.

        :raises .ClientError: If revocation is unsuccessful.

        Ú
revokeCertN)Ú_revoker   )r   rœ   r�   s      r   ÚrevokezClientV2.revoke  s   € ð 	�‰�T˜3 §¡¨|Ñ <Õ=r   c                 ó¶   — t        | j                  d«      xrB t        | j                  j                  d«      xr  | j                  j                  j                  S )zGChecks if ACME server requires External Account Binding authentication.ÚmetaÚexternal_account_required)Úhasattrr   r£   r¤   ©r   s    r   r¤   z"ClientV2.external_account_required"  sG   € ä�t—~‘~ vÓ.ò =Ü�t—~‘~×*Ñ*Ð,GÓHò=à�~‰~×"Ñ"×<Ñ<ð	=r   ÚargsÚkwargsc                 óB   — |dd dz   |dd z   } | j                   |i |¤ŽS )z
        Send GET request using the POST-as-GET protocol.
        :param args:
        :param kwargs:
        :return:
        Nrw   ©N)r$   )r   r§   r¨   Únew_argss       r   rZ   zClientV2._post_as_get(  s5   € ð ˜˜�8˜gÑ%¨¨Q¨R¨Ñ0ˆØˆt�z‰z˜8Ð. vÑ.Ð.r   r*   Úrelation_typec                 ó¢   — d|j                   vrg S t        |j                   d   «      }|D �cg c]  }d|v rd|v r|d   |k(  r|d   ‘Œ c}S c c}w )zÖ
        Retrieves all Link URIs of relation_type from the response.
        :param requests.Response response: The requests HTTP response.
        :param str relation_type: The relation type to filter by.
        ÚLinkÚrelrc   )r&   r   )r   r*   r¬   ÚlinksÚls        r   r–   zClientV2._get_links2  sk   € ð ˜×)Ñ)Ñ)ØˆIÜ" 8×#3Ñ#3°FÑ#;Ó<ˆØ"'ö L˜QØ˜A‘: %¨1¡*°°5±¸]Ò1Jð �%“ò Lð 	Lùò Ls   ­Arc   c                 óz   — t         j                  j                  |j                  |«      j	                  «       «      S )aB  
        Retrieves the ACME directory (RFC 8555 section 7.1.1) from the ACME server.
        :param str url: the URL where the ACME directory is available
        :param ClientNetwork net: the ClientNetwork to use to make the request

        :returns: the ACME directory object
        :rtype: messages.Directory
        )r   Ú	Directoryr@   r\   rA   )Úclsrc   r   s      r   Úget_directoryzClientV2.get_directory@  s,   € ô ×!Ñ!×+Ñ+¨C¯G©G°C«L×,=Ñ,=Ó,?Ó@Ð@r   r>   Úterms_of_servicec                 óü   — d|j                   v r|j                   d   d   }t        j                  t        j                  j	                  |j                  «       «      |j                  j                  d|«      |¬«      S )Nzterms-of-servicerc   r#   )r3   r>   r¶   )r°   r   ÚRegistrationResourcer?   r@   rA   r&   r\   )r´   r*   r>   r¶   s       r   r(   zClientV2._regr_from_responseL  sk   € ð  §¡Ñ/Ø'Ÿ~™~Ð.@ÑAÀ%ÑHÐä×,Ñ,Ü×&Ñ&×0Ñ0°·±³ÓAØ× Ñ ×$Ñ$ Z°Ó5Ø-ô/ð 	/r   r3   c                 óŠ   — | j                  |j                  |«      }| j                  ||j                  |j                  ¬«      S )N)r>   r¶   )r$   r>   r(   r¶   )r   r+   r3   r*   s       r   r7   zClientV2._send_recv_regrX  sB   € à—:‘:˜dŸh™h¨Ó-ˆð ×'Ñ'Ø˜$Ÿ(™(Ø!×2Ñ2ð (ó 4ð 	4r   c                 ó†   — |j                  dt        | j                  d«      «        | j                  j                  |i |¤ŽS )zŠWrapper around self.net.post that adds the newNonce URL.

        This is used to retry the request in case of a badNonce error.

        Únew_nonce_urlÚnewNonce)Ú
setdefaultÚgetattrr   r   Úpost©r   r§   r¨   s      r   r$   zClientV2._postf  s9   € ð 	×Ñ˜/¬7°4·>±>À:Ó+NÔOØˆt�x‰x�}‰}˜dÐ- fÑ-Ð-r   c                 óf   — | j                  |t        j                  j                  dddœ«      «      S )zúDeactivate registration.

        :param messages.RegistrationResource regr: The Registration Resource
            to be deactivated.

        :returns: The Registration resource that was deactivated.
        :rtype: `.RegistrationResource`

        ÚdeactivatedN)rx   Úcontact)r9   r   r?   r@   r.   s     r   Údeactivate_registrationz ClientV2.deactivate_registrationo  s4   € ð ×'Ñ'¨¬h×.CÑ.C×.MÑ.MØ$°Ñ6ó/8ó 9ð 	9r   c                 óÈ   — t        j                  d¬«      }| j                  |j                  |«      }| j	                  ||j
                  j                  |j                  «      S )a  Deactivate authorization.

        :param messages.AuthorizationResource authzr: The Authorization resource
            to be deactivated.

        :returns: The Authorization resource that was deactivated.
        :rtype: `.AuthorizationResource`

        rÂ   )rx   )r   ÚUpdateAuthorizationr$   r>   rY   r3   rg   )r   re   r3   r*   s       r   Údeactivate_authorizationz!ClientV2.deactivate_authorization}  sP   € ô ×+Ñ+°=ÔAˆØ—:‘:˜fŸj™j¨$Ó/ˆØ×)Ñ)¨(Ø�K‰K×"Ñ" F§J¡Jó0ð 	0r   rg   c                 ó  — t        j                  t         j                  j                  |j	                  «       «      |j
                  j                  d|«      ¬«      }|�.|j                  j                  |k7  rt        j                  |«      ‚|S )Nr#   r=   )r   ÚAuthorizationResourceÚAuthorizationr@   rA   r&   r\   r3   rg   r   ÚUnexpectedUpdate)r   r*   rg   r>   re   s        r   rY   zClientV2._authzr_from_responseŽ  ss   € ô ×/Ñ/Ü×'Ñ'×1Ñ1°(·-±-³/ÓBØ× Ñ ×$Ñ$ Z°Ó5ô7ˆð Ð! f§k¡k×&<Ñ&<À
Ò&JÜ×)Ñ)¨&Ó1Ð1Øˆr   Úchallbc                 óœ  — | j                  |j                  |«      }	 |j                  d   d   }t        j                  |t        j                  j                  |j                  «       «      ¬«      }|j                  |j                  k7  rt	        j                  |j                  «      ‚|S # t        $ r t	        j
                  d«      ‚w xY w)ah  Answer challenge.

        :param challb: Challenge Resource body.
        :type challb: `.ChallengeBody`

        :param response: Corresponding Challenge response
        :type response: `.challenges.ChallengeResponse`

        :returns: Challenge Resource with updated body.
        :rtype: `.ChallengeResource`

        :raises .UnexpectedUpdate:

        Úuprc   z"up" Link header missing)Ú
authzr_urir3   )r$   r>   r°   ÚKeyErrorr   ÚClientErrorr   ÚChallengeResourceÚChallengeBodyr@   rA   rË   )r   rÌ   r*   ÚresprÏ   Úchallrs         r   Úanswer_challengezClientV2.answer_challenge˜  s²   € ð  �z‰z˜&Ÿ*™* hÓ/ˆð	AØŸ™ DÑ)¨%Ñ0ˆJô ×+Ñ+Ø!Ü×'Ñ'×1Ñ1°$·)±)³+Ó>ô@ˆð �:‰:˜Ÿ™Ò#Ü×)Ñ)¨&¯*©*Ó5Ð5Øˆøô ò 	AÜ×$Ñ$Ð%?Ó@Ð@ð	Aús   žB, Â,CÚdefaultc                 ó¨  — |j                   j                  dt        |«      «      }	 t        |«      }t        j                  j                  «       t        j                  |¬«      z   S # t        $ ra t        |«      }|�O	 t        j                  |d   �|d   nd«      }t        j                  |dd Ž |z
  cY S # t        t        f$ r Y nw xY w|}Y Œžw xY w)aü  Compute next `poll` time based on response ``Retry-After`` header.

        Handles integers and various datestring formats per
        https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.37

        :param requests.Response response: Response from `poll`.
        :param int default: Default value (in seconds), used when
            ``Retry-After`` header is not present or invalid.

        :returns: Time point when next `poll` should be performed.
        :rtype: `datetime.datetime`

        zRetry-AfterNéÿÿÿÿr   é   rn   )
r&   r\   ÚstrÚintÚ
ValueErrorr   rp   rr   ÚOverflowErrorrq   )r´   r*   r×   Úretry_afterro   ÚwhenÚtz_secss          r   rß   zClientV2.retry_afterµ  sÖ   € ð ×&Ñ&×*Ñ*¨=¼#¸g»,ÓGˆð	Ü˜+Ó&ˆGô × Ñ ×$Ñ$Ó&¬×);Ñ);ÀGÔ)LÑLÐLøô ò 
	ô   Ó,ˆDØÐðÜ&×0Ñ0¸TÀ"¹XÐ=Q°°b²ÐWXÓY�GÜ#×,Ñ,¨d°2°A¨hÐ7¸'ÑAÒAøÜ"¤MÐ2ò ÙðúàŠGð
	ús5   §A' Á'CÁ>6B7Â4CÂ7C	ÃCÃC	Ã	CÃCc                 ó¶   — | j                  |t        j                  ||¬«      «      }|j                  t        j
                  k7  rt        j                  d«      ‚y)a.  Revoke certificate.

        :param .ComparableX509 cert: `OpenSSL.crypto.X509` wrapped in
            `.ComparableX509`

        :param int rsn: Reason code for certificate revocation.

        :param str url: ACME URL to post to

        :raises .ClientError: If revocation is unsuccessful.

        )r”   Úreasonz0Successful revocation must return HTTP OK statusN)r$   r   Ú
Revocationr%   Úhttp_clientÚOKr   rÑ   )r   rœ   r�   rc   r*   s        r   r    zClientV2._revokeÕ  sY   € ð —:‘:˜cÜ&×1Ñ1Ø,0Ø'*ô,ó-ˆð ×Ñ¤;§>¡>Ò1Ü×$Ñ$ØBóDð Dð 2r   rª   )F)NN)8Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r³   r   ÚNewRegistrationr¸   r   r/   r   r?   r9   Úboolr-   Úbytesr[   rd   rÉ   r
   ÚrequestsÚResponseri   rp   ru   rs   r‹   rš   rt   r†   r‡   rÜ   r¡   r¤   r   rZ   rÛ   r   r–   Úclassmethodrµ   r(   r7   r$   rÄ   rÇ   rT   rY   rÓ   r   ÚChallengeResponserÒ   rÖ   rß   r    r4   r   r   r   r   #   sx  „ ñð (×"4Ñ"4ð ¸?ð Ètó ð x×'?Ñ'?ð ÀH×DaÑDaó ð&
  x×'DÑ'Dð 
 Ø (× =Ñ =ó
 ð GKñ¨×(EÑ(Eð Ø$,¨X×-BÑ-BÑ$Cðà!)×!>Ñ!>óñ,
 H×$AÑ$Að 
ÐPTð 
Ø$×9Ñ9ó
ð! ð !¨8×+AÑ+Aó !ðF(˜8×9Ñ9ð (Ø˜×6Ñ6¸×8IÑ8IÐIÑJó(ð$ CGñ5¨×(>Ñ(>ð 5Ø$,¨X×->Ñ->Ñ$?ð5ØKS×KaÑKaó5ð&7¨(×*@Ñ*@ð 7ÈH×L]ÑL]ð 7Ø!)×!7Ñ!7ó7ð2¨×)?Ñ)?ð Ø (× 6Ñ 6óð& <Añ$¨×(>Ñ(>ð $Ø$,×$5Ñ$5ð$à48ð$ð  (×5Ñ5ó$ðB 9>ñR X×%;Ñ%;ð RÀx×GXÑGXð RØ15ðRØBJ×BXÑBXóRð >˜4×.Ñ.ð >°Sð >¸Tó >ð=¨4ó =ð/ #ð /°ð /¸×9JÑ9Jó /ðL 8×#4Ñ#4ð LÀSð LÈTÐRUÉYó Lð ð	A ð 	A¨/ð 	A¸h×>PÑ>Pò 	Aó ð	Að ØSWØ>Bñ	/¨8×+<Ñ+<ð 	/À8ÈCÁ=ð 	/Ø.6°s©mð	/à!)×!>Ñ!>ò	/ó ð	/ð4 H×$AÑ$Að 4Ø&×3Ñ3ð4Ø8@×8UÑ8Uó4ð.˜3ð .¨#ð .°(×2CÑ2Có .ð9¨H×,IÑ,Ið 9Ø%-×%BÑ%Bó9ð0Ø)1×)GÑ)Gð0à&.×&DÑ&Dó0ð$ KOØ37ñ¨h×.?Ñ.?ð Ø*2°8×3FÑ3FÑ*Gðà#+¨C¡=ðà<D×<ZÑ<Zóð x×'=Ñ'=ð Ø#-×#?Ñ#?ðØDL×D^ÑD^óð: ðM 8×#4Ñ#4ð M¸sð MÀx×GXÑGXò Mó ðMð>D˜D×/Ñ/ð D°cð DÀð DÈô Dr   r   c                   ó\  — e Zd ZdZdZdZdZdZ	 dej                  dde
fd	ej                  d
eej                     dej                  dedededdfd„Zd$d„Zdej*                  dededefd„Ze	 d%dej2                  dee   dej2                  fd„«       Zdededededej2                  f
d„Zdededej2                  fd„Zefdedededej2                  fd„Zdej2                  ddfd„Zded edefd!„Z dededej2                  fd"„Z!efdedej*                  dededej2                  f
d#„Z"y)&r   zvWrapper around requests that signs POSTs for authentication.

    Also adds user agent, and handles Content-Type.
    zapplication/jsonzapplication/jose+jsonzapplication/problem+jsonzReplay-NonceNTzacme-pythonÚkeyr)   ÚalgÚ
verify_sslÚ
user_agentÚtimeoutr   c                 ó,  — || _         || _        || _        || _        t	        «       | _        || _        t        j                  «       | _	        || _
        t        «       }| j                  j                  d|«       | j                  j                  d|«       y )Nzhttp://zhttps://)ró   r)   rô   rõ   ÚsetÚ_noncesrö   rî   ÚSessionÚsessionÚ_default_timeoutr   Úmount)r   ró   r)   rô   rõ   rö   r÷   Úadapters           r   r   zClientNetwork.__init__   sw   € ð ˆŒØˆŒØˆŒØ$ˆŒÜ!$£ˆŒØ$ˆŒÜ×'Ñ'Ó)ˆŒØ 'ˆÔÜ“-ˆà�‰×Ñ˜9 gÔ.Ø�‰×Ñ˜: wÕ/r   c                 óX   — 	 | j                   j                  «        y # t        $ r Y y w xY wrª   )rü   ÚcloseÚ	Exceptionr¦   s    r   Ú__del__zClientNetwork.__del__  s)   € ð	Ø�L‰L×ÑÕ øÜò 	Ùð	ús   ‚ �	)¨)ÚobjÚnoncerc   c           	      ó†  — |r |j                  d¬«      j                  «       nd}t        j                  d|«       | j                  ||dœ}| j
                  �| j
                  d   |d<   | j                  |d<   t        j                  j                  |fi t        t        t        t        f   |«      ¤Žj                  d¬«      S )	zþWrap `JSONDeSerializable` object in JWS.

        .. todo:: Implement ``acmePath``.

        :param josepy.JSONDeSerializable obj:
        :param str url: The URL to which this object will be POSTed
        :param str nonce:
        :rtype: str

        é   )Úindentr   zJWS payload:
%s)rô   r  rc   r>   Úkidró   )Ú
json_dumpsÚencodeÚloggerÚdebugrô   r)   ró   r   ÚJWSÚsignr   r   rÛ   r   )r   r  r  rc   Újobjr¨   s         r   Ú_wrap_in_jwszClientNetwork._wrap_in_jws  s¦   € ñ 58ˆs�~‰~ Qˆ~Ó'×.Ñ.Ô0¸SˆÜ�‰Ð'¨Ô.à—8‘8ØØñ
ˆð �<‰<Ð#Ø ŸL™L¨Ñ/ˆF�5‰MØŸ™ˆˆu‰Ü�w‰w�|‰|˜DÑD¤D¬´´c°Ñ):¸FÓ$CÑD×OÑOÐWXÐOÓYÐYr   r*   Úcontent_typec                 ó  — |j                   j                  d«      }|r"|j                  d«      d   j                  «       }	 |j	                  «       }|j                  dk(  r/t        j                  |j                   j                  dd«      «      ‚|j                  s\|�E|| j                  k7  rt        j                  d|«       	 t        j                  j                  |«      ‚t        j$                  |«      ‚|�%|| j&                  k7  rt        j                  d	|«       || j&                  k(  r|€t        j$                  d
|› �«      ‚|S # t
        $ r d}Y �Œw xY w# t         j"                  $ r}t        j$                  ||f«      ‚d}~ww xY w)a¿  Check response content and its type.

        .. note::
           Checking is not strict: wrong server response ``Content-Type``
           HTTP header is ignored if response is an expected JSON object
           (c.f. Boulder #56).

        :param str content_type: Expected Content-Type response header.
            If JSON is expected and not present in server response, this
            function will raise an error. Otherwise, wrong Content-Type
            is ignored, but logged.

        :raises .messages.Error: If server response body
            carries HTTP Problem (https://datatracker.ietf.org/doc/html/rfc7807).
        :raises .ClientError: In case of other networking errors.

        úContent-Typeú;r   Ni™  r#   zUNKNOWN-LOCATIONz/Ignoring wrong Content-Type (%r) for JSON Errorz<Ignoring wrong Content-Type (%r) for JSON decodable responsez"Unexpected response Content-Type: )r&   r\   ÚsplitÚstriprA   rÝ   r%   r   r'   ÚokÚJSON_ERROR_CONTENT_TYPEr  r  r   r“   r@   r†   ÚDeserializationErrorrÑ   ÚJSON_CONTENT_TYPE)r´   r*   r  Úresponse_ctr  r   s         r   Ú_check_responsezClientNetwork._check_response1  s{  € ð( ×&Ñ&×*Ñ*¨>Ó:ˆáØ%×+Ñ+¨CÓ0°Ñ3×9Ñ9Ó;ˆKð	ð —=‘=“?ˆDð ×Ñ 3Ò&Ü×&Ñ& x×'7Ñ'7×';Ñ';¸JÐHZÓ'[Ó\Ð\à�{Š{ØÐØ #×"=Ñ"=Ò=Ü—L‘LØIØ#ô%ð@Ü"Ÿ.™.×2Ñ2°4Ó8Ð8ô ×(Ñ(¨Ó2Ð2àÐ K°3×3HÑ3HÒ$HÜ—‘ðØ +ô-ð ˜s×4Ñ4Ò4¸¸Ü×(Ñ(Ð+MÈkÈ]Ð)[Ó\Ð\àˆøô; ò 	Ø‹Dð	ûô ×0Ñ0ò @ä ×,Ñ,¨h¸Ð->Ó?Ð?ûð@ús*   ÁE	 ÃE Å	EÅEÅF
Å.FÆF
Úmethodr§   r¨   c           	      óh  — |dk(  rt         j                  d||d   «       nt         j                  d||«       | j                  |d<   |j                  di «       |d   j                  d| j                  «       |j                  d| j
                  «       	  | j                  j                  ||g|¢­i |¤Ž}d|d   v r t!        j"                  |j$                  «      }nd|_        |j(                  }t         j                  d|j*                  dj-                  d„ |j.                  j1                  «       D «       «      |«       |S # t        j                  j                  $ rR}	 d	}t        j                  |t        |«      «      }|€‚ |j                  «       \  }	}
}}t        d|	› |
› d|› �«      ‚d
}~ww xY w)aà  Send HTTP request.

        Makes sure that `verify_ssl` is respected. Logs request and
        response (with headers). For allowed parameters please see
        `requests.request`.

        :param str method: method for the new `requests.Request` object
        :param str url: URL for the new `requests.Request` object

        :raises requests.exceptions.RequestException: in case of any problems

        :returns: HTTP Response
        :rtype: `requests.Response`


        ÚPOSTzSending POST request to %s:
%sÚdatazSending %s request to %s.Úverifyr&   z
User-Agentr÷   zT.*host='(\S*)'.*Max retries exceeded with url\: (\/\w*).*(\[Errno \d+\])([A-Za-z ]*)NzRequesting ú:ÚAcceptzutf-8z!Received response:
HTTP %d
%s

%sú
c              3   óF   K  — | ]  \  }}d j                  ||«      –— Œ y­w)z{0}: {1}N)Úformat)Ú.0ÚkÚvs      r   ú	<genexpr>z.ClientNetwork._send_request.<locals>.<genexpr>®  s+   è ø€ ò FÙ$( A qð  *×0Ñ0°°A×6ñ Fùs   ‚!)r  r  rõ   r½   rö   rý   rü   Úrequestrî   Ú
exceptionsÚRequestExceptionÚreÚmatchrÛ   ÚgroupsrÝ   Úbase64Ú	b64encodeÚcontentÚencodingr•   r%   Újoinr&   Úitems)r   r  rc   r§   r¨   r*   ÚeÚ	err_regexÚmÚhostÚpathÚ_err_noÚerr_msgÚdebug_contents                 r   Ú_send_requestzClientNetwork._send_requestl  s«  € ð" �VÒÜ�L‰LÐ:Ø˜v f™~õ/ô �L‰LÐ4°f¸cÔBØŸ?™?ˆˆxÑØ×Ñ˜) RÔ(ØˆyÑ×$Ñ$ \°4·?±?ÔCØ×Ñ˜) T×%:Ñ%:Ô;ð	CØ+�t—|‘|×+Ñ+¨F°CÐI¸$ÒIÀ&ÑIˆHð8 �v˜iÑ(Ñ(Ü"×,Ñ,¨X×-=Ñ-=Ó>‰Mð !(ˆHÔØ$ŸM™MˆMÜ�‰Ð<Ø×)Ñ)Ø—Y‘Yñ FØ,4×,<Ñ,<×,BÑ,BÓ,DôFó Fà"ô		$ð
 ˆøôS ×"Ñ"×3Ñ3ò 	Cð/ð pˆIÜ—‘˜¤C¨£FÓ+ˆAØˆyØØ+,¯8©8«:Ñ(ˆD�$˜ Ü˜{¨4¨&°°°a¸°yÐAÓBÐBûð+	Cús   Â!E ÅF1ÅAF,Æ,F1c                 ó.   —  | j                   dg|¢­i |¤ŽS )a  Send HEAD request without checking the response.

        Note, that `_check_response` is not called, as it is expected
        that status code other than successfully 2xx will be returned, or
        messages2.Error will be raised by the server.

        ÚHEAD)r@  rÀ   s      r   ÚheadzClientNetwork.head³  s!   € ð "ˆt×!Ñ! &Ð:¨4Ò:°6Ñ:Ð:r   c                 óL   — | j                   | j                  d|fi |¤Ž|¬«      S )z$Send GET request and check response.ÚGET©r  )r  r@  )r   rc   r  r¨   s       r   r\   zClientNetwork.get½  s7   € ð ×#Ñ#ØˆD×Ñ˜u cÑ4¨VÑ4À<ð $ó Qð 	Qr   c                 ó®  — | j                   |j                  v rx|j                  | j                      }	 t        j                  j                  d   j                  |«      }t        j                  d|«       | j                  j                  |«       y t        j                  |«      ‚# t        j                  $ r}t        j                  ||«      ‚d }~ww xY w)Nr  zStoring nonce: %s)ÚREPLAY_NONCE_HEADERr&   r   ÚHeaderÚ_fieldsÚdecoder†   r  r   ÚBadNoncer  r  rú   ÚaddÚMissingNonce)r   r*   r  Údecoded_noncer   s        r   Ú
_add_noncezClientNetwork._add_nonceÃ  s­   € Ø×#Ñ# x×'7Ñ'7Ñ7Ø×$Ñ$ T×%=Ñ%=Ñ>ˆEð4Ü #§
¡
× 2Ñ 2°7Ñ ;× BÑ BÀ5Ó I�ô �L‰LÐ,¨eÔ4Ø�L‰L×Ñ˜]Õ+ä×%Ñ% hÓ/Ð/øô ×,Ñ,ò 4Ü—o‘o e¨UÓ3Ð3ûð4ús   ³,B& Â&CÂ9CÃCr»   c                 ó  — | j                   s\t        j                  d«       |€| j                  |«      }n"| j	                  | j                  |«      d ¬«      }| j                  |«       | j                   j                  «       S )NzRequesting fresh noncerF  )rú   r  r  rC  r  rP  Úpop)r   rc   r»   r*   s       r   Ú
_get_noncezClientNetwork._get_nonceÏ  si   € Ø�|Š|Ü�L‰LÐ1Ô2ØÐ$ØŸ9™9 S›>‘ð  ×/Ñ/°·	±	¸-Ó0HÐW[Ð/Ó\�Ø�O‰O˜HÔ%Ø�|‰|×ÑÓ!Ð!r   c                 óØ   — 	  | j                   |i |¤ŽS # t        j                  $ rB}|j                  dk(  r-t        j                  d|«        | j                   |i |¤ŽcY d}~S ‚ d}~ww xY w)z�POST object wrapped in `.JWS` and check response.

        If the server responded with a badNonce error, the request will
        be retried once.

        ÚbadNoncez Retrying request after error:
%sN)Ú
_post_oncer   r“   Úcoder  r  )r   r§   r¨   r   s       r   r¿   zClientNetwork.postÚ  se   € ð	Ø"�4—?‘? DÐ3¨FÑ3Ð3øÜ�~‰~ò 	Ø�z‰z˜ZÒ'Ü—‘Ð@À%ÔHØ&�t—‘¨Ð7°Ñ7Õ7Øûð		ús    ‚ ”A)§6A$ÁA)Á#A$Á$A)c                 ó  — |j                  dd «      }| j                  || j                  ||«      |«      }|j                  dd|i«        | j                  d|fd|i|¤Ž}| j                  ||¬«      }| j                  |«       |S )Nr»   r&   r  r   r!  rF  )rR  r  rS  r½   r@  r  rP  )r   rc   r  r  r¨   r»   r!  r*   s           r   rV  zClientNetwork._post_onceé  sŠ   € àŸ
™
 ?°DÓ9ˆØ× Ñ   d§o¡o°c¸=Ó&IÈ3ÓOˆØ×Ñ˜) n°lÐ%CÔDØ%�4×%Ñ% f¨cÑG¸ÐGÀÑGˆØ×'Ñ'¨¸|Ð'ÓLˆØ�‰˜Ô!Øˆr   )r   Nrª   )#rç   rè   ré   rê   r  ÚJOSE_CONTENT_TYPEr  rH  r†   ÚRS256ÚDEFAULT_NETWORK_TIMEOUTÚJWKr   r   r¸   ÚJWASignaturerì   rÛ   rÜ   r   r  ÚJSONDeSerializabler  rð   rî   rï   r  r   r@  rC  r\   rP  rS  r¿   rV  r4   r   r   r   r   ë  s  „ ñð +ÐØ/ÐØ8ÐØ(Ðð
ð Z^Ø*.¯*©*ÈØ#0ÐAXñ0˜DŸH™Hð 0¨x¸×8UÑ8UÑ/Vð 0Ø×'Ñ'ð0ØBFð0à ð0à;>ð0à]aó0ó ðZ × 7Ñ 7ð ZÀð ZÈ#ð ZÐRUó Zð2 à6:ñ8 x×'8Ñ'8ð 8Ø&.¨s¡mð8Ø?G×?PÑ?Pò8ó ð8ðtE Cð E¨cð E¸#ð EÈð EÐQY×QbÑQbó EðN;˜#ð ;¨ð ;°×1BÑ1Bó ;ð 1Bñ Q�sð Q¨#ð QØðQØ&×/Ñ/óQð
0 8×#4Ñ#4ð 
0¸ó 
0ð	"˜cð 	"°#ð 	"¸#ó 	"ð˜#ð ¨ð °×1BÑ1Bó ð  (9ñ˜cð ¨×(?Ñ(?ð Ø!$ðØDGðØLT×L]ÑL]ôr   r   )(rê   r2  rp   Úemail.utilsr   Úhttp.clientÚclientrå   Úloggingr/  rz   Útypingr   r   r   r   r   r	   r
   r   Újosepyr†   rM   rî   Úrequests.adaptersr   Úrequests.utilsr   Úacmer   r   r   r   r   Ú	getLoggerrç   r  r[  r   r   r4   r   r   ú<module>ri     s†   ðÙ Û Û Ý $Ý !Û Û 	Û Ý Ý Ý Ý Ý Ý Ý Ý ã Û Û Ý )Ý -å Ý Ý Ý Ý à	ˆ×	Ñ	˜8Ó	$€àÐ ÷EDñ ED÷PFò Fr   