o
    h;                     @   s  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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ej$dej%ej&e'df  fddZ(dej)ej$ dej%e' dej%e* de'de'f
ddZ+dd Z,ddd d!Z-d"d# Z.dej)ej$ fd$d%Z/d&d' Z0d(d) Z1G d*d+ d+e j2Z3dd,d-d.Z4d/d0 Z5G d1d2 d2e6Z7d3d4 Z8G d5d6 d6e'ej9Z:d7e;fd8d9Z<d:e;fd;d<Z=d=d> Z>e:j?e>e:j@e<de:jAe<d?e:jBe<d?e:jCe=de:jDe=d?iZEd@e:fdAdBZFdCdD ZGdEefdFdGZHdHdI ZIdJdK ZJdLdM ZKdS )N    N   )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   i/var/www/html/construction_image-detection-poc/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   0   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.pgpasspassfilereturn.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 filer3   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 )r9   r8   N)r   .0pr   r   r   	<genexpr>y   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)r4   passtabfliner   r   r   _read_password_fileX   sH   rT   hostsportsr&   r$   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*)rT   ziprK   str)r4   rU   rV   r&   r$   rQ   hostportphostpport	pdatabasepuser	ppasswordr   r   r   _read_password_from_pgpass   s$   
rc   c                    sV   t  trt t| krtdt t|  S  fddtt| D   S )Nz+could not match {} port numbers to {} hostsc                    s   g | ]} qS r   r   )r;   r   r]   r   r   
<listcomp>   s    z'_validate_port_spec.<locals>.<listcomp>)r   listlenr   ClientConfigurationErrorrC   range)rU   r]   r   rd   r   _validate_port_spec   s   
rj   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   re          z#_parse_hostlist.<locals>.<listcomp>8  r   rW    [z(?:\[([^\]]+)\])(?::([0-9]+))?r   r   z0invalid IPv6 address in the connection URI: {!r}:)rO   osenvirongetrq   rj   	enumeraterN   matchgroupr   rh   rC   	partitionurllibr   rl   rL   )hostlistr]   rl   	hostspecsrU   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: )rK   r   rh   
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           -         s,  d }d  } } } } d  }}d }| rt j| }|jdvr)td|j|jrAd|jv r;|jd\}}}n
|j}d}nd }}|rP|d\}}}nd }}|sa|rat	||dd\}}|j
r||d u r||j
}|drv|d	d  }t j|}|d u r|rt j|}|d u r|rt j|}|jrt jj|jdd
}| D ]\}}t|tr|d ||< qd|v r|d}|s|rdd |dD }d|v r|d}|s|rt	||\}}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 r1|d}|d u r1|}d|v rB|d}|d u rB|}d|v rL|d}d|v rV|d}d|v r`|d}d|v rj|d}d|v rt|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|}|r|	d u r|}	ni ||	}	|stjd"} | rt	| |\}}|sd#g}td$krd#g}ng d%}t|ttfs|g}|d u r|}|s2tjd&}!|!r/d|!v r*d'd |!dD }nt|!}nd(}nt|ttfrBd)d |D }nt|}t||}|d u r\td*}|s\t }|d u rftd+}|d u rptd,}|d u rw|}|d u rtd-|d u rtd.|d u r|d u rtd/}|d u rt }"|"r|"t  }nd }nt!"|}|d urt#|||||d0}g }#d1}$t$||D ]*\}%}&|%drd2|%vrtj
%|%d3|&}%|#&|% q|#&|%|&f d}$q|#st'd4|d u rtd5}|d u r|$rd6}|d ur |rt(j)nt(j*}'n5|d u r+tjd7}|d urRzt(|}'W n t+yQ   d8%d9d: t(D }(td;|( d w t(j*}'t|t,t-frzt-|})W n t.y   d8%d<d: t-D }(td=|(d w |)t-j/k rd1}n~t01t0j2}|)t-j3k|_4|)t-j5k rt0j6|_7n|d u rtd>}|r|j8|d? t0j9|_7n[zt:d@}|d ur|j8|d? ntdAW n? tjt;t<fy   |)t-j5kr|d u rdB}dC}*nd }*tjdD| dEdF| dG|*dH|)t-j5kr	t0j6|_7nJ dIY nw t0j9|_7|d u rtdJ}|r0|j8|d? | j=t0j>O  _=n&t:dK}|d urVz|j8|d? W n t;t<fyM   Y n	w | j=t0j>O  _=|d u r`tdL}|sst:dM}|d urs|? ssd } sxd |d u rtdN}|r|j@|| fdOdPdQ n$t:dR}|d urz|j@|| fdSdPdQ W n t;t<fy   Y nw tA|dTrtjdU}+|+rtBjCjDs|+|_E|d u rtdV}|rtF||_GntFdW|_G|d u rtdX}|rtF||_Hn|du rt0I }t-j3})nt-jJ})|	d ur.t|	tKr)tLdYd: |	D r)tLdZd: |	M D s.td[|
d u r:td\tNjO}
ztN|
}
W n t+yT   td]tNjPjM|
d w |d u r_td^}|d u rwtd_}|d u rwtd$krud`nda}|dbvrtdc|tQ|||||)|'|	|
||dd
},|#|,fS )eN>   r    
postgresqlzQinvalid DSN: scheme is expected to be either "postgresql" or "postgres", got {!r}@rt   rv   Trk   rW   r   )strict_parsingr]   c                 S   ro   r   rp   r:   r   r   r   re   E  rr   z/_parse_connect_dsn_and_args.<locals>.<listcomp>rm   r\   dbnamer&   r$   r%   r4   r   sslcertsslkeysslrootcertsslnegotiationsslcrlsslpasswordssl_min_protocol_versionssl_max_protocol_versionr*   r+   r,   PGHOSTrX   r3   )z/run/postgresqlz/var/run/postgresqlz/tmpz/private/tmprX   rn   c                 S   ro   r   rp   r:   r   r   r   re     rr   rs   c                 S   ro   r   rp   r:   r   r   r   re     rr   PGUSER
PGPASSWORD
PGDATABASEz-could not determine user name to connect withz/could not determine database name to connect to
PGPASSFILE)rU   rV   r&   r$   r4   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   r=     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   r=     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>x      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   r=         c                 s   r   r   r   )r;   vr   r   r   r=     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#   )Rr~   r   urlparseschemer   rh   rC   netlocr}   r   pathrK   rl   queryparse_qsitemsr   rf   poprO   rw   rx   ry   rD   rM   rq   rj   getenvgetpassgetuserr   get_pg_home_directoryr   r   r   rc   rZ   joinrL   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_CHAINr?   load_cert_chainhasattrsysflagsignore_environmentr   r   minimum_versionmaximum_versioncreate_default_contextr   dictallvaluesSessionAttributeany__members___ConnectionParameters)-dsnr\   r]   r$   r%   r4   r&   r'   
direct_tlsr)   r*   r+   r,   
auth_hostsr   r   r   r   r   r   r   parseddsn_authr   dsn_hostspecdsn_userdsn_passworddsn_databaser   keyvaldsn_target_session_attrsr   r   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>   r0   r2   r1   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   r\   r]   r$   r%   r4   r'   r   r&   r)   r*   r+   r,   r.   )localsr   boolr   rC   floatr  _ClientConfiguration)r   r\   r]   r$   r%   r4   r&   r/   r0   r1   r2   r'   r   r)   r*   r+   r,   
local_varsvar_namevar_valr  r
  configr   r   r   _parse_connect_arguments  sT   


r  c                   @   s$   e Zd Zdd Zdd Zdd ZdS )TLSUpgradeProtoc                 C   s&   t || _|| _|| _|| _|| _d S r   )_create_futureon_datar\   r]   ssl_contextssl_is_advisory)selfloopr\   r]   r  r  r   r   r   __init__  s
   

zTLSUpgradeProto.__init__c                 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)r\   r]   )r  
set_resultr  r  r   r   r   set_exceptionConnectionErrorrC   r\   r]   )r  datar   r   r   data_received  s   zTLSUpgradeProto.data_receivedc                 C   s.   | j  s|d u rtd}| j | d S d S )Nz!unexpected connection_lost() call)r  doner!  r   r  excr   r   r   connection_lost  s
   
zTLSUpgradeProto.connection_lostN)r   r   r   r  r#  r'  r   r   r   r   r    s    r  )r  c             	      sj    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rr|r\zj
|| dI d H }	W n ttjfy[   |   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   r\   r  r]   r  r  r   r   r   #  s    z(_create_ssl_connection.<locals>.<lambda>z!ll   i/	start_tls)server_hostname)r'   r+  sock)create_connectionwritestructpackr  	ExceptionasyncioCancelledErrorcloser   r*  is_sslconnection_madeset_protocol	functoolspartial_get_socketdup_set_nodelay)protocol_factoryr\   r]   r  r  r  trprdo_ssl_upgradenew_trpg_protoconn_factoryr-  r   r(  r   _create_ssl_connection  s^   



rE  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_addrV  s*   	


rQ  c                   @   s   e Zd ZdS )rK  N)r   r   r   r   r   r   r   rK  ~  s    rK  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
  rM  r   r   r     s    
z __connect_addr.<locals>.<lambda>r'   r  r  r  )r  r   r[   create_unix_connectionr'   r(   r   r!   r.  rE  r   r   r   r   &InvalidAuthorizationSpecificationErrorConnectionDoesNotExistErrorr5  r   r6  rK  r2  r3  r4  set_connection)r
  retryr   r  r  rL  rM  rN  proto_factory	connectorr?  r@  conr   rS  r   rJ    sV   






rJ  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     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rc  r   r   can_be_used  s   
z+_accept_in_hot_standby.<locals>.can_be_usedr   )rc  rn  r   rm  r   _accept_in_hot_standby  s   ro  should_be_read_onlyc                    rd  )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offrf  )rg  r   ro  )ri  rj  is_readonlyrp  r   r   rn    s   z&_accept_read_only.<locals>.can_be_usedr   )rp  rn  r   rt  r   _accept_read_only  s   ru  c                    s   dS NTr   )r   r   r   r   _accept_any  s   rw  Tattrc                    s   t | }|| I d H S r   )target_attrs_check)ri  rx  can_user   r   r   _can_use_connection  s   r{  c                    s  | d u r	t  } tdi |\}}}|j}g }d  d }	|D ]7}
z!t|
| ||||dI d H }|| t||I d H r@| W  n"W q tyU } z|}	W Y d }~qd }~ww |tj	krb|rbt
| t j fdd|D ddiI d H   rx S |	ptd|)N)r   r  r
  r  rL  rM  c                 3   s     | ]}| ur|  V  qd S r   )r5  )r;   cchosen_connectionr   r   r=   ,  s    z_connect.<locals>.<genexpr>return_exceptionsTz=None of the hosts match the target attribute requirement {!r}r   )r3  get_event_loopr  r*   rQ  rL   r{  OSErrorr   r`  randomchoicegatherr   TargetServerAttributeNotMatchedrC   )r  rL  rM  kwargsr  r
  r  target_attr
candidates
last_errorr   connexr   r}  r   _connect  sP   

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)r  on_disconnectr6  )r  r  r   r   r  >  s   

z%_cancel.<locals>.CancelProto.__init__c                 S   s   | j  s| j d d S d S rv  )r  r$  r  r%  r   r   r   r'  B  s   
z,_cancel.<locals>.CancelProto.connection_lostN)r   r   r   r  r'  r   r  r   r   CancelProto<  s    r  rU  z!llll   i.)r3  rR  r   r[   rV  r'   r   r   r   rE  r   r.  r=  r;  r0  r1  r/  r  r5  )	r  r   r
  backend_pidbackend_secretr  r?  r@  msgr   r  r   _cancel9  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!  rC   )	transportr-  r   r   r   r;  _  s   
r;  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_NODELAYr,  r   r   r   r=  h  s   r=  c                 C   s.   z| j }W | S  ty   tj| d Y S w )Nr  )create_futurer   r3  Future)r  r  r   r   r   r  m  s   r  )Lr3  collectionsenumr9  r   rw   r   platformr  rN   r  r'   r   rE   r0  r   typingurllib.parser~   rA   rG  rt   r   r   r   IntEnumr   StrEnumr   
namedtupler   r  unamesystemrD   r   r   ListTupler[   rT   Optionalrq   rc   rj   r   r   r   r  r  rR  r  rE  rQ  r2  rK  rJ  Enumr   r  ro  ru  rw  r   r^  r_  r`  ra  rb  ry  r{  r  r  r;  r=  r  r   r   r   r   <module>   s   


+

%@	   F/"7(K	





,&	