
    ogfk                        d Z dZdZddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZmZmZ dd	lmZmZmZmZ dd
lmZ ee_        d Zee_        ej,                  j/                  ej,                  j1                  e      d      Zej,                  j/                  ej,                  j1                  e      d      Zdad Zd Z G d de      Z d Z!d Z"dZ#dZ$dZ%dZ&dZ'ej,                  j/                  ed      Z(ej,                  j/                  ed      Z)ej,                  j/                  ed      Z*dZ+dZ,dZ-ej,                  j/                  edd       Z.ej,                  j/                  ed!d"      Z/ej,                  j/                  ed#      Z0ej,                  j/                  ed!d$      Z1ej,                  j/                  edd%      Z2ej,                  j/                  ed!d&      Z3 G d' d(e      Z4y))zSerg BresterzHCopyright (c) 2015 Serg G. Brester (sebres), 2008- Fail2Ban ContributorsGPL    N   )fail2banregex)Fail2banRegexget_opt_parserexec_command_lineoutputstr2LogLevel   )setUpMyTimetearDownMyTimeLogCaptureTestCaselogSys)
CONFIG_DIRc                  6    t        j                  d| d          y )N
output: %sr   )r   notice)argss    F/usr/lib/python3/dist-packages/fail2ban/tests/fail2banregextestcase.py_test_outputr   &   s    |T!W%    configfilesc                      t               }|j                  t        |             \  }} |j                  dv r(t	        j
                  t        |j                               || t        |      fS )N)r   warning)r   
parse_argslist	log_levelr   setLevelr
   r   )r   parseroptss      r   _Fail2banRegexr"   0   sV    

!!$t*-$NN++//,t~~./	t]4())r   c                  <    t        |  \  }} }|j                  |       S N)r"   start)r   r!   fail2banRegexs      r   
_test_execr'   8   s$    -t4$mD!!r   c                       e Zd Zd Zy)ExitExceptionc                 &    || _         d|z  | _        y )NzExit with code: %s)codemsg)selfr+   s     r   __init__zExitException.__init__=   s    $)!D($(r   N)__name__
__module____qualname__r.    r   r   r)   r)   <   s    )r   r)   c                     dd}t         j                  t         j                  t         j                  d}d}|t         _        t        st        t        j                  d      at        xt         _        t         _        	 t        t        |              |d   t         _        |d   t         _        |d   t         _        |S # t        $ r}|j                  }Y d }~Fd }~ww xY w# |d   t         _        |d   t         _        |d   t         _        w xY w)	Nr   c                     t        |       r$   )r)   )r+   s    r   _exitz&_test_exec_command_line.<locals>._exitB   s    dr   )exitstdoutstderrwr6   r7   r8   )r   )sysr6   r7   r8   DEV_NULLopenosdevnullr   r   r)   r+   )r   r5   _org
_exit_codees        r   _test_exec_command_linerB   A   s     SZZ3::FT"**c2(##cjDJ &\#(H~#*H~#* 	 vv* &\#(H~#*H~#*s*   =B= =	CCC CC ,Dc                  0    ddl m}  | j                          y )Nr   _decode_line_warn)server.filterrE   clearrD   s    r   _resetrH   T   s    .r   zRDec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 192.0.2.0zB[sshd] error: PAM: Authentication failure for kevin from 192.0.2.0z(?:(?:Authentication failure|Failed [-/\w+]+) for(?: [iI](?:llegal|nvalid) user)?|[Ii](?:llegal|nvalid) user|ROOT LOGIN REFUSED) .*(?: from|FROM) <HOST>z8Authentication failure for <F-ID>.*?</F-ID> from <ADDR>$z<Authentication failure for <F-USER>.*?</F-USER> from <ADDR>$ztestcase01.logztestcase02.logztestcase-wrong-char.loga"  Nov 28 09:16:03 srv sshd[32307]: Failed publickey for git from 192.0.2.1 port 57904 ssh2: ECDSA 0e:ff:xx:xx:xx:xx:xx:xx:xx:xx:xx:...
Nov 28 09:16:03 srv sshd[32307]: Failed publickey for git from 192.0.2.1 port 57904 ssh2: RSA 04:bc:xx:xx:xx:xx:xx:xx:xx:xx:xx:...
Nov 28 09:16:03 srv sshd[32307]: Postponed publickey for git from 192.0.2.1 port 57904 ssh2 [preauth]
Nov 28 09:16:05 srv sshd[32310]: Failed publickey for git from 192.0.2.2 port 57910 ssh2: ECDSA 1e:fe:xx:xx:xx:xx:xx:xx:xx:xx:xx:...
Nov 28 09:16:05 srv sshd[32310]: Failed publickey for git from 192.0.2.2 port 57910 ssh2: RSA 14:ba:xx:xx:xx:xx:xx:xx:xx:xx:xx:...
Nov 28 09:16:05 srv sshd[32310]: Disconnecting: Too many authentication failures for git [preauth]
Nov 28 09:16:05 srv sshd[32310]: Connection closed by 192.0.2.2 [preauth]zNov 28 09:16:06 srv sshd[32307]: Accepted publickey for git from 192.0.2.1 port 57904 ssh2: DSA 36:48:xx:xx:xx:xx:xx:xx:xx:xx:xx:...zINov 28 09:16:06 srv sshd[32307]: Connection closed by 192.0.2.1 [preauth]logssshdzfilter.dz	sshd.confzzzz-sshd-obsolete-multiline.logz zzz-sshd-obsolete-multiline.confzzzz-generic-examplezzzz-generic-example.confc                       e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d  Z"d! Z#d" Z$d# Z%d$ Z&d% Z'y&)'Fail2banRegexTestc                 V    t        j                  |        t                t                y)zCall before every test case.N)r   setUpr   rH   r-   s    r   rN   zFail2banRegexTest.setUp   s    4 -(r   c                 B    t        j                  |        t                y)zCall after every test case.N)r   tearDownr   rO   s    r   rQ   zFail2banRegexTest.tearDown   s    d#r   c                 $   | j                  t        dd             | j                  d       | j                  ddd       | j                          | j                  t        dd             | j                  d       | j                  d	d
d       y )Ntestz.** from <HOST>$$Unable to compile regular expressionmultiple repeatat position 2Fallz,^(?:(?P<type>A)|B)? (?(typo)...) from <ADDR>zunknown group name: 'typo'zat position 23)assertFalser'   assertLoggedpruneLogrO   s    r   testWrongREzFail2banRegexTest.testWrongRE   s    :	  :;%EB--/:	:  :;02BNr   c           	          | j                  t        ddddd             | j                  d       | j                  ddd	
       y )N--datepattern{^LN-BEG}EPOCHrS   z.*? from <HOST>$z.**rT   rU   rV   FrW   rY   r'   rZ   rO   s    r   testWrongIngnoreREz$Fail2banRegexTest.testWrongIngnoreRE   sL    :$	  :;%EBr   c                 b    | j                  t        dd             | j                  ddd       y )NrS   zflt[a='x,y,z',b=z,y,x]zWrong filter name or optionszwrong syntax at 14: y,xTrW   r`   rO   s    r   testWrongFilterOptionsz(Fail2banRegexTest.testWrongFilterOptions   s7    :	#  24MSWXr   c           
      l    | j                  t        ddddt        d             | j                  d       y )Nr^   *^(?:%a )?%b %d %H:%M:%S(?:\.%f)?(?: %ExY)?--print-all-matched--print-no-missed+Authentication failure for .*? from <HOST>$.Lines: 1 lines, 0 ignored, 1 matched, 0 missed
assertTruer'   STR_00rZ   rO   s    r   testDirectFoundz!Fail2banRegexTest.testDirectFound   s8    //*A-	1	  DEr   c                 f    | j                  t        dt        d             | j                  d       y )N--print-all-missedzXYZ from <HOST>$z.Lines: 1 lines, 0 ignored, 0 matched, 1 missedrj   rO   s    r   testDirectNotFoundz$Fail2banRegexTest.testDirectNotFound   s/    //*	 
 DEr   c                 h    | j                  t        dt        dd             | j                  d       y )N--print-all-ignoredrh   zkevin from 192.0.2.0$z.Lines: 1 lines, 1 ignored, 0 matched, 0 missedrj   rO   s    r   testDirectIgnoredz#Fail2banRegexTest.testDirectIgnored   s2    //*	1	  DEr   c           	          | j                  t        dddt        t                     | j	                  d       | j	                  d       | j	                  d       | j	                  d       | j	                  d       y )	Nr^   re   rf   0Lines: 19 lines, 0 ignored, 16 matched, 3 missedError decoding linez6Continuing to process line ignoring invalid characterszVDez 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 193.168.0.128zVDec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 87.142.124.10rk   r'   FILENAME_01RE_00rZ   rO   s    r   testDirectRE_1z Fail2banRegexTest.testDirectRE_1   sp    //*A 
 FG)*LMlmlmr   c           
      t    | j                  t        ddddt        t                     | j	                  d       y )Nr^   re   rf   --rawz0Lines: 19 lines, 0 ignored, 19 matched, 0 missedrw   rO   s    r   testDirectRE_1rawz#Fail2banRegexTest.testDirectRE_1raw   s6    //*A' 
 FGr   c                    | j                  t        dddddt        t                     | j	                  d       | j                          | j                  t        ddd	d
             | j	                  dd       | j                  d       y )Nr^   re   rf   r|   z--usedns=noru   -d^Epochz1490349000 test failed.dns.chz^\s*test <F-ID>\S+</F-ID>ri   TrW   z)Unable to find a corresponding IP address)rk   r'   rx   ry   rZ   r[   assertNotLoggedrO   s    r   testDirectRE_1raw_noDnsz)Fail2banRegexTest.testDirectRE_1raw_noDns   s    //*A'= 
 FG--///*"$?  D$OBCr   c           	      r    | j                  t        dddt        t                     | j	                  d       y )Nr^   re   rf   /Lines: 13 lines, 0 ignored, 5 matched, 8 missedrk   r'   FILENAME_02ry   rZ   rO   s    r   testDirectRE_2z Fail2banRegexTest.testDirectRE_2   s4    //*A 
 EFr   c                     | j                  t        dddddddt        t        	             | j	                  d       | j	                  d	       | j	                  d
       y )Nr^   re   z
--timezonezUTC+0200z	--verbose--verbose-daterg   r   z&141.3.81.106  Sun Aug 14 11:53:59 2005z&141.3.81.106  Sun Aug 14 11:54:59 2005r   rO   s    r   testVerbosezFail2banRegexTest.testVerbose   s]    //*A "5	  EF<=<=r   c                 :   | j                  t        dddddddt        t        d
             | j	                  d	d
d       | j                          | j                  t        ddddt        dd             | j	                  ddd       | j                  ddd       y )N-lr   -vr   rf   rr   -crJ   8[29116]: User root not allowed because account is lockedz)[29116]: Received disconnect from 1.2.3.4TrW   -vvzRDec 31 11:59:59 [sshd] error: PAM: Authentication failure for kevin from 192.0.2.1zsshd[logtype=short]zReal  filter options :z'logtype': 'short''logtype': 'file''logtype': 'journal')rk   r'   r   FILENAME_SSHDrZ   r[   r   rO   s    r   testVerboseFullSshdz%Fail2banRegexTest.testVerboseFullSshd   s    //*	02G&	  N.D  :--///*$
W	  ,.BM*,BMr   c                 ~    | j                  t        ddddt        t        d             | j	                  dddd	
       y )Nr   r   rf   r   zsshd.conf[mode=normal]z"[29116]: Connection from 192.0.2.4r   +[29116]: Received disconnect from 192.0.2.4TrW   )rk   r'   r   FILENAME_ZZZ_SSHDrZ   rO   s    r   testFastSshdzFail2banRegexTest.testFastSshd  sH    //*.	  '=0d  <r   c                     | j                  t        dddddt        j                  j	                  t
              t        t        j                  j                  t
                           | j                  dd       y )	Nr   r   rf   ro   r   r   TrW   )	rk   r'   r=   pathdirnameFILTER_ZZZ_SSHDr   basenamerZ   rO   s    r   testMultilineSshdz#Fail2banRegexTest.testMultilineSshd  s`    //*.	)bgg&&7	  0d  <r   c           	      T    | j                  t        ddt        t        dz                y )Nr   r   z[mode=test])rk   r'   FILENAME_ZZZ_GENFILTER_ZZZ_GENrO   s    r   testFullGenericz!Fail2banRegexTest.testFullGeneric(  s$    //*^M1 r   c                     dD ]p  }| j                  d|z         | j                  t        ddddddd	d
|z  dz   d	             | j                  d|dz   d|dz   d       | j                  ddd       r y )N)r      z[test-phase %s]--usednsnor   r   rf   
--maxlines5z1490349000 TEST-NL
L1490349000 FAIL
1490349000 TEST1
1490349001 TEST2
1490349001 HOST 192.0.2.34*^\s*FAIL\s*$<SKIPLINES>^\s*HOST <HOST>\s*$zLines:    z lines, 0 ignored, 2 matched, r   z missedz|  1490349000 FAILz|  1490349001 HOST 192.0.2.34TrW   )r[   rk   r'   rZ   )r-   preLiness     r   testDirectMultilineBufz(Fail2banRegexTest.testDirectMultilineBuf/  s     
Vh=="X-.??:dH&;\3H$UV1	  8TU:W_`aWabc)+JPTU
Vr   c                     | j                  t        ddddddddd	d

             | j                  d       | j                  dd       y )Nr   r   r   r   
--debuggexrf   r   r   r   r   .Lines: 4 lines, 0 ignored, 2 matched, 2 missedz&flags=mz?flags=mrk   r'   rZ   rO   s    r   testDirectMultilineBufDebuggexz0Fail2banRegexTest.testDirectMultilineBufDebuggex>  sO    //*tT8\3H,X[T0 
 DEJ
+r   c                 j    | j                  t        ddddddddd		             | j                  d
       y )Nr   r   r   r   rf   z-L2z)1490349000 FAIL: failure
host: 192.0.2.35z^\s*FAIL:\s*.*\nhost:\s+<HOST>$.Lines: 2 lines, 0 ignored, 2 matched, 0 missedr   rO   s    r   testSinglelineWithNLinContentz/Fail2banRegexTest.testSinglelineWithNLinContentH  s=    //*tT8%::% 
 DEr   c                 f    | j                  t        ddddddd             | j                  d       y )	Nz-rr   ^\[{LEPOCH}\]\s+r   r   z[1516469849] 192.0.2.1 FAIL: failure
[1516469849551] 192.0.2.2 FAIL: failure
[1516469849551000] 192.0.2.3 FAIL: failure
[1516469849551.000] 192.0.2.4 FAIL: failurez^<HOST> FAIL\b.Lines: 4 lines, 0 ignored, 4 matched, 0 missedr   rO   s    r   testRegexEpochPatternsz(Fail2banRegexTest.testRegexEpochPatternsQ  s<    //*"L#1   DEr   c                     | j                  t        ddddddd             | j                  d       | j                  d	d
d       y )Nr   r   r   r   r   z[1516469849] 192.0.2.1 FAIL: failure
[1516469849] 192.0.2.1/24 FAIL: failure
[1516469849] 2001:DB8:FF:FF::1 FAIL: failure
[1516469849] 2001:DB8:FF:FF::1/60 FAIL: failure
z^<SUBNET> FAIL\br   z192.0.2.0/24z2001:db8:ff:f0::/60TrW   r   rO   s    r   testRegexSubnetz!Fail2banRegexTest.testRegexSubnet\  sR    //*$#\37   DEN$9tDr   c           
         | j                  t        ddt        t                     | j	                  ddz         | j                          | j                  t        dddddd             | j	                  dt        d	      z         | j                          | j                  t        ddddd
d             | j	                  dt        d      z         | j                          | j                  t        dddddd             | j	                  dt        d      z         | j                          | j                  t        dddddd             | j                  dt        d      z         | j	                  ddz         | j                          | j                  t        dddddd             | j	                  ddz  t        d      z   dz          | j                          | j                  t        ddt        t                     | j	                  ddz  ddd       | j                          | j                  t        ddt        t                     | j	                  ddz  ddd       | j                          | j                  t        ddt        t                     | j	                  dt        z         | j                          | j                  t        ddt        t                     | j	                  ddz         | j                          | j                  t        ddt        t                     | j	                  dd z         | j                          y )!N-oidr   kevinr   r_   z"1591983743.667 192.0.2.1 192.0.2.2z(^\s*<F-ID/> <F-TUPLE_ID>\S+</F-TUPLE_ID>)z	192.0.2.1	192.0.2.2z#1591983743.667 left 192.0.2.3 rightzM^\s*<F-TUPLE_ID_1>\S+</F-TUPLE_ID_1> <F-ID/> <F-TUPLE_ID_2>\S+</F-TUPLE_ID_2>)z	192.0.2.3leftrightz+1591983743.667 left [192.0.2.4]:12345 rightzc^\s*<F-TUPLE_ID_1>\S+</F-TUPLE_ID_1> <F-ID><ADDR>:<F-PORT/></F-ID> <F-TUPLE_ID_2>\S+</F-TUPLE_ID_2>)z[192.0.2.4]:12345r   r   ipz	192.0.2.4zID:<fid> | IP:<ip>zID:z | IP:192.0.2.4rowz['kevin'z'ip4': '192.0.2.0'z'fid': 'kevin'TrW   z['192.0.2.0'z'user': 'kevin'r,   userz<ip>, <F-USER>, <family>z192.0.2.0, kevin, inet4)	rk   r'   rl   RE_00_IDrZ   r[   strr   
RE_00_USERrO   s    r   testFrmtOutputz Fail2banRegexTest.testFrmtOutputh  s   //*T4:;L7*+--///*T4/?'.0 1 L3'A#BBC--///*T4/?(SU V L3'E#FFG--///*T4/?0ik l L3'M#NNO--///*T4/?0ik l |c*P&QQRL;./--///*T#7?O0ik l L5(-S)TTUffg--///*T5&(;<L:-/CEU[_`--///*T5&*=>L>13GIZ`de--///*T5&*=>L6)*--///*T66:>?L7*+--///*T#=vzRSL#<<=--/r   c                      dt         ddfdfd j                   ddd              j                  d	        j                          d fd
	} |         |dd       y )Nr   r   re   zMay 27 00:16:33 host sshd[2364]: User root not allowed because account is locked
May 27 00:16:33 host sshd[2364]: Received disconnect from 192.0.2.76 port 58846:11: Bye Bye [preauth]c                      t        | z    S r$   )r'   )r   r!   s    r   <lambda>zCFail2banRegexTest.testStalledIPByNoFailFrmtOutput.<locals>.<lambda>  s    
TD[2 r   r   zIP:<ip>rJ   zIP:192.0.2.76c           	      .   j                   dd| dz   |z   dz   |z   dz                j                  d       j                          j                   dd| dz   |z   dz   |z   dz                j                  d	       j                          y )
Nr   z!ID:"<fid>" | IP:<ip> | U:<F-USER>z[failregex="^z4<F-ID>User <F-USER>\S+</F-USER></F-ID> not allowed
^z!Received disconnect from <ADDR>"]z'ID:"User root" | IP:192.0.2.76 | U:rootz'User <F-USER>\S+</F-USER> not allowed
^z7Received disconnect from <F-ID><ADDR> port \d+</F-ID>"]z3ID:"192.0.2.76 port 58846" | IP:192.0.2.76 | U:root)rk   rZ   r[   )fltprefix_testlogr-   s     r   _test_variantszIFail2banRegexTest.testStalledIPByNoFailFrmtOutput.<locals>._test_variants  s    ??5BC 	
 




		
 
 >?==???5BC 	
 




		
 
 JK==?r   commonz)\s*\S+ sshd\[<F-MLFID>\d+</F-MLFID>\]:\s+)r   )rJ    )r   rk   rZ   r[   )r-   r   r   r   r!   s   ` @@@r   testStalledIPByNoFailFrmtOutputz1Fail2banRegexTest.testStalledIPByNoFailFrmtOutput  sm    	6
$
k  3%//%if56O$--/$ "MNr   c           
      8   | j                  t        ddddt        t                     | j	                  dddd	       | j                          | j                  t        dd
ddt        t                     | j	                  dd	       | j                  ddd	       y )Nr   r_   r   zFound-ID:<F-ID>z*Found a match but no valid date/time foundzMatch without a timestamp:zFound-ID:kevinTrW   {NONE})rk   r'   STR_00_NODTr   rZ   r[   r   rO   s    r   testNoDateTimez Fail2banRegexTest.testNoDateTime  s    //*T#3T;Lk[cde/   --///*T8T3DkS[\]  /T  +r   c                 h    | j                  t        dddd             | j                  dddd	       y )
Nr   zFound-ADDR:<ip>z192.0.2.1 - - [02/May/2021:18:40:55 +0100] "GET / HTTP/1.1" 302 328 "-" "Mozilla/5.0" "-"
192.0.2.2 - - [02/May/2021:18:40:55 +0100
192.0.2.3 - - [02/May/2021:18:40:55z^<ADDR>zFound-ADDR:192.0.2.1zFound-ADDR:192.0.2.2zFound-ADDR:192.0.2.3TrW   r   rO   s    r   testIncompleteDateTimez(Fail2banRegexTest.testIncompleteDateTime  sH     //*	)   13It  Ur   c                    t         j                  j                  d       | j                  t	        dddt
        ddt        dz   t        z   d	             t        j                  d      }| j                  d
|d   vxr d
|d   v        | j                  d|d   z   d|d   z   d       | j                  d       | j                  d       | j                  t	        dddt
        ddt        dz   t        z   d             | j                  d|d   z   d|d   z   d|d   z   d|d   z   d       | j                  d       | j                  d       | j                  t	        dddt
        ddt        dz   t        z   d             t        j                  d      dd t        j                  d      dd  z   }| j                  d|d   z   d|d   z   d|d   z   d       y )NTstockr   z<ip>, <F-USER>, <msg>r   r   r   
z&sshd[logtype=short, publickey=invalid]r   z192.0.2.2, git, rW   z192.0.2.1, git, zA[test-phase 1] mode=aggressive & publickey=nofail + OK (accepted)z$sshd[logtype=short, mode=aggressive]zL[test-phase 2] mode=aggressive & publickey=nofail + FAIL (closed on preauth)r   r   )unittestF2BSkipIfCfgMissingrk   r'   r   STR_ML_SSHDSTR_ML_SSHD_OKsplitrZ   r   r[   STR_ML_SSHD_FAIL)r-   liness     r   testFrmtOutputWrapMLz&Fail2banRegexTest.testFrmtOutputWrapML  s   
,,d+//*T#:Z&(PR S 

D
!%//+U2Y.K;%)3KLeBieBi  
 )* --ST//*T#:Z&(NP Q eBieBieBieBi   )* --^_//*T#:Z((*PR S 

D
!!A
&)9)?)?)Ebc)J
J%eBieBieBi	  r   c                     t         j                  j                  d       | j                  t	        dddt
        dddd	             | j                  d
       | j                  d       y )NTr   r   zfailure from == <ip> ==r   r   r   zsvc[1] connect started 192.0.2.3
svc[1] connect finished 192.0.2.3
svc[2] connect started 192.0.2.4
svc[2] connect authorized 192.0.2.4
svc[2] connect finished 192.0.2.4
zcommon[prefregex="^svc\[<F-MLFID>\d+</F-MLFID>\] connect <F-CONTENT>.+</F-CONTENT>$", failregex="^started
^<F-NOFAIL><F-MLFFORGET>finished</F-MLFFORGET></F-NOFAIL> <ADDR>
^<F-MLFGAINED>authorized</F-MLFGAINED> <ADDR>", maxlines=1]zfailure from == 192.0.2.3 ==zfailure from == 192.0.2.4 ==)r   r   r   rk   r'   r   rZ   r   rO   s    r   &testOutputNoPendingFailuresAfterGainedz8Fail2banRegexTest.testOutputNoPendingFailuresAfterGained  sd    
,,d+ //*T#<T8)
  2356r   c                 J    | j                  t        t        t                     y r$   )rY   r'   r   rO   s    r   testWrongFilterFilez%Fail2banRegexTest.testWrongFilterFile#  s    :% r   c           
      <   t         j                  j                  d       | j                  t	        ddddt
        t                     | j                  d       | j                  d       | j                  d	       | j                  d
       | j                  d       y )NTr   r   r   r^   re   r   rv   z7Continuing to process line ignoring invalid characters:zMNov  8 00:16:12 main sshd[32548]: input_userauth_request: invalid user llincozkNov  8 00:16:12 main sshd[32547]: pam_succeed_if(sshd:auth): error retrieving information about user llincor   r   r   rk   r'   FILENAME_WRONGCHARFILTER_SSHDrZ   rO   s    r   testWronCharzFail2banRegexTest.testWronChar)  s    
,,d+//*A{ 
 DE)*MNcd  B  Cr   c                     t         j                  j                  d       | j                  t	        ddddddt
        t        d		             | j                  d
       | j                  d       | j                  d       y )NTr   r   r   r^   re   r   rf   zllinco[^\\]rv   z.Lines: 4 lines, 1 ignored, 2 matched, 1 missedzhttps://r   rO   s    r   testWronCharDebuggexz&Fail2banRegexTest.testWronCharDebuggex8  sq    
,,d+//*A&{  )*DEJr   c                     t        j                  dd      }dD ]  }| j                  d|z         	 t        |d      }dD ]"  }|j	                  |j                  |             $ |j                          | j                  t        dd	d
|dd|d             | j                  d|z  dd       | j                  d       |j                          t        j                  |        y # j                          t        j                  |       w xY w)Ntmp_fail2banuni)r   suffix)zutf-16bezutf-16lez[test-phase encoding=%s]wb)u?   1490349000 € Failed auth: invalid user TestȊ from 192.0.2.1
u>   1490349000 € Failed auth: invalid user TestI from 192.0.2.2
r   r   z
--encodingr^   z^EPOCHzFailed .* from <HOST>z encoding : %sr   TrW   zMissed line(s))tempfilemktempr[   r<   writeencodecloserk   r'   rZ   r   r=   unlink)r-   fnameencfoutls        r   testNLCharAsPartOfUniCharz+Fail2banRegexTest.testNLCharAsPartOfUniCharF  s    
//
>%% c==+c12tD  
ZZ	
 	JJLOOJ(3i
$	  	&,54  A)*JJLIIe30 	JJLIIes   BC&&'Dc                 *   | j                  t               d       | j                          | j                  t        d      d       | j	                  t        j                                | j                          | j                  t        d      d       y )Nr   z-Vz	--version)assertNotEqualrB   r[   assertEqualrZ   r   normVersionrO   s    r   testExecCmdLine_Usagez'Fail2banRegexTest.testExecCmdLine_Usaged  sk    -/3--/*40!4M--/0--/*;7;r   c                 j    | j                  t        ddt        d      d       | j                  d       y )Nr   inforh   r   ri   )r  rB   rl   rZ   rO   s    r   testExecCmdLine_Directz(Fail2banRegexTest.testExecCmdLine_Directl  s9    *	9  DEr   c                 j    | j                  t        ddt        d      d       | j                  d       y )Nr   r  zAuthentication failurer   zNo failure-id group in )r
  rB   rl   rZ   rO   s    r   testExecCmdLine_MissFailIDz,Fail2banRegexTest.testExecCmdLine_MissFailIDs  s9    -	$  -.r   c           
          | j                  t        dddddd      d       | j                  d       | j                          | j                  t        d	dddd      d       | j                  d
       y )Nr   r   r   z%:%.%-LOGREr   z ERROR: Failed to set datepatternr   zFailed to set datepattern)r
  rB   rZ   r[   rO   s    r   testExecCmdLine_ErrorParamz,Fail2banRegexTest.testExecCmdLine_ErrorParamz  sw    -45$ 67--/-x /0r   c                    t         j                  st        j                  d      | j	                  t        dt        dz   dz                | j                  d       | j                  d       | j                  d       | j                          | j	                  t        dt        dz   d	z   dz                | j                  d       | j                  d       y )
Nz.Skip test because no systemd backend availablezsystemd-journalz,[journalmatch="SYSLOG_IDENTIFIER=dummy",z; failregex="^ dummy regex, never match <F-ID>xxx</F-ID>"]r   r   z.Lines: 0 lines, 0 ignored, 0 matched, 0 missedz[logtype=file,z, journalmatch="SYSLOG_IDENTIFIER=dummy",)
r   FilterSystemdr   SkipTestrk   r'   r   rZ   r   r[   rO   s    r   testLogtypeSystemdJournalz+Fail2banRegexTest.testLogtypeSystemdJournal  s    		$	$			K	LL//*n@AKL 
 *+*+DE--///*n@A LL  '(-.r   N)(r/   r0   r1   rN   rQ   r\   ra   rc   rm   rp   rs   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r2   r   r   rL   rL   }   s    
PDYFFFnHD G
>N,<
<V,F	F
E6p#OJ+ 
U*X7,C <<F/1/r   rL   )5
__author____copyright____license__r=   r:   r   r   clientr   client.fail2banregexr   r   r   r	   r
   utilsr   r   r   r   r   r   r   joinr   __file__TEST_CONFIG_DIRTEST_FILES_DIRr;   r"   r'   	Exceptionr)   rB   rH   rl   r   ry   r   r   rx   r   r   r   r   r   r   r   r   r   r   r   rL   r2   r   r   <module>r&     s  , 
Z 	 
   " i i J J   & $ '',,rwwx8(Cbggooh7A*")I )
&
 
^R 	dFL
ggll>+;<ggll>+;<WW\\.2KL M Z^  ^VV<ggll:z;?GGLL1RS '',,
<^_77<<8MN oz;UV^/* ^/r   