
    =*f(                        S SK r S SKrS SKrS SKrS SKrS SKrSSKJr  SSKJ	r	J
r
JrJr   " S S5      r S SKr " S S\R                  5      r " S	 S
\R"                  \5      r S SKrS SKJr  S SKrS SKrS SKr " S S5      r " S S\R"                  \5      rg! \ a  r\" S\-  5         SrCNNSrCff = f! \ a  r\" S\-  5         SrCgSrCff = f)    N   )	DummyJail)
CONFIG_DIRasyncserverUtils
uni_decodec                   L    \ rS rSrS rSS jrS rS rSS jrS r	S r
S	 rS
rg)_SMTPActionTestCase   c                     S H6  n[        U R                  U5      (       d  M   [        U R                  U5        M8     SU l        g )N)mailfromorg_datadataF)hasattrsmtpddelattrready)selfas     C/usr/lib/python3/dist-packages/fail2ban/tests/action_d/test_smtp.py_reset_smtpd _SMTPActionTestCase._reset_smtpd!   s1    +adjj!gdjj!4 ,$*    c                    ^  U(       a  US-  nST R                   l        U" 5         [        R                  " U 4S jU5        g )N   Fc                  0   > T R                   R                  $ N)r   r   r   s   r   <lambda>4_SMTPActionTestCase._exec_and_wait.<locals>.<lambda>*   s    ))r   )r   r   r   wait_for)r   doactiontimeoutshorts   `   r   _exec_and_wait"_SMTPActionTestCase._exec_and_wait&   s.    
GrMG$**
*..)73r   c                    U R                  U R                  R                  5        U R                  U R                  R
                  S5        U R                  U R                  R                  S/5        SU R                  l        U R                  SU R                  R                  -  U R                  R                  ;   5        g )Nfail2banrootFzSubject: [Fail2Ban] %s: started)r%   actionstartassertEqualr   r   rcpttosssl
assertTruejailnamer   r   s    r   	testStart_SMTPActionTestCase.testStart,   s    dkk''(4::&&
34::%%x0$++///$tyy~~5
jjoor   c                 f   U R                  U R                  R                  5        U R                  U R                  R
                  S5        U R                  U R                  R                  S/5        U R                  SU R                  R                  -  U R                  R                  ;   5        g )Nr(   r)   zSubject: [Fail2Ban] %s: stopped)r%   r*   stopr,   r   r   r-   r/   r0   r1   r   r   s    r   testStop_SMTPActionTestCase.testStop5   s    dkk&&'4::&&
34::%%x0//$IINNjjoo&'r   c                   ^ ^ SSSSSS.mU(       a  STS'   T R                  UU 4S	 jUS
9  U(       a  T R                  [        U 4S j5        g T R                  T R                  R
                  S5        T R                  T R                  R                  S/5        ST R                  R                  < STS   < 3nT R                  UT R                  R                  5        T R                  STS   -  T R                  R                  5        ST R                  l        T R                  UU 4S j5        T R                  TS   T R                  R                  5        ST R                  l        T R                  UU 4S j5        T R                  TS   T R                  R                  5        ST R                  l        T R                  UU 4S j5        T R                  TS   T R                  R                  5        g )Nz	127.0.0.2   zTest fail 1
zTest fail 1
Test Fail2
z"Test fail 1
Test Fail2
Test Fail3
)ipfailuresmatchesipjailmatches	ipmatches   restoredc                  :   > TR                   R                  T 5      $ r   r*   banaInfor   s   r   r   ._SMTPActionTestCase._testBan.<locals>.<lambda>H       dkkooe4r   )r$   c                  0   > T R                   R                  $ r   )r   r   r   s   r   r   rF   J   s    TZZ-@-@r   r(   r)   zSubject: [Fail2Ban] z	: banned r:   z%i attemptsr;   r<   c                  :   > TR                   R                  T 5      $ r   rB   rD   s   r   r   rF   U   rG   r   r=   c                  :   > TR                   R                  T 5      $ r   rB   rD   s   r   r   rF   Y   rG   r   r>   c                  :   > TR                   R                  T 5      $ r   rB   rD   s   r   r   rF   ]   rG   r   )r%   assertRaisesAttributeErrorr,   r   r   r-   r0   r1   assertInr   r*   r<   )r   r@   subjectrE   s   `  @r   _testBan_SMTPActionTestCase._testBan=   s~   	/7% 54HE^%@A	4::&&
34::%%x099>>5; '--)--5$$djjoo7 "$++45--i $**//2'$++45--o&

8#$++45--k"DJJOO4r   c                 $    U R                  5         g r   rP   r   s    r   testBan_SMTPActionTestCase.testBan`   s    --/r   c                 "    U R                  SS9  g )NT)r@   rS   r   s    r   testNOPByRestored%_SMTPActionTestCase.testNOPByRestoredc   s    ---r   c                 
   U R                  U R                  R                  5        U R                  U R                  R
                  S5        U R                  U R                  R                  S/5        SU R                  l        SU R                  l        SU R                  l	        U R                  U R                  R                  5        U R                  U R                  R
                  S5        U R                  SU R                  R                  < SU R                  R                  < S3U R                  R                  ;   5        U R                  [        U R                  R                  5      [        SS	/5      5        g )
Nr(   r)   Testztest@example.comz#test@example.com, test2@example.comzFrom: z <>ztest2@example.com)r%   r*   r+   r,   r   r   r-   fromnamefromaddrtoaddrr/   r   setr   s    r   testOptions_SMTPActionTestCase.testOptionsf   s   dkk''(4::&&
34::%%x0$+++$++<$++dkk''(4::&&(:;//KK$++..037::??C D3tzz))*C1CEX0Y,Z[r   r   N)r9   F)F)__name__
__module____qualname____firstlineno__r   r%   r2   r6   rP   rT   rW   r`   __static_attributes__ r   r   r
   r
      s,    
4'!5F\r   r
   c                        \ rS rSrS rS rSrg)TestSMTPServerw   c                 T    [         R                  R                  " U /UQ76   SU l        g NF)r   
SMTPServer__init__r   r   argss     r   ro   TestSMTPServer.__init__y   s"    T)D)4:r   c                     Xl         X l        X0l        X@l        [        R
                  " SS[        U5      5      U l        SU l        g )Nz\n[\t ] T)	peerr   r-   r   resubr   r   r   )r   ru   r   r-   r   kwargss         r   process_messageTestSMTPServer.process_message}   s6    9=<=vvj#z$'78494:r   r   r   r   ru   r-   r   N)rc   rd   re   rf   ro   ry   rg   rh   r   r   rj   rj   w   s    r   rj   c                   @   ^  \ rS rSrS rS rU 4S jrU 4S jrSrU =r	$ )SMTPActionTest   c                    ^  [         R                  R                  SS9  [        m [	        SS5      T l        T R
                  R                  R                  5       S   T l        ST l	        [        R                  " [        R                  SU 4S j0S	9T l        ST R                  l        T R                  R!                  5         g)
Call before tests.smtp.pyr*   	localhostr   Nr?   Tactivec                     > T R                   $ r   )_activeclss   r   r   +SMTPActionTest.setUpClass.<locals>.<lambda>   s	    s{{r   )targetrx   )unittestF2BSkipIfCfgMissingr}   rj   r   socketgetsocknameportr   	threadingThreadr   loop_loop_threaddaemonr+   r   s   @r   
setUpClassSMTPActionTest.setUpClass   s    <<  	 2	3.539ii**,Q/38 3;&&X/B$CE3!3r   c                      [         n U R                  R                  5         SU l        U R                  R                  5         g)Call after tests.FN)r}   r   closer   r   joinr   s    r   tearDownClassSMTPActionTest.tearDownClass   s.    	399??3;r   c                   > [         R                  R                  SS9  [        [        U ]  5         [        5       U l        [        R                  R                  [        SS5      n[        R                  R                  UR                  S5      5      n[        R                  R!                  X!5      R#                  5       nUR%                  U R                  SSU R&                  -  S9U l        g)	Call before every test case.r   r   action.d.pytestlocalhost:%ihostN)r   r   r   superr}   setUpr   r0   ospathr   r   basenamerstrip	importlib	machinerySourceFileLoaderload_moduleActionr   r*   r   pythonModulepythonModuleNamecustomActionModule	__class__s       r   r   SMTPActionTest.setUp   s    <<  	 2$&{49'',,z:yA<gg&&|':':5'AB!++<<$$/KM  $**IIvNTYY6 + 84;r   c                 J   > U R                  5         [        [        U ]  5         gzCall after every test case.N)r   r   r}   tearDownr   r   s    r   r   SMTPActionTest.tearDown   s    ')r   r*   r0   )
rc   rd   re   rf   r   r   r   r   rg   __classcell__r   s   @r   r}   r}      s    8* *r   r}   zI: Skipping smtp tests: %s)
Controllerc                   &    \ rS rSrS rS rS rSrg)TestSMTPHandler   c                     SU l         g rm   rb   rp   s     r   ro   TestSMTPHandler.__init__   s	    4:r   c                   #    UR                   U l         UR                  U l        UR                  U l        UR
                  R                  5       U l        [        R                  " SS[        U R                  5      5      U l        SU l        g7f)Nz\r\n
Tz250 OK)ru   	mail_fromr   rcpt_tosr-   contentdecoder   rv   rw   r   r   r   )r   serversessionenvelopes       r   handle_DATATestSMTPHandler.handle_DATA   sg     ||49%%4=##4<##**,4=vvgtZ%>?494:
s   BBc                 "   #    [        U5        g7f)Nz542 Internal server error)print)r   errors     r   handle_exception TestSMTPHandler.handle_exception   s     <
%s   r{   N)rc   rd   re   rf   ro   r   r   rg   rh   r   r   r   r      s    &r   r   c                   p   ^  \ rS rSr\S 5       r\S 5       r\S 5       rS r	S r
U 4S jrU 4S jrS	rU =r$ )
AIOSMTPActionTest   c                    [        U S5      (       a  U R                  $ [        R                  " SS5      [        R                  " SS5      4=U l        n[	        US   S5       nUR                  S5        SSS5        [	        US	   S5       nUR                  S
5        SSS5        U$ ! , (       d  f       N9= f! , (       d  f       U$ = f)az  
                        Create a self signed SSL certificate in temporary files for host
                                'localhost'

                        Returns a tuple containing the certificate file name and the key
                        file name.

                        The cert (ECC:256, 100years) created with:
                        openssl req -x509 -out /tmp/f2b-localhost.crt -keyout /tmp/f2b-localhost.key -days 36500 -newkey ec:<(openssl ecparam -name prime256v1) -nodes -sha256                    -subj '/CN=localhost' -extensions EXT -config <(                            printf "[dn]
CN=localhost
[req]
distinguished_name = dn
[EXT]
subjectAltName=DNS:localhost
keyUsage=digitalSignature
extendedKeyUsage=serverAuth"                        )
                        cat /tmp/f2b-localhost.*
                        rm /tmp/f2b-localhost.*

                        crtfilesz.crt	f2b_cert_z.keyr   waK  -----BEGIN CERTIFICATE-----
MIIBhDCCASugAwIBAgIUCuW168kD3G7XrpFwGHwE6vGfoJkwCgYIKoZIzj0EAwIw
FDESMBAGA1UEAwwJbG9jYWxob3N0MCAXDTIzMTIzMDE3NDUzNFoYDzIxMjMxMjA2
MTc0NTM0WjAUMRIwEAYDVQQDDAlsb2NhbGhvc3QwWTATBgcqhkjOPQIBBggqhkjO
PQMBBwNCAARDa8BO/UE4axzvnOQ/pCc/ZTp351X1TqIfjEFaMoZOItz1/MW3ZCuS
2vuby3rMn0WZ59RWVotBqA6lcMVcgDq3o1kwVzAUBgNVHREEDTALgglsb2NhbGhv
c3QwCwYDVR0PBAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMBMB0GA1UdDgQWBBS8
kH1Ucuq+wlex5DxxHDe1kKGdcjAKBggqhkjOPQQDAgNHADBEAiBmv05+BvXWMzLg
TtF4McoQNrU/0TTKhV8o+mgd+47tMAIgaaSNRnfjGIfJMbXg7Bh53qOIu5+lnm1b
ySygMgFmePs=
-----END CERTIFICATE-----
Nr?   z-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgoBGcojKPZMYut7aP
JGe2GW+2lVV0zJpgCsZ7816a9uqhRANCAARDa8BO/UE4axzvnOQ/pCc/ZTp351X1
TqIfjEFaMoZOItz1/MW3ZCuS2vuby3rMn0WZ59RWVotBqA6lcMVcgDq3
-----END PRIVATE KEY-----
)r   r   tempfilemktempopenwrite)r   r   fs      r   create_temp_self_signed_cert.AIOSMTPActionTest.create_temp_self_signed_cert   s    $ c:s|| 3&oofkBHOOTZ\gDhii3<(Xa[#!GG
# 	 	Xa[#!GG# 	 ?/ 	 	 ?s   "B'B8'
B58
Cc                     [        U S5      (       aD  U R                  (       a2  U R                   H  n [        R                  " U5        M     S U l        g g g ! [         a     M5  f = f)Nr   )r   r   r   unlinkFileNotFoundError)r   r   s     r   	_del_certAIOSMTPActionTest._del_cert   sS    c:3<<\\$iil  CL $0 #t#s   A
A%$A%c                      [         R                   " [         R                  [         R                  5       n U R                  S5        U R	                  5       S   sS S S 5        $ ! , (       d  f       g = f)Nr   r?   )r   AF_INETSOCK_STREAMbindr   )ss    r   
_free_portAIOSMTPActionTest._free_port  sC    fnnf&8&89QFF==?1 	:99s   $A""
A0c            	         [         R                  R                  SS9  [        R	                  5       u  p[
        R                  " [
        R                  R                  5      nUR                  X5        [        nUR                  5       Ul        [        5       Ul        [        UR                  SSUR                  USS.S9Ul        UR                  R!                  5         g)r   r   r   r   F)tls_contextrequire_starttls)hostnameserver_hostnamer   server_kwargsN)r   r   r   r   r   r.   create_default_contextPurposeCLIENT_AUTHload_cert_chainr   r   r   r   r   
controllerr+   )	cert_filecert_keyssl_contextr   s       r   r   AIOSMTPActionTest.setUpClass  s    <<  	 2*GGI9++CKK,C,CD;y3	3nn38 39syy;P[bebjbj"-5IK3> >>r   c                  d    [         n U R                  R                  5         U R                  5         g)r   N)r   r   r5   r   r   s    r   r   AIOSMTPActionTest.tearDownClass  s     	3>>==?r   c                   > [         R                  R                  SS9  [        [        U ]  5         [        5       U l        [        R                  R                  [        SS5      n[        R                  R                  UR                  S5      5      n[        R                  R!                  X!5      R#                  5       nUR%                  U R                  SSU R&                  -  S9U l        SU R(                  l        g	)
r   r   r   r   r   r   r   r   TN)r   r   r   r   r   r   r   r0   r   r   r   r   r   r   r   r   r   r   r   r   r*   r.   r   s       r   r   AIOSMTPActionTest.setUp#  s    <<  	 2	D'){49'',,z:yA<gg&&|':':5'AB!++<<$$/KM  $**IIvNTYY6 + 84; 4;;?r   c                 J   > U R                  5         [        [        U ]  5         gr   )r   r   r   r   r   s    r   r   AIOSMTPActionTest.tearDown2  s    	D*,r   r   )rc   rd   re   rf   classmethodr   r   staticmethodr   r   r   r   r   rg   r   r   s   @r   r   r      sW    * *X    
 - -r   r   zI: Skipping SSL smtp tests: %s)r   r   r   rv   sysr   	dummyjailr   utilsr   r   r   r   r
   r   rn   rj   TestCaser}   ImportErrorer   asyncioaiosmtpd.controllerr   r   r.   r   r   r   rh   r   r   <module>r     s   ( 
   	 
  ! > >S\ S\j>)e&&  (*h'')< (*\C-+& &&f-**,? f-=  )#a'(()L  -'!+,,-s/   /B &6B; B8#B33B8;CCC