§
    Ètºfy  ã                   óª  — U d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	 e	e
         ed<   	 ddlZdZn# e$ r dZY nw xY wdd	lmZ dd
lmZ ddlmZmZmZm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! ddl"m#Z# ddl$m%Z% ddl&m'Z' ddl(m)Z)  e%d¦  «        rdZ*ddl+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ndZ* e4edd¦  «        �dZ5ndZ5 G d„ de)¦  «        Z6 G d„ de)¦  «        Z7 G d „ d!e)¦  «        Z8 G d"„ d#e)¦  «        Z9 G d$„ d%e)¦  «        Z: G d&„ d'e)¦  «        Z; G d(„ d)e)¦  «        Z< ed*d+g¦  «        Z= G d,„ d-e>¦  «        Z? G d.„ d/e)¦  «        Z@dS )0z&
Tests for L{twisted.conch.checkers}.
é    N)Úencodebytes)Ú
namedtuple)ÚBytesIO)ÚOptionalÚ	cryptSkipzcannot run without crypt module)ÚverifyObject)Ú'InMemoryUsernamePasswordDatabaseDontUse)ÚISSHPrivateKeyÚIUsernamePasswordÚSSHPrivateKeyÚUsernamePassword)ÚUnauthorizedLoginÚUnhandledCredentials)ÚDeferred)Úutil)ÚShadowDatabaseÚUserDatabase)ÚFilePath)ÚrequireModule)ÚMockOS)ÚTestCaseÚcryptography)Úcheckers)ÚNotEnoughAuthenticationÚValidPublicKey)Úkeys)Úkeydatazcan't run without cryptographyÚgeteuidz0Cannot run without effective UIDs (questionable)c                   óJ   — e Zd ZdZepeZd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
S )ÚHelperTestszl
    Tests for helper functions L{verifyCryptedPassword}, L{_pwdGetByName} and
    L{_shadowGetByName}.
    c                 ó,   — t          ¦   «         | _        d S ©N)r   Úmockos©Úselfs    ú_/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/twisted/conch/test/test_checkers.pyÚsetUpzHelperTests.setUp@   s   € Ý‘h”hˆŒˆˆó    c                 ó²   — d}d}t          j         ||¦  «        }|                      t          j        ||¦  «        d                     ||¦  «        ¦  «         dS )z–
        L{verifyCryptedPassword} returns C{True} if the plaintext password
        passed to it matches the encrypted password passed to it.
        úsecret stringÚsaltyz5{!r} supposed to be valid encrypted password for {!r}N©ÚcryptÚ
assertTruer   ÚverifyCryptedPasswordÚformat©r%   ÚpasswordÚsaltÚcrypteds       r&   Útest_verifyCryptedPasswordz&HelperTests.test_verifyCryptedPasswordC   sg   € ð
 #ˆØˆÝ”+˜h¨Ñ-Ô-ˆØ�ŠÝÔ*¨7°HÑ=Ô=ØC×JÒJØ˜ñô ñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó²   — d}d}t          j         ||¦  «        }|                      t          j        ||¦  «        d                     ||¦  «        ¦  «         dS )zŠ
        L{verifyCryptedPassword} returns True if the provided cleartext password
        matches the provided MD5 password hash.
        r2   z$1$saltz3{!r} supposed to be valid encrypted password for {}Nr,   r1   s       r&   Útest_verifyCryptedPasswordMD5z)HelperTests.test_verifyCryptedPasswordMD5R   sg   € ð
 ˆØˆÝ”+˜h¨Ñ-Ô-ˆØ�ŠÝÔ*¨7°HÑ=Ô=ØA×HÒHØ˜ñô ñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó²   — d}d}t          j         ||¦  «        }|                      t          j        ||¦  «        d                     ||¦  «        ¦  «         dS )zž
        L{verifyCryptedPassword} returns C{False} if the plaintext password
        passed to it does not match the encrypted password passed to it.
        zstring secretr*   z7{!r} not supposed to be valid encrypted password for {}N)r-   ÚassertFalser   r/   r0   )r%   r2   Úwrongr4   s       r&   Útest_refuteCryptedPasswordz&HelperTests.test_refuteCryptedPassworda   si   € ð
 #ˆØˆÝ”+˜h¨Ñ1Ô1ˆØ×ÒÝÔ*¨7°EÑ:Ô:ØE×LÒLØ˜ñô ñ	
ô 	
ð 	
ð 	
ð 	
r(   c           	      ó  — t          ¦   «         }|                     ddddddd¦  «         |                      t          d|¦  «         |                      t          j        d¦  «        |                     d¦  «        ¦  «         d	S )
z‡
        L{_pwdGetByName} returns a tuple of items from the UNIX /etc/passwd
        database if the L{pwd} module is present.
        ÚaliceÚsecrité   é   ú
first lastú/fooú/bin/shÚpwdN)r   ÚaddUserÚpatchr   ÚassertEqualÚ_pwdGetByNameÚgetpwnam©r%   Úuserdbs     r&   Útest_pwdGetByNamezHelperTests.test_pwdGetByNamep   st   € õ
 ‘”ˆØ�Š�w ¨!¨Q°¸fÀiÑPÔPÐPØ�
Š
•8˜U FÑ+Ô+Ð+Ø×Ò�Ô/°Ñ8Ô8¸&¿/º/È'Ñ:RÔ:RÑSÔSÐSÐSÐSr(   c                 óŒ   — |                       t          dd¦  «         |                      t          j        d¦  «        ¦  «         dS )zW
        If the C{pwd} module isn't present, L{_pwdGetByName} returns L{None}.
        rD   Nr=   )rF   r   ÚassertIsNonerH   r$   s    r&   Útest_pwdGetByNameWithoutPwdz'HelperTests.test_pwdGetByNameWithoutPwdz   s?   € ð 	�
Š
•8˜U DÑ)Ô)Ð)Ø×Ò�(Ô0°Ñ9Ô9Ñ:Ô:Ð:Ð:Ð:r(   c                 ó  — t          ¦   «         }|                     ddddddddd	¦	  «	         |                      t          d
|¦  «         d| j        _        d| j        _        |                      t          d| j        ¦  «         |                      t          j	        d¦  «        | 
                    d¦  «        ¦  «         |                      | j        j        ddg¦  «         |                      | j        j        ddg¦  «         dS )z„
        L{_shadowGetByName} returns a tuple of items from the UNIX /etc/shadow
        database if the L{spwd} is present.
        ÚbobÚ
passphraser?   r@   é   é   é   é   é   Úspwdé)	  éÒ  Úosr   N)r   rE   rF   r   r#   ÚeuidÚegidr   rG   Ú_shadowGetByNameÚgetspnamÚseteuidCallsÚsetegidCallsrJ   s     r&   Útest_shadowGetByNamez HelperTests.test_shadowGetByName�   sä   € õ
  Ñ!Ô!ˆØ�Š�u˜l¨A¨q°!°Q¸¸1¸aÑ@Ô@Ð@Ø�
Š
•8˜V VÑ,Ô,Ð,àˆŒÔØˆŒÔØ�
Š
•4˜˜tœ{Ñ+Ô+Ð+à×Ò�Ô2°5Ñ9Ô9¸6¿?º?È5Ñ;QÔ;QÑRÔRÐRØ×Ò˜œÔ1°A°t°9Ñ=Ô=Ð=Ø×Ò˜œÔ1°A°t°9Ñ=Ô=Ð=Ð=Ð=r(   c                 ó  — |                       t          dd¦  «         |                      t          j        d¦  «        ¦  «         |                      | j        j        g ¦  «         |                      | j        j        g ¦  «         dS )zP
        L{_shadowGetByName} returns L{None} if C{spwd} is not present.
        rX   NrQ   )rF   r   rN   r^   rG   r#   r`   ra   r$   s    r&   Útest_shadowGetByNameWithoutSpwdz+HelperTests.test_shadowGetByNameWithoutSpwd’   su   € ð 	�
Š
•8˜V TÑ*Ô*Ð*à×Ò�(Ô3°EÑ:Ô:Ñ;Ô;Ð;Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ð6Ð6r(   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚdependencySkipÚskipr'   r5   r7   r;   rL   rO   rb   rd   © r(   r&   r    r    8   s¥   € € € € € ðð ð
 Ð&˜€Dðð ð ð
ð 
ð 
ð
ð 
ð 
ð
ð 
ð 
ðTð Tð Tð;ð ;ð ;ð>ð >ð >ð"7ð 7ð 7ð 7ð 7r(   r    c                   ó^   — e Zd ZdZepeZdd„Zd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚSSHPublicKeyDatabaseTestsz,
    Tests for L{SSHPublicKeyDatabase}.
    ÚreturnNc           	      ó¤  — t          j        ¦   «         | _        t          d¦  «        | _        t          d¦  «        | _        d| j        z   dz   | j        z   dz   | _        t          ¦   «         | _        |  	                    t          d| j        ¦  «         t          |                      ¦   «         ¦  «        | _        t          | j        j        t          ¦  «        sJ ‚| j                             d¦  «        | _        | j                             ¦   «          t'          ¦   «         }|                     dd	d
dd| j        j        d¦  «         || j        _        d S )Nó   foobaró   eggspams   t1 s    foo
t2 s    egg
r[   ú.sshÚuserr2   r?   r@   rA   ú
/bin/shell)r   ÚSSHPublicKeyDatabaseÚcheckerr   Úkey1Úkey2Úcontentr   r#   rF   r   r   ÚmktempÚpathÚ
isinstanceÚstrÚchildÚsshDirÚmakedirsr   rE   Ú_userdbrJ   s     r&   r'   zSSHPublicKeyDatabaseTests.setUp¤   s  € ÝÔ4Ñ6Ô6ˆŒÝ 	Ñ*Ô*ˆŒ	Ý 
Ñ+Ô+ˆŒ	Ø ¤	Ñ)¨LÑ8¸4¼9ÑDÀyÑPˆŒå‘h”hˆŒØ�
Š
•4˜˜tœ{Ñ+Ô+Ð+å˜TŸ[š[™]œ]Ñ+Ô+ˆŒ	Ý˜$œ)œ.­#Ñ.Ô.Ð.Ð.Ð.Ø”i—o’o fÑ-Ô-ˆŒØŒ×ÒÑÔÐå‘”ˆØ�ŠØØØØØØŒIŒNØñ	
ô 	
ð 	
ð  &ˆŒÔÐÐr(   c                 ó  — |                       | j        g¬¦  «        }|                      |d         d         t          ¦  «         |                      |d         d         d¦  «         |                      t	          |¦  «        d¦  «         dS )zJ
        L{SSHPublicKeyDatabase} is deprecated as of version 15.0
        )ÚoffendingFunctionsr   ÚcategoryÚmessagezÜtwisted.conch.checkers.SSHPublicKeyDatabase was deprecated in Twisted 15.0.0: Please use twisted.conch.checkers.SSHPublicKeyChecker, initialized with an instance of twisted.conch.checkers.UNIXAuthorizedKeysFiles instead.r?   N)ÚflushWarningsr'   rG   ÚDeprecationWarningÚlen)r%   ÚwarningsShowns     r&   Útest_deprecatedz)SSHPublicKeyDatabaseTests.test_deprecated¾   s�   € ð ×*Ò*¸t¼z¸lÐ*ÑKÔKˆØ×Ò˜ qÔ)¨*Ô5Õ7IÑJÔJÐJØ×ÒØ˜!Ô˜YÔ'ðFñ	
ô 	
ð 	
ð 	×Ò�˜]Ñ+Ô+¨QÑ/Ô/Ð/Ð/Ð/r(   c                 óÂ  — | j                              |¦  «                             | j        ¦  «         t	          dd¦  «        }d|_        |                      | j                             |¦  «        ¦  «         d|_        |                      | j                             |¦  «        ¦  «         d|_        |  	                    | j                             |¦  «        ¦  «         d S )Nó   useró   passwordrp   rq   s
   notallowed)
r   r~   Ú
setContentry   r   Úblobr.   rv   ÚcheckKeyr9   )r%   Úfilenamers   s      r&   Ú_testCheckKeyz'SSHPublicKeyDatabaseTests._testCheckKeyÎ   sº   € ØŒ×Ò˜(Ñ#Ô#×.Ò.¨t¬|Ñ<Ô<Ð<Ý ¨Ñ5Ô5ˆØˆŒ	Ø�Š˜œ×-Ò-¨dÑ3Ô3Ñ4Ô4Ð4ØˆŒ	Ø�Š˜œ×-Ò-¨dÑ3Ô3Ñ4Ô4Ð4Ø!ˆŒ	Ø×Ò˜œ×.Ò.¨tÑ4Ô4Ñ5Ô5Ð5Ð5Ð5r(   c                 ó°   — |                       d¦  «         |                      | j        j        g ¦  «         |                      | j        j        g ¦  «         dS )z˜
        L{SSHPublicKeyDatabase.checkKey} should retrieve the content of the
        authorized_keys file and check the keys against that file.
        Úauthorized_keysN©r’   rG   r#   r`   ra   r$   s    r&   Útest_checkKeyz'SSHPublicKeyDatabaseTests.test_checkKeyØ   sU   € ð
 	×ÒÐ,Ñ-Ô-Ð-Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ð6Ð6r(   c                 ó°   — |                       d¦  «         |                      | j        j        g ¦  «         |                      | j        j        g ¦  «         dS )z™
        L{SSHPublicKeyDatabase.checkKey} should retrieve the content of the
        authorized_keys2 file and check the keys against that file.
        Úauthorized_keys2Nr•   r$   s    r&   Útest_checkKey2z(SSHPublicKeyDatabaseTests.test_checkKey2á   sU   € ð
 	×ÒÐ-Ñ.Ô.Ð.Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ø×Ò˜œÔ1°2Ñ6Ô6Ð6Ð6Ð6r(   c                 ó°  ‡‡— | j                              d¦  «        Š‰                     | j        ¦  «         ‰                     d¦  «         |                      ‰j        d¦  «         | j        j        Šˆˆfd„}d| j        _        d| j        _	        |  
                    | j        d|¦  «         |  
                    t          d| j        ¦  «         t          d	d
¦  «        }d|_        |                      | j                             |¦  «        ¦  «         |                      | j        j        g d¢¦  «         |                      | j        j        ddg¦  «         dS )z˜
        If the key file is readable, L{SSHPublicKeyDatabase.checkKey} should
        switch its uid/gid to the ones of the authenticated user.
        r”   r   éÿ  c                 óD   •— ‰                      d¦  «          ‰| ¦  «        S )Nr›   )Úchmod)r\   ÚkeyFileÚsavedSeteuids    €€r&   Úseteuidz>SSHPublicKeyDatabaseTests.test_checkKeyAsRoot.<locals>.seteuid÷   s%   ø€ Ø�MŠM˜%Ñ Ô Ð Ø�< Ñ%Ô%Ð%r(   rY   rZ   r    r[   rŒ   r�   rp   )r   r?   r   rY   r@   N)r   r~   rŽ   ry   r�   Ú
addCleanupr#   r    r\   r]   rF   r   r   r�   r.   rv   r�   rG   r`   ra   )r%   r    rs   rž   rŸ   s      @@r&   Útest_checkKeyAsRootz-SSHPublicKeyDatabaseTests.test_checkKeyAsRootê   sD  øø€ ð
 ”+×#Ò#Ð$5Ñ6Ô6ˆØ×Ò˜4œ<Ñ(Ô(Ð(à�Š�eÑÔÐØ�Š˜œ uÑ-Ô-Ð-à”{Ô*ˆð	&ð 	&ð 	&ð 	&ð 	&ð 	&ð  ˆŒÔØˆŒÔØ�
Š
�4”; 	¨7Ñ3Ô3Ð3Ø�
Š
•4˜˜tœ{Ñ+Ô+Ð+Ý ¨Ñ5Ô5ˆØˆŒ	Ø�Š˜œ×-Ò-¨dÑ3Ô3Ñ4Ô4Ð4Ø×Ò˜œÔ1°?°?°?ÑCÔCÐCØ×Ò˜œÔ1°A°t°9Ñ=Ô=Ð=Ð=Ð=r(   c           	      óX  ‡ — d„ }‰                       ‰ j        d|¦  «         t          ddt          j        dt
          j                             t          j        ¦  «         	                    d¦  «        ¦  «        }‰ j         
                    |¦  «        }ˆ fd„}|                     |¦  «        S )z�
        L{SSHPublicKeyDatabase.requestAvatarId} should return the avatar id
        passed in if its C{_checkKey} method returns True.
        c                 ó   — dS ©NTrk   ©Úignoreds    r&   Ú	_checkKeyzASSHPublicKeyDatabaseTests.test_requestAvatarId.<locals>._checkKey  ó   € Ø�4r(   r�   ó   testó   ssh-rsaó   fooc                 ó4   •— ‰                      | d¦  «         d S ©Nrª   ©rG   ©ÚavatarIdr%   s    €r&   Ú_verifyz?SSHPublicKeyDatabaseTests.test_requestAvatarId.<locals>._verify  ó   ø€ Ø×Ò˜X wÑ/Ô/Ð/Ð/Ð/r(   )rF   rv   r   r   ÚpublicRSA_opensshr   ÚKeyÚ
fromStringÚprivateRSA_opensshÚsignÚrequestAvatarIdÚaddCallback)r%   r¨   ÚcredentialsÚdr²   s   `    r&   Útest_requestAvatarIdz.SSHPublicKeyDatabaseTests.test_requestAvatarId  s²   ø€ ð	ð 	ð 	ð 	�
Š
�4”< ¨YÑ7Ô7Ð7Ý#ØØÝÔ%ØÝŒH×Ò¥Ô :Ñ;Ô;×@Ò@ÀÑHÔHñ
ô 
ˆð ŒL×(Ò(¨Ñ5Ô5ˆð	0ð 	0ð 	0ð 	0ð 	0ð �}Š}˜WÑ%Ô%Ð%r(   c                 óä   — d„ }|                       | j        d|¦  «         t          ddt          j        dd¦  «        }| j                             |¦  «        }|                      |t          ¦  «        S )a(  
        L{SSHPublicKeyDatabase.requestAvatarId} should raise L{ValidPublicKey}
        if the credentials represent a valid key without a signature.  This
        tells the user that the key is valid for login, but does not actually
        allow that user to do so without a signature.
        c                 ó   — dS r¥   rk   r¦   s    r&   r¨   zQSSHPublicKeyDatabaseTests.test_requestAvatarIdWithoutSignature.<locals>._checkKey%  r©   r(   r�   rª   r«   N)rF   rv   r   r   r´   r¹   ÚassertFailurer   ©r%   r¨   r»   r¼   s       r&   Ú$test_requestAvatarIdWithoutSignaturez>SSHPublicKeyDatabaseTests.test_requestAvatarIdWithoutSignature  su   € ð	ð 	ð 	ð 	�
Š
�4”< ¨YÑ7Ô7Ð7Ý#Ø�Z¥Ô!:¸DÀ$ñ
ô 
ˆð ŒL×(Ò(¨Ñ5Ô5ˆØ×!Ò! !¥^Ñ4Ô4Ð4r(   c                 óª   — d„ }|                       | j        d|¦  «         | j                             d¦  «        }|                      |t          ¦  «        S )z…
        If L{SSHPublicKeyDatabase.checkKey} returns False,
        C{_cbRequestAvatarId} should raise L{UnauthorizedLogin}.
        c                 ó   — dS ©NFrk   r¦   s    r&   r¨   zKSSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidKey.<locals>._checkKey5  ó   € Ø�5r(   r�   N)rF   rv   r¹   rÀ   r   )r%   r¨   r¼   s      r&   Útest_requestAvatarIdInvalidKeyz8SSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidKey/  sW   € ð	ð 	ð 	ð 	�
Š
�4”< ¨YÑ7Ô7Ð7ØŒL×(Ò(¨Ñ.Ô.ˆØ×!Ò! !Õ%6Ñ7Ô7Ð7r(   c           	      óX  — d„ }|                       | j        d|¦  «         t          ddt          j        dt
          j                             t          j        ¦  «         	                    d¦  «        ¦  «        }| j         
                    |¦  «        }|                      |t          ¦  «        S )z¡
        Valid keys with invalid signatures should cause
        L{SSHPublicKeyDatabase.requestAvatarId} to return a {UnauthorizedLogin}
        failure
        c                 ó   — dS r¥   rk   r¦   s    r&   r¨   zQSSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidSignature.<locals>._checkKeyC  r©   r(   r�   rª   r«   r¬   )rF   rv   r   r   r´   r   rµ   r¶   ÚprivateDSA_opensshr¸   r¹   rÀ   r   rÁ   s       r&   Ú$test_requestAvatarIdInvalidSignaturez>SSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidSignature<  s›   € ð	ð 	ð 	ð 	�
Š
�4”< ¨YÑ7Ô7Ð7Ý#ØØÝÔ%ØÝŒH×Ò¥Ô :Ñ;Ô;×@Ò@ÀÑHÔHñ
ô 
ˆð ŒL×(Ò(¨Ñ5Ô5ˆØ×!Ò! !Õ%6Ñ7Ô7Ð7r(   c                 ó  ‡ — d„ }‰                       ‰ j        d|¦  «         t          ddddd¦  «        }‰ j                             |¦  «        }ˆ fd„}|                     |¦  «         ‰                      |t          ¦  «        S )	z~
        Exceptions raised while verifying the key should be normalized into an
        C{UnauthorizedLogin} failure.
        c                 ó   — dS r¥   rk   r¦   s    r&   r¨   zSSSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeException.<locals>._checkKeyW  r©   r(   r�   rª   Ns   blobs   sigDatas   sigc                 óŒ   •— ‰                      t          j        ¦  «        }‰                     t	          |¦  «        d¦  «         | S )Nr?   )ÚflushLoggedErrorsr   ÚBadKeyErrorrG   rˆ   )ÚfailureÚerrorsr%   s     €r&   Ú_verifyLoggedExceptionz`SSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeException.<locals>._verifyLoggedException^  s:   ø€ Ø×+Ò+­DÔ,<Ñ=Ô=ˆFØ×Ò�S ™[œ[¨!Ñ,Ô,Ð,ØˆNr(   )rF   rv   r   r¹   Ú
addErrbackrÀ   r   )r%   r¨   r»   r¼   rÓ   s   `    r&   Ú&test_requestAvatarIdNormalizeExceptionz@SSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeExceptionQ  s›   ø€ ð	ð 	ð 	ð 	�
Š
�4”< ¨YÑ7Ô7Ð7Ý# G¨T°7¸JÈÑOÔOˆØŒL×(Ò(¨Ñ5Ô5ˆð	ð 	ð 	ð 	ð 	ð
 	
�ŠÐ+Ñ,Ô,Ð,Ø×!Ò! !Õ%6Ñ7Ô7Ð7r(   ©rn   N)re   rf   rg   rh   ÚeuidSkipri   rj   r'   rŠ   r’   r–   r™   r¢   r½   rÂ   rÇ   rË   rÕ   rk   r(   r&   rm   rm   �   sÔ   € € € € € ðð ð Ð%�~€Dð&ð &ð &ð &ð40ð 0ð 0ð 6ð 6ð 6ð7ð 7ð 7ð7ð 7ð 7ð>ð >ð >ð6&ð &ð &ð05ð 5ð 5ð$8ð 8ð 8ð8ð 8ð 8ð*8ð 8ð 8ð 8ð 8r(   rm   c                   ó:   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ ZdS )	ÚSSHProtocolCheckerTestsz*
    Tests for L{SSHProtocolChecker}.
    c                 óP  — t          j        ¦   «         }|                      |j        g ¦  «         |                     t          j        ¦   «         ¦  «         |                      |j        t          g¦  «         |                      |j         t                   t           j        ¦  «         dS )z€
        L{SSHProcotolChecker.registerChecker} should add the given checker to
        the list of registered checkers.
        N)r   ÚSSHProtocolCheckerrG   ÚcredentialInterfacesÚregisterCheckerru   r
   ÚassertIsInstance©r%   rv   s     r&   Útest_registerCheckerz,SSHProtocolCheckerTests.test_registerCheckern  sŸ   € õ
 Ô-Ñ/Ô/ˆØ×Ò˜Ô5°rÑ:Ô:Ð:Ø×ÒÝÔ)Ñ+Ô+ñ	
ô 	
ð 	
ð 	×Ò˜Ô5½Ð7GÑHÔHÐHØ×ÒØÔ�^Ô,­hÔ.Kñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó\  — t          j        ¦   «         }|                      |j        g ¦  «         |                     t          j        ¦   «         t          ¦  «         |                      |j        t          g¦  «         |                      |j         t                   t           j        ¦  «         dS )zÙ
        If a specific interface is passed into
        L{SSHProtocolChecker.registerChecker}, that interface should be
        registered instead of what the checker specifies in
        credentialIntefaces.
        N)r   rÛ   rG   rÜ   rÝ   ru   r   rÞ   rß   s     r&   Ú!test_registerCheckerWithInterfacez9SSHProtocolCheckerTests.test_registerCheckerWithInterface}  s›   € õ Ô-Ñ/Ô/ˆØ×Ò˜Ô5°rÑ:Ô:Ð:Ø×Ò¥Ô =Ñ ?Ô ?ÕARÑSÔSÐSØ×Ò˜Ô5Õ8IÐ7JÑKÔKÐKØ×ÒØÔÕ.Ô/µÔ1Nñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó  ‡ — t          j        ¦   «         }t          ¦   «         }|                     dd¦  «         |                     |¦  «         |                     t          dd¦  «        ¦  «        }ˆ fd„}|                     |¦  «        S )z†
        L{SSHProtocolChecker.requestAvatarId} should defer to one if its
        registered checkers to authenticate a user.
        rª   c                 ó4   •— ‰                      | d¦  «         d S r®   r¯   r°   s    €r&   Ú	_callbackz?SSHProtocolCheckerTests.test_requestAvatarId.<locals>._callback—  r³   r(   )r   rÛ   r	   rE   rÝ   r¹   r   rº   )r%   rv   ÚpasswordDatabaser¼   rå   s   `    r&   r½   z,SSHProtocolCheckerTests.test_requestAvatarIdŒ  s•   ø€ õ
 Ô-Ñ/Ô/ˆÝBÑDÔDÐØ× Ò  ¨'Ñ2Ô2Ð2Ø×ÒÐ 0Ñ1Ô1Ð1Ø×#Ò#Õ$4°W¸gÑ$FÔ$FÑGÔGˆð	0ð 	0ð 	0ð 	0ð 	0ð �}Š}˜YÑ'Ô'Ð'r(   c                 óJ  — t          j        ¦   «         }d„ }|                      |d|¦  «         t          ¦   «         }|                     dd¦  «         |                     |¦  «         |                     t          dd¦  «        ¦  «        }|                      |t          ¦  «        S )zÂ
        If the client indicates that it is never satisfied, by always returning
        False from _areDone, then L{SSHProtocolChecker} should raise
        L{NotEnoughAuthentication}.
        c                 ó   — dS rÅ   rk   )r±   s    r&   Ú_areDonezYSSHProtocolCheckerTests.test_requestAvatarIdWithNotEnoughAuthentication.<locals>._areDone¤  rÆ   r(   ÚareDonerª   )
r   rÛ   rF   r	   rE   rÝ   r¹   r   rÀ   r   )r%   rv   ré   ræ   r¼   s        r&   Ú/test_requestAvatarIdWithNotEnoughAuthenticationzGSSHProtocolCheckerTests.test_requestAvatarIdWithNotEnoughAuthenticationœ  s¥   € õ Ô-Ñ/Ô/ˆð	ð 	ð 	ð 	�
Š
�7˜I xÑ0Ô0Ð0åBÑDÔDÐØ× Ò  ¨'Ñ2Ô2Ð2Ø×ÒÐ 0Ñ1Ô1Ð1Ø×#Ò#Õ$4°W¸gÑ$FÔ$FÑGÔGˆØ×!Ò! !Õ%<Ñ=Ô=Ð=r(   c                 ó¤   — t          j        ¦   «         }|                     t          dd¦  «        ¦  «        }|                      |t
          ¦  «        S )z™
        If the passed credentials aren't handled by any registered checker,
        L{SSHProtocolChecker} should raise L{UnhandledCredentials}.
        rª   )r   rÛ   r¹   r   rÀ   r   )r%   rv   r¼   s      r&   Ú%test_requestAvatarIdInvalidCredentialz=SSHProtocolCheckerTests.test_requestAvatarIdInvalidCredential¯  sG   € õ
 Ô-Ñ/Ô/ˆØ×#Ò#Õ$4°W¸gÑ$FÔ$FÑGÔGˆØ×!Ò! !Õ%9Ñ:Ô:Ð:r(   c                 óx   — |                       t          j        ¦   «                              d¦  «        ¦  «         dS )zV
        The default L{SSHProcotolChecker.areDone} should simply return True.
        N)r.   r   rÛ   rê   r$   s    r&   Útest_areDonez$SSHProtocolCheckerTests.test_areDone¸  s3   € ð 	�Š�Ô3Ñ5Ô5×=Ò=¸dÑCÔCÑDÔDÐDÐDÐDr(   N)re   rf   rg   rh   ri   rj   rà   râ   r½   rë   rí   rï   rk   r(   r&   rÙ   rÙ   g  s„   € € € € € ðð ð €Dð
ð 
ð 
ð
ð 
ð 
ð(ð (ð (ð >ð >ð >ð&;ð ;ð ;ðEð Eð Eð Eð Er(   rÙ   c                   ój   — e Zd ZdZepeZdee         deddfd„Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚUNIXPasswordDatabaseTestsz,
    Tests for L{UNIXPasswordDatabase}.
    r¼   Úusernamern   Nc                 óX   — |                       |                      |¦  «        |¦  «         dS )zè
        Assert that the L{Deferred} passed in is called back with the value
        'username'.  This represents a valid login for this TestCase.

        @param d: a L{Deferred} from an L{IChecker.requestAvatarId} method.
        N)rG   ÚsuccessResultOf)r%   r¼   rò   s      r&   ÚassertLoggedInz(UNIXPasswordDatabaseTests.assertLoggedInÆ  s.   € ð 	×Ò˜×-Ò-¨aÑ0Ô0°(Ñ;Ô;Ð;Ð;Ð;r(   c                 ó  — t          j        ¦   «         }d„ }t          ¦   «         }|                     d |dd¦  «        ddddd¦  «         |                     d	d
ddddd¦  «         t	          ¦   «         }|                     ddddddddd¦	  «	         |                     d	 |d	d¦  «        ddddddd¦	  «	         |                      t           d|¦  «         |                      t           d|¦  «         t          ¦   «         }|                      t          d|¦  «         d|_        d|_	        t          dd ¦  «        }|                      |                     |¦  «        d¦  «         |                      |j        g ¦  «         |                      |j        g ¦  «         d!|_        |                      |                     |¦  «        d!¦  «         |                      |j        d"dg¦  «         |                      |j        d"dg¦  «         d#S )$z�
        L{UNIXPasswordDatabase} with no arguments has checks the C{pwd} database
        and then the C{spwd} database.
        c                 ó`   — t          j         || ¦  «        }t          j         |d|z   ¦  «        }|S )Nz$1$)r-   )rò   r2   r3   r4   s       r&   r4   z?UNIXPasswordDatabaseTests.test_defaultCheckers.<locals>.cryptedÖ  s-   € Ý”;˜x¨Ñ2Ô2ˆDÝ”k (¨E°D©LÑ9Ô9ˆGØˆNr(   r=   r2   r?   r@   ÚfoorB   rC   rQ   ÚxÚbarú/barr:   rS   rT   rU   rV   rW   é   é	   é
   é   é   é   é   rD   rX   r[   rY   rZ   ó   alicer�   ó   bobr   N)r   ÚUNIXPasswordDatabaser   rE   r   rF   r   r   r\   r]   r   rõ   r¹   rG   r`   ra   rò   )r%   rv   r4   rD   rX   r#   Úcreds          r&   Útest_defaultCheckersz.UNIXPasswordDatabaseTests.test_defaultCheckersÏ  s  € õ
 Ô/Ñ1Ô1ˆð	ð 	ð 	õ
 ‰nŒnˆØ�ŠØ�W�W˜W jÑ1Ô1°1°a¸ÀÈ	ñ	
ô 	
ð 	
ð 	�Š�E˜3  1 e¨V°YÑ?Ô?Ð?ÝÑÔˆØ�Š�W˜g q¨!¨Q°°1°a¸Ñ;Ô;Ð;Ø�Š�U˜G˜G E¨:Ñ6Ô6¸¸1¸bÀ"ÀbÈ"ÈbÑQÔQÐQà�
Š
•8˜U CÑ(Ô(Ð(Ø�
Š
•8˜V TÑ*Ô*Ð*å‘”ˆØ�
Š
•4˜˜vÑ&Ô&Ð&àˆŒØˆŒå ¨+Ñ6Ô6ˆØ×Ò˜G×3Ò3°DÑ9Ô9¸8ÑDÔDÐDØ×Ò˜Ô,¨bÑ1Ô1Ð1Ø×Ò˜Ô,¨bÑ1Ô1Ð1ØˆŒØ×Ò˜G×3Ò3°DÑ9Ô9¸6ÑBÔBÐBØ×Ò˜Ô,¨q°$¨iÑ8Ô8Ð8Ø×Ò˜Ô,¨q°$¨iÑ8Ô8Ð8Ð8Ð8r(   c                 óF   — |                       |t          j        ¦  «         dS )aÅ  
        Asserts that the L{Deferred} passed in is erred back with an
        L{UnauthorizedLogin} L{Failure}.  This reprsents an invalid login for
        this TestCase.

        NOTE: To work, this method's return value must be returned from the
        test method, or otherwise hooked up to the test machinery.

        @param d: a L{Deferred} from an L{IChecker.requestAvatarId} method.
        @type d: L{Deferred}
        @rtype: L{None}
        N)ÚfailureResultOfr   r   ©r%   r¼   s     r&   ÚassertUnauthorizedLoginz1UNIXPasswordDatabaseTests.assertUnauthorizedLogin÷  s#   € ð 	×Ò˜Q¥Ô :Ñ;Ô;Ð;Ð;Ð;r(   c           	      ó$  — t          j         dd¦  «        }t          ¦   «         }|                     d|ddddd¦  «         t          j        |j        g¦  «        }|                      |                     t          dd	¦  «        ¦  «        d¦  «         d
S )zo
        L{UNIXPasswordDatabase} takes a list of functions to check for UNIX
        user information.
        ÚsecretÚanybodyr?   r@   rø   rû   rC   s   anybodys   secretN)	r-   r   rE   r   r  rI   rõ   r¹   r   )r%   r2   rK   rv   s       r&   Útest_passInCheckersz-UNIXPasswordDatabaseTests.test_passInCheckers  s‘   € õ
 ”;˜x¨Ñ2Ô2ˆÝ‘”ˆØ�Š�y (¨A¨q°%¸ÀÑKÔKÐKÝÔ/°´Ð0AÑBÔBˆØ×ÒØ×#Ò#Õ$4°ZÀÑ$KÔ$KÑLÔLÈjñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 óæ   — d„ }d„ }|                       t          d|¦  «         t          j        |g¦  «        }t          dd¦  «        }|                      |                     |¦  «        d¦  «         dS )zÝ
        If the encrypted password provided by the getpwnam function is valid
        (verified by the L{verifyCryptedPassword} function), we callback the
        C{requestAvatarId} L{Deferred} with the username.
        c                 ó   — | |k    S r"   rk   ©r4   Úpws     r&   r/   zLUNIXPasswordDatabaseTests.test_verifyPassword.<locals>.verifyCryptedPassword  ó   € Ø˜b’=Ð r(   c                 ó
   — | | gS r"   rk   ©rò   s    r&   rI   z?UNIXPasswordDatabaseTests.test_verifyPassword.<locals>.getpwnam  s   € Ø˜hÐ'Ð'r(   r/   ó   usernameN©rF   r   r  r   rõ   r¹   ©r%   r/   rI   rv   Ú
credentials        r&   Útest_verifyPasswordz-UNIXPasswordDatabaseTests.test_verifyPassword  s…   € ð	!ð 	!ð 	!ð	(ð 	(ð 	(ð 	�
Š
•8Ð4Ð6KÑLÔLÐLÝÔ/°°
Ñ;Ô;ˆÝ% k°;Ñ?Ô?ˆ
Ø×Ò˜G×3Ò3°JÑ?Ô?ÀÑMÔMÐMÐMÐMr(   c                 ó¦   — d„ }t          j        |g¦  «        }t          dd¦  «        }|                      |                     |¦  «        ¦  «         dS )z}
        If the getpwnam function raises a KeyError, the login fails with an
        L{UnauthorizedLogin} exception.
        c                 ó    — t          | ¦  «        ‚r"   )ÚKeyErrorr  s    r&   rI   z?UNIXPasswordDatabaseTests.test_failOnKeyError.<locals>.getpwnam+  s   € Ý˜8Ñ$Ô$Ð$r(   r  r�   N)r   r  r   r  r¹   )r%   rI   rv   r  s       r&   Útest_failOnKeyErrorz-UNIXPasswordDatabaseTests.test_failOnKeyError%  s\   € ð	%ð 	%ð 	%õ Ô/°°
Ñ;Ô;ˆÝ% k°;Ñ?Ô?ˆ
Ø×$Ò$ W×%<Ò%<¸ZÑ%HÔ%HÑIÔIÐIÐIÐIr(   c                 óä   — d„ }d„ }|                       t          d|¦  «         t          j        |g¦  «        }t          dd¦  «        }|                      |                     |¦  «        ¦  «         dS )z”
        If the verifyCryptedPassword function doesn't verify the password, the
        login fails with an L{UnauthorizedLogin} exception.
        c                 ó   — dS rÅ   rk   r  s     r&   r/   zOUNIXPasswordDatabaseTests.test_failOnBadPassword.<locals>.verifyCryptedPassword8  rÆ   r(   c                 ó
   — | dgS )Nr�   rk   r  s    r&   rI   zBUNIXPasswordDatabaseTests.test_failOnBadPassword.<locals>.getpwnam;  s   € Ø˜kÐ*Ð*r(   r/   r  r�   N)rF   r   r  r   r  r¹   r  s        r&   Útest_failOnBadPasswordz0UNIXPasswordDatabaseTests.test_failOnBadPassword2  sƒ   € ð	ð 	ð 	ð	+ð 	+ð 	+ð 	�
Š
•8Ð4Ð6KÑLÔLÐLÝÔ/°°
Ñ;Ô;ˆÝ% k°;Ñ?Ô?ˆ
Ø×$Ò$ W×%<Ò%<¸ZÑ%HÔ%HÑIÔIÐIÐIÐIr(   c                 óî   — d„ }d„ }d„ }|                       t          d|¦  «         t          j        ||g¦  «        }t          dd¦  «        }|                      |                     |¦  «        d¦  «         dS )a  
        UNIXPasswordDatabase.requestAvatarId loops through each getpwnam
        function associated with it and returns a L{Deferred} which fires with
        the result of the first one which returns a value other than None.
        ones do not verify the password.
        c                 ó   — | |k    S r"   rk   r  s     r&   r/   zRUNIXPasswordDatabaseTests.test_loopThroughFunctions.<locals>.verifyCryptedPasswordK  r  r(   c                 ó
   — | dgS )Nznot the passwordrk   r  s    r&   Ú	getpwnam1zFUNIXPasswordDatabaseTests.test_loopThroughFunctions.<locals>.getpwnam1N  s   € ØÐ0Ð1Ð1r(   c                 ó
   — | dgS )Nr2   rk   r  s    r&   Ú	getpwnam2zFUNIXPasswordDatabaseTests.test_loopThroughFunctions.<locals>.getpwnam2Q  s   € Ø˜jÐ)Ð)r(   r/   r  r�   Nr  )r%   r/   r'  r)  rv   r  s         r&   Útest_loopThroughFunctionsz3UNIXPasswordDatabaseTests.test_loopThroughFunctionsC  s—   € ð	!ð 	!ð 	!ð	2ð 	2ð 	2ð	*ð 	*ð 	*ð 	�
Š
•8Ð4Ð6KÑLÔLÐLÝÔ/°¸IÐ0FÑGÔGˆÝ% k°;Ñ?Ô?ˆ
Ø×Ò˜G×3Ò3°JÑ?Ô?ÀÑMÔMÐMÐMÐMr(   c           	      óŠ  — t          ¦   «         }|                     ddddddd¦  «         |                     ddddddd¦  «         |                     d	d
ddddd¦  «         |                      t          d|¦  «         t          j        t          j        g¦  «        }t          dd¦  «        }|                      |                     |¦  «        ¦  «         t          dd¦  «        }|                      |                     |¦  «        ¦  «         t          dd¦  «        }|                      |                     |¦  «        ¦  «         dS )z¨
        If the password returned by any function is C{""}, C{"x"}, or C{"*"} it
        is not compared against the supplied password.  Instead it is skipped.
        r=   Ú r?   r@   rø   rú   rQ   rù   ÚcarolÚ*rD   r  r(   r  ó   xs   caroló   *N)	r   rE   rF   r   r  rH   r   r  r¹   )r%   rD   rv   r  s       r&   Útest_failOnSpecialz,UNIXPasswordDatabaseTests.test_failOnSpecialY  s,  € õ
 ‰nŒnˆØ�Š�G˜R  A r¨5°%Ñ8Ô8Ð8Ø�Š�E˜3  1 b¨%°Ñ7Ô7Ð7Ø�Š�G˜S ! Q¨¨E°5Ñ9Ô9Ð9Ø�
Š
•8˜U CÑ(Ô(Ð(åÔ/µÔ1GÐ0HÑIÔIˆÝ ¨#Ñ.Ô.ˆØ×$Ò$ W×%<Ò%<¸TÑ%BÔ%BÑCÔCÐCå ¨Ñ-Ô-ˆØ×$Ò$ W×%<Ò%<¸TÑ%BÔ%BÑCÔCÐCå ¨$Ñ/Ô/ˆØ×$Ò$ W×%<Ò%<¸TÑ%BÔ%BÑCÔCÐCÐCÐCr(   )re   rf   rg   rh   r   ri   rj   r   Úbytesrõ   r  r  r  r  r  r#  r*  r1  rk   r(   r&   rñ   rñ   ¿  sá   € € € € € ðð ð Ð&˜€Dð< ¨¤ð <¸5ð <ÀTð <ð <ð <ð <ð&9ð &9ð &9ðP<ð <ð <ð
ð 
ð 
ðNð Nð Nð$Jð Jð JðJð Jð Jð"Nð Nð Nð,Dð Dð Dð Dð Dr(   rñ   c                   ó(   — e Zd ZdZeZd„ Zd„ Zd„ ZdS )ÚAuthorizedKeyFileReaderTestsz5
    Tests for L{checkers.readAuthorizedKeyFile}
    c                 óš   — t          d¦  «        }t          j        |d„ ¦  «        }|                      ddgt	          |¦  «        ¦  «         dS )zg
        L{checkers.readAuthorizedKeyFile} does not attempt to turn comments
        into keys
        sE   # this comment is ignored
this is not
# this is again
and this is notc                 ó   — | S r"   rk   ©rù   s    r&   ú<lambda>zCAuthorizedKeyFileReaderTests.test_ignoresComments.<locals>.<lambda>�  s   € À1€ r(   s   this is nots   and this is notN©r   r   ÚreadAuthorizedKeyFilerG   Úlist©r%   ÚfileobjÚresults      r&   Útest_ignoresCommentsz1AuthorizedKeyFileReaderTests.test_ignoresCommentsv  sV   € õ
 ðñ
ô 
ˆõ Ô/°¸¸ÑEÔEˆØ×Ò˜.Ð*<Ð=½tÀF¹|¼|ÑLÔLÐLÐLÐLr(   c                 óš   — t          d¦  «        }t          j        |d„ ¬¦  «        }|                      dgt	          |¦  «        ¦  «         dS )zw
        L{checkers.readAuthorizedKeyFile} ignores leading whitespace in
        lines, as well as empty lines
        sg   
                           # ignore
                           not ignored
                           c                 ó   — | S r"   rk   r7  s    r&   r8  zYAuthorizedKeyFileReaderTests.test_ignoresLeadingWhitespaceAndEmptyLines.<locals>.<lambda>�  s   € ÈA€ r(   ©ÚparseKeys   not ignoredNr9  r<  s      r&   Ú*test_ignoresLeadingWhitespaceAndEmptyLineszGAuthorizedKeyFileReaderTests.test_ignoresLeadingWhitespaceAndEmptyLines„  sV   € õ
 ðñ
ô 
ˆõ Ô/°À+À+ÐNÑNÔNˆØ×Ò˜.Ð)­4°©<¬<Ñ8Ô8Ð8Ð8Ð8r(   c                 óž   — d„ }t          d¦  «        }t          j        ||¬¦  «        }|                      dgt	          |¦  «        ¦  «         dS )zÇ
        L{checkers.readAuthorizedKeyFile} does not raise an exception
        when a key fails to parse (raises a
        L{twisted.conch.ssh.keys.BadKeyError}), but rather just keeps going
        c                 óX   — |                       d¦  «        rt          j        d¦  «        ‚| S )Nó   fzfailed to parse)Ú
startswithr   rÐ   )Úlines    r&   Ú
failOnSomezKAuthorizedKeyFileReaderTests.test_ignoresUnparsableKeys.<locals>.failOnSome™  s-   € Ø�Š˜tÑ$Ô$ð :ÝÔ&Ð'8Ñ9Ô9Ð9ØˆKr(   s   failed key
good keyrB  s   good keyNr9  )r%   rJ  r=  r>  s       r&   Útest_ignoresUnparsableKeysz7AuthorizedKeyFileReaderTests.test_ignoresUnparsableKeys’  sZ   € ð	ð 	ð 	õ
 Ð1Ñ2Ô2ˆÝÔ/°À*ÐMÑMÔMˆØ×Ò˜+˜­¨V©¬Ñ5Ô5Ð5Ð5Ð5r(   N)	re   rf   rg   rh   ri   rj   r?  rD  rK  rk   r(   r&   r4  r4  o  sU   € € € € € ðð ð €DðMð Mð Mð9ð 9ð 9ð6ð 6ð 6ð 6ð 6r(   r4  c                   ó(   — e Zd ZdZeZd„ Zd„ Zd„ ZdS )ÚInMemorySSHKeyDBTestsz0
    Tests for L{checkers.InMemorySSHKeyDB}
    c                 óh   — t          j        ddgi¦  «        }t          t           j        |¦  «         dS )z_
        L{checkers.InMemorySSHKeyDB} implements
        L{checkers.IAuthorizedKeysDB}
        r  s   keyN)r   ÚInMemorySSHKeyDBr   ÚIAuthorizedKeysDB©r%   Úkeydbs     r&   Útest_implementsInterfacez.InMemorySSHKeyDBTests.test_implementsInterfaceª  s4   € õ
 Ô)¨8°f°XÐ*>Ñ?Ô?ˆÝ•XÔ/°Ñ7Ô7Ð7Ð7Ð7r(   c                 ó    — t          j        ddgi¦  «        }|                      g t          |                     d¦  «        ¦  «        ¦  «         dS )z½
        If the user is not in the mapping provided to
        L{checkers.InMemorySSHKeyDB}, an empty iterator is returned
        by L{checkers.InMemorySSHKeyDB.getAuthorizedKeys}
        r  s   keysr  N©r   rO  rG   r;  ÚgetAuthorizedKeysrQ  s     r&   Útest_noKeysForUnauthorizedUserz4InMemorySSHKeyDBTests.test_noKeysForUnauthorizedUser²  sM   € õ Ô)¨8°g°YÐ*?Ñ@Ô@ˆØ×Ò˜�T %×"9Ò"9¸&Ñ"AÔ"AÑBÔBÑCÔCÐCÐCÐCr(   c                 ó¦   — t          j        dddgi¦  «        }|                      ddgt          |                     d¦  «        ¦  «        ¦  «         dS )zÅ
        If the user is in the mapping provided to
        L{checkers.InMemorySSHKeyDB}, an iterator with all the keys
        is returned by L{checkers.InMemorySSHKeyDB.getAuthorizedKeys}
        r  ó   aó   bNrU  rQ  s     r&   Útest_allKeysForAuthorizedUserz3InMemorySSHKeyDBTests.test_allKeysForAuthorizedUser»  sS   € õ Ô)¨8°d¸D°\Ð*BÑCÔCˆØ×Ò˜$ ˜¥t¨E×,CÒ,CÀHÑ,MÔ,MÑ'NÔ'NÑOÔOÐOÐOÐOr(   N)	re   rf   rg   rh   ri   rj   rS  rW  r[  rk   r(   r&   rM  rM  £  sZ   € € € € € ðð ð €Dð8ð 8ð 8ðDð Dð DðPð Pð Pð Pð Pr(   rM  c                   ó<   — e Zd ZdZeZd
d„Zd„ Zd„ Zd„ Z	d„ Z
d	„ ZdS )ÚUNIXAuthorizedKeysFilesTestsz8
    Tests for L{checkers.UNIXAuthorizedKeysFiles}.
    rn   Nc           	      ó   — t          |                      ¦   «         ¦  «        | _        t          | j        j        t          ¦  «        sJ ‚| j                             ¦   «          t          ¦   «         | _        | j                             ddddd| j        j        d¦  «         | j         	                    d¦  «        | _
        | j
                             ¦   «          | j
         	                    d¦  «        }|                     d	¦  «         d
dg| _        d S )Nr=   r2   r?   r@   zalice lastnamert   rr   r”   s   key 1
key 2s   key 1s   key 2)r   rz   r{   r|   r}   r€   r   rK   rE   r~   r   rŽ   ÚexpectedKeys)r%   ÚauthorizedKeyss     r&   r'   z"UNIXAuthorizedKeysFilesTests.setUpÌ  sí   € Ý˜TŸ[š[™]œ]Ñ+Ô+ˆŒ	Ý˜$œ)œ.­#Ñ.Ô.Ð.Ð.Ð.ØŒ	×ÒÑÔÐå"‘n”nˆŒØŒ×ÒØØØØØØŒIŒNØñ	
ô 	
ð 	
ð ”i—o’o fÑ-Ô-ˆŒØŒ×ÒÑÔÐØœ×*Ò*Ð+<Ñ=Ô=ˆØ×!Ò! /Ñ2Ô2Ð2à% xÐ0ˆÔÐÐr(   c                 ól   — t          j        | j        ¦  «        }t          t           j        |¦  «         dS )zg
        L{checkers.UNIXAuthorizedKeysFiles} implements
        L{checkers.IAuthorizedKeysDB}.
        N)r   ÚUNIXAuthorizedKeysFilesrK   r   rP  rQ  s     r&   rS  z5UNIXAuthorizedKeysFilesTests.test_implementsInterfaceã  s/   € õ
 Ô0°´Ñ=Ô=ˆÝ•XÔ/°Ñ7Ô7Ð7Ð7Ð7r(   c                 óª   — t          j        | j        d„ ¬¦  «        }|                      g t	          |                     d¦  «        ¦  «        ¦  «         dS )zÒ
        If the user is not in the user database provided to
        L{checkers.UNIXAuthorizedKeysFiles}, an empty iterator is returned
        by L{checkers.UNIXAuthorizedKeysFiles.getAuthorizedKeys}.
        c                 ó   — | S r"   rk   r7  s    r&   r8  zMUNIXAuthorizedKeysFilesTests.test_noKeysForUnauthorizedUser.<locals>.<lambda>ñ  ó   € ÐQR€ r(   rB  r  N)r   rb  rK   rG   r;  rV  rQ  s     r&   rW  z;UNIXAuthorizedKeysFilesTests.test_noKeysForUnauthorizedUserë  sO   € õ Ô0°´À{À{ÐSÑSÔSˆØ×Ò˜�T %×"9Ò"9¸&Ñ"AÔ"AÑBÔBÑCÔCÐCÐCÐCr(   c                 ó  — | j                              d¦  «                             d¦  «         t          j        | j        d„ ¬¦  «        }|                      | j        dgz   t          | 	                    d¦  «        ¦  «        ¦  «         dS )a  
        If the user is in the user database provided to
        L{checkers.UNIXAuthorizedKeysFiles}, an iterator with all the keys in
        C{~/.ssh/authorized_keys} and C{~/.ssh/authorized_keys2} is returned
        by L{checkers.UNIXAuthorizedKeysFiles.getAuthorizedKeys}.
        r˜   s   key 3c                 ó   — | S r"   rk   r7  s    r&   r8  z`UNIXAuthorizedKeysFilesTests.test_allKeysInAllAuthorizedFilesForAuthorizedUser.<locals>.<lambda>ü  re  r(   rB  r  N)
r   r~   rŽ   r   rb  rK   rG   r_  r;  rV  rQ  s     r&   Ú1test_allKeysInAllAuthorizedFilesForAuthorizedUserzNUNIXAuthorizedKeysFilesTests.test_allKeysInAllAuthorizedFilesForAuthorizedUserô  s‰   € ð 	Œ×ÒÐ,Ñ-Ô-×8Ò8¸ÑBÔBÐBÝÔ0°´À{À{ÐSÑSÔSˆØ×ÒØÔ  
Ñ*­D°×1HÒ1HÈÑ1RÔ1RÑ,SÔ,Sñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó´   — t          j        | j        d„ ¬¦  «        }|                      | j        t          |                     d¦  «        ¦  «        ¦  «         dS )z¸
        L{checkers.UNIXAuthorizedKeysFiles.getAuthorizedKeys} returns only
        the keys in C{~/.ssh/authorized_keys} and C{~/.ssh/authorized_keys2}
        if they exist.
        c                 ó   — | S r"   rk   r7  s    r&   r8  zJUNIXAuthorizedKeysFilesTests.test_ignoresNonexistantFile.<locals>.<lambda>  re  r(   rB  r  N)r   rb  rK   rG   r_  r;  rV  rQ  s     r&   Útest_ignoresNonexistantFilez8UNIXAuthorizedKeysFilesTests.test_ignoresNonexistantFile  sR   € õ Ô0°´À{À{ÐSÑSÔSˆØ×Ò˜Ô*­D°×1HÒ1HÈÑ1RÔ1RÑ,SÔ,SÑTÔTÐTÐTÐTr(   c                 ó  — | j                              d¦  «                             ¦   «          t          j        | j        d„ ¬¦  «        }|                      | j        t          | 	                    d¦  «        ¦  «        ¦  «         dS )z¿
        L{checkers.UNIXAuthorizedKeysFiles.getAuthorizedKeys} returns only
        the keys in C{~/.ssh/authorized_keys} and C{~/.ssh/authorized_keys2}
        if they are readable.
        r˜   c                 ó   — | S r"   rk   r7  s    r&   r8  zIUNIXAuthorizedKeysFilesTests.test_ignoresUnreadableFile.<locals>.<lambda>  re  r(   rB  r  N)
r   r~   r€   r   rb  rK   rG   r_  r;  rV  rQ  s     r&   Útest_ignoresUnreadableFilez7UNIXAuthorizedKeysFilesTests.test_ignoresUnreadableFile
  su   € ð 	Œ×ÒÐ,Ñ-Ô-×6Ò6Ñ8Ô8Ð8ÝÔ0°´À{À{ÐSÑSÔSˆØ×Ò˜Ô*­D°×1HÒ1HÈÑ1RÔ1RÑ,SÔ,SÑTÔTÐTÐTÐTr(   rÖ   )re   rf   rg   rh   ri   rj   r'   rS  rW  rh  rk  rn  rk   r(   r&   r]  r]  Å  s�   € € € € € ðð ð €Dð1ð 1ð 1ð 1ð.8ð 8ð 8ðDð Dð Dð
ð 
ð 
ðUð Uð UðUð Uð Uð Uð Ur(   r]  Ú_KeyDBrV  c                   ó   — e Zd ZdZdS )Ú_DummyExceptionz0
    Fake exception to be used for testing.
    N)re   rf   rg   rh   rk   r(   r&   rq  rq    s   € € € € € ðð ð 	€Dr(   rq  c                   ó@   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd	S )
ÚSSHPublicKeyCheckerTestsz4
    Tests for L{checkers.SSHPublicKeyChecker}.
    c           	      ó$  — t          ddt          j        dt          j                             t          j        ¦  «                             d¦  «        ¦  «        | _        t          d„ ¦  «        | _
        t          j        | j
        ¦  «        | _        d S )Nr  r«   r¬   c                 óV   — t           j                             t          j        ¦  «        gS r"   )r   rµ   r¶   r   r´   )Ú_s    r&   r8  z0SSHPublicKeyCheckerTests.setUp.<locals>.<lambda>/  s   € ¥t¤x×':Ò':½7Ô;TÑ'UÔ'UÐ&V€ r(   )r   r   r´   r   rµ   r¶   r·   r¸   r»   ro  rR  r   ÚSSHPublicKeyCheckerrv   r$   s    r&   r'   zSSHPublicKeyCheckerTests.setUp'  st   € Ý(ØØÝÔ%ØÝŒH×Ò¥Ô :Ñ;Ô;×@Ò@ÀÑHÔHñ
ô 
ˆÔõ ÐVÐVÑWÔWˆŒ
ÝÔ3°D´JÑ?Ô?ˆŒˆˆr(   c                 óŽ   — d| j         _        |                      | j                             | j         ¦  «        t
          ¦  «         dS )z�
        Calling L{checkers.SSHPublicKeyChecker.requestAvatarId} with
        credentials that do not have a signature fails with L{ValidPublicKey}.
        N)r»   Ú	signaturer	  rv   r¹   r   r$   s    r&   Ú test_credentialsWithoutSignaturez9SSHPublicKeyCheckerTests.test_credentialsWithoutSignature2  sI   € ð
 &*ˆÔÔ"Ø×ÒØŒL×(Ò(¨Ô)9Ñ:Ô:½Nñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó˜   — d| j         _        |                      | j                             | j         ¦  «        t
          j        ¦  «         dS )z–
        Calling L{checkers.SSHPublicKeyChecker.requestAvatarId} with
        credentials that have a bad key fails with L{keys.BadKeyError}.
        r(   N)r»   r�   r	  rv   r¹   r   rÐ   r$   s    r&   Útest_credentialsWithBadKeyz3SSHPublicKeyCheckerTests.test_credentialsWithBadKey<  sL   € ð
 !$ˆÔÔØ×ÒØŒL×(Ò(¨Ô)9Ñ:Ô:½DÔ<Lñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó¢   — t           j        | j        _        |                      | j                             | j        ¦  «        t          ¦  «         dS )zÙ
        If L{checkers.IAuthorizedKeysDB.getAuthorizedKeys} returns no keys
        that match the credentials,
        L{checkers.SSHPublicKeyChecker.requestAvatarId} fails with
        L{UnauthorizedLogin}.
        N)r   ÚpublicDSA_opensshr»   r�   r	  rv   r¹   r   r$   s    r&   Útest_credentialsNoMatchingKeyz6SSHPublicKeyCheckerTests.test_credentialsNoMatchingKeyF  sM   € õ !(Ô 9ˆÔÔØ×ÒØŒL×(Ò(¨Ô)9Ñ:Ô:Õ<Mñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 ó  — t           j                             t          j        ¦  «                             d¦  «        | j        _        |                      | j	         
                    | j        ¦  «        t          ¦  «         dS )z§
        Calling L{checkers.SSHPublicKeyChecker.requestAvatarId} with
        credentials that are incorrectly signed fails with
        L{UnauthorizedLogin}.
        r¬   N)r   rµ   r¶   r   rÊ   r¸   r»   ry  r	  rv   r¹   r   r$   s    r&   Ú test_credentialsInvalidSignaturez9SSHPublicKeyCheckerTests.test_credentialsInvalidSignatureR  sr   € õ &*¤X×%8Ò%8ÝÔ&ñ&
ô &
ç
Š$ˆv‰,Œ,ð 	ÔÔ"ð 	×ÒØŒL×(Ò(¨Ô)9Ñ:Ô:Õ<Mñ	
ô 	
ð 	
ð 	
ð 	
r(   c                 óò   — d„ }|                       t          j        d|¦  «         |                      | j                             | j        ¦  «        t          ¦  «         |                      t          ¦  «         dS )z�
        If L{keys.Key.verify} raises an exception,
        L{checkers.SSHPublicKeyChecker.requestAvatarId} fails with
        L{UnauthorizedLogin}.
        c                  ó   — t          ¦   «         ‚r"   )rq  )ÚargsÚkwargss     r&   Úfailz?SSHPublicKeyCheckerTests.test_failureVerifyingKey.<locals>.failf  s   € Ý!Ñ#Ô#Ð#r(   ÚverifyN)
rF   r   rµ   r	  rv   r¹   r»   r   rÏ   rq  )r%   r†  s     r&   Útest_failureVerifyingKeyz1SSHPublicKeyCheckerTests.test_failureVerifyingKey_  sx   € ð	$ð 	$ð 	$ð 	�
Š
•4”8˜X tÑ,Ô,Ð,à×ÒØŒL×(Ò(¨Ô)9Ñ:Ô:Õ<Mñ	
ô 	
ð 	
ð 	×Ò�Ñ/Ô/Ð/Ð/Ð/r(   c                 ó–   — | j                              | j        ¦  «        }|                      d|                      |¦  «        ¦  «         dS )zu
        L{checker.SSHPublicKeyChecker.requestAvatarId}, if successful,
        callbacks with the username.
        r  N)rv   r¹   r»   rG   rô   r
  s     r&   Útest_usernameReturnedOnSuccessz7SSHPublicKeyCheckerTests.test_usernameReturnedOnSuccessp  sF   € ð
 ŒL×(Ò(¨Ô)9Ñ:Ô:ˆØ×Ò˜ 4×#7Ò#7¸Ñ#:Ô#:Ñ;Ô;Ð;Ð;Ð;r(   N)re   rf   rg   rh   ri   rj   r'   rz  r|  r  r�  rˆ  rŠ  rk   r(   r&   rs  rs     s‘   € € € € € ðð ð €Dð	@ð 	@ð 	@ð
ð 
ð 
ð
ð 
ð 
ð

ð 

ð 

ð
ð 
ð 
ð0ð 0ð 0ð"<ð <ð <ð <ð <r(   rs  )Arh   r[   Úbase64r   Úcollectionsr   Úior   Útypingr   r}   Ú__annotations__r-   r   ÚImportErrorÚzope.interface.verifyr   Útwisted.cred.checkersr	   Útwisted.cred.credentialsr
   r   r   r   Útwisted.cred.errorr   r   Útwisted.internet.deferr   Útwisted.pythonr   Útwisted.python.fakepwdr   r   Útwisted.python.filepathr   Útwisted.python.reflectr   Útwisted.test.test_processr   Útwisted.trial.unittestr   ri   Útwisted.conchr   Útwisted.conch.errorr   r   Útwisted.conch.sshr   Útwisted.conch.testr   Úgetattrr×   r    rm   rÙ   rñ   r4  rM  r]  ro  Ú	Exceptionrq  rs  rk   r(   r&   ú<module>r¢     s6  ððð ð ð
 
€	€	€	Ø Ð Ð Ð Ð Ð Ø "Ð "Ð "Ð "Ð "Ð "Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à�CŒ=Ð Ð Ñ ðØ€L€L€Lð €I€Iøð ð 2ð 2ð 2Ø1€I€I€Ið2øøøð
 /Ð .Ð .Ð .Ð .Ð .à IÐ IÐ IÐ IÐ IÐ Iðð ð ð ð ð ð ð ð ð ð ð ð GÐ FÐ FÐ FÐ FÐ FÐ FÐ FØ +Ð +Ð +Ð +Ð +Ð +Ø Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ð ?Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø ,Ð ,Ð ,Ð ,Ð ,Ð ,Ø +Ð +Ð +Ð +Ð +Ð +à€=�Ñ Ô ð 6Ø€NØ&Ð&Ð&Ð&Ð&Ð&ØKÐKÐKÐKÐKÐKÐKÐKØ&Ð&Ð&Ð&Ð&Ð&Ø*Ð*Ð*Ð*Ð*Ð*Ð*à5€Nà
€7ˆ2ˆy˜$ÑÔÐ+Ø€H€HàA€Hðb7ð b7ð b7ð b7ð b7�(ñ b7ô b7ð b7ðJG8ð G8ð G8ð G8ð G8 ñ G8ô G8ð G8ðTUEð UEð UEð UEð UE˜hñ UEô UEð UEðpmDð mDð mDð mDð mD ñ mDô mDð mDð`16ð 16ð 16ð 16ð 16 8ñ 16ô 16ð 16ðhPð Pð Pð Pð P˜Hñ Pô Pð PðDMUð MUð MUð MUð MU 8ñ MUô MUð MUð` 
ˆ�HÐ2Ð3Ñ	4Ô	4€ð	ð 	ð 	ð 	ð 	�iñ 	ô 	ð 	ðV<ð V<ð V<ð V<ð V<˜xñ V<ô V<ð V<ð V<ð V<s   ¬3 ³=¼=