o
    LDi                     @  s  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Zd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl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 G dd	 d	ejZG d
d dej Z!e"dg dZ#e"dg dZ$e% j&Z'e'dkrdZ(ndZ(dZ)deddZ*dfd"d#Z+d$d% Z,d&d'd(d)Z-d*d+ Z.dgd,d-Z/d.d/ Z0d0d1 Z1G d2d3 d3ej2Z3ej4d4ej5j2d5Z6d&d6dhdCdDZ7dEdF Z8G dGdH dHe9Z:dIdJ Z;G dKdL dLe<ej=Z>didNdOZ?djdQdRZ@dSdT ZAe>jBeAe>jCe?d&e>jDe?dUe>jEe?dUe>jFe@d&e>jGe@dUiZHdkdWdXZIdYdZ ZJdld]d^ZKd_d` ZLdadb ZMdcdd ZNdS )m    )annotationsN)Callable   )compat)
exceptions)protocolc                   @  s0   e Zd ZdZdZdZdZdZdZe	dd Z
d	S )
SSLModer   r               c                 C  s    t || r|S t| |ddS )N-_)
isinstancegetattrreplace)clssslmode r   a/var/www/www-root/data/www/77.83.87.30/venv/lib/python3.10/site-packages/asyncpg/connect_utils.pyparse,   s   
zSSLMode.parseN)__name__
__module____qualname__disableallowpreferrequire	verify_caverify_fullclassmethodr   r   r   r   r   r   $   s    r   c                   @  s   e Zd ZdZdZdS )SSLNegotiationpostgresdirectN)r   r   r   r"   r#   r   r   r   r   r!   3   s    r!   ConnectionParameters
userpassworddatabasesslr   ssl_negotiationserver_settingstarget_session_attrs
krbsrvnamegsslibConnectionConfigurationcommand_timeoutstatement_cache_sizemax_cached_statement_lifetimemax_cacheable_statement_sizeWindowszpgpass.confz.pgpassz.pg_service.confpassfilepathlib.Pathreturn#typing.List[typing.Tuple[str, ...]]c                 C  s   g }zs|   s
g W S |  std|  g W S tdkr3|  jtjtj	B @ r3td|  g W S | 
d3}|D ]&}| }|rH|drIq;|dd}|tdd	 tjd
|ddD  q;W d    W |S 1 snw   Y  W |S  ty   Y |S w )Nz&password file {!r} is not a plain filer5   zWpassword file {!r} has group or world access; permissions should be u=rw (0600) or lessrt#\\
c                 s  s    | ]	}| d dV  qdS )r=   r<   N)r   .0pr   r   r   	<genexpr>   s
    

z&_read_password_file.<locals>.<genexpr>z(?<!\\):r   )maxsplit)existsis_filewarningswarnformat_systemstatst_modeS_IRWXGS_IRWXOopenstrip
startswithr   appendtupleresplitIOError)r6   passtabfliner   r   r   _read_password_file^   sH   rX   typing.Optional[pathlib.Path]hoststyping.List[str]portstyping.List[int]r(   strr&   c                 C  s   t | }|sdS t||D ]@\}}|drd}|D ]2\}}	}
}}|dkr*||kr*q|	dkr5|	t|kr5q|
dkr>|
|kr>q|dkrG||krGq|    S qdS )zParse the pgpass file and return the matching password.

    :return:
        Password string, if found, ``None`` otherwise.
    N/	localhost*)rX   ziprO   r^   )r6   rZ   r\   r(   r&   rU   hostportphostpport	pdatabasepuser	ppasswordr   r   r   _read_password_from_pgpass   s$   
rj   c                   s   t  tr"t dkr"t t| kr tdt t|  S t  tr<t dkr< fddtt| D   S  fddtt| D   S )Nr   z+could not match {} port numbers to {} hostsc                   s   g | ]} d  qS )r   r   r?   r   rd   r   r   
<listcomp>       z'_validate_port_spec.<locals>.<listcomp>c                   s   g | ]} qS r   r   rk   rl   r   r   rm      s    )r   listlenr   ClientConfigurationErrorrG   range)rZ   rd   r   rl   r   _validate_port_spec   s   rs   Funquotec                C  sR  d| v r
|  d}n| g}g }g }|s7tjd}|r/d|v r*dd | dD }nt|}nd}t||}nt||}t|D ]`\}}	|	d dkrO|	}
d}n)|	d d	krptd
|	}|rh|	d}
|	d}nt
d|	|	d\}
}}|rtj|
}
||
 |s|r|rtj|}|t| q@|||  q@|s|}||fS )N,PGPORTc                 S     g | ]}t |qS r   intr>   r   r   r   rm      rn   z#_parse_hostlist.<locals>.<listcomp>8  r   r_    [z(?:\[([^\]]+)\])(?::([0-9]+))?r   r	   z0invalid IPv6 address in the connection URI: {!r}:)rS   osenvirongetrz   rs   	enumeraterR   matchgroupr   rq   rG   	partitionurllibr   ru   rP   )hostlistrd   ru   	hostspecsrZ   hostlist_portsportspecdefault_portihostspecaddrhostspec_portmr   r   r   r   _parse_hostlist   sT   



r   c                 C  sN   |  drtd|  z
tj| dd W S  ty&   td|  w )NSSLzUnsupported TLS version: .r   zNo such TLS version: )rO   r   rq   
ssl_module
TLSVersionr   KeyError)tls_versionr   r   r   _parse_tls_version   s   
r   c              	   C  s8   zt j }W n ttfy   Y d S w |d |   S )Nz.postgresql)pathlibPathhomeRuntimeErrorr   resolve)filenamehomedirr   r   r   _dot_postgresql_path  s   r   c           2        s  d }d  } } } } d  }}d }| rt j| }d }|jrLt jj|jdd}| D ]\}}t|tr<|d ||< q-d|v rL|d}|sL|rL|}|	}|d u rWt	
d}|d u rit }|rf|t }nd }nt|}|jdvr|td|j|jrd|jv r|jd\}}}n
|j}d	}nd	 }}|r|d
\} }}!nd	 } }!|s|rt||dd\}}|jr|d u r|j}"|"dr|"dd  }"t j|"}|d u r| rt j| }|d u r|!rt j|!}|r&d|v r|d}|s|rdd |dD }d|v r|d}|s|rt||\}}d|v r,|d}|d u r,|}d|v r=|d}|d u r=|}d|v rN|d}|d u rN|}d|v r_|d}|d u r_|}d|v rp|d}|d u rp|}d|v r|d}|d u r|}d|v r|d}d|v r|d}d|v r|d}d|v r|d}d|v r|d}d|v r|d d|v r|d}d |v r|d }d!|v r|d!}#|d u r|#}d"|v r|d"}|d u r|}d#|v r|d#}|d u r|}d|v r|d}|d u r|}|r&|d u r |}ni ||}|d ur|d urt }$|$| ||$ v r|$| }%d|%v r^|%d}|s^|r^d$d |dD }d|%v ru|%d}|su|rut||\}}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r|%d}|d u r|}d|%v r0|%d}|d u r0|}d|%v rA|%d} d u rA| d|%v rR|%d}|d u rR|}d |%v rc|%d }|d u rc|}d!|%v rt|%d!}#|d u rt|#}d"|%v r|%d"}|d u r|}d#|%v r|%d#}|d u r|}|st	j d%}|st	j d&}&|&rt|&|\}}|sd'g}t!d(krd'g}ng d)}t|tt"fs|g}|d u r|}|st	j d*}'|'rd|'v rd+d |'dD }nt#|'}nd,}nt|tt"frd-d |D }nt#|}t$||}|d u r%t	
d.}|s%t%& }|d u r/t	
d/}|d u r9t	
d0}|d u r@|}|d u rJtd1|d u rTtd2|d u r|d u rct	
d3}|d u rwt }|rt|t' }nd }nt|}|d urt(|||||d4}g }(d5})t)||D ]*\}*}+|*drd6|*vrt	j*|*d7|+}*|(+|* q|(+|*|+f d})q|(st,d8|d u rt	
d9}|d u r|)rd:}|
d ur|
rt-j.nt-j/},n5|d u rt	j d;}|d urzt-|},W n t0y   d<*d=d> t-D }-td?|- d w t-j/},t|t1t2frzt2|}.W n t3yH   d<*d@d> t2D }-tdA|-d w |.t2j4k rSd5}n~t56t5j7}|.t2j8k|_9|.t2j:k rjt5j;|_<n|d u rtt	
dB}|r|j=|dC t5j>|_<n[zt?dD}|d ur|j=|dC ntdEW n? tjt@tAfy   |.t2j:kr|d u rdF}dG}/nd }/tjdH| dIdJ| dK|/dL|.t2j:krt5j;|_<nJ dMY nw t5j>|_<|d u rt	
dN}|r|j=|dC | jBt5jCO  _Bn&t?dO}|d urz|j=|dC W n t@tAfy   Y n	w | jBt5jCO  _B|d u r)t	
dP}|s<t?dQ}|d ur<|D s<d } sAd	 |d u rKt	
dR}|r[|jE|| fdSdTdU n$t?dV}|d urz|jE|| fdWdTdU W n t@tAfy~   Y nw tF|dXrt	j dY}0|0rtGjHjIs|0|_J|d u rt	
dZ}|rtK||_LntKd[|_L|d u rt	
d\}|rtK||_Mn|du rt5N }t2j8}.nt2jO}.|d urt|tPrtQd]d> |D rtQd^d> |R D std_|d u rt	
d`tSjT}ztS|}W n t0y   tdatSjUjR|d w |d u r(t	
db}|d u r@t	
dc}|d u r@t!d(kr>ddnde}|dfvrMtdg|tV|||||.|,||||dh
}1|(|1fS )iNT)strict_parsingservicePGSERVICEFILE>   r"   
postgresqlzQinvalid DSN: scheme is expected to be either "postgresql" or "postgres", got {!r}@r|   r~   rt   r_   r   rd   c                 S  rx   r   ry   r>   r   r   r   rm   d  rn   z/_parse_connect_dsn_and_args.<locals>.<listcomp>rv   rc   dbnamer(   r&   r'   r6   r   sslcertsslkeysslrootcertsslnegotiationsslcrlsslpasswordssl_min_protocol_versionssl_max_protocol_versionr,   r-   r.   c                 S  rx   r   ry   r>   r   r   r   rm     rn   	PGSERVICEPGHOSTr`   r5   )z/run/postgresqlz/var/run/postgresqlz/tmpz/private/tmpr`   rw   c                 S  rx   r   ry   r>   r   r   r   rm   D  rn   r{   c                 S  rx   r   ry   r>   r   r   r   rm   K  rn   PGUSER
PGPASSWORD
PGDATABASEz-could not determine user name to connect withz/could not determine database name to connect to
PGPASSFILE)rZ   r\   r(   r&   r6   Fz	.s.PGSQL.z.s.PGSQL.{}z6could not determine the database address to connect to	PGSSLMODEr   PGSSLNEGOTIATIONz, c                 s      | ]
}|j d dV  qdS r   r   Nnamer   r?   r   r   r   r   rA     s
    
z._parse_connect_dsn_and_args.<locals>.<genexpr>z+`sslnegotiation` parameter must be one of: c                 s  r   r   r   r   r   r   r   rA     s    z&`sslmode` parameter must be one of: {}PGSSLROOTCERT)cafilezroot.crtzDcannot determine location of user PostgreSQL configuration directoryz~/.postgresql/root.crtzCould not determine location of user home directory (HOME is either unset, inaccessible, or does not point to a valid directory)zroot certificate file "z&" does not exist or cannot be accessedz4Provide the certificate file directly or make sure "z" exists and is readable.)hintdetailunreachablePGSSLCRLzroot.crlPGSSLKEYzpostgresql.key	PGSSLCERTc                         S Nr   r   r   r   r   <lambda>      z-_parse_connect_dsn_and_args.<locals>.<lambda>)keyfiler'   zpostgresql.crtc                     r   r   r   r   r   r   r   r     r   keylog_filenameSSLKEYLOGFILEPGSSLMINPROTOCOLVERSIONzTLSv1.2PGSSLMAXPROTOCOLVERSIONc                 s      | ]}t |tV  qd S r   r   r^   )r?   kr   r   r   rA   3      c                 s  r   r   r   )r?   vr   r   r   rA   4  r   z:server_settings is expected to be None or a Dict[str, str]PGTARGETSESSIONATTRSz<target_session_attrs is expected to be one of {!r}, got {!r}PGKRBSRVNAMEPGGSSLIBsspigssapi>   r   r   z<gsslib parameter must be either 'gssapi' or 'sspi', got {!r}r%   )Wr   r   urlparsequeryparse_qsitemsr   ro   popr   getenvr   get_pg_home_directoryPG_SERVICEFILEr   r   schemer   rq   rG   netlocr   r   pathrO   ru   rS   configparserConfigParserreadsectionsr   r   rH   rQ   rz   rs   getpassgetuserr   rj   rb   joinrP   InternalClientErrorr!   r#   r"   
ValueErrorr^   r   AttributeErrorr   r   
SSLContextPROTOCOL_TLS_CLIENTr   check_hostnamer   	CERT_NONEverify_modeload_verify_locationsCERT_REQUIREDr   FileNotFoundErrorNotADirectoryErrorverify_flagsVERIFY_CRL_CHECK_CHAINrC   load_cert_chainhasattrsysflagsignore_environmentr   r   minimum_versionmaximum_versioncreate_default_contextr   dictallvaluesSessionAttributeany__members___ConnectionParameters)2dsnrc   rd   r&   r'   r6   r(   r)   r   servicefile
direct_tlsr+   r,   r-   r.   
auth_hostsr   r   r   r   r   r   r   parsedr   keyvalconnection_service_filer   dsn_authr   dsn_hostspecdsn_userdsn_passworddsn_databasedsn_target_session_attrs
pg_serviceservice_paramsr   r   addrshave_tcp_addrshr@   sslnegmodesr   r   
keylogfileparamsr   r   r   _parse_connect_dsn_and_args  s  








































































































































	


























	




r  c                 C  s   t  }dD ]}|| }|d u st|ts|dk r td||q|d urHzt|tr-tt|}|dkr7tW n tyG   td|d w t| ||||||||||||||d\}}t|||	|
d}|||fS )N>   r2   r4   r3   r   z4{} is expected to be greater or equal to 0, got {!r}zGinvalid command_timeout value: expected greater than 0 float (got {!r}))r  rc   rd   r&   r'   r6   r)   r
  r(   r+   r,   r-   r.   r   r	  r0   )localsr   boolr   rG   floatr  _ClientConfiguration)r  rc   rd   r&   r'   r6   r(   r1   r2   r3   r4   r)   r
  r+   r,   r-   r.   r   r	  
local_varsvar_namevar_valr  r  configr   r   r   _parse_connect_arguments^  sV   

	
r(  c                   @  s*   e Zd ZdddZdddZdddZdS )TLSUpgradeProtoloopasyncio.AbstractEventLooprc   r^   rd   rz   ssl_contextssl_module.SSLContextssl_is_advisoryr!  r8   Nonec                 C  s&   t || _|| _|| _|| _|| _d S r   )_create_futureon_datarc   rd   r,  r.  )selfr*  rc   rd   r,  r.  r   r   r   __init__  s
   

zTLSUpgradeProto.__init__databytesc                 C  sf   |dkr| j d d S | jr"| jjtjkr"|dkr"| j d d S | j tdj	| j
| jd d S )N   ST   NFz9PostgreSQL server at "{host}:{port}" rejected SSL upgrade)rc   rd   )r1  
set_resultr.  r,  r   r   r   set_exceptionConnectionErrorrG   rc   rd   )r2  r4  r   r   r   data_received  s   zTLSUpgradeProto.data_receivedexctyping.Optional[Exception]c                 C  s.   | j  s|d u rtd}| j | d S d S )Nz!unexpected connection_lost() call)r1  doner:  r9  r2  r<  r   r   r   connection_lost  s
   
zTLSUpgradeProto.connection_lostN)r*  r+  rc   r^   rd   rz   r,  r-  r.  r!  r8   r/  )r4  r5  r8   r/  )r<  r=  r8   r/  )r   r   r   r3  r;  r@  r   r   r   r   r)    s    

r)  _ProctolFactoryR)bound)r.  protocol_factoryCallable[[], _ProctolFactoryR]rc   rd   rz   r*  r+  r,  r-  r.  r!  1typing.Tuple[asyncio.Transport, _ProctolFactoryR]c             	     sv    fdd I d H \}}|tddd z|jI d H }W n ttjfy6   |   w t	drx|rbzj
|| dI d H }	|	d usQJ W n ttjfya   |   w |}	|  }
||
_|
|	 |	|
 |	|
fS tj | }|rtj| d}t|}| }t| |  z||d	I d H \}	}
||
_|	|
fW S  ttjfy   |   w )
Nc                     s   t  S r   )r)  r   rc   r*  rd   r,  r.  r   r   r     s    z(_create_ssl_connection.<locals>.<lambda>z!ll   i/	start_tls)server_hostname)r)   rI  sock)create_connectionwritestructpackr1  	ExceptionasyncioCancelledErrorcloser   rH  is_sslconnection_madeset_protocol	functoolspartial_get_socketdup_set_nodelay)rC  rc   rd   r*  r,  r.  trprdo_ssl_upgradenew_trpg_protoconn_factoryrK  r   rF  r   _create_ssl_connection  s`   



rb  c           
        s   |d usJ |}t |jr"| }t|r|I d H }|j|d}| |||||f}|jtjkr9|}	|jd d}n|jtjkrF|jd d}	nt	|dg|R  I d H S zt	|dg|R  I d H W S  t
yh   Y nw t	|	dg|R  I d H S )N)r'   )r)   FT)callabler'   inspectisawaitable_replacer   r   r   r   __connect_addr_RetryConnectSignal)
r   r*  r  r'  connection_classrecord_classparams_inputr'   argsparams_retryr   r   r   _connect_addr  s*   	


rn  c                   @  s   e Zd ZdS )rh  N)r   r   r   r   r   r   r   rh  &  s    rh  c              	     sJ  t  fdd}t tr| }	n6jr2jtju r2j|g R dji}	njrHt	|g R jj
tjkd}	n	j|g R  }	|	I d H \}
}zI d H  W n5 tjtjfy   |
  |rj
tjkry|jrj
tjkr|jrt   ttjfy   |
   w |||
 ||}|| |S )Nc                     s   t  S r   )r   Protocolr   r   	connectedr*  r  rj  r   r   r   6  s    
z __connect_addr.<locals>.<lambda>r)   r*  r,  r.  )r0  r   r^   create_unix_connectionr)   r*   r!   r#   rL  rb  r   r   r   r   &InvalidAuthorizationSpecificationErrorConnectionDoesNotExistErrorrS  r   rT  rh  rP  rQ  rR  set_connection)r  retryr   r*  r'  ri  rj  rk  proto_factory	connectorr\  r]  conr   rp  r   rg  *  sV   






rg  c                   @  s$   e Zd ZdZdZdZdZdZdZdS )r  r  primarystandbyzprefer-standbyz
read-writez	read-onlyN)	r   r   r   r  r{  r|  prefer_standby
read_write	read_onlyr   r   r   r   r  u  s    r  should_be_in_hot_standbyc                       fdd}|S )a  
    If the server didn't report "in_hot_standby" at startup, we must determine
    the state by checking "SELECT pg_catalog.pg_is_in_recovery()".
    If the server allows a connection and states it is in recovery it must
    be a replica/standby server.
    c                   sF   |   }t|dd }|d ur|dk}| kS | dI d H }| kS )Nin_hot_standbyonz%SELECT pg_catalog.pg_is_in_recovery())get_settingsr   fetchval)
connectionsettingshot_standby_statusis_in_hot_standbyr  r   r   can_be_used  s   
z+_accept_in_hot_standby.<locals>.can_be_usedr   )r  r  r   r  r   _accept_in_hot_standby~  s   r  should_be_read_onlyc                   r  )zJ
    Verify the server has not set default_transaction_read_only=True
    c                   s4   |   }t|dd}|dkr S t | I d H S )Ndefault_transaction_read_onlyoffr  )r  r   r  )r  r  is_readonlyr  r   r   r    s   z&_accept_read_only.<locals>.can_be_usedr   )r  r  r   r  r   _accept_read_only  s   r  c                   s   dS NTr   )r   r   r   r   _accept_any  s   r  Tattrc                   s   t | }|| I d H S r   )target_attrs_check)r  r  can_user   r   r   _can_use_connection  s   r  c                   s"  | d u r	t  } tdi |\}}}|j}g }d }	d }
zV|D ]7}z!t|| ||||dI d H }|| t||I d H rA|}	W  n"W q tyV } z|}
W Y d }~qd }~ww |tj	krc|rct
|}	W dd }|rrt |||	 ndd }|rt |||	 w w |	r|	S |
ptd|)N)r   r*  r  r'  ri  rj  c                   s*   t j fdd| D ddiI d H  d S )Nc                 3  s     | ]}| ur|  V  qd S r   )rS  )r?   cchosenr   r   rA     s    z6_connect.<locals>._close_candidates.<locals>.<genexpr>return_exceptionsT)rQ  gather)connsr  r   r  r   _close_candidates  s   z#_connect.<locals>._close_candidatesz=None of the hosts match the target attribute requirement {!r}r   )rQ  get_event_loopr(  r,   rn  rP   r  OSErrorr  r}  randomchoicecreate_taskr   TargetServerAttributeNotMatchedrG   )r*  ri  rj  kwargsr  r  r'  target_attr
candidateschosen_connection
last_errorr   connexr  r   r   r   _connect  sb   

r  r  r  c           	        s   G  fdddt j}t|tr ||I d H \}}n5|jr>|jtjkr>t	|g|R  |j|jtj
kdI d H \}}n j|g|R  I d H \}}tt| tddd||}z|| |jI d H  W |  d S |  w )Nc                      s    e Zd Z fddZdd ZdS )z_cancel.<locals>.CancelProtoc                   s   t  | _d| _d S )NF)r0  on_disconnectrT  )r2  r*  r   r   r3    s   

z%_cancel.<locals>.CancelProto.__init__c                 S  s   | j  s| j d d S d S r  )r  r>  r8  r?  r   r   r   r@    s   
z,_cancel.<locals>.CancelProto.connection_lostN)r   r   r   r3  r@  r   r  r   r   CancelProto  s    r  rr  z!llll   i.)rQ  ro  r   r^   rs  r)   r   r   r   rb  r   rL  r[  rY  rN  rO  rM  r  rS  )	r*  r   r  backend_pidbackend_secretr  r\  r]  msgr   r  r   _cancel  s2   



r  c                 C  s$   |  d}|d u rtd| |S )Nsocketz+could not get the socket for transport {!r})get_extra_infor:  rG   )	transportrK  r   r   r   rY    s   
rY  c                 C  s0   t tdr| jtjkr| tjtjd d S d S )NAF_UNIXr   )r   r  familyr  
setsockoptIPPROTO_TCPTCP_NODELAYrJ  r   r   r   r[    s   r[  c                 C  s.   z| j }W | S  ty   tj| d Y S w )Nr  )create_futurer   rQ  Future)r*  r  r   r   r   r0    s   r0  )r6   r7   r8   r9   )
r6   rY   rZ   r[   r\   r]   r(   r^   r&   r^   )r8   rY   )rC  rD  rc   r^   rd   rz   r*  r+  r,  r-  r.  r!  r8   rE  )r  r!  )r  r!  )r  r  )r  r  )O
__future__r   rQ  r   collectionscollections.abcr   enumrW  r   r   r   platformr  rR   r  r)   r   rI   rN  r   typingurllib.parser   rE   rd  r|   r   r   r   IntEnumr   StrEnumr!   
namedtupler  r#  unamesystemrH   r   r   rX   rj   rs   r   r   r   r  r(  ro  r)  TypeVar	protocolsrA  rb  rn  rP  rh  rg  r^   Enumr  r  r  r  r  r{  r|  r}  r~  r  r  r  r  r  rY  r[  r0  r   r   r   r   <module>   s   



+%@
	    N1(B(K
	








2&	