
    &gJR                    F   S r SSKJr  SSKrSSKrSSKrSSKJrJrJ	r	J
r
JrJrJrJr  SSKJr  SSKJr  SSKJr  SSKJrJrJrJr  SS	KJrJr  SS
KJr  \(       a  SSKJ r   Sr!\"" \!5      r#Sr$\"" \$5      r%Sr&S$S jr'S%S jr(      S&S jr)\&4S'S jjr*1 Skr+S(S jr,S)S jr-S)S jr.S)S jr/S*S+S jjr0 S,         S-S jjr1\&4S.S jjr2\Rf                  " S\Rh                  " S5      -   S-   5      r5\6" / S Q5      r7S/S! jr8S0S" jr9\&SSSS4             S1S# jjr:g)2zTools to parse and validate a MongoDB URI.

.. seealso:: This module is compatible with both the synchronous and asynchronous PyMongo APIs.
    )annotationsN)TYPE_CHECKINGAnyMappingMutableMappingOptionalSizedUnioncast)unquote_plus)_have_dnspython)_parse_ssl_options)INTERNAL_URI_OPTION_NAME_MAPURI_OPTIONS_DEPRECATION_MAP_CaseInsensitiveDictionaryget_validated_options)ConfigurationError
InvalidURI)_Address)
SSLContextz
mongodb://zmongodb+srv://ii  c                ~    [        [        U 5      5       H%  nX   S:X  d  M  XUS-    n[        U5      U:X  d  M%    g   g)zCheck for unescaped percent signs.

:param s: A string. `s` can have things like '%25', '%2525',
       and '%E2%85%A8' but cannot have unquoted percent like '%foo'.
%   TF)rangelenr   )sisubs      ^C:\Suresh\moveshuttle\MDcreated\moveengine\venv\Lib\site-packages\pymongo/uri_parser_shared.py_unquoted_percentr    :   sC     3q6]43;A,C C C'      c                    SU ;   d%  U R                  S5      S:  d  [        U 5      (       a  [        S5      eU R                  S5      u  pnU(       d  [        S5      e[	        U5      [	        U5      4$ )aB  Validates the format of user information in a MongoDB URI.
Reserved characters that are gen-delimiters (":", "/", "?", "#", "[",
"]", "@") as per RFC 3986 must be escaped.

Returns a 2-tuple containing the unescaped username followed
by the unescaped password.

:param userinfo: A string of the form <username>:<password>
@:   zXUsername and password must be escaped according to RFC 3986, use urllib.parse.quote_plusz&The empty string is not valid username)countr    r   	partitionr   )userinfouser_passwds       r   parse_userinfor,   J   sr     h(..-15Fx5P5P4
 	

 ((-ODVABB|F333r!   c                    U R                  S5      S:X  a  [        S5      eU R                  S5      nUS:X  a  U SS U4$ U SU XS-   S 4$ )a  Validates an IPv6 literal host:port string.

Returns a 2-tuple of IPv6 literal followed by port where
port is default_port if it wasn't specified in entity.

:param entity: A string that represents an IPv6 literal enclosed
                in braces (e.g. '[::1]' or '[::1]:27017').
:param default_port: The port number to use when one wasn't
                      specified in entity.
]zNan IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.z]:r%      N)find
ValueError)entitydefault_portr   s      r   parse_ipv6_literal_hostr5   b   sf     {{32\
 	
 	DABwa|\))!A;1uw''r!   c                z   U nUnU S   S:X  a  [        X5      u  p#ObU R                  S5      (       a  X4$ U R                  S5      S:w  a4  U R                  S5      S:  a  [	        S5      eUR                  SS5      u  p#[        U[        5      (       a  UR                  5       (       dO  [        S U 5       5      (       a-  U H'  nUR                  5       (       d  M  [	        S	U< 35      e   [	        S
5      e[        U5      S:  d  [        U5      S::  a  [	        S5      e[        U5      nUR                  5       U4$ )aU  Validates a host string

Returns a 2-tuple of host followed by port where port is default_port
if it wasn't specified in the string.

:param entity: A host or host:port string where host could be a
                hostname or IP address.
:param default_port: The port number to use when one wasn't
                      specified in entity.
r   [.sockr$   r/   r%   zReserved characters such as ':' must be escaped according RFC 2396. An IPv6 address literal must be enclosed in '[' and ']' according to RFC 2732.c              3  n   #    U  H+  oR                  5       =(       d    UR                  5       v   M-     g 7f)N)isspaceisdigit).0cs     r   	<genexpr>parse_host.<locals>.<genexpr>   s"     <t!99;-!))+-ts   35z$Port contains whitespace character: zPort contains non-digit characters. Hint: username and password must be escaped according to RFC 3986, use urllib.parse.quote_plusi  z+Port must be an integer between 0 and 65535)r5   endswithr1   r&   r2   split
isinstancestrr;   allr:   intlower)r3   r4   hostportr=   s        r   
parse_hostrI   y   s.    D&2DayC,VB
d		!	!##	S	R	<<q 1  ZZQ'
$||~~<t<<<Ayy{{(+OPQu)UVV  8  t9uD	QJKK4y ::<r!   >   tlsallowinvalidhostnamestlsallowinvalidcertificatestlsdisableocspendpointcheckc                f   [        5       nU R                  U5       H  nUR                  S5      u  pEUR                  5       S:X  a#  UR                  U/ 5      R	                  U5        MM  XB;   a  [
        R                  " SU S3SS9  UR                  5       S:X  a  UnO[        U5      nXbU'   M     U$ )zHelper method for split_options which creates the options dict.
Also handles the creation of a list for the URI tag_sets/
readpreferencetags portion, and the use of a unicode options string.
=readpreferencetagszDuplicate URI option 'z'.r0   
stacklevelauthmechanismproperties)r   rA   rF   
setdefaultappendwarningswarnr   )optsdelimoptionsurioptkeyvaluevals          r   _parse_optionsr^      s    
 )*G**U#\\#&
99;..sB'..u5~ 6se2>1Myy{77"5)CL $ Nr!   c                   U R                  S5      nUbA  [         H7  nX ;   d  M
  Sn[        X0R                  S5      U R                  U5      4-  5      e   U R                  S5      nUb1  SU ;   a!  Sn[        USU R                  S5      4-  5      eUSL a  SU S'   U R                  S5      nUb-  S H'  nU R                  U5      SL d  M  Sn[        X24-  5      e   S	U ;   aj  S
U ;   ad  SS jnU" U R                  S	5      5      U" U R                  S
5      5      :w  a/  Sn[        X0R                  S	5      U R                  S
5      4-  5      eU $ )zRaise appropriate errors when conflicting TLS options are present in
the options dictionary.

:param options: Instance of _CaseInsensitiveDictionary containing
      MongoDB URI options.
tlsinsecurez9URI options %s and %s cannot be specified simultaneously.rK   rL   T
tlscrlfile)r`   rK   rL   zDURI option %s=True cannot be specified when CRL checking is enabled.ssltlsc                J    U S;   a  U S:H  $ [        U [        5      (       a  U $ U $ )N)truefalsere   )rB   bool)r]   s    r   truth_value-_handle_security_options.<locals>.truth_value   s,    ''f}$#t$$
Jr!   z=Can not specify conflicting values for URI options %s and %s.)r]   r   returnr   )get_IMPLICIT_TLSINSECURE_OPTSr   	cased_key)rY   r`   opterr_msgtlsallowinvalidcertsra   rh   s          r   _handle_security_optionsrq      sv    ++m,K-C~U 00?ARARSVAWXX  . #;;'DE'(G3QG0'2C2CDa2bcd   4'59G12 \*J`C{{34'` 6!122 a
 EW,	 w{{5)*k'++e:L.MMUGW(9(9%(@'BSBSTYBZ'[[\\Nr!   c                   [        U 5       H  nU[        ;   d  M  [        U   u  p#US:X  a  UnX@;   aQ  Sn[        R                  " XPR	                  U5      U R	                  U5      4-  [
        SS9  U R                  U5        Mx  Sn[        R                  " XPR	                  U5      U4-  [
        SS9  M  US:X  d  M  Sn[        R                  " XPR	                  U5      U4-  [
        SS9  M     U $ )a'  Issue appropriate warnings when deprecated options are present in the
options dictionary. Removes deprecated option key, value pairs if the
options dictionary is found to also have the renamed option.

:param options: Instance of _CaseInsensitiveDictionary containing
      MongoDB URI options.
renamedz0Deprecated option '%s' ignored in favor of '%s'.r0   rP   z,Option '%s' is deprecated, use '%s' instead.removedzOption '%s' is deprecated. %s.)listr   rU   rV   rm   DeprecationWarningpop)rY   optnamemodemessage
newoptnamewarn_msgs         r   _handle_option_deprecationsr}      s     =117@MDy $
(QHMM $5$5g$>@Q@QR\@]#^^*#$
 KK(I 1 1' :JGG& 
 "; 1 1' :GDD& - !8 Nr!   c                    U R                  S5      nUb  [         H  nXU'   M	     [        U 5       H2  n[        R                   " US5      nUc  M  U R	                  U5      X'   M4     U $ )zNormalizes option names in the options dictionary by converting them to
their internally-used names.

:param options: Instance of _CaseInsensitiveDictionary containing
      MongoDB URI options.
r`   N)rk   rl   ru   r   rw   )rY   r`   rn   rx   intnames        r   _normalize_optionsr   &  si     ++m,K-C&CL . =.227DA&{{73G !
 Nr!   Fc                    [        X5      $ )a  Validates and normalizes options passed in a MongoDB URI.

Returns a new dictionary of validated and normalized options. If warn is
False then errors will be thrown for invalid options, otherwise they will
be ignored and a warning will be issued.

:param opts: A dict of MongoDB URI options.
:param warn: If ``True`` then warnings will be logged and
      invalid options will be ignored. Otherwise invalid options will
      cause errors.
)r   )rW   rV   s     r   validate_optionsr   <  s     !,,r!   Tc                   U R                  S5      nU R                  S5      n US:  a  US:  a  [        S5      eUS:  a  [        U S5      nO;US:  a  [        U S5      nO(U R                  S5      S:w  a  [        U S5      nO[        e[	        U5      n[        U5      nU(       a  [        U5      nU(       a9  [        [        [        Xb5      5      nUR                  S	5      S
:X  a  [        S5      eU$ ! [         a    [        S5      Sef = f)a  Takes the options portion of a MongoDB URI, validates each option
and returns the options in a dictionary.

:param opt: A string representing MongoDB URI options.
:param validate: If ``True`` (the default), validate and normalize all
      options.
:param warn: If ``False`` (the default), suppress all warnings raised
      during validation of options.
:param normalize: If ``True`` (the default), renames all options to their
      internally-used names.
&;r   z-Can not mix '&' and ';' for option separatorsrN   r/   Nz'MongoDB URI options are key=value pairs
authsource z1the authSource database cannot be an empty string)r1   r   r^   r2   rq   r}   r   r   r   r   rk   )rW   validaterV   	normalizeand_idxsemi_idxrY   s          r   split_optionsr   K  s    iinGyy~HNa<HMLMM\$T3/G]$T3/GYYs^r!$T40G 'w/G)'2G$W-13CG3RS;;|$*PQQN  NBCMNs   )C3 C3 !!C3 C3 3D
c                    / nU R                  S5       HI  nU(       d  [        S5      eUnUR                  S5      (       a  SnUR                  [	        X45      5        MK     U$ )a  Takes a string of the form host1[:port],host2[:port]... and
splits it into (host, port) tuples. If [:port] isn't present the
default_port is used.

Returns a set of 2-tuples containing the host name (or IP) followed by
port number.

:param hosts: A string of the form host1[:port],host2[:port],...
:param default_port: The port number to use when one wasn't specified
      for a host.
,z(Empty host (or extra comma in host list)r8   N)rA   r   r@   rT   rI   )hostsr4   nodesr3   rH   s        r   split_hostsr   x  s\     E++c"$%OPP??7##DZ-. # Lr!   r7   z/ "$r.   )r   
authSource
replicaset
replicaSetloadbalancedloadBalancedc                J   [        U 5      S:  a!  UR                  S5      (       a  [        S5      eUR                  S5      (       a]  [        U 5      S:  a  [        S5      eUR                  S5      (       a  [        S5      eUR                  S5      (       a  [        S5      eg g )	Nr%   directconnectionz8Cannot specify multiple hosts with directConnection=truer   z4Cannot specify multiple hosts with loadBalanced=truez;Cannot specify directConnection=true with loadBalanced=truer   z0Cannot specify replicaSet with loadBalanced=true)r   rk   r   )r   rY   s     r   _check_optionsr     s    
5zA~'++&899 ![\\{{>""u:>$%[\\;;)**$%bcc;;|$$$%WXX % #r!   c                   U (       d  0 $ [        U [        5      (       d  [        S5      e0 nU R                  5        H  u  p#[        U[        5      (       d  [        SU S35      eUR	                  SS5        [        U5      n[        U5      n[        U5      n[        [
        [        U5      5      n[        U5      u  pVUc  [        S5      eU(       a  [        S5      eS H  nXt;   a  [        S	U 35      eXQU'   M     M     U$ )
z!Parse KMS TLS connection options.zkms_tls_options must be a dictzkms_tls_options["z"] must be a dictrc   Tz!TLS is required for KMS providerszInsecure TLS options prohibited)tlsInsecuretlsAllowInvalidCertificatestlsAllowInvalidHostnames$tlsDisableCertificateRevocationCheckz!Insecure TLS options prohibited: )rB   dict	TypeErroritemsrS   r   rq   r   r   r   r   r   )kms_tls_optionscontextsproviderrY   rW   ssl_contextallow_invalid_hostnamesns           r   _parse_kms_tls_optionsr     s   	ot,,899H,224'4((/z9JKLL5$')'2'-!$'.0@0FG/A$/G,$%HII"$%FGG
A y(+LQC)PQQ!,X
 5. Or!   c                P   U R                  [        5      (       a  SnU [        S  nOvU R                  [        5      (       aB  [	        5       (       d'  [
        R                  =(       d    Sn[        SU-  5      eSnU [        S  nO[        S[         S[         S35      eU(       d  [        S5      eS n	S n
S nS n[        5       nUR                  S	5      u  pnS
U;   a  UR                  S
5      u  npOUnU(       aN  [        U5      nSU;   a  UR                  SS5      u  p[        R                  U5      (       a  [        SU-  5      eOS nU(       a  UR!                  [#        UX#U5      5        SU;   a#  UR%                  S5      u  nnn['        U5      u  pOUnS
U;   a  [        SU-  5      e[        U5      nS nU=(       d    UR)                  S5      nU(       ar  UR)                  S5      (       a  [        S[         S35      e[+        US S9n[-        U5      S:w  a  [        [         S35      eUS   u  nnUb  [        [         S35      eOGU(       d  UR)                  S5      b  [        S5      eU(       d  U(       a  [        S5      e[+        UUS9n[/        UU5        UU	U
UUUUS.$ )NFpythonzThe "dnspython" module must be installed to use mongodb+srv:// URIs. To fix this error install pymongo again:
 %s -m pip install pymongo>=4.3Tz)Invalid URI scheme: URI must begin with 'z' or ''z(Must provide at least one hostname or IP?/.r%   zBad database name "%s"r#   z;Any '/' in a unix domain socket must be percent-encoded: %ssrvMaxHostsdirectConnectionz*Cannot specify directConnection=true with z URIs)r4   z. URIs must include one, and only one, hostnamer   z$ URIs must not include a port numbersrvServiceNamezDThe srvServiceName option is only allowed with 'mongodb+srv://' URIszAThe srvMaxHosts option is only allowed with 'mongodb+srv://' URIs)nodelistusernamepassworddatabase
collectionrY   fqdn)
startswithSCHEME
SCHEME_LEN
SRV_SCHEMEr   sys
executabler   SRV_SCHEME_LENr   r   r'   r   rA   _BAD_DB_CHARSsearchupdater   
rpartitionr,   rk   r   r   r   )urir4   r   rV   r   srv_max_hostsis_srvscheme_freepython_pathr)   r+   dbaser   rY   host_plus_db_partr*   rW   	host_partr(   r   r   r   rH   s                          r   _validate_urir     s    ~~f*+&	
	#	#  ..4HK$1 5@A  ./*DVHFS]R^^_`aaCDDDFEJ(*G!,!6!6s!;$
/99#>	1e%	U#%< %C 3E&&5=>> ' }T89EF
i&11#6!U%h/f
e|VYbbccED!?W[[%?M;;)**$'QR\Q]]b%cddE5u:?
|+YZ[[1X
d
|+OPQQ $45A R
 	
  O
 	
 E=5'"   r!   )r   rC   rj   rg   )r(   rC   rj   ztuple[str, str])r3   rC   r4   Optional[int]rj   z%tuple[str, Optional[Union[str, int]]])r3   rC   r4   r   rj   r   )rW   rC   rX   zOptional[str]rj   r   )rY   r   rj   r   )F)rW   Mapping[str, Any]rV   rg   rj   MutableMapping[str, Any])TFT)
rW   rC   r   rg   rV   rg   r   rg   rj   r   )r   rC   r4   r   rj   zlist[_Address])r   r	   rY   r   rj   None)r   zOptional[Mapping[str, Any]]rj   zdict[str, SSLContext])r   rC   r4   r   r   rg   rV   rg   r   rg   r   r   rj   zdict[str, Any]);__doc__
__future__r   rer   rU   typingr   r   r   r   r   r	   r
   r   urllib.parser   !pymongo.asynchronous.srv_resolverr   pymongo.client_optionsr   pymongo.commonr   r   r   r   pymongo.errorsr   r   pymongo.typingsr   pymongo.pyopenssl_contextr   r   r   r   r   r   DEFAULT_PORTr    r,   r5   rI   rl   r^   rq   r}   r   r   r   r   compileescaper   	frozenset_ALLOWED_TXT_OPTSr   r   r    r!   r   <module>r      s    # 	 
 	 	 	 & = 5  : $4	[

Z 40((,(*(. ;G 0h ,2j$N,-  MQ*
**,0*EI**Z ;G 4 

37!33c9:\ 
YF #/#']	]] ] 	]
 ] !] ]r!   