Ë
    M/Åe·2  ã                   óð  — 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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mZ ddlmZ ddlmZ ddlmZ  e	j8                  e«      Z G d„ dej>                  «      Z  G d„ d«      Z! G d„ d«      Z" G d„ de e!«      Z# G d„ dejH                  «      Z$ G d„ de$e!«      Z% G d„ de"«      Z& G d„ dejN                  «      Z(y)z1Support for standalone client challenge solvers. é    N)ÚAny)Úcast)ÚList)ÚMapping)ÚOptional)ÚSet)ÚTuple)ÚType)Úcrypto)ÚSSL)Ú
challenges)Úcrypto_utilc                   óœ   ‡ — e Zd ZdZdededdfˆ fd„Zdd„Zdej                  de	e
ej                  ej                  f      fd	„Zdd
„Zˆ xZS )Ú	TLSServerzGeneric TLS Server.ÚargsÚkwargsÚreturnNc                 óf  •— |j                  dd«      | _        | j                  rt        j                  | _        nt        j
                  | _        |j                  di «      | _        |j                  dt        j                  «      | _	        |j                  dd«      | _
        t        ‰| �0  |i |¤Ž y )NÚipv6FÚcertsÚmethodÚallow_reuse_addressT)Úpopr   ÚsocketÚAF_INET6Úaddress_familyÚAF_INETr   r   Ú_DEFAULT_SSL_METHODr   r   ÚsuperÚ__init__©Úselfr   r   Ú	__class__s      €ú1/usr/lib/python3/dist-packages/acme/standalone.pyr    zTLSServer.__init__   s„   ø€ Ø—J‘J˜v uÓ-ˆŒ	Ø�9Š9Ü"(§/¡/ˆDÕä"(§.¡.ˆDÔØ—Z‘Z ¨Ó,ˆŒ
Ø—j‘j ¬;×+JÑ+JÓKˆŒØ#)§:¡:Ð.CÀTÓ#JˆÔ Ü‰Ñ˜$Ð) &Ó)ó    c                 óÂ   — t        t        j                  t        j                  | j                  | j                  t        | dd «      | j                  ¬«      «      | _        y )NÚ_alpn_selection)Úcert_selectionÚalpn_selectionr   )r   r   r   Ú	SSLSocketÚ_cert_selectionÚgetattrr   ©r"   s    r$   Ú
_wrap_sockzTLSServer._wrap_sock*   sD   € Üœ6Ÿ=™=¬+×*?Ñ*?Ø�K‰K¨×(<Ñ(<Ü" 4Ð):¸DÓAØ—;‘;ô+ ó !ˆ�r%   Ú
connectionc                 ó`   — |j                  «       }|r| j                  j                  |d«      S y)z.Callback selecting certificate for connection.N)Úget_servernamer   Úget©r"   r/   Úserver_names      r$   r+   zTLSServer._cert_selection0   s-   € ð !×/Ñ/Ó1ˆÙØ—:‘:—>‘> +¨tÓ4Ð4Ør%   c                 ó`   — | j                  «        t        j                  j                  | «      S ©N)r.   ÚsocketserverÚ	TCPServerÚserver_bindr-   s    r$   r9   zTLSServer.server_bind8   s#   € Ø�‰ÔÜ×%Ñ%×1Ñ1°$Ó7Ð7r%   ©r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r.   r   Ú
Connectionr   r	   r   ÚPKeyÚX509r+   r9   Ú__classcell__©r#   s   @r$   r   r      sY   ø„ Ùð	*˜cð 	*¨Sð 	*°Tõ 	*ó!ð¨#¯.©.ð Ø% e¨F¯K©K¸¿¹Ð,DÑ&EÑFó÷8r%   r   c                   ó   — e Zd ZdZdZdZy)ÚACMEServerMixinz"ACME server common settings mixin.z'ACME client standalone challenge solverTN)r;   r<   r=   r>   Úserver_versionr   © r%   r$   rE   rE   =   s   „ Ù,à>€NØÑr%   rE   c            
       ó|   — e Zd ZdZdeej                     deee	f   de
de
ddf
d„Zdd	„Zdeeee	f      fd
„Zdd„Zy)ÚBaseDualNetworkedServersa  Base class for a pair of IPv6 and IPv4 servers that tries to do everything
       it's asked for both servers, but where failures in one server don't
       affect the other.

       If two servers are instantiated, they will serve on the same port.
       ÚServerClassÚserver_addressÚremaining_argsr   r   Nc                 ój  — |d   }g | _         g | _        d }dD ]€  }	 ||d<   |d   f|fz   |dd  z   }|f|z   }	 ||	i |¤Ž}
t        j                  d|d   |d   |rdnd«       | j                  j	                  |
«       |
j
                  j                  «       d   }Œ‚ | j                  s|r|‚t        j                  d«      ‚y # t
        j                  $ r^}|}| j                  r#t        j                  d	d   |d   |rdnd«       n"t        j                  d
d   |d   |rdnd«       Y d }~�Œd }~ww xY w)Né   )TFr   r   é   z$Successfully bound to %s:%s using %sÚIPv6ÚIPv4z‚Certbot wasn't able to bind to %s:%s using %s, this is often expected due to the dual stack nature of IPv6 socket implementations.z Failed to bind to %s:%s using %szCould not bind to IPv4 or IPv6.)ÚthreadsÚserversÚloggerÚdebugÚappendr   ÚgetsocknameÚerror)r"   rJ   rK   rL   r   ÚportÚlast_socket_errÚ
ip_versionÚnew_addressÚnew_argsÚserverÚes               r$   r    z!BaseDualNetworkedServers.__init__L   sc  € à˜aÑ ˆØ/1ˆŒØ68ˆŒð 37ˆð (ò 	6ˆJð6Ø!+��v‘Ø-¨aÑ0Ð2°d°WÑ<¸~ÈaÈbÐ?QÑQ�Ø'˜>¨NÑ:�Ù$ hÐ9°&Ñ9�Ü—‘Ø:¸KÈ¹NØ ‘N©j¡F¸fôFð$ —‘×#Ñ# FÔ+ð —}‘}×0Ñ0Ó2°1Ñ5‘ð7	6ð8 �|Š|ÙØ%Ð%ä—l‘lÐ#DÓEÐEð	 øô' —<‘<ò JØ"#�Ø—<’<ä—L‘Lð7ð $ A™¨°A©Ù",™°&õ:ô —L‘LØ:¸KÈ¹NØ# A™±*©À&ôJÿùðJús   œACÃD2ÃAD-Ä-D2c                 ó¼   — | j                   D ]M  }t        j                  |j                  ¬«      }|j	                  «        | j
                  j                  |«       ŒO y)z*Wraps socketserver.TCPServer.serve_forever)ÚtargetN)rS   Ú	threadingÚThreadÚserve_foreverÚstartrR   rV   ©r"   r^   Úthreads      r$   rd   z&BaseDualNetworkedServers.serve_forever~   sI   € à—l‘lò 	(ˆFÜ×%Ñ%Ø×+Ñ+ô-ˆFà�L‰LŒNØ�L‰L×Ñ Õ'ñ		(r%   c                 óp   — | j                   D �cg c]  }|j                  j                  «       ‘Œ c}S c c}w )z/Wraps socketserver.TCPServer.socket.getsockname)rS   r   rW   )r"   r^   s     r$   Úgetsocknamesz%BaseDualNetworkedServers.getsocknames†   s'   € à:>¿,¹,ÖG°�—‘×)Ñ)Õ+ÒGÐGùÒGs   �!3c                 ó¶   — | j                   D ]"  }|j                  «        |j                  «        Œ$ | j                  D ]  }|j	                  «        Œ g | _        y)zpWraps socketserver.TCPServer.shutdown, socketserver.TCPServer.server_close, and
           threading.Thread.joinN)rS   ÚshutdownÚserver_closerR   Újoinrf   s      r$   Úshutdown_and_server_closez2BaseDualNetworkedServers.shutdown_and_server_closeŠ   sR   € ð —l‘lò 	"ˆFØ�O‰OÔØ×ÑÕ!ð	"ð —l‘lò 	ˆFØ�K‰K�Mð	àˆ�r%   r:   )r;   r<   r=   r>   r
   r7   r8   r	   ÚstrÚintr   r    rd   r   ri   rn   rG   r%   r$   rI   rI   D   sv   „ ñð0F D¨×)?Ñ)?Ñ$@ð 0FÐRWÐX[Ð]`ÐX`ÑRað 0FØ"%ð0FØ14ð0FØ9=ó0Fód(ðH˜d 5¨¨c¨¡?Ñ3ó Hôr%   rI   c                   ó<  — e Zd ZdZdZ	 ddeeef   deee	j                  e	j                  f      deeee	j                  e	j                  f   f   deddf
d	„Zd
ej"                  deee	j                  e	j                  f      fd„Zdej"                  dee   defd„Zy)ÚTLSALPN01ServerzTLSALPN01 Server.s
   acme-tls/1rK   r   Úchallenge_certsr   r   Nc                 ób   — t         j                  | |t        j                  ||¬«       || _        y )N)r   r   )r   r    r7   ÚBaseRequestHandlerrs   )r"   rK   r   rs   r   s        r$   r    zTLSALPN01Server.__init__š   s3   € ô 	×ÑØ�.¤,×"AÑ"AÈØð 	ô 	ð  /ˆÕr%   r/   c                 ór   — |j                  «       }|r%t        j                  d|«       | j                  |   S y )Nz)Serving challenge cert for server name %s)r1   rT   rU   rs   r3   s      r$   r+   zTLSALPN01Server._cert_selection¦   s8   € ð !×/Ñ/Ó1ˆÙÜ�L‰LÐDÀkÔRØ×'Ñ'¨Ñ4Ð4Ør%   Ú_connectionÚalpn_protosc                 óÚ   — t        |«      dk(  r>|d   | j                  k(  r,t        j                  d| j                  «       | j                  S t        j                  dt	        |«      «       y)z!Callback to select alpn protocol.rN   r   zAgreed on %s ALPNz#Cannot agree on ALPN proto. Got: %sr%   )ÚlenÚACME_TLS_1_PROTOCOLrT   rU   ro   )r"   rw   rx   s      r$   r'   zTLSALPN01Server._alpn_selectionµ   sZ   € äˆ{Ó˜qÒ  [°¡^°t×7OÑ7OÒ%OÜ�L‰LÐ,¨d×.FÑ.FÔGØ×+Ñ+Ð+Ü�‰Ð:¼CÀÓ<LÔMð r%   )F)r;   r<   r=   r>   r{   r	   ro   rp   r   r   r@   rA   r   ÚbytesÚboolr    r   r?   r   r+   r'   rG   r%   r$   rr   rr   •   sØ   „ Ùà'Ðð
 $ñ
/ u¨S°#¨X¡ð 
/Ø˜U 6§;¡;°·±Ð#;Ñ<Ñ=ð
/à")¨%°°v·{±{ÀFÇKÁKÐ7OÑ1PÐ*PÑ"Qð
/ð ð
/ð )-ó
/ð¨#¯.©.ð ¸XÀeÈFÏKÉKØLRÏKÉKðMXñ GYñ >Zó ð¨3¯>©>ð ÈÈUÉð ÐX]ô r%   rr   c                   ó0   ‡ — e Zd ZdZdededdfˆ fd„Zˆ xZS )Ú
HTTPServerzGeneric HTTP Server.r   r   r   Nc                 óÀ   •— |j                  dd«      | _        | j                  rt        j                  | _        nt        j
                  | _        t        ‰| �  |i |¤Ž y )Nr   F)r   r   r   r   r   r   r   r    r!   s      €r$   r    zHTTPServer.__init__Ã   sF   ø€ Ø—J‘J˜v uÓ-ˆŒ	Ø�9Š9Ü"(§/¡/ˆDÕä"(§.¡.ˆDÔÜ‰Ñ˜$Ð) &Ó)r%   ©r;   r<   r=   r>   r   r    rB   rC   s   @r$   r   r   À   s%   ø„ Ùð*˜cð *¨Sð *°T÷ *ñ *r%   r   c                   ó`   ‡ — e Zd ZdZ	 d	deeef   deej                     de
deddf
ˆ fd„Zˆ xZS )
ÚHTTP01ServerzHTTP01 Server.rK   Ú	resourcesr   Útimeoutr   Nc                 óT   •— t         ‰| �  |t        j                  ||¬«      |¬«       y )N©Úsimple_http_resourcesr…   )r   )r   r    ÚHTTP01RequestHandlerÚpartial_init)r"   rK   r„   r   r…   r#   s        €r$   r    zHTTP01Server.__init__Ï   s5   ø€ ä‰ÑØÔ0×=Ñ=Ø&/¸ð >ó BØHLð 	õ 	Nr%   )Fé   )r;   r<   r=   r>   r	   ro   rp   r   r   ÚHTTP01r}   r    rB   rC   s   @r$   rƒ   rƒ   Ì   sU   ø„ Ùð 57ñN u¨S°#¨X¡ð NÀ3Àz×GXÑGXÑCYð NØðNØ.1ðNØ;?÷Nñ Nr%   rƒ   c                   ó0   ‡ — e Zd ZdZdededdfˆ fd„Zˆ xZS )ÚHTTP01DualNetworkedServersz`HTTP01Server Wrapper. Tries everything for both. Failures for one don't
       affect the other.r   r   r   Nc                 ó4   •— t        ‰| �  t        g|¢­i |¤Ž y r6   )r   r    rƒ   r!   s      €r$   r    z#HTTP01DualNetworkedServers.__init__Ú   s   ø€ Ü‰ÑœÐ7¨Ò7°Ó7r%   r�   rC   s   @r$   rŽ   rŽ   Ö   s'   ø„ ñð8˜cð 8¨Sð 8°T÷ 8ñ 8r%   rŽ   c                   óà   ‡ — e Zd ZdZ ej
                  dd«      Zdededdfˆ fd„Ze	de
fd	„«       Zd
ededdfd„Zdd„Zdd„Zdd„Zdd„Zdd„Zedeej,                     de
ddfd„«       Zˆ xZS )r‰   zÍHTTP01 challenge handler.

    Adheres to the stdlib's `socketserver.BaseRequestHandler` interface.

    :ivar set simple_http_resources: A set of `HTTP01Resource`
        objects. TODO: better name?

    ÚHTTP01Resourcezchall response validationr   r   r   Nc                 ó”   •— |j                  dt        «       «      | _        |j                  dd«      | _        t	        ‰| �  |i |¤Ž |  y )Nrˆ   r…   r‹   )r   Úsetrˆ   Ú_timeoutr   r    r!   s      €r$   r    zHTTP01RequestHandler.__init__ê   s@   ø€ Ø%+§Z¡ZÐ0GÌËÓ%OˆÔ"ØŸ
™
 9¨bÓ1ˆŒÜ‰Ñ˜$Ð) &Ò)Úr%   c                 ó   — | j                   S )z�
        The default timeout this server should apply to requests.
        :return: timeout to apply
        :rtype: int
        )r”   r-   s    r$   r…   zHTTP01RequestHandler.timeoutö   s   € ð �}‰}Ðr%   Úformatc                 óR   — t         j                  d| j                  d   ||z  «       y)zLog arbitrary message.z	%s - - %sr   N)rT   rU   Úclient_address)r"   r–   r   s      r$   Úlog_messagez HTTP01RequestHandler.log_messageÿ   s!   € ä�‰�[ $×"5Ñ"5°aÑ"8¸&À4¹-ÕHr%   c                 ód   — | j                  d«       t        j                  j                  | «       y)zHandle request.zIncoming requestN)r™   ÚBaseHTTPServerÚBaseHTTPRequestHandlerÚhandler-   s    r$   r�   zHTTP01RequestHandler.handle  s%   € à×ÑÐ+Ô,Ü×-Ñ-×4Ñ4°TÕ:r%   c                 óò   — | j                   dk(  r| j                  «        y | j                   j                  dt        j                  j
                  z   «      r| j                  «        y | j                  «        y )Nú/)ÚpathÚhandle_indexÚ
startswithr   rŒ   ÚURI_ROOT_PATHÚhandle_simple_http_resourceÚ
handle_404r-   s    r$   Údo_GETzHTTP01RequestHandler.do_GET  sS   € Ø�9‰9˜ÒØ×ÑÕØ�Y‰Y×!Ñ! #¬
×(9Ñ(9×(GÑ(GÑ"GÔHØ×,Ñ,Õ.à�O‰OÕr%   c                 óä   — | j                  d«       | j                  dd«       | j                  «        | j                  j	                  | j
                  j                  j                  «       «       y)zHandle index page.éÈ   zContent-Typeú	text/htmlN)Úsend_responseÚsend_headerÚend_headersÚwfileÚwriter^   rF   Úencoder-   s    r$   r¡   z!HTTP01RequestHandler.handle_index  sQ   € à×Ñ˜3ÔØ×Ñ˜¨Ô5Ø×ÑÔØ�
‰
×Ñ˜Ÿ™×3Ñ3×:Ñ:Ó<Õ=r%   c                 óÀ   — | j                  t        j                  d¬«       | j                  dd«       | j	                  «        | j
                  j                  d«       y)zHandler 404 Not Found errors.z	Not Found)ÚmessagezContent-typer©   s   404N)rª   Úhttp_clientÚ	NOT_FOUNDr«   r¬   r­   r®   r-   s    r$   r¥   zHTTP01RequestHandler.handle_404  sI   € à×Ñœ;×0Ñ0¸+ÐÔFØ×Ñ˜¨Ô5Ø×ÑÔØ�
‰
×Ñ˜Õ r%   c                 óä  — | j                   D ]´  }|j                  j                  | j                  k(  sŒ'| j                  d|j                  j	                  d«      «       | j                  t        j                  «       | j                  «        | j                  j                  |j                  j	                  «       «        y | j                  d«       | j                  d| j                  «       y)z$Handle HTTP01 provisioned resources.zServing HTTP01 with token %rÚtokenNzNo resources to servez0%s does not correspond to any resource. ignoring)rˆ   Úchallr    r™   r¯   rª   r²   ÚOKr¬   r­   r®   Ú
validation)r"   Úresources     r$   r¤   z0HTTP01RequestHandler.handle_simple_http_resource  s¼   € à×2Ñ2ò 		6ˆHØ�~‰~×"Ñ" d§i¡iÓ/Ø× Ñ Ð!?Ø!)§¡×!6Ñ!6°wÓ!?ôAà×"Ñ"¤;§>¡>Ô2Ø× Ñ Ô"Ø—
‘
× Ñ  ×!4Ñ!4×!;Ñ!;Ó!=Ô>Ùð		6ð ×ÑÐ4Ô5Ø×ÑÐKØŸ™õ	$r%   rˆ   r…   z'functools.partial[HTTP01RequestHandler]c                 ó2   — t        j                  | ||¬«      S )z¿Partially initialize this handler.

        This is useful because `socketserver.BaseServer` takes
        uninitialized handler and initializes it with the current
        request.

        r‡   )Ú	functoolsÚpartial)Úclsrˆ   r…   s      r$   rŠ   z!HTTP01RequestHandler.partial_init-  s    € ô × Ñ ØÐ'<Øôð 	r%   r:   )r;   r<   r=   r>   ÚcollectionsÚ
namedtupler‘   r   r    Úpropertyrp   r…   ro   r™   r�   r¦   r¡   r¥   r¤   Úclassmethodr   r   rŒ   rŠ   rB   rC   s   @r$   r‰   r‰   Þ   sÄ   ø„ ñð ,�[×+Ñ+ØÐ5ó7€Nð"˜cð "¨Sð "°Tõ "ð ð˜ò ó ððI #ð I¨cð I°dó Ió;ó
ó>ó!ó$ð ð°°Z×5FÑ5FÑ1Gð Ø!ðØ&Oòó ôr%   r‰   ))r>   r¾   r»   Úhttp.clientÚclientr²   Úhttp.serverr^   r›   Úloggingr   r7   rb   Útypingr   r   r   r   r   r   r	   r
   ÚOpenSSLr   r   Úacmer   r   Ú	getLoggerr;   rT   r8   r   rE   rI   rr   r   rƒ   rŽ   rœ   r‰   rG   r%   r$   ú<module>rÊ      sÒ   ðÙ 7Û Û Ý !Ý $Û Û Û Û Ý Ý Ý Ý Ý Ý Ý Ý å Ý å Ý à	ˆ×	Ñ	˜8Ó	$€ô8�×&Ñ&ô 8÷Bñ ÷Nñ Nôb(�i ô (ôV	*�×*Ñ*ô 	*ôN�:˜ô Nô8Ð!9ô 8ô[˜>×@Ñ@õ [r%   