ó
    Ö›‘h[;  ã                   ó8  • S r  SSKr\r SSKr\rSSKrSSKJr  SSK	J
r
  SSKJrJr  SSKJr  SrS r\" 5       r " S	 S
5      r " S S\\5      r " S S\\5      r " S S5      r " S S\\5      r " S S\\5      rg! \ a    Sr N€f = f! \ a    Sr N‡f = f)z&
Tests for L{twisted.python.fakepwd}.
é    N)Úgetitem)Ú_PYPY)ÚShadowDatabaseÚUserDatabase)ÚTestCaseiç  c                  ó~   • [         n [        b    [        R                  U 5        U S-  n M  U $ ! [         a     U $ f = f)aÉ  
By convention, UIDs less than 1000 are reserved for the system.  A system
which allocated every single one of those UIDs would likely have practical
problems with allocating new ones, so let's assume that we'll be able to
find one.  (If we don't, this will wrap around to negative values and
I{eventually} find something.)

@return: a user ID which does not exist on the local system.  Or, on
    systems without a L{pwd} module, return C{SYSTEM_UID_MAX}.
é   )ÚSYSTEM_UID_MAXÚpwdÚgetpwuidÚKeyError)Úguesss    ÚdC:\Users\psant\Downloads\Noiseback\school\venv\Lib\site-packages\twisted/python/test/test_fakepwd.pyÚfindInvalidUIDr       sT   € ô €EÜ
�ØðÜ—‘˜UÔ#ð ˜‘
�ñ ð €Løô	 ó Øð €Lð	ús   �. ®
<»<c                   óB   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)ÚUserDatabaseTestsMixiné:   aF  
L{UserDatabaseTestsMixin} defines tests which apply to any user database
implementation.  Subclasses should mix it in, implement C{setUp} to create
C{self.database} bound to a user database instance, and implement
C{getExistingUserInfo} to return information about a user (such information
should be unique per test method).
c                 ó  • [        S5       H÷  nU R                  5       u  p#pEpgnU R                  R                  U5      n	U R	                  U	R
                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        Mù     g)zK
I{getpwuid} accepts a uid and returns the user record associated with
it.
é   N)ÚrangeÚgetExistingUserInfoÚdatabaser   ÚassertEqualÚpw_nameÚ	pw_passwdÚpw_uidÚpw_gidÚpw_gecosÚpw_dirÚpw_shell©
ÚselfÚiÚusernameÚpasswordÚuidÚgidÚgecosÚdirÚshellÚentrys
             r   Útest_getpwuidÚ$UserDatabaseTestsMixin.test_getpwuidC   sË   € ô
 �q–ˆAà>B×>VÑ>VÓ>XÑ;ˆH ¨%°eð —M‘M×*Ñ*¨3Ó/ˆEØ×Ñ˜UŸ]™]¨HÔ5Ø×Ñ˜UŸ_™_¨hÔ7Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ^™^¨UÔ3Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ^™^¨UÖ3ò ó    c                 ób   • U R                  [        U R                  R                  [        5        g)z]
I{getpwuid} raises L{KeyError} when passed a uid which does not exist
in the user database.
N)ÚassertRaisesr   r   r   ÚINVALID_UID©r"   s    r   Útest_noSuchUIDÚ%UserDatabaseTestsMixin.test_noSuchUIDV   s    € ð
 	×Ñœ( D§M¡M×$:Ñ$:¼KÕHr.   c                 ó  • [        S5       H÷  nU R                  5       u  p#pEpgnU R                  R                  U5      n	U R	                  U	R
                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        U R	                  U	R                  U5        Mù     g)zP
I{getpwnam} accepts a username and returns the user record associated
with it.
r   N)r   r   r   Úgetpwnamr   r   r   r   r   r   r   r    r!   s
             r   Útest_getpwnamÚ$UserDatabaseTestsMixin.test_getpwnam]   sË   € ô
 �q–ˆAà>B×>VÑ>VÓ>XÑ;ˆH ¨%°eð —M‘M×*Ñ*¨8Ó4ˆEØ×Ñ˜UŸ]™]¨HÔ5Ø×Ñ˜UŸ_™_¨hÔ7Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ^™^¨UÔ3Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ^™^¨UÖ3ò r.   c                 ó~   • [         n[        (       a  [        nU R                  XR                  R
                  S5        g)z>
L{getpwnam} rejects a non-L{str} username with an exception.
ó
   i-am-bytesN)Ú	TypeErrorr   Ú	Exceptionr0   r   r6   )r"   Úexc_types     r   Útest_getpwnamRejectsBytesÚ0UserDatabaseTestsMixin.test_getpwnamRejectsBytesp   s/   € ô ˆßŠ5ô !ˆHØ×Ñ˜(§M¡M×$:Ñ$:¸MÕJr.   c                 óZ   • U R                  [        U R                  R                  S5        g)zb
I{getpwnam} raises L{KeyError} when passed a username which does not
exist in the user database.
z.nosuchuserexiststhenameistoolongandhasinittooN)r0   r   r   r6   r2   s    r   Útest_noSuchNameÚ&UserDatabaseTestsMixin.test_noSuchName{   s'   € ð
 	×ÑÜØ�M‰M×"Ñ"ðõ	
r.   c                 ó0  • U R                   nU R                  5       u  p#pEpgnUR                  U5      UR                  U5      UR	                  5       S   4 H=  n	U R                  [        U	5      [        5        U R                  [        U	5      S5        M?     g)zU
The user record returned by I{getpwuid}, I{getpwnam}, and I{getpwall}
has a length.
r   é   N)	r   r   r   r6   ÚgetpwallÚassertIsInstanceÚlenÚintr   ©
r"   Údbr$   r%   r&   r'   r(   r)   r*   r+   s
             r   Útest_recordLengthÚ(UserDatabaseTestsMixin.test_recordLength”   s{   € ð
 �]‰]ˆØ:>×:RÑ:RÓ:TÑ7ˆ˜C e°%Ø—k‘k #Ó&¨¯©°HÓ(=¸r¿{¹{»}ÈQÑ?OÓPˆEØ×!Ñ!¤# e£*¬cÔ2Ø×ÑœS ›Z¨Ö+ò Qr.   c           	      ót  • U R                   nU R                  5       u  p#pEpgnUR                  U5      UR                  U5      UR	                  5       S   4 Hß  n	U R                  U	S   U5        U R                  U	S   U5        U R                  U	S   U5        U R                  U	S   U5        U R                  U	S   U5        U R                  U	S   U5        U R                  U	S   U5        U R                  [        U	5      [        [        U	5      5      5        U R                  [        [        U	S5        Má     g	)
a  
The user record returned by I{getpwuid}, I{getpwnam}, and I{getpwall}
is indexable, with successive indexes starting from 0 corresponding to
the values of the C{pw_name}, C{pw_passwd}, C{pw_uid}, C{pw_gid},
C{pw_gecos}, C{pw_dir}, and C{pw_shell} attributes, respectively.
r   r	   r   é   é   é   é   rD   N)r   r   r   r6   rE   r   rG   Úlistr0   Ú
IndexErrorr   rI   s
             r   Útest_recordIndexableÚ+UserDatabaseTestsMixin.test_recordIndexableŸ   s  € ð �]‰]ˆØ:>×:RÑ:RÓ:TÑ7ˆ˜C e°%Ø—k‘k #Ó&¨¯©°HÓ(=¸r¿{¹{»}ÈQÑ?OÓPˆEØ×Ñ˜U 1™X xÔ0Ø×Ñ˜U 1™X xÔ0Ø×Ñ˜U 1™X sÔ+Ø×Ñ˜U 1™X sÔ+Ø×Ñ˜U 1™X uÔ-Ø×Ñ˜U 1™X sÔ+Ø×Ñ˜U 1™X uÔ-à×ÑœS ›Z¬¬T°%«[Ó)9Ô:Ø×Ñœj¬'°5¸!Ö<ò Qr.   © N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r,   r3   r7   r>   rA   rK   rT   Ú__static_attributes__rV   r.   r   r   r   :   s,   † ñò4ò&Iò4ò&	Kò
ò2	,õ=r.   r   c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚUserDatabaseTestséµ   z
Tests for L{UserDatabase}.
c                 ó>   • [        5       U l        [        S-   U l        g)z3
Create a L{UserDatabase} with no user data in it.
r	   N)r   r   r
   Ú_counterr2   s    r   ÚsetUpÚUserDatabaseTests.setUpº   s   € ô %›ˆŒÜ&¨Ñ*ˆ�r.   c           	      ó  • U =R                   S-  sl         S[        U R                   5      -   nSU-   nSU-   nU R                   nU R                   S-   nSU-   nSU-   nSU-   nU R                  R                  X#XEXgU5        X#XEXgU4$ )	ú@
Add a new user to C{self.database} and return its information.
r	   Ú_r$   r%   iè  r(   r)   r*   ©ra   Ústrr   ÚaddUser)	r"   Úsuffixr$   r%   r&   r'   r(   r)   r*   s	            r   r   Ú%UserDatabaseTests.getExistingUserInfoÁ   s”   € ð 	�Š˜Ñ�Ø”s˜4Ÿ=™=Ó)Ñ)ˆØ Ñ&ˆØ Ñ&ˆØ�m‰mˆØ�m‰m˜dÑ"ˆØ˜&Ñ ˆØ�f‰nˆØ˜&Ñ ˆà�‰×Ñ˜h°#¸EÈÔNØ C¨e¸%Ð@Ð@r.   c           	      ó`  • SnSnSnSnSnSnSnU R                   nUR                  XX4XVU5        UR                  U5      /UR                  U5      /UR	                  5       4 HÉ  u  n	U R                  U	R                  U5        U R                  U	R                  U5        U R                  U	R                  U5        U R                  U	R                  U5        U R                  U	R                  U5        U R                  U	R                  U5        U R                  U	R                  U5        MË     g)	úÙ
L{UserDatabase.addUser} accepts seven arguments, one for each field of
a L{pwd.struct_passwd}, and makes the new record available via
L{UserDatabase.getpwuid}, L{UserDatabase.getpwnam}, and
L{UserDatabase.getpwall}.
ÚaliceÚsecr3té{   iÈ  zAlice,,,z/users/alicez/usr/bin/fooshN)r   ri   r   r6   rE   r   r   r   r   r   r   r   r    )
r"   r$   r%   r&   r'   r(   Úhomer*   rJ   r+   s
             r   Útest_addUserÚUserDatabaseTests.test_addUserÒ   s   € ð ˆØˆØˆØˆØˆØˆØ ˆà�]‰]ˆØ
�
‰
�8 s°¸eÔDàŸ™ SÓ)Ð*¨R¯[©[¸Ó-BÐ,CÀRÇ[Á[Ã]ÓS‰GˆUØ×Ñ˜UŸ]™]¨HÔ5Ø×Ñ˜UŸ_™_¨hÔ7Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ^™^¨UÔ3Ø×Ñ˜UŸ\™\¨4Ô0Ø×Ñ˜UŸ^™^¨UÖ3ò Tr.   ©ra   r   N©	rW   rX   rY   rZ   r[   rb   r   rr   r\   rV   r.   r   r^   r^   µ   s   † ñò+òAõ"4r.   r^   c                   ó4   • \ rS rSrSr\c  SrO\rS rS r	Sr
g)ÚPwdModuleTestséî   zµ
L{PwdModuleTests} runs the tests defined by L{UserDatabaseTestsMixin}
against the built-in C{pwd} module.  This serves to verify that
L{UserDatabase} is really a fake of that API.
Nz2Cannot verify UserDatabase against pwd without pwdc                 ór   • [        U R                  R                  5       5      U l        [	        5       U l        g ©N)Úiterr   rE   Ú_usersÚsetÚ_uidsr2   s    r   rb   ÚPwdModuleTests.setUpú   s$   € Ü˜4Ÿ=™=×1Ñ1Ó3Ó4ˆŒÜ“Uˆ�
r.   c                 ó¢   •  [        U R                  5      nUR                  nX R                  ;  a  U R                  R	                  U5        U$ MO  )z´
Read and return the next record from C{self._users}, filtering out
any records with previously seen uid values (as these cannot be
found with C{getpwuid} and only cause trouble).
)Únextr|   r   r~   Úadd)r"   r+   r&   s      r   r   Ú"PwdModuleTests.getExistingUserInfoþ   sB   € ð Ü˜Ÿ™Ó%ˆEØ—,‘,ˆCØŸ*™*Ó$Ø—
‘
—‘˜sÔ#Ø�ñ r.   )r~   r|   )rW   rX   rY   rZ   r[   r   Úskipr   rb   r   r\   rV   r.   r   rw   rw   î   s"   † ñð �{ØC‰àˆòõr.   rw   c                   ó6   • \ rS rSrSrS rS rS rS rS r	Sr
g	)
ÚShadowDatabaseTestsMixini  aV  
L{ShadowDatabaseTestsMixin} defines tests which apply to any shadow user
database implementation.  Subclasses should mix it in, implement C{setUp} to
create C{self.database} bound to a shadow user database instance, and
implement C{getExistingUserInfo} to return information about a user (such
information should be unique per test method).
c           
      óŽ  • [        S5       GH5  nU R                  5       u	  nnnnnnnn	n
U R                  R                  U5      nU R	                  UR
                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U	5        U R	                  UR                  U
5        GM8     g)zP
L{getspnam} accepts a username and returns the user record associated
with it.
r   N)r   r   r   Úgetspnamr   Úsp_namÚsp_pwdÚ	sp_lstchgÚsp_minÚsp_maxÚsp_warnÚsp_inactÚ	sp_expireÚsp_flag)r"   r#   r$   r%   Ú
lastChangeÚminÚmaxÚwarnÚinactÚexpireÚflagr+   s               r   Útest_getspnamÚ&ShadowDatabaseTestsMixin.test_getspnam  s
  € ô
 �q—ˆAð ×(Ñ(Ó*ñ
ØØØØØØØØØð —M‘M×*Ñ*¨8Ó4ˆEØ×Ñ˜UŸ\™\¨8Ô4Ø×Ñ˜UŸ\™\¨8Ô4Ø×Ñ˜UŸ_™_¨jÔ9Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ]™]¨DÔ1Ø×Ñ˜UŸ^™^¨UÔ3Ø×Ñ˜UŸ_™_¨fÔ5Ø×Ñ˜UŸ]™]¨D×1ò/ r.   c                 óZ   • U R                  [        U R                  R                  S5        g)zb
I{getspnam} raises L{KeyError} when passed a username which does not
exist in the user database.
rn   N)r0   r   r   rˆ   r2   s    r   rA   Ú(ShadowDatabaseTestsMixin.test_noSuchName3  s    € ð
 	×Ñœ( D§M¡M×$:Ñ$:¸GÕDr.   c                 óZ   • U R                  [        U R                  R                  S5        g)zU
I{getspnam} raises L{TypeError} when passed a L{bytes}, just like
L{spwd.getspnam}.
r:   N)r0   r;   r   rˆ   r2   s    r   Útest_getspnamBytesÚ+ShadowDatabaseTestsMixin.test_getspnamBytes:  s    € ð
 	×Ñœ) T§]¡]×%;Ñ%;¸]ÕKr.   c                 ó  • U R                   nU R                  5       S   nUR                  U5      UR                  5       S   4 H=  nU R	                  [        U5      [        5        U R                  [        U5      S5        M?     g)zN
The shadow user record returned by I{getspnam} and I{getspall} has a
length.
r   é	   N)r   r   rˆ   ÚgetspallrF   rG   rH   r   )r"   rJ   r$   r+   s       r   rK   Ú*ShadowDatabaseTestsMixin.test_recordLengthA  sk   € ð
 �]‰]ˆØ×+Ñ+Ó-¨aÑ0ˆØ—k‘k (Ó+¨R¯[©[«]¸1Ñ-=Ó>ˆEØ×!Ñ!¤# e£*¬cÔ2Ø×ÑœS ›Z¨Ö+ò ?r.   c           	      ó¶  • U R                   nU R                  5       u	  nnnnnnnn	n
UR                  U5      UR                  5       S   4 GH
  nU R	                  US   U5        U R	                  US   U5        U R	                  US   U5        U R	                  US   U5        U R	                  US   U5        U R	                  US   U5        U R	                  US   U5        U R	                  US   U	5        U R	                  US	   U
5        U R	                  [        U5      [        [        U5      5      5        U R                  [        [        US
5        GM     g)a#  
The shadow user record returned by I{getpwnam} and I{getspall} is
indexable, with successive indexes starting from 0 corresponding to the
values of the C{sp_nam}, C{sp_pwd}, C{sp_lstchg}, C{sp_min}, C{sp_max},
C{sp_warn}, C{sp_inact}, C{sp_expire}, and C{sp_flag} attributes,
respectively.
r   r	   r   rN   rO   rP   rQ   rD   é   r¡   N)
r   r   rˆ   r¢   r   rG   rR   r0   rS   r   )r"   rJ   r$   r%   r’   r“   r”   r•   r–   r—   r˜   r+   s               r   rT   Ú-ShadowDatabaseTestsMixin.test_recordIndexableL  sC  € ð �]‰]ˆð ×$Ñ$Ó&ñ
	
ØØØØØØØØØà—k‘k (Ó+¨R¯[©[«]¸1Ñ-=Ô>ˆEØ×Ñ˜U 1™X xÔ0Ø×Ñ˜U 1™X xÔ0Ø×Ñ˜U 1™X zÔ2Ø×Ñ˜U 1™X sÔ+Ø×Ñ˜U 1™X sÔ+Ø×Ñ˜U 1™X tÔ,Ø×Ñ˜U 1™X uÔ-Ø×Ñ˜U 1™X vÔ.Ø×Ñ˜U 1™X tÔ,à×ÑœS ›Z¬¬T°%«[Ó)9Ô:Ø×Ñœj¬'°5¸!×<ò ?r.   rV   N)rW   rX   rY   rZ   r[   r™   rA   rž   rK   rT   r\   rV   r.   r   r†   r†     s"   † ñò2ò<EòLò	,õ =r.   r†   c                   ó*   • \ rS rSrSrS rS rS rSrg)ÚShadowDatabaseTestsio  z
Tests for L{ShadowDatabase}.
c                 ó0   • [        5       U l        SU l        g)z5
Create a L{ShadowDatabase} with no user data in it.
r   N)r   r   ra   r2   s    r   rb   ÚShadowDatabaseTests.setUpt  s   € ô 'Ó(ˆŒØˆ�r.   c                 óŽ  • U =R                   S-  sl         S[        U R                   5      -   nSU-   nSU-   nU R                   S-   nU R                   S-   nU R                   S-   nU R                   S-   nU R                   S-   nU R                   S	-   n	U R                   S
-   n
U R                  R                  X#XEXgX‰U
5	        X#XEXgX‰U
4	$ )re   r	   rf   r$   r%   r   rN   rO   rP   rQ   rD   rg   )r"   rj   r$   r%   r’   r“   r”   r•   r–   r—   r˜   s              r   r   Ú'ShadowDatabaseTests.getExistingUserInfo{  sË   € ð 	�Š˜Ñ�Ø”s˜4Ÿ=™=Ó)Ñ)ˆØ Ñ&ˆØ Ñ&ˆØ—]‘] QÑ&ˆ
Ø�m‰m˜aÑˆØ�m‰m˜aÑˆØ�}‰}˜qÑ ˆØ—‘ Ñ!ˆØ—‘ Ñ"ˆØ�}‰}˜qÑ ˆà�‰×ÑØ 
°¸EÈ4ô	
ð  J°SÀÈtÐTÐTr.   c                 ó¼  • SnSnSnSnSnSnSnSnSn	U R                   n
U
R                  XX4XVXxU	5	        U
R                  U5      /U
R                  5       4 GH  u  nU R	                  UR
                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U5        U R	                  UR                  U	5        GM     g	)
rm   rn   ro   é   é*   éi   é   rN   i�  N)r   ri   rˆ   r¢   r   r‰   rŠ   r‹   rŒ   r�   rŽ   r�   r�   r‘   )r"   r$   r%   r’   r“   r”   r•   r–   r—   r˜   rJ   r+   s               r   rr   Ú ShadowDatabaseTests.test_addUser�  s'  € ð ˆØˆØˆ
ØˆØˆØˆØˆØˆØˆà�]‰]ˆØ
�
‰
�8 z¸À5ÐRVÔWàŸ™ XÓ.Ð/°·±³Ô?‰GˆUØ×Ñ˜UŸ\™\¨8Ô4Ø×Ñ˜UŸ\™\¨8Ô4Ø×Ñ˜UŸ_™_¨jÔ9Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ\™\¨3Ô/Ø×Ñ˜UŸ]™]¨DÔ1Ø×Ñ˜UŸ^™^¨UÔ3Ø×Ñ˜UŸ_™_¨fÔ5Ø×Ñ˜UŸ]™]¨D×1ò @r.   rt   Nru   rV   r.   r   r¨   r¨   o  s   † ñòòUõ*2r.   r¨   c                   ód   • \ rS rSrSr\c  SrO\R                  " 5       S:w  a  SrO\r	S r
S rS	rg)
ÚSPwdModuleTestsi°  z»
L{SPwdModuleTests} runs the tests defined by L{ShadowDatabaseTestsMixin}
against the built-in C{spwd} module.  This serves to verify that
L{ShadowDatabase} is really a fake of that API.
Nz6Cannot verify ShadowDatabase against spwd without spwdr   z1Cannot access shadow user database except as rootc                 óT   • [        U R                  R                  5       5      U l        g rz   )r{   r   r¢   r|   r2   s    r   rb   ÚSPwdModuleTests.setUp¾  s   € Ü˜4Ÿ=™=×1Ñ1Ó3Ó4ˆ�r.   c                 ó,   • [        U R                  5      $ )z6
Read and return the next record from C{self._users}.
)r�   r|   r2   s    r   r   Ú#SPwdModuleTests.getExistingUserInfoÁ  s   € ô �D—K‘KÓ Ð r.   )r|   )rW   rX   rY   rZ   r[   Úspwdr„   ÚosÚgetuidr   rb   r   r\   rV   r.   r   r´   r´   °  s5   † ñð �|ØG‰Ø	�Š‹˜Ó	ØB‰àˆò5õ!r.   r´   )r[   r   Ú_pwdÚImportErrorr¹   Ú_spwdrº   Úoperatorr   Útwisted.python.compatr   Útwisted.python.fakepwdr   r   Útwisted.trial.unittestr   r
   r   r1   r   r^   rw   r†   r¨   r´   rV   r.   r   Ú<module>rÃ      sÏ   ðñðÛð €CðÛð €Dã 	Ý å 'ß ?Ý +à€òñ. Ó€÷x=ñ x=ôv64˜Ð"8ô 64ôr�XÐ5ô ÷<`=ñ `=ôF>2˜(Ð$<ô >2ôB!�hÐ 8õ !øðM ó Ø
‚Cðûð ó Ø‚Dðús"   „B  ‹B Â BÂ
BÂBÂB