
    h`                     j   d 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Z
dZ	 ddlZ e eeej"                  j%                  d      dd             dk\  rdZdd	lmZmZ dd
lmZ ddlmZ ddlmZmZmZ ddlmZ ddl m!Z! ddl"m#Z#m$Z$ ddl%m&Z&  e'g d      Z(	  G d de)      Z* edg d      Z+	  edg d      Z,	  eddg      Z-	 d Z.erd Z/ej`                  Z1ejd                  Z3nddl4m5Z6m7Z8 d Z/ee6fdZ1e8fdZ3	 dd l9m:Z; 	 dd"lm<Z< d& Z?d' Z@d( ZAd) ZBd* ZCd+ ZDd, ZEd- ZFd. ZGd/ ZHd0 ZId1 ZJeGeEeIeHe!eF ej                  eAd23       ej                  eAd43      eJd5	ZL G d6 d7e)      ZM G d8 d9eM      ZN G d: d;eM      ZOeO ej                  eNd23       ej                  eNd43       ej                  eNd43      d<ZPd= ZQd> ZRy# e$ r
 ddl	mZ Y w xY w# e$ r 	 ddlZn# e$ r dZ
Y nw xY wY w xY w# e$ r 	 dd lm:Z; n# e$ r d! Z;Y nw xY wY w xY w# e$ r erd# Z=ne>fd$Z=e=fd%Z<Y $w xY w)?zAuthentication helpers.    N)quoteTF.   )r      )standard_b64decodestandard_b64encode)
namedtuple)Binary)string_type_unicodePY3)SON)_authenticate_aws)ConfigurationErrorOperationFailure)saslprep)GSSAPI
MONGODB-CRMONGODB-X509MONGODB-AWSPLAINSCRAM-SHA-1SCRAM-SHA-256DEFAULTc                   8    e Zd ZdZ ed       Zd Zd Zd Zd Z	y)_Cachedatac                     d | _         y Nr   selfs    O/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/pymongo/auth.py__init__z_Cache.__init__D   s	    	    c                 0    t        |t              ryt        S )NT
isinstancer   NotImplementedr"   others     r#   __eq__z_Cache.__eq__G   s    eV$r%   c                 0    t        |t              ryt        S )NFr'   r*   s     r#   __ne__z_Cache.__ne__M   s    eV$r%   c                     | j                   S r    )	_hash_valr!   s    r#   __hash__z_Cache.__hash__R   s    ~~r%   N)
__name__
__module____qualname__	__slots__hashr0   r$   r,   r.   r1    r%   r#   r   r   ?   s$    IXI
r%   r   MongoCredential)	mechanismsourceusernamepasswordmechanism_propertiescacheGSSAPIPropertiesservice_namecanonicalize_host_nameservice_realmAWSPropertiesaws_session_tokenc           	         | dvr|t        | d      | dk(  rw||dk7  rt        d      |j                  di       }|j                  dd	      }|j                  d
d      }|j                  d      }	t        |||	      }
t	        | d|||
d      S | dk(  r/|t        d      ||dk7  rt        d      t	        | d|ddd      S | dk(  r`||t        d      ||dk7  rt        d      |j                  di       }|j                  d      }t        |      }
t	        | d|||
d      S | dk(  r|xs |xs d}t	        | |||dd      S |xs |xs d}|t        d      t	        | |||dt                     S )z=Build and return a mechanism specific credentials tuple.
    )r   r   Nz requires a username.r   	$externalz:authentication source must be $external or None for GSSAPIauthmechanismpropertiesSERVICE_NAMEmongodbCANONICALIZE_HOST_NAMEFSERVICE_REALMr@   r   z+Passwords are not supported by MONGODB-X509z@authentication source must be $external or None for MONGODB-X509r   z;username without a password is not supported by MONGODB-AWSz?authentication source must be $external or None for MONGODB-AWSAWS_SESSION_TOKEN)rE   r   adminzA password is required.)r   
ValueErrorgetr?   r8   _AWSPropertiesr   )mechr:   userpasswdextradatabase
propertiesrA   canonicalizerC   propsrE   source_databases                r#   _build_credentials_tupler[   m   s    22t| d!DEEx&K"7LN NYY8"=
!~~ni@!~~&>F"7 l8D/<> t[$tLL		$=? ?&K"756 6 t[$dDII		$MO O&K"7$45 5 YY8"=
&NN+>?1BCt[$tLL	 ;H;t_dFD$OO 7H7>$%>??/4vxA 	Ar%   c           
          dj                  t        | |      D cg c]  \  }}t        ||z  g       c}}      S c c}}w )z+XOR two byte strings together (python 3.x).r%   )joinzipbytesfirsecxys       r#   _xorre      s3    xxCSMBDAqAwBCCBs   <
)hexlify	unhexlifyc                     dj                  t        | |      D cg c]%  \  }}t        t        |      t        |      z        ' c}}      S c c}}w )z+XOR two byte strings together (python 2.x).r%   )r]   r^   chrordr`   s       r#   re   re      s:    xx#c3-H$!QSVc!f_-HIIHs   *A
c                       | ||       d      S )z3An implementation of int.from_bytes for python 2.x.   r7   )valuedummy_int_hexlifys       r#   _from_bytesrq      s    HUOR((r%   c                 *    dd|z  fz  } ||| z        S )z1An implementation of int.to_bytes for python 2.x.z%%0%dxr   r7   )rm   lengthrn   
_unhexlifyfmts        r#   	_to_bytesrv      s!    !f*&#+&&r%   )pbkdf2_hmacc                    t        j                  |dt        t        |             }|fd}t        }t
        } ||dz         } ||d      }	t        |dz
        D ]  }
 ||      }|	 ||d      z  }	  ||	|j                  d      S )z'A simple implementation of PBKDF2-HMAC.Nc                 d    |j                         }|j                  |        |j                         S )zGet a digest for msg.)copyupdatedigest)msgmac_macs      r#   _digestz_hi.<locals>._digest   s%    xxzC {{}$r%   s      big   )hmacHMACgetattrhashlibrq   rv   rangedigest_size)	hash_namer   salt
iterationsr~   r   
from_bytesto_bytes_u1_ui_s              r#   _hir      s    ))D$(CDC!$ % %J H$!445CS%(C:>* .clz#u--. C%88r%   )compare_digestc                     | |z  S r    r7   )abs     r#   
_xor_bytesr      s    q5Lr%   c                 $     ||        ||      z  S r    r7   )r   r   _ords      r#   r   r      s    7T!W$$r%   c                     d }|}t        |       t        |      k(  r| }d}t        |       t        |      k7  r|}d}t        ||      D ]  \  }} |||      z  } dk(  S )Nr   r   )lenr^   )r   r   r   leftrightresultrc   rd   s           r#   r   r      su    q6SVDFq6SVDFe$ 	'DAqjA&&F	'{r%   c                 D    t        d | j                  d      D              S )z-Split a scram response into key, value pairs.c              3   @   K   | ]  }|j                  d d        yw)   =r   N)split).0items     r#   	<genexpr>z(_parse_scram_response.<locals>.<genexpr>   s     E

4#Es      ,)dictr   )responses    r#   _parse_scram_responser      s    Et0DEEEr%   c           	          | j                   }|j                  d      j                  dd      j                  dd      }t        t	        j
                  d            }d|z   dz   |z   }t        d	d
|fdt        d|z         fddddifg      }|||fS )Nutf-8r   s   =3Dr   s   =2C    s   n=s   ,r=	saslStartr   r9   payloads   n,,autoAuthorizer   optionsskipEmptyExchangeT)r;   encodereplacer   osurandomr   r
   )credentialsr9   r;   rS   nonce
first_barecmds          r#   _authenticate_scram_startr     s    ##H??7#++D&9AA$ODrzz"~.E&.J
Y'6&:"567#/67	9 :C
 *c!!r%   c                 8   | j                   }|dk(  r7d}t        j                  }t        | j                        j                  d      }n7d}t        j                  }t        || j                        j                  d      }| j                  }| j                  }t        j                  }	|j                  j                  |       }
|
r,|
j                         r|
j                  \  }}|
j                   }n"t#        | |      \  }}}|j%                  ||      }|d   }t'        |      }t)        |d         }|dk  rt+        d      |d	   }|d
   }|j-                  |      st+        d      d|z   }|j.                  r|j.                  \  }}}}nd\  }}}}|r
||k7  s||k7  rRt1        ||t3        |      |      } |	|d|      j5                         } |	|d|      j5                         }||||f|_         ||      j5                         }dj7                  |||f      } |	|||      j5                         }dt9        t;        ||            z   }dj7                  ||f      }t9         |	|||      j5                               }t=        dd|d   fdt?        |      fg      }|j%                  ||      }t'        |d         }tA        |d   |      st+        d      |d   sAt=        dd|d   fdt?        d      fg      }|j%                  ||      }|d   st+        d      yy)zAuthenticate using SCRAM.r   sha256r   sha1r      ii   z+Server returned an invalid iteration count.   s   rz!Server returned an invalid nonce.s	   c=biws,r=)NNNNs
   Client Keys
   Server Keyr   s   p=saslContinuer   conversationId   vz%Server returned an invalid signature.doner%   z%SASL conversation failed to complete.N)!r;   r   r   r   r<   r   r   _password_digestr:   r>   r   r   auth_ctxrP   speculate_succeeded
scram_dataspeculative_authenticater   commandr   intr   
startswithr   r   r   r|   r]   r   re   r   r
   r   ) r   	sock_infor9   r;   r|   	digestmodr   r:   r>   _hmacctxr   r   resr   server_firstparsedr   r   rnoncewithout_proof
client_key
server_keycsaltciterationssalted_pass
stored_keyauth_msg
client_sigclient_proofclient_final
server_sigs                                    r#   _authenticate_scramr     sD   ##HO#NN	,,-44W=LL	+*>*>?FFwOFE IIE



 
 
-C
s&&(NNz**!:"$z3,y>L"<0FVD\"JDLMM$<DD\FU#BCC 6)Mzz5:ZZ2
J{5K2
J{ **CD,T2J@;yAHHJ
;yAHHJ
 *dJ?
:&--/Jyy*lMBCHz8Y7>>@J-d:z.JKKL99m\:;L#j(I.5579J " #&6"786,/02 3C 

FC
(C"3y>2F&,
3FGG v;&$c*:&;<vc{+- . ,6{"#JKK  r%   c                    t        |t              st        dt        j                        t	        |      dk(  rt        d      t        | t              st        dt        j                        t        j                         }| d|}|j                  |j                  d             t        |j                               S )z5Get a password digest to use for authentication.
    z password must be an instance of r   zpassword can't be emptyz!password must be an instance of  z:mongo:r   )r(   r   	TypeErrorr2   r   rO   r   md5r{   r   r   	hexdigest)r;   r<   md5hashr   s       r#   r   r   ^  s     h,,7,@,@C D 	D
8}233h,-8-A-AD E 	E kkmG$h/DNN4;;w'(G%%'((r%   c                     t        ||      }t        j                         }| ||}|j                  |j	                  d             t        |j                               S )z/Get an auth key to use for authentication.
    r   )r   r   r   r{   r   r   r   )r   r;   r<   r|   r   r   s         r#   	_auth_keyr   p  sP     h1FkkmGh/DNN4;;w'(G%%'((r%   c                 B   t        j                  | dddt         j                  t         j                        d   \  }}}}}	 t        j                  |t         j
                        }|d   j                         S # t         j                  $ r |j                         cY S w xY w)z2Canonicalize hostname following MIT-krb5 behavior.Nr   )socketgetaddrinfoIPPROTO_TCPAI_CANONNAMEgetnameinfoNI_NAMEREQDgaierrorlower)hostnameafsocktypeproto	canonnamesockaddrnames          r#   _canonicalize_hostnamer   z  s     06/A/A$1f00&2E2E0GGH0J,B%H!!!(F,>,>? 7==? ?? !  !s   $A8 8#BBc                    t         st        d      	 | j                  }| j                  }| j                  }|j
                  d   }|j                  rt        |      }|j                  dz   |z   }|j                  |dz   |j                  z   }|t        rOdj                  t        |      t        |      f      }t        j                  ||t        j                        \  }}	nrd|v r|j!                  dd      \  }
}n|d}}
t        j                  |t        j                  |
||      \  }}	n(t        j                  |t        j                        \  }}	|t        j"                  k7  rt%        d	      	 t        j&                  |	d
      dk7  rt%        d      t        j(                  |	      }t+        ddd|fdg      }|j-                  d|      }t/        d      D ]  }t        j&                  |	t1        |d               }|dk(  rt%        d      t        j(                  |	      xs d
}t+        dd|d   fd|fg      }|j-                  d|      }|t        j"                  k(  s n t%        d      t        j2                  |	t1        |d               dk7  rt%        d      t        j4                  |	t        j(                  |	      |      dk7  rt%        d      t        j(                  |	      }t+        dd|d   fd|fg      }|j-                  d|       t        j6                  |	       y# t        j6                  |	       w xY w# t        j8                  $ r}t%        t1        |            d}~ww xY w)zAuthenticate using GSSAPI.
    zEThe "kerberos" module must be installed to use GSSAPI authentication.r   @N:)gssflagsr   )r   rS   domainr<   z&Kerberos context failed to initialize. z*Unknown kerberos failure in step function.r   )r9   r   r   r   rG   
   r   r   z+Kerberos authentication failed to complete.z0Unknown kerberos failure during GSS_Unwrap step.z.Unknown kerberos failure during GSS_Wrap step.)HAVE_KERBEROSr   r;   r<   r=   addressrB   r   rA   rC   _USE_PRINCIPALr]   r   kerberosauthGSSClientInitGSS_C_MUTUAL_FLAGr   AUTH_GSS_COMPLETEr   authGSSClientStepauthGSSClientResponser   r   r   strauthGSSClientUnwrapauthGSSClientWrapauthGSSClientCleanKrbError)r   r   r;   r<   rY   hostservice	principalr   r   rS   r   r   r   r   r   excs                    r#   _authenticate_gssapir    s      "K L 	Ld)''''00   #'')$/D$$s*T1*me&9&99G  HHeHouX%GH	&88Y1K1KM (?#+>>#q#9LD&#+T&D&88h&@&@fxA #44("<"<>KFC X///"#KLL=	-
 ))#r2a7& (C D D 44S9G'.!7++- .C !((c:H 2Y M!33C478K4LNR<* ,G H H #88=C.,h7G.HI%w/1 2 %,,[#>X777M" ' (L M M
 ++C,/0C,DFIJK& (I J J ))#*2*H*H*M*24789 ' (G H H 44S9G*((3C*DE!7+- .C k3/ '',H'', )s3x(()s8   E!M 5C/L- %B2L- M -MM M3M..M3c                     | j                   }| j                  }| j                  }d|d|j                  d      }t	        dddt        |      fdg      }|j                  ||       y)z-Authenticate using SASL PLAIN (RFC 4616)
     r   r   )r9   r   r   r   N)r:   r;   r<   r   r   r
   r   )r   r   r:   r;   r<   r   r   s          r#   _authenticate_plainr    sp     F##H##H!)84<<WEG
%6'?+#% &C fc"r%   c                    | j                   }| j                  }| j                  }t        ||      }t	        dddt        d      fdg      }|j                  ||      }t        j                  |j                  d      t        j                        }|j                  |d          |j                  d      dz   |j                         j                  d      z   }	t	        d	d
|d
   fdt        |	      fg      }|j                  ||       y)z+Authenticate using CRAM-MD5 (RFC 2195)
    r   )r9   CRAM-MD5r   r%   r   r   )keyr       r   r   N)r:   r;   r<   r   r   r
   r   r   r   r   r   r   r{   r   )
r   r   r:   r;   r<   rT   r   r   r~   	challenges
             r#   _authenticate_cram_md5r    s    F##H##H h1F
(6#;'#% &C   -H ))g.'++
FCJJx	"#(4/#--/2H2H2QQI
" (+;"<=6),-/ 0C fc"r%   c                    |j                   j                  |       }|r|j                         ryt        |       j	                         }| j
                  |j                  dk  rt        d      |j                  d|       y)z%Authenticate using MONGODB-X509.
    Nr   ziA username is required for MONGODB-X509 authentication when connected to MongoDB versions older than 3.4.rG   )	r   rP   r   _X509Contextspeculate_commandr;   max_wire_versionr   r   )r   r   r   r   s       r#   _authenticate_x509r$    s~     


 
 
-C
s&&(
{
#
5
5
7C#	(B(BQ(F AB 	B k3'r%   c                     | j                   }| j                  }| j                  }|j                  |ddi      }|d   }t	        |||      }t        dd|fd|fd|fg      }|j                  ||       y)z#Authenticate using MONGODB-CR.
    getnoncer   r   authenticater   rS   r  N)r:   r;   r<   r   r   r   )	r   r   r:   r;   r<   r   r   r  querys	            r#   _authenticate_mongo_crr*  -  s     F##H##H  *a9HWE
E8X
.C $(#5!  E fe$r%   c                    |j                   dk\  r| |j                  v r|j                  |    }nO| j                  }t        dd|dz   | j                  z   fg      }|j                  ||d      j                  dg       }d|v rt        | |d      S t        | |d      S |j                   d	k\  rt        | |d      S t        | |      S )
N   )ismasterr   saslSupportedMechsr   F)publish_eventsr   r      )	r#  negotiated_mechanismsr:   r   r;   r   rP   r   r*  )r   r   mechsr:   r   s        r#   _authenticate_defaultr3  @  s    !!Q&)99933K@E ''F%v|k6J6J'JKM NC %%E & 3363$b4*  e#&{IOO&{I}MM		#	#q	(";	=II%k9==r%   r   )r9   r   )	r  r   r   r   r   r   r   r   r   c                   4    e Zd Zd Zed        Zd Zd Zd Zy)_AuthContextc                      || _         d | _        y r    )r   r   )r"   r   s     r#   r$   z_AuthContext.__init__f  s    &(,%r%   c                 V    t         j                  | j                        }|r ||       S y r    )_SPECULATIVE_AUTH_MAPrP   r9   )credsspec_clss     r#   from_credentialsz_AuthContext.from_credentialsj  s&    (,,U__=E?"r%   c                     t         r    )NotImplementedErrorr!   s    r#   r"  z_AuthContext.speculate_commandq  s    !!r%   c                 &    |j                   | _         y r    )r   )r"   r-  s     r#   parse_responsez_AuthContext.parse_responset  s    (0(I(I%r%   c                 ,    t        | j                        S r    )boolr   r!   s    r#   r   z _AuthContext.speculate_succeededw  s    D1122r%   N)	r2   r3   r4   r$   staticmethodr;  r"  r?  r   r7   r%   r#   r5  r5  e  s+    -  "J3r%   r5  c                   $     e Zd Z fdZd Z xZS )_ScramContextc                 H    t         t        |   |       d | _        || _        y r    )superrD  r$   r   r9   )r"   r   r9   	__class__s      r#   r$   z_ScramContext.__init__|  s     mT+K8"r%   c                     t        | j                  | j                        \  }}}| j                  j                  |d<   ||f| _        |S )Ndb)r   r   r9   r:   r   )r"   r   r   r   s       r#   r"  z_ScramContext.speculate_command  sJ    !:dnn".z3 $$++D	 *-
r%   )r2   r3   r4   r$   r"  __classcell__)rG  s   @r#   rD  rD  {  s    #
r%   rD  c                       e Zd Zd Zy)r!  c                 ~    t        ddg      }| j                  j                  | j                  j                  |d<   |S )Nr'  )r9   r   rS   )r   r   r;   )r"   r   s     r#   r"  z_X509Context.speculate_command  sC    &02 3$$0**33CK
r%   N)r2   r3   r4   r"  r7   r%   r#   r!  r!    s    r%   r!  )r   r   r   r   c                 X    | j                   }t        j                  |      } || |       y)zAuthenticate sock_info.N)r9   	_AUTH_MAPrP   )r   r   r9   	auth_funcs       r#   r(  r(    s%    %%Ii(Ik9%r%   c                 ,    |j                  | ddi       y)zLog out from a database.logoutr   N)r   )r:   r   s     r#   rQ  rQ    s    fxm,r%   )S__doc__	functoolsr   r   r   r   urllibr   ImportErrorurllib.parser  r  winkerberosr  tuplemapr   __version__r   base64r   r   collectionsr	   bson.binaryr
   bson.py3compatr   r   r   bson.sonr   pymongo.auth_awsr   pymongo.errorsr   r   pymongo.saslprepr   	frozenset
MECHANISMSobjectr   r8   r?   rQ   r[   re   r   rq   r   rv   binasciirf   rp   rg   rt   backports.pbkdf2rw   r   r   r   rj   r   r   r   r   r   r   r  r  r  r$  r*  r3  partialrN  r5  rD  r!  r8  r(  rQ  r7   r%   r#   <module>ri     s       	 # "Sh**005bq9:;vE : "  5 5  . ? % 
 :V 0  ? 001  6 O.A-BC :2Aj D
 ..KI3J
 (+X )
 4> '936#>F
"LL^)$)k)\##2( %&>. '"(&$ $9$$}6&Y&&8$	36 3,L  <  !$9$$]mL&Y&&}1@B y  /J &-W  #""#   @  99. 9	99	98  
	 #& 	% )3 s   G 4G  G7 H GGG4G#"G4#G-*G4,G--G43G47H=HHHHHHHH21H2