HEX
Server: Apache
System: Linux scp1.abinfocom.com 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64
User: confeduphaar (1010)
PHP: 8.1.33
Disabled: exec,passthru,shell_exec,system
Upload Files
File: //usr/lib/python3/dist-packages/uaclient/http/__pycache__/__init__.cpython-38.pyc
U

��Jhi;�	@sxddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZm
Z
mZmZmZddlmZmZddlmZmZddlmZmZmZmZdZdZdZd	Zd
Z e�!e�"e#��Z$edde%fd
ee&e&ffde'fg�Z(edde%fd
ee&e&ffde&fdee&effde
efg�Z)e&e*d�dd�Z+e&ee&e&ee&d�dd�Z,ia-ee&ee&dd�dd�Z.ee&e&fd�dd�Z/ej0j1ee&e&fd�dd �Z2d;ej3ee%e(d!�d"d#�Z4d$d%�Z5d&d'�Z6d<ej3ee%ee&e(d(�d)d*�Z7eed�d+d,�Z8e&d-�d.d/�Z9d=e&ee%ee'e&fd0�d1d2�Z:diddd3fe&ee'ee&e&fee&ee%e*e)d4�d5d6�Z;d>e&e&e&e&e)d8�d9d:�Z<dS)?�N)�Any�Dict�List�
NamedTuple�Optional�Tuple)�error�request)�ParseResult�urlparse)�defaults�
exceptions�system�util)z169.254.169.254Zmetadataz[fd00:ec2::254]zhttp://archive.ubuntu.comzhttps://esm.ubuntu.comzhttp://api.snapcraft.iozhttps://api.snapcraft.io�UnparsedHTTPResponse�code�headers�body�HTTPResponse�	json_dict�	json_list)�url�returncCsXzt|�}Wntk
r"YdSX|jdkr2dSz
|jWntk
rRYdSXdS)NF)�https�httpT)r�
ValueError�schemeZport)rZ
parsed_url�r�8/usr/lib/python3/dist-packages/uaclient/http/__init__.py�is_service_url+s

r)�protocol�proxy�test_urlrc
Csr|sdSt|�stj|d��tj|dd�}|dkr�t|�jdkr�zt||d�}Wn�tjk
rh�Ynntj	k
r~�YnXtj
k
r��YnBtk
r�}z$t�
d||t|��tj|d��W5d}~XYnX|jdkr�|Stj|d��t�||i�}t�|�}z|�|�|WStjt
jfk
�rl}z,t�
d||t|d	t|���tj|d��W5d}~XYnXdS)
N)r!�HEAD)�methodr��https_proxyz:Error trying to use "%s" as pycurl proxy to reach "%s": %s��z:Error trying to use "%s" as urllib proxy to reach "%s": %s�reason)rr
ZProxyInvalidUrlr	�Requestrr�_readurl_pycurl_https_in_https�PycurlRequiredError�ProxyAuthenticationFailed�PycurlCACertificatesError�	Exception�LOGr�strZProxyNotWorkingErrorr�ProxyHandler�build_opener�open�socket�timeout�URLError�getattr)r r!r"�req�response�e�
proxy_handler�openerrrr�validate_proxy<sL�


�r=)�
http_proxyr&rcCs�i}|r||d<|r||d<d�tt��}dD]6}tj�|�}|r.d�tt|�d���tt����}q.t	�
d|�|tjd<|tjd<|r�t�|�}t�
|�}t�|�t	j
dd	|id
�|adS)aW
    Globally configure pro-client to use http and https proxies.

    - sets global proxy configuration for urllib
    - sets the no_proxy environment variable for the current process
      which gets inherited for all subprocesses
    - sets module variable for use in https-in-https pycurl requests
      this is retrieved later using get_configured_web_proxy

    :param http_proxy: http proxy to be used by urllib. If None, it will
                       not be configured
    :param https_proxy: https proxy to be used by urllib. If None, it will
                        not be configured
    rr�,)�no_proxy�NO_PROXYzSetting no_proxy: %sr@rAzSetting global proxy dict�extra)rBN)�join�sorted�UA_NO_PROXY_URLS�os�environ�get�set�split�unionr/�debugr	r1r2Zinstall_opener�_global_proxy_dict)r>r&Z
proxy_dictr@Zenv_varZproxy_valuer;r<rrr�configure_web_proxyqs.��




rN)rcCstS)N)rMrrrr�get_configured_web_proxy�srO)rrcCsdd�|��D�S)NcSsi|]\}}|��|�qSr)�lower)�.0�k�vrrr�
<dictcomp>�sz$_headers_to_dict.<locals>.<dictcomp>)�items�rrrr�_headers_to_dict�srW)r8r5rc
Cs�ztj||d�}Wnjtjk
r:}z|}W5d}~XYnDtjk
r|}z$t�t|j��t	j
||jd��W5d}~XYnX|��}t
|jt|j�|d�S)N�r5)�causer�rrr)r	�urlopenr�	HTTPErrorr6r/Z	exceptionr0r(r
ZConnectivityErrorZfull_url�readrrrWr)r8r5�respr:rrrr�_readurl_urllib�s"�r_cCsJt|�}t|�}|jdko8t�|j�o8|dk	o8|jdk}t�d|�|S)a�
    We only want to use pycurl if all of the following are true

    - The target url scheme is https
    - The target host is not in no_proxy
    - An https_proxy is configured either via pro's config or via environment
    - The https_proxy url scheme is https

    urllib.request provides some helpful functions that we re-use here.

    This function also returns the https_proxy to use, since it is calculated
    here anyway.
    rNzShould use pycurl: %r)r�_parse_https_proxyrr	Zproxy_bypassZhostnamer/rL)r&Z
target_urlZparsed_target_url�parsed_https_proxyZretrrr�should_use_pycurl�s
���rbcCs|d}d}t|j�dkr |jd}t|j�dkr8|jd}||krV|rVd|krVt���n"||krltj|d��ntj|d��dS)Nr�Z407�r)r:)�len�argsr
r,r-ZPycurlError)rr�authentication_error_code�ca_certificates_error_coder�msgrrr�_handle_pycurl_error�s


rj)r8r5r&rc

szddl}Wntk
r(t���YnX|��}|����}|dkrV|�|jd�nT|dkrn|�|j	d�n<|dkr�|�|j
d�|jr�|�|j|j�nt
d�|���|�|j|���dd�|��D�}t|�dkr�|�|j|�|�|jd�|�|jtj�|�r|�|j|�|�rXt|�}|�r6|��nd}|�|j|�|�|jd	�n
t�d
�t� �}|�|j!|�i��fdd�}	|�|j"|	�z|�#�Wn>|j$k
�r�}
zt%|
|��|j&|j'd
�W5d}
~
XYnXt(|�)|j*��}|�+�}|�,�t-|�|d�S)Nr�GETTr#�POSTz5HTTP method "{}" not supported in HTTPS-in-HTTPS modecSsg|]\}}d�||��qS)z{}: {}��format)rQ�name�valrrr�
<listcomp>sz2_readurl_pycurl_https_in_https.<locals>.<listcomp>�z1in pycurl request function without an https proxycsF|�d�}d|krdS|�dd�\}}|����}|��}|�|<dS)Nz
iso-8859-1�:rc)�decoderJ�striprP)Zheader_lineZname_rawZ	value_rawro�valuerVrr�save_header(s
z3_readurl_pycurl_https_in_https.<locals>.save_header)rrgrhrZ).�pycurl�ImportErrorr
r+ZCurlZ
get_method�upperZsetoptZHTTPGETZNOBODYrl�dataZCOPYPOSTFIELDSrrnZURLZget_full_urlZheader_itemsreZ
HTTPHEADERZFOLLOWLOCATIONZCAINFOrZSSL_CERTS_PATHZTIMEOUTr`ZgeturlZPROXYZ	PROXYTYPEr/�warning�io�BytesIOZ	WRITEDATAZHEADERFUNCTIONZperformrrjZE_RECV_ERRORZE_SSL_CACERT_BADFILE�intZgetinfoZ
RESPONSE_CODE�getvalue�closer)
r8r5r&rx�cr$Zheader_str_listraZbody_outputrwr:rrrrVrr*�st����
	��r*cCs"|st���d�}|rt|�SdS)Nr)r	Z
getproxiesrHrr%rrrr`Jsr`rdcCsH|j�d�}i}|si}n"tj�|�s,i}nt�t�|��}|�|g�S)NZserviceclient_url_responses)	ZfeaturesrHrF�path�exists�json�loadsrZ	load_file)�cfgrZresponse_overlay_pathZresponse_overlayrrr�_get_overlay_dataPsr�)rr5rcCs�t||�}|rJ|�d�}t�|dd��}|��dfW5QR�SQRXt|�s^tj|d��t�	d�
|��t��d�}i}|r�||d<t
||�r�ttj||d	�||d
�}|jdkr�tj|d��t�|j�|j�d�fStj||d	�}	zZt�|	��F}t�|��0}|��|j�d
�fW5QR�W5QR�WSQRXW5QRXWnVtjk
�r�}
z4|
jdk�rptj|d��|
jdk�r�t���n�W5d}
~
XYnXdS)Nrr9Z	file_path�rdz
URL [GET]: {}rz
If-None-MatchrV�r5r&i0�etagZETagi�)r��pop�lzmar3r]rr
�
InvalidUrlr/rLrnrOrHrbr*r	r)rZ
ETagUnchanged�
decompressrrr[rr\ZVulnerabilityDataNotFound)r�rr5r�Zoverlay_responser9�fr&rr8r:rrr�download_xz_file_from_url^sH


�


�
�2
r�T)rr{rr$r5�log_response_bodyrc
s�t|�stj|d��|r |s d}tj||�|d�}d��fdd�t��D��}t�d�	|p\d|||rn|�
d	�nd��t��d
�}t
||�r�t|||d��nt||d���jj
d	d
d�}	i}
g}d�j�dd�k�rtj|	tjd�}t|t�r�|}
n"t|t��r|}nt�dt|��d��fdd�t�j�D��}d�	|�p@d||�}
|�rx�j}|
�r`|
}n
|�rj|}|
d�	|�7}
t�|
�t�j�j|	|
|d�S)Nrdrl)r{rr$z, csg|]}d�|�|��qS�z
'{}': '{}'rm�rQrRrVrrrq�szreadurl.<locals>.<listcomp>z'URL [{}]: {}, headers: {{{}}}, data: {}rk�utf-8rr�rX�ignore��errors�application/json�content-typer���cls�unexpected JSON response: %scsg|]}d�|�j|��qSr�)rnrr�)r^rrrq�sz&URL [{}] response: {}, headers: {{{}}}z
, data: {}�rrrrr)rr
r�r	r)rCrDr/rLrnrtrOrHrbr*r_rrr�r�r�DatetimeAwareJSONDecoder�
isinstance�dict�listr|r0rr)rr{rr$r5r�r8Zsorted_header_strr&Zdecoded_bodyrr�	json_bodyZ	debug_msgZbody_to_logr)rr^r�readurl�sr���	
�
��
�r��	localhost)�socket_path�http_method�	http_path�
http_hostnamercCs�t�tjtj�}|�|�tj�|�}||_z*|�	||�|�
�}|��jddd�}W5|��|��Xi}g}	d|j
�dd�kr�tj|tjd�}
t|
t�r�|
}n t|
t�r�|
}	nt�dt|
��t|jt|j
�|||	d	�S)
Nr�r�r�r�r�r�r�r�r�)r4ZAF_UNIXZSOCK_STREAMZconnectrZclientZHTTPConnection�sockr�r	Zgetresponser]rtrrHr�r�rr�r�r�r�r/r|r0rZstatusrW)r�r�r�r�r�Zconnr^�outrrr�rrr�unix_socket_request�s4



�r�)N)NN)NN)r�)=Z
email.messageZemailZhttp.clientrr}r�Zloggingr�rFr4�typingrrrrrrZurllibrr	Zurllib.parser
rZuaclientrr
rrrEZPROXY_VALIDATION_APT_HTTP_URLZPROXY_VALIDATION_APT_HTTPS_URLZPROXY_VALIDATION_SNAP_HTTP_URLZPROXY_VALIDATION_SNAP_HTTPS_URLZ	getLoggerZreplace_top_level_logger_name�__name__r/rr0�bytesrr�boolrr=rMrNrO�messageZMessagerWr)r_rbrjr*r`r�r�r�r�rrrr�<module>s� ��
���2�1����_�
�6�
�M��