Ë
    ojy  ã                   óX  — 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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@y# e$ r dZY Œùw xY w)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                   óL   — e Zd ZdZexs eZd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zy
)ÚHelperTestszl
    Tests for helper functions L{verifyCryptedPassword}, L{_pwdGetByName} and
    L{_shadowGetByName}.
    c                 ó"   — t        «       | _        y ©N)r   Úmockos©Úselfs    úB/usr/lib/python3/dist-packages/twisted/conch/test/test_checkers.pyÚsetUpzHelperTests.setUp@   s   € Ü“hˆ�ó    c                 ó¤   — d}d}t        j                   ||«      }| j                  t        j                  ||«      dj	                  ||«      «       y)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   sM   € ð
 #ˆØˆÜ—+‘+˜h¨Ó-ˆØ�‰Ü×*Ñ*¨7°HÓ=ØC×JÑJØ˜óõ	
r(   c                 ó¤   — d}d}t        j                   ||«      }| j                  t        j                  ||«      dj	                  ||«      «       y)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   sM   € ð
 ˆØˆÜ—+‘+˜h¨Ó-ˆØ�‰Ü×*Ñ*¨7°HÓ=ØA×HÑHØ˜óõ	
r(   c                 ó¤   — d}d}t        j                   ||«      }| j                  t        j                  ||«      dj	                  ||«      «       y)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   sO   € ð
 #ˆØˆÜ—+‘+˜h¨Ó1ˆØ×ÑÜ×*Ñ*¨7°EÓ:ØE×LÑLØ˜óõ	
r(   c           	      óÜ   — t        «       }|j                  ddddddd«       | j                  t        d|«       | j	                  t        j
                  d«      |j                  d«      «       y	)
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   sW   € ô
 “ˆØ�‰�w ¨!¨Q°¸fÀiÔPØ�
‰
”8˜U FÔ+Ø×Ñœ×/Ñ/°Ó8¸&¿/¹/È'Ó:RÕSr(   c                 óz   — | j                  t        dd«       | j                  t        j                  d«      «       y)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Ñ0°Ó9Õ:r(   c                 ó  — t        «       }|j                  ddddddddd	«	       | j                  t        d
|«       d| j                  _        d| j                  _        | j                  t        d| j                  «       | j                  t        j                  d«      |j                  d«      «       | j                  | j                  j                  ddg«       | j                  | j                  j                  ddg«       y)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Ñ2°5Ó9¸6¿?¹?È5Ó;QÔRØ×Ñ˜Ÿ™×1Ñ1°A°t°9Ô=Ø×Ñ˜Ÿ™×1Ñ1°A°t°9Õ=r(   c                 ó  — | j                  t        dd«       | j                  t        j                  d«      «       | j	                  | j
                  j                  g «       | j	                  | j
                  j                  g «       y)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’   sa   € ð 	�
‰
”8˜V TÔ*à×Ñœ(×3Ñ3°EÓ:Ô;Ø×Ñ˜Ÿ™×1Ñ1°2Ô6Ø×Ñ˜Ÿ™×1Ñ1°2Õ6r(   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚdependencySkipÚskipr'   r5   r7   r;   rL   rO   rb   rd   © r(   r&   r    r    8   s<   „ ñð
 Ò&˜€Dòò
ò
ò
òTò;ò>ó"7r(   r    c                   ó`   — e Zd ZdZexs 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y)ÚSSHPublicKeyDatabaseTestsz,
    Tests for L{SSHPublicKeyDatabase}.
    Nc           	      ó¬  — t        j                  «       | _        t        d«      | _        t        d«      | _        d| j                  z   dz   | j
                  z   dz   | _        t        «       | _        | j                  t        d| j                  «       t        | j                  «       «      | _        t        | j                  j                  t        «      sJ ‚| j                  j!                  d«      | _        | j"                  j%                  «        t'        «       }|j)                  dd	d
dd| j                  j                  d«       || j                  _        y )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Ñ4Ó6ˆŒÜ 	Ó*ˆŒ	Ü 
Ó+ˆŒ	Ø §	¡	Ñ)¨LÑ8¸4¿9¹9ÑDÀyÑPˆŒä“hˆŒØ�
‰
”4˜˜tŸ{™{Ô+ä˜TŸ[™[›]Ó+ˆŒ	Ü˜$Ÿ)™)Ÿ.™.¬#Ô.Ð.Ð.Ø—i‘i—o‘o fÓ-ˆŒØ�‰×ÑÔä“ˆØ�‰ØØØØØØ�I‰I�N‰NØô	
ð  &ˆ�‰Õr(   c                 óÜ   — | j                  | j                  g¬«      }| j                  |d   d   t        «       | j                  |d   d   d«       | j                  t	        |«      d«       y)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¾   sp   € ð ×*Ñ*¸t¿z¹z¸lÐ*ÓKˆØ×Ñ˜ qÑ)¨*Ñ5Ô7IÔJØ×ÑØ˜!Ñ˜YÑ'ðFô	
ð 	×Ñœ˜]Ó+¨QÕ/r(   c                 óª  — | j                   j                  |«      j                  | j                  «       t	        dd«      }d|_        | j                  | j                  j                  |«      «       d|_        | j                  | j                  j                  |«      «       d|_        | j                  | j                  j                  |«      «       y )Nó   useró   passwordro   rp   s
   notallowed)
r~   r}   Ú
setContentrx   r   Úblobr.   ru   ÚcheckKeyr9   )r%   Úfilenamerr   s      r&   Ú_testCheckKeyz'SSHPublicKeyDatabaseTests._testCheckKeyÎ   s—   € Ø�‰×Ñ˜(Ó#×.Ñ.¨t¯|©|Ô<Ü ¨Ó5ˆØˆŒ	Ø�‰˜Ÿ™×-Ñ-¨dÓ3Ô4ØˆŒ	Ø�‰˜Ÿ™×-Ñ-¨dÓ3Ô4Ø!ˆŒ	Ø×Ñ˜Ÿ™×.Ñ.¨tÓ4Õ5r(   c                 ó¾   — | j                  d«       | j                  | j                  j                  g «       | j                  | j                  j                  g «       y)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Ø   sG   € ð
 	×ÑÐ,Ô-Ø×Ñ˜Ÿ™×1Ñ1°2Ô6Ø×Ñ˜Ÿ™×1Ñ1°2Õ6r(   c                 ó¾   — | j                  d«       | j                  | j                  j                  g «       | j                  | j                  j                  g «       y)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á   sG   € ð
 	×ÑÐ-Ô.Ø×Ñ˜Ÿ™×1Ñ1°2Ô6Ø×Ñ˜Ÿ™×1Ñ1°2Õ6r(   c                 óà  ‡‡— | j                   j                  d«      Š‰j                  | j                  «       ‰j	                  d«       | j                  ‰j                  d«       | j                  j                  Šˆˆfd„}d| j                  _        d| j                  _	        | j                  | j                  d|«       | j                  t        d| j                  «       t        d	d
«      }d|_        | j                  | j                  j!                  |«      «       | j#                  | j                  j$                  g d¢«       | j#                  | j                  j&                  ddg«       y)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                 ó6   •— ‰j                  d«        ‰| «      S )Nrš   )Úchmod)r\   ÚkeyFileÚsavedSeteuids    €€r&   Úseteuidz>SSHPublicKeyDatabaseTests.test_checkKeyAsRoot.<locals>.seteuid÷   s   ø€ Ø�M‰M˜%Ô Ù Ó%Ð%r(   rY   rZ   rŸ   r[   r‹   rŒ   ro   )r   r?   r   rY   r@   N)r~   r}   r�   rx   rœ   Ú
addCleanupr#   rŸ   r\   r]   rF   r   r   rŽ   r.   ru   r�   rG   r`   ra   )r%   rŸ   rr   r�   rž   s      @@r&   Útest_checkKeyAsRootz-SSHPublicKeyDatabaseTests.test_checkKeyAsRootê   s  ù€ ð
 —+‘+×#Ñ#Ð$5Ó6ˆØ×Ñ˜4Ÿ<™<Ô(à�‰�eÔØ�‰˜Ÿ™ uÔ-à—{‘{×*Ñ*ˆõ	&ð  ˆ�‰ÔØˆ�‰ÔØ�
‰
�4—;‘; 	¨7Ô3Ø�
‰
”4˜˜tŸ{™{Ô+Ü ¨Ó5ˆØˆŒ	Ø�‰˜Ÿ™×-Ñ-¨dÓ3Ô4Ø×Ñ˜Ÿ™×1Ñ1²?ÔCØ×Ñ˜Ÿ™×1Ñ1°A°t°9Õ=r(   c           	      óT  ‡ — d„ }‰ j                  ‰ j                  d|«       t        ddt        j                  dt
        j                  j                  t        j                  «      j                  d«      «      }‰ j                  j                  |«      }ˆ fd„}|j                  |«      S )z�
        L{SSHPublicKeyDatabase.requestAvatarId} should return the avatar id
        passed in if its C{_checkKey} method returns True.
        c                  ó   — y©NTrk   ©Úignoreds    r&   Ú	_checkKeyzASSHPublicKeyDatabaseTests.test_requestAvatarId.<locals>._checkKey  ó   € Ør(   r�   ó   testó   ssh-rsaó   fooc                 ó*   •— ‰j                  | d«       y ©Nr©   ©rG   ©ÚavatarIdr%   s    €r&   Ú_verifyz?SSHPublicKeyDatabaseTests.test_requestAvatarId.<locals>._verify  ó   ø€ Ø×Ñ˜X wÕ/r(   )rF   ru   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Ü#ØØÜ×%Ñ%ØÜ�H‰H×Ñ¤× :Ñ :Ó;×@Ñ@ÀÓHó
ˆð �L‰L×(Ñ(¨Ó5ˆô	0ð �}‰}˜WÓ%Ð%r(   c                 óÞ   — d„ }| j                  | j                  d|«       t        ddt        j                  dd«      }| j                  j                  |«      }| 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                  ó   — yr¤   rk   r¥   s    r&   r§   zQSSHPublicKeyDatabaseTests.test_requestAvatarIdWithoutSignature.<locals>._checkKey%  r¨   r(   r�   r©   rª   N)rF   ru   r   r   r³   r¸   ÚassertFailurer   ©r%   r§   rº   r»   s       r&   Ú$test_requestAvatarIdWithoutSignaturez>SSHPublicKeyDatabaseTests.test_requestAvatarIdWithoutSignature  sa   € ò	ð 	�
‰
�4—<‘< ¨YÔ7Ü#Ø�Z¤×!:Ñ!:¸DÀ$ó
ˆð �L‰L×(Ñ(¨Ó5ˆØ×!Ñ! !¤^Ó4Ð4r(   c                 ó¤   — d„ }| j                  | j                  d|«       | j                  j                  d«      }| j                  |t        «      S )z…
        If L{SSHPublicKeyDatabase.checkKey} returns False,
        C{_cbRequestAvatarId} should raise L{UnauthorizedLogin}.
        c                  ó   — y©NFrk   r¥   s    r&   r§   zKSSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidKey.<locals>._checkKey5  ó   € Ør(   r�   N)rF   ru   r¸   r¿   r   )r%   r§   r»   s      r&   Útest_requestAvatarIdInvalidKeyz8SSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidKey/  sE   € ò	ð 	�
‰
�4—<‘< ¨YÔ7Ø�L‰L×(Ñ(¨Ó.ˆØ×!Ñ! !Ô%6Ó7Ð7r(   c           	      óR  — d„ }| j                  | j                  d|«       t        ddt        j                  dt
        j                  j                  t        j                  «      j                  d«      «      }| j                  j                  |«      }| j                  |t        «      S )z¡
        Valid keys with invalid signatures should cause
        L{SSHPublicKeyDatabase.requestAvatarId} to return a {UnauthorizedLogin}
        failure
        c                  ó   — yr¤   rk   r¥   s    r&   r§   zQSSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidSignature.<locals>._checkKeyC  r¨   r(   r�   r©   rª   r«   )rF   ru   r   r   r³   r   r´   rµ   ÚprivateDSA_opensshr·   r¸   r¿   r   rÀ   s       r&   Ú$test_requestAvatarIdInvalidSignaturez>SSHPublicKeyDatabaseTests.test_requestAvatarIdInvalidSignature<  s†   € ò	ð 	�
‰
�4—<‘< ¨YÔ7Ü#ØØÜ×%Ñ%ØÜ�H‰H×Ñ¤× :Ñ :Ó;×@Ñ@ÀÓHó
ˆð �L‰L×(Ñ(¨Ó5ˆØ×!Ñ! !Ô%6Ó7Ð7r(   c                 óð   ‡ — d„ }‰ j                  ‰ j                  d|«       t        ddddd«      }‰ j                  j                  |«      }ˆ fd„}|j	                  |«       ‰ j                  |t        «      S )	z~
        Exceptions raised while verifying the key should be normalized into an
        C{UnauthorizedLogin} failure.
        c                  ó   — yr¤   rk   r¥   s    r&   r§   zSSSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeException.<locals>._checkKeyW  r¨   r(   r�   r©   Ns   blobs   sigDatas   sigc                 ó|   •— ‰j                  t        j                  «      }‰j                  t	        |«      d«       | S )Nr?   )ÚflushLoggedErrorsr   ÚBadKeyErrorrG   r‡   )ÚfailureÚerrorsr%   s     €r&   Ú_verifyLoggedExceptionz`SSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeException.<locals>._verifyLoggedException^  s2   ø€ Ø×+Ñ+¬D×,<Ñ,<Ó=ˆFØ×ÑœS ›[¨!Ô,ØˆNr(   )rF   ru   r   r¸   Ú
addErrbackr¿   r   )r%   r§   rº   r»   rÒ   s   `    r&   Ú&test_requestAvatarIdNormalizeExceptionz@SSHPublicKeyDatabaseTests.test_requestAvatarIdNormalizeExceptionQ  sl   ø€ ò	ð 	�
‰
�4—<‘< ¨YÔ7Ü# G¨T°7¸JÈÓOˆØ�L‰L×(Ñ(¨Ó5ˆô	ð
 	
�‰Ð+Ô,Ø×!Ñ! !Ô%6Ó7Ð7r(   ©ÚreturnN)re   rf   rg   rh   ÚeuidSkipri   rj   r'   r‰   r‘   r•   r˜   r¡   r¼   rÁ   rÆ   rÊ   rÔ   rk   r(   r&   rm   rm   �   sJ   „ ñð Ò%�~€Dó&ò40ò 6ò7ò7ò>ò6&ò05ò$8ò8ó*8r(   rm   c                   ó8   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zy)	ÚSSHProtocolCheckerTestsz*
    Tests for L{SSHProtocolChecker}.
    c                 óN  — t        j                  «       }| j                  |j                  g «       |j	                  t        j
                  «       «       | j                  |j                  t        g«       | j                  |j                   t           t         j
                  «       y)z€
        L{SSHProcotolChecker.registerChecker} should add the given checker to
        the list of registered checkers.
        N)r   ÚSSHProtocolCheckerrG   ÚcredentialInterfacesÚregisterCheckerrt   r
   ÚassertIsInstance©r%   ru   s     r&   Útest_registerCheckerz,SSHProtocolCheckerTests.test_registerCheckern  s�   € ô
 ×-Ñ-Ó/ˆØ×Ñ˜×5Ñ5°rÔ:Ø×ÑÜ×)Ñ)Ó+ô	
ð 	×Ñ˜×5Ñ5¼Ð7GÔHØ×ÑØ×Ñœ^Ñ,¬h×.KÑ.Kõ	
r(   c                 óX  — t        j                  «       }| j                  |j                  g «       |j	                  t        j
                  «       t        «       | j                  |j                  t        g«       | j                  |j                   t           t         j
                  «       y)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Ý   rt   r   rÞ   rß   s     r&   Ú!test_registerCheckerWithInterfacez9SSHProtocolCheckerTests.test_registerCheckerWithInterface}  s�   € ô ×-Ñ-Ó/ˆØ×Ñ˜×5Ñ5°rÔ:Ø×Ñ¤× =Ñ =Ó ?ÔARÔSØ×Ñ˜×5Ñ5Ô8IÐ7JÔKØ×ÑØ×ÑÔ.Ñ/´×1NÑ1Nõ	
r(   c                 óè   ‡ — t        j                  «       }t        «       }|j                  dd«       |j	                  |«       |j                  t        dd«      «      }ˆ fd„}|j                  |«      S )z†
        L{SSHProtocolChecker.requestAvatarId} should defer to one if its
        registered checkers to authenticate a user.
        r©   c                 ó*   •— ‰j                  | d«       y r­   r®   r¯   s    €r&   Ú	_callbackz?SSHProtocolCheckerTests.test_requestAvatarId.<locals>._callback—  r²   r(   )r   rÛ   r	   rE   rÝ   r¸   r   r¹   )r%   ru   ÚpasswordDatabaser»   rå   s   `    r&   r¼   z,SSHProtocolCheckerTests.test_requestAvatarIdŒ  si   ø€ ô
 ×-Ñ-Ó/ˆÜBÓDÐØ× Ñ  ¨'Ô2Ø×ÑÐ 0Ô1Ø×#Ñ#Ô$4°W¸gÓ$FÓGˆô	0ð �}‰}˜YÓ'Ð'r(   c                 ó  — t        j                  «       }d„ }| j                  |d|«       t        «       }|j	                  dd«       |j                  |«       |j                  t        dd«      «      }| j                  |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                  ó   — yrÄ   rk   )r°   s    r&   Ú_areDonezYSSHProtocolCheckerTests.test_requestAvatarIdWithNotEnoughAuthentication.<locals>._areDone¤  rÅ   r(   ÚareDoner©   )
r   rÛ   rF   r	   rE   rÝ   r¸   r   r¿   r   )r%   ru   ré   ræ   r»   s        r&   Ú/test_requestAvatarIdWithNotEnoughAuthenticationzGSSHProtocolCheckerTests.test_requestAvatarIdWithNotEnoughAuthenticationœ  s}   € ô ×-Ñ-Ó/ˆò	ð 	�
‰
�7˜I xÔ0äBÓDÐØ× Ñ  ¨'Ô2Ø×ÑÐ 0Ô1Ø×#Ñ#Ô$4°W¸gÓ$FÓGˆØ×!Ñ! !Ô%<Ó=Ð=r(   c                 óŒ   — t        j                  «       }|j                  t        dd«      «      }| j	                  |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%   ru   r»   s      r&   Ú%test_requestAvatarIdInvalidCredentialz=SSHProtocolCheckerTests.test_requestAvatarIdInvalidCredential¯  s>   € ô
 ×-Ñ-Ó/ˆØ×#Ñ#Ô$4°W¸gÓ$FÓGˆØ×!Ñ! !Ô%9Ó:Ð:r(   c                 óh   — | j                  t        j                  «       j                  d«      «       y)zV
        The default L{SSHProcotolChecker.areDone} should simply return True.
        N)r.   r   rÛ   rê   r$   s    r&   Útest_areDonez$SSHProtocolCheckerTests.test_areDone¸  s$   € ð 	�‰œ×3Ñ3Ó5×=Ñ=¸dÓCÕDr(   N)re   rf   rg   rh   ri   rj   rà   râ   r¼   rë   rí   rï   rk   r(   r&   rÙ   rÙ   g  s-   „ ñð €Dò
ò
ò(ò >ò&;óEr(   rÙ   c                   óf   — e Zd ZdZexs 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y)ÚUNIXPasswordDatabaseTestsz,
    Tests for L{UNIXPasswordDatabase}.
    r»   ÚusernamerÖ   Nc                 óF   — | j                  | j                  |«      |«       y)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°(Õ;r(   c                 ó‚  — t        j                  «       }d„ }t        «       }|j                  d |dd«      ddddd«       |j                  d	d
ddddd«       t	        «       }|j                  ddddddddd«	       |j                  d	 |d	d«      ddddddd«	       | j                  t         d|«       | j                  t         d|«       t        «       }| j                  t        d|«       d|_        d|_	        t        dd «      }| j                  |j                  |«      d«       | j                  |j                  g «       | j                  |j                  g «       d!|_        | j                  |j                  |«      d!«       | j                  |j                  d"dg«       | j                  |j                  d"dg«       y#)$z�
        L{UNIXPasswordDatabase} with no arguments has checks the C{pwd} database
        and then the C{spwd} database.
        c                 ód   — 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ˆDÜ—k‘k (¨E°D©LÓ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%   ru   r4   rD   rX   r#   Úcreds          r&   Útest_defaultCheckersz.UNIXPasswordDatabaseTests.test_defaultCheckersÏ  s‘  € ô
 ×/Ñ/Ó1ˆò	ô
 ‹nˆØ�‰Ø‘W˜W jÓ1°1°a¸ÀÈ	ô	
ð 	�‰�E˜3  1 e¨V°YÔ?ÜÓˆØ�‰�W˜g q¨!¨Q°°1°a¸Ô;Ø�‰�U™G E¨:Ó6¸¸1¸bÀ"ÀbÈ"ÈbÔQà�
‰
”8˜U CÔ(Ø�
‰
”8˜V TÔ*ä“ˆØ�
‰
”4˜˜vÔ&àˆŒØˆŒä ¨+Ó6ˆØ×Ñ˜G×3Ñ3°DÓ9¸8ÔDØ×Ñ˜×,Ñ,¨bÔ1Ø×Ñ˜×,Ñ,¨bÔ1ØˆŒØ×Ñ˜G×3Ñ3°DÓ9¸6ÔBØ×Ñ˜×,Ñ,¨q°$¨iÔ8Ø×Ñ˜×,Ñ,¨q°$¨iÕ8r(   c                 óD   — | j                  |t        j                  «       y)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        «       }|j                  d|ddddd«       t        j                  |j
                  g«      }| j                  |j                  t        dd	«      «      d«       y
)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   ru   s       r&   Útest_passInCheckersz-UNIXPasswordDatabaseTests.test_passInCheckers  sp   € ô
 —;‘;˜x¨Ó2ˆÜ“ˆØ�‰�y (¨A¨q°%¸ÀÔKÜ×/Ñ/°·±Ð0AÓBˆØ×ÑØ×#Ñ#Ô$4°ZÀÓ$KÓLÈjõ	
r(   c                 óÄ   — d„ }d„ }| j                  t        d|«       t        j                  |g«      }t        dd«      }| j	                  |j                  |«      d«       y)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   ru   Ú
credentials        r&   Útest_verifyPasswordz-UNIXPasswordDatabaseTests.test_verifyPassword  sY   € ò	!ò	(ð 	�
‰
”8Ð4Ð6KÔLÜ×/Ñ/°°
Ó;ˆÜ% k°;Ó?ˆ
Ø×Ñ˜G×3Ñ3°JÓ?ÀÕMr(   c                 óŽ   — d„ }t        j                  |g«      }t        dd«      }| j                  |j	                  |«      «       y)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   ru   r  s       r&   Útest_failOnKeyErrorz-UNIXPasswordDatabaseTests.test_failOnKeyError%  s@   € ò	%ô ×/Ñ/°°
Ó;ˆÜ% k°;Ó?ˆ
Ø×$Ñ$ W×%<Ñ%<¸ZÓ%HÕIr(   c                 óÂ   — d„ }d„ }| j                  t        d|«       t        j                  |g«      }t        dd«      }| j	                  |j                  |«      «       y)z”
        If the verifyCryptedPassword function doesn't verify the password, the
        login fails with an L{UnauthorizedLogin} exception.
        c                  ó   — y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  sW   € ò	ò	+ð 	�
‰
”8Ð4Ð6KÔLÜ×/Ñ/°°
Ó;ˆÜ% k°;Ó?ˆ
Ø×$Ñ$ W×%<Ñ%<¸ZÓ%HÕIr(   c                 óÌ   — d„ }d„ }d„ }| j                  t        d|«       t        j                  ||g«      }t        dd«      }| j	                  |j                  |«      d«       y)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)  ru   r  s         r&   Útest_loopThroughFunctionsz3UNIXPasswordDatabaseTests.test_loopThroughFunctionsC  sa   € ò	!ò	2ò	*ð 	�
‰
”8Ð4Ð6KÔLÜ×/Ñ/°¸IÐ0FÓGˆÜ% k°;Ó?ˆ
Ø×Ñ˜G×3Ñ3°JÓ?ÀÕMr(   c           	      ó   — t        «       }|j                  ddddddd«       |j                  ddddddd«       |j                  d	d
ddddd«       | j                  t        d|«       t        j                  t        j
                  g«      }t        dd«      }| j                  |j                  |«      «       t        dd«      }| j                  |j                  |«      «       t        dd«      }| j                  |j                  |«      «       y)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   ru   r  s       r&   Útest_failOnSpecialz,UNIXPasswordDatabaseTests.test_failOnSpecialY  së   € ô
 ‹nˆØ�‰�G˜R  A r¨5°%Ô8Ø�‰�E˜3  1 b¨%°Ô7Ø�‰�G˜S ! Q¨¨E°5Ô9Ø�
‰
”8˜U CÔ(ä×/Ñ/´×1GÑ1GÐ0HÓIˆÜ ¨#Ó.ˆØ×$Ñ$ W×%<Ñ%<¸TÓ%BÔCä ¨Ó-ˆØ×$Ñ$ W×%<Ñ%<¸TÓ%BÔCä ¨$Ó/ˆØ×$Ñ$ W×%<Ñ%<¸TÓ%BÕ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òP<ò
òNò$JòJò"Nó,Dr(   rñ   c                   ó&   — e Zd ZdZeZd„ Zd„ Zd„ Zy)ÚAuthorizedKeyFileReaderTestsz5
    Tests for L{checkers.readAuthorizedKeyFile}
    c                 ó‚   — t        d«      }t        j                  |d„ «      }| j                  ddgt	        |«      «       y)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  sA   € ô
 ðó
ˆô ×/Ñ/°¹ÓEˆØ×Ñ˜.Ð*<Ð=¼tÀF»|ÕLr(   c                 ó‚   — t        d«      }t        j                  |d„ ¬«      }| j                  dgt	        |«      «       y)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„  s>   € ô
 ðó
ˆô ×/Ñ/°Á+ÔNˆØ×Ñ˜.Ð)¬4°«<Õ8r(   c                 ó†   — d„ }t        d«      }t        j                  ||¬«      }| j                  dgt	        |«      «       y)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                 óR   — | j                  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ØˆKr(   s   failed key
good keyrB  s   good keyNr9  )r%   rJ  r=  r>  s       r&   Útest_ignoresUnparsableKeysz7AuthorizedKeyFileReaderTests.test_ignoresUnparsableKeys’  s<   € ò	ô
 Ð1Ó2ˆÜ×/Ñ/°À*ÔMˆØ×Ñ˜+˜¬¨V«Õ5r(   N)	re   rf   rg   rh   ri   rj   r?  rD  rK  rk   r(   r&   r4  r4  o  s   „ ñð €DòMò9ó6r(   r4  c                   ó&   — e Zd ZdZeZd„ Zd„ Zd„ Zy)ÚInMemorySSHKeyDBTestsz0
    Tests for L{checkers.InMemorySSHKeyDB}
    c                 óh   — t        j                  ddgi«      }t        t         j                  |«       y)z_
        L{checkers.InMemorySSHKeyDB} implements
        L{checkers.IAuthorizedKeysDB}
        r  s   keyN)r   ÚInMemorySSHKeyDBr   ÚIAuthorizedKeysDB©r%   Úkeydbs     r&   Útest_implementsInterfacez.InMemorySSHKeyDBTests.test_implementsInterfaceª  s+   € ô
 ×)Ñ)¨8°f°XÐ*>Ó?ˆÜ”X×/Ñ/°Õ7r(   c                 óˆ   — t        j                  ddgi«      }| j                  g t        |j	                  d«      «      «       y)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²  s;   € ô ×)Ñ)¨8°g°YÐ*?Ó@ˆØ×Ñ˜œT %×"9Ñ"9¸&Ó"AÓBÕCr(   c                 óŽ   — t        j                  dddgi«      }| j                  ddgt        |j	                  d«      «      «       y)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»  sA   € ô ×)Ñ)¨8°d¸D°\Ð*BÓCˆØ×Ñ˜$ ˜¤t¨E×,CÑ,CÀHÓ,MÓ'NÕOr(   N)	re   rf   rg   rh   ri   rj   rS  rW  r[  rk   r(   r&   rM  rM  £  s   „ ñð €Dò8òDó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y)
ÚUNIXAuthorizedKeysFilesTestsz8
    Tests for L{checkers.UNIXAuthorizedKeysFiles}.
    Nc           	      ó&  — t        | j                  «       «      | _        t        | j                  j                  t        «      sJ ‚| j                  j                  «        t        «       | _        | j                  j                  ddddd| j                  j                  d«       | j                  j                  d«      | _
        | j                  j                  «        | j                  j                  d«      }|j                  d	«       d
dg| _        y )Nr=   r2   r?   r@   zalice lastnamers   rq   r“   s   key 1
key 2s   key 1s   key 2)r   ry   rz   r{   r|   r   r   rK   rE   r}   r~   r�   ÚexpectedKeys)r%   ÚauthorizedKeyss     r&   r'   z"UNIXAuthorizedKeysFilesTests.setUpÌ  sÊ   € Ü˜TŸ[™[›]Ó+ˆŒ	Ü˜$Ÿ)™)Ÿ.™.¬#Ô.Ð.Ð.Ø�	‰	×ÑÔä"“nˆŒØ�‰×ÑØØØØØØ�I‰I�N‰NØô	
ð —i‘i—o‘o fÓ-ˆŒØ�‰×ÑÔØŸ™×*Ñ*Ð+<Ó=ˆØ×!Ñ! /Ô2à% xÐ0ˆÕr(   c                 óv   — t        j                  | j                  «      }t        t         j                  |«       y)zg
        L{checkers.UNIXAuthorizedKeysFiles} implements
        L{checkers.IAuthorizedKeysDB}.
        N)r   ÚUNIXAuthorizedKeysFilesrK   r   rP  rQ  s     r&   rS  z5UNIXAuthorizedKeysFilesTests.test_implementsInterfaceã  s(   € ô
 ×0Ñ0°·±Ó=ˆÜ”X×/Ñ/°Õ7r(   c                 óœ   — t        j                  | j                  d„ ¬«      }| j                  g t	        |j                  d«      «      «       y)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ë  s:   € ô ×0Ñ0°·±Á{ÔSˆØ×Ñ˜œT %×"9Ñ"9¸&Ó"AÓBÕCr(   c                 ó  — | j                   j                  d«      j                  d«       t        j                  | j
                  d„ ¬«      }| j                  | j                  dgz   t        |j                  d«      «      «       y)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ô  sh   € ð 	�‰×ÑÐ,Ó-×8Ñ8¸ÔBÜ×0Ñ0°·±Á{ÔSˆØ×ÑØ×Ñ  
Ñ*¬D°×1HÑ1HÈÓ1RÓ,Sõ	
r(   c                 ó°   — t        j                  | j                  d„ ¬«      }| j                  | j                  t        |j                  d«      «      «       y)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  s@   € ô ×0Ñ0°·±Á{ÔSˆØ×Ñ˜×*Ñ*¬D°×1HÑ1HÈÓ1RÓ,SÕTr(   c                 ó  — | j                   j                  d«      j                  «        t        j                  | j
                  d„ ¬«      }| j                  | j                  t        |j                  d«      «      «       y)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
  s\   € ð 	�‰×ÑÐ,Ó-×6Ñ6Ô8Ü×0Ñ0°·±Á{ÔSˆØ×Ñ˜×*Ñ*¬D°×1HÑ1HÈÓ1RÓ,SÕTr(   rÕ   )re   rf   rg   rh   ri   rj   r'   rS  rW  rh  rk  rn  rk   r(   r&   r]  r]  Å  s/   „ ñð €Dó1ò.8òDò
òUóUr(   r]  Ú_KeyDBrV  c                   ó   — e Zd ZdZy)Ú_DummyExceptionz0
    Fake exception to be used for testing.
    N)re   rf   rg   rh   rk   r(   r&   rq  rq    s   „ ñð 	r(   rq  c                   ó>   — e Zd ZdZeZd„ Zd„ Zd„ Zd„ Z	d„ Z
d„ Zd„ Zy	)
ÚSSHPublicKeyCheckerTestsz4
    Tests for L{checkers.SSHPublicKeyChecker}.
    c           	      ó&  — t        ddt        j                  dt        j                  j                  t        j                  «      j                  d«      «      | _        t        d„ «      | _
        t        j                  | j                  «      | _        y )Nr  rª   r«   c                 ó^   — t         j                  j                  t        j                  «      gS r"   )r   r´   rµ   r   r³   )Ú_s    r&   r8  z0SSHPublicKeyCheckerTests.setUp.<locals>.<lambda>/  s   € ¤t§x¡x×':Ñ':¼7×;TÑ;TÓ'UÐ&V€ r(   )r   r   r³   r   r´   rµ   r¶   r·   rº   ro  rR  r   ÚSSHPublicKeyCheckerru   r$   s    r&   r'   zSSHPublicKeyCheckerTests.setUp'  si   € Ü(ØØÜ×%Ñ%ØÜ�H‰H×Ñ¤× :Ñ :Ó;×@Ñ@ÀÓHó
ˆÔô ÑVÓWˆŒ
Ü×3Ñ3°D·J±JÓ?ˆ�r(   c                 ó˜   — d| j                   _        | j                  | j                  j	                  | j                   «      t
        «       y)z�
        Calling L{checkers.SSHPublicKeyChecker.requestAvatarId} with
        credentials that do not have a signature fails with L{ValidPublicKey}.
        N)rº   Ú	signaturer	  ru   r¸   r   r$   s    r&   Ú test_credentialsWithoutSignaturez9SSHPublicKeyCheckerTests.test_credentialsWithoutSignature2  s:   € ð
 &*ˆ×ÑÔ"Ø×ÑØ�L‰L×(Ñ(¨×)9Ñ)9Ó:¼Nõ	
r(   c                 ó¬   — d| j                   _        | j                  | j                  j	                  | j                   «      t
        j                  «       y)z–
        Calling L{checkers.SSHPublicKeyChecker.requestAvatarId} with
        credentials that have a bad key fails with L{keys.BadKeyError}.
        r(   N)rº   rŽ   r	  ru   r¸   r   rÏ   r$   s    r&   Útest_credentialsWithBadKeyz3SSHPublicKeyCheckerTests.test_credentialsWithBadKey<  s@   € ð
 !$ˆ×ÑÔØ×ÑØ�L‰L×(Ñ(¨×)9Ñ)9Ó:¼D×<LÑ<Lõ	
r(   c                 ó´   — t         j                  | j                  _        | j	                  | j
                  j                  | j                  «      t        «       y)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	  ru   r¸   r   r$   s    r&   Útest_credentialsNoMatchingKeyz6SSHPublicKeyCheckerTests.test_credentialsNoMatchingKeyF  sA   € ô !(× 9Ñ 9ˆ×ÑÔØ×ÑØ�L‰L×(Ñ(¨×)9Ñ)9Ó:Ô<Mõ	
r(   c                 ó  — t         j                  j                  t        j                  «      j                  d«      | j                  _        | j                  | j                  j                  | j                  «      t        «       y)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	  ru   r¸   r   r$   s    r&   Ú test_credentialsInvalidSignaturez9SSHPublicKeyCheckerTests.test_credentialsInvalidSignatureR  sa   € ô &*§X¡X×%8Ñ%8Ü×&Ñ&ó&
ç
‰$ˆv‹,ð 	×ÑÔ"ð 	×ÑØ�L‰L×(Ñ(¨×)9Ñ)9Ó:Ô<Mõ	
r(   c                 óè   — d„ }| j                  t        j                  d|«       | j                  | j                  j                  | j                  «      t        «       | j                  t        «       y)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	  ru   r¸   rº   r   rÎ   rq  )r%   r†  s     r&   Útest_failureVerifyingKeyz1SSHPublicKeyCheckerTests.test_failureVerifyingKey_  sV   € ò	$ð 	�
‰
”4—8‘8˜X tÔ,à×ÑØ�L‰L×(Ñ(¨×)9Ñ)9Ó:Ô<Mô	
ð 	×ÑœÕ/r(   c                 ó�   — | j                   j                  | j                  «      }| j                  d| j	                  |«      «       y)zu
        L{checker.SSHPublicKeyChecker.requestAvatarId}, if successful,
        callbacks with the username.
        r  N)ru   r¸   rº   rG   rô   r
  s     r&   Útest_usernameReturnedOnSuccessz7SSHPublicKeyCheckerTests.test_usernameReturnedOnSuccessp  s9   € ð
 �L‰L×(Ñ(¨×)9Ñ)9Ó:ˆØ×Ñ˜ 4×#7Ñ#7¸Ó#:Õ;r(   N)re   rf   rg   rh   ri   rj   r'   rz  r|  r  r�  rˆ  rŠ  rk   r(   r&   rs  rs     s2   „ ñð €Dò	@ò
ò
ò

ò
ò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¢     sF  ðòó
 
Ý Ý "Ý Ý à�C‰=Ó ðÛð €Iå .å I÷ó ÷ GÝ +Ý ß ?Ý ,Ý 0Ý ,Ý +á�Ô Ø€NÝ&ßKÝ&Þ*à5€Ná
ˆ2ˆy˜$ÓÐ+Ø�HàA€Hôb7�(ô b7ôJG8 ô G8ôTUE˜hô UEôpmD ô mDô`16 8ô 16ôhP˜Hô PôDMU 8ô MUñ` 
�HÐ2Ð3Ó	4€ô	�iô 	ôV<˜xõ V<øð] ò 2Ø1‚Ið2ús   ©D ÄD)Ä(D)