
    h^                     r   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l4m5Z6 ddl4m7Z8 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/ ZGd0 ZHd1 ZId2 ZJeGeEeIeHe!eF ej                  eAd34       ej                  eAd54      eJd6	ZL G d7 d8e)      ZM G d9 d:eM      ZN G d; d<eM      ZOeO ej                  eNd34       ej                  eNd54       ej                  eNd54      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)PY3_unicodestring_type)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    J/var/www/html/eduruby.in/venv/lib/python3.12/site-packages/pymongo/auth.py__init__z_Cache.__init__G   s	    	    c                 0    t        |t              ryt        S )NT
isinstancer   NotImplementedr"   others     r#   __eq__z_Cache.__eq__J   s    eV$r%   c                 0    t        |t              ryt        S )NFr'   r*   s     r#   __ne__z_Cache.__ne__P   s    eV$r%   c                     | j                   S r    )	_hash_valr!   s    r#   __hash__z_Cache.__hash__U   s    ~~r%   N)
__name__
__module____qualname__	__slots__hashr0   r$   r,   r.   r1    r%   r#   r   r   B   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 )z8Build 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[   j   s   22t| d!DEEx&K"7YZZYY8"=
!~~ni@!~~&>F"7 %#/'
 t[$tLL		$%RSS&K"7bcct[$dDII		$%bcc&K"7$T  YY8"=
&NN+>?1BCt[$tLL	 ;H;t_dFD$OO 7H7>$%>??t_dFD&(SSr%   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
)$v
234 ,d34	
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     s8   ##HO#NN	,,-44W=LL	+*>*>?FFwOFE IIE



 
 
-C
s&&(NNz**!:;	!R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&$(:4(@*M;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#E*h	$J$Q$Q$STJ
s#345|,-	
C 

FC
(C"3y>2F&,
3FGG v;#!3'7#89F3K(
 ,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 )z0Get 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,;CWCWYZZ
8}233h,KDXDXZ[[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   o  sN    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   x  s     06/A/A$1f00&2E2E00	,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    ss    V
 	
k)''''00   #'')$/D$$s*T1*me&9&99G  HHeHouX%GH	&88Y1K1K (?#+>>#q#9LD&#+T&D&88%77!% #44WxGaGabKFCX///"#KLL@	-
 ))#r2a7&'VWW 44S9G$+((	C !((c:H 2Y Y!33CXi=P9QRR<*+Z[["88=C+)84D+EF"G, %,,[#>X777#Y& ''WXX ++CXi5H1IJaO&'\]]))#x/M/Mc/RT\]abb&'Z[[44S9G'%x0@'AB(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    sn    F##H##H!)84<<WEG
"w( 		
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
%s$ 		
C   -H ))g.'++
FCJJx	"#(4/#--/2H2H2QQI
x(89:y)*	
C 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$  -  sz    



 
 
-C
s&&(
{
#
5
5
7C#	(B(BQ(F A
 	
 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 $vx&87E:JUTWLYZEfe$r%   c                    |j                   dk\  r| |j                  v r|j                  |    }nU| j                  }|j                         }|dz   | j                  z   |d<   |j                  ||d      j                  dg       }d|v rt        | |d      S t        | |d      S |j                   dk\  rt        | |d      S t        | |      S )	N   r   saslSupportedMechsF)publish_eventsr   r      )	r#  negotiated_mechanismsr:   	hello_cmdr;   r   rP   r   r*  )r   r   mechsr:   r   s        r#   _authenticate_defaultr3  L  s    !!Q&)99933K@E ''F%%'C(.{7K7K(KC$%%%fc%%HLL$bE 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__o  s    &(,%r%   c                 V    t         j                  | j                        }|r ||       S y r    )_SPECULATIVE_AUTH_MAPrP   r9   )credsspec_clss     r#   from_credentialsz_AuthContext.from_credentialss  s&    (,,U__=E?"r%   c                     t         r    )NotImplementedErrorr!   s    r#   r"  z_AuthContext.speculate_commandz  s    !!r%   c                 &    |j                   | _         y r    )r   )r"   hellos     r#   parse_responsez_AuthContext.parse_response}  s    (-(F(F%r%   c                 ,    t        | j                        S r    )boolr   r!   s    r#   r   z _AuthContext.speculate_succeeded  s    D1122r%   N)	r2   r3   r4   r$   staticmethodr;  r"  r@  r   r7   r%   r#   r5  r5  n  s+    -  "G3r%   r5  c                   $     e Zd Z fdZd Z xZS )_ScramContextc                 H    t         t        |   |       d | _        || _        y r    )superrE  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  sE    !:4;K;KT^^!\z3$$++D	 *-
r%   )r2   r3   r4   r$   r"  __classcell__)rH  s   @r#   rE  rE    s    #
r%   rE  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  s?    &(EFG$$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#   rR  rR    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  partialrO  r5  rE  r!  r8  r(  rR  r7   r%   r#   <module>rj     s       	 # 	"Sh**005bq9:;vE : "  5 5  . ? %	
 :V . T ? S  6 O.A-BC :-T` D ..KI,0J (+X ) 4> '938 #DF
"$QLh))r)j#"#@( %>, '"(&$ $9$$%8MR&Y&&':oV$
	36 3,L <  !$9$$]mL&Y&&}P y  /J	 &-c  #""#   h  99. 9	99	9:  
	
 #& 	% )3 %s   G
 4G G; H 
GGG8"G'&G8'G1.G80G11G87G8;HHHHHHHHH65H6