
    Bdk                        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                            ej                            e          d          Zej                            ej                            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                            ed          Z(ej                            ed          Z)ej                            ed          Z*dZ+dZ,dZ-ej                            edd           Z.ej                            ed!d"          Z/ej                            ed#          Z0ej                            ed!d$          Z1ej                            edd%          Z2ej                            ed!d&          Z3 G d' d(e          Z4dS ))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                  <    t          j        d| d                    d S )N
output: %sr   )r   notice)argss    F/usr/lib/python3/dist-packages/fail2ban/tests/fail2banregextestcase.py_test_outputr   &   s    |T!W%%%%%    configfilesc                      t                      }|                    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   sg    


!!$t**--$N+++/,t~..///	t]4(())r   c                  F    t          |  \  }} }|                    |           S N)r"   start)r   r!   fail2banRegexs      r   
_test_execr'   8   s'    -t4$mD!!!r   c                       e Zd Zd ZdS )ExitExceptionc                 (    || _         d|z  | _        d S )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                  J   dd}t           j        t           j        t           j        d}d}|t           _        t          st          t          j        d          at          xt           _        t           _        	 t          t          |                      n# t          $ r}|j        }Y d }~nd }~ww xY w|d         t           _        |d         t           _        |d         t           _        n;# |d         t           _        |d         t           _        |d         t           _        w xY w|S )	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       SZ3:FF2T"*c22(##cjDJJ   v****** &\#(H~#*H~#** &\#(H~#*H~#*s0   6B C( 
B.B)$C( )B..C( (8D c                  :    ddl m}  |                                  d S )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'd&S )'Fail2banRegexTestc                 f    t          j        |            t                       t                       dS )zCall before every test case.N)r   setUpr   rH   r-   s    r   rN   zFail2banRegexTest.setUp   s)    4   ---(((((r   c                 J    t          j        |            t                       dS )zCall after every test case.N)r   tearDownr   rO   s    r   rQ   zFail2banRegexTest.tearDown   s%    d###r   c                 n   |                      t          dd                     |                     d           |                     ddd           |                                  |                      t          dd                     |                     d           |                     d	d
d           d S )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BB--///:	:     :;;;02BNNNNNr   c           	          |                      t          ddddd                     |                     d           |                     ddd	
           d S )N--datepattern{^LN-BEG}EPOCHrS   z.*? from <HOST>$z.**rT   rU   rV   FrW   rY   r'   rZ   rO   s    r   testWrongIngnoreREz$Fail2banRegexTest.testWrongIngnoreRE   sm    :$	     :;;;%EBBBBBr   c                 |    |                      t          dd                     |                     ddd           d S )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   sR    :	#     24MSWXXXXXr   c           
          |                      t          ddddt          d                     |                     d           d S )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   sS    //*A-	1	     DEEEEEr   c                     |                      t          dt          d                     |                     d           d S )N--print-all-missedzXYZ from <HOST>$z.Lines: 1 lines, 0 ignored, 0 matched, 1 missedrj   rO   s    r   testDirectNotFoundz$Fail2banRegexTest.testDirectNotFound   sJ    //*	    
 DEEEEEr   c                     |                      t          dt          dd                     |                     d           d S )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   sM    //*	1	     DEEEEEr   c           	      8   |                      t          dddt          t                               |                     d           |                     d           |                     d           |                     d           |                     d           d S )	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   s    //*A    
 FGGG)***LMMMlmmmlmmmmmr   c           
          |                      t          ddddt          t                               |                     d           d S )Nr^   re   rf   --rawz0Lines: 19 lines, 0 ignored, 19 matched, 0 missedrw   rO   s    r   testDirectRE_1rawz#Fail2banRegexTest.testDirectRE_1raw   sQ    //*A'    
 FGGGGGr   c                 ^   |                      t          dddddt          t                               |                     d           |                                  |                      t          ddd	d
                     |                     dd           |                     d           d S )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GG--/////*"$?     D$OOOBCCCCCr   c           	          |                      t          dddt          t                               |                     d           d S )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   sO    //*A    
 EFFFFFr   c                     |                      t          dddddddt          t          	  	                   |                     d           |                     d	           |                     d
           d S )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FF<===<=====r   c                    |                      t          dddddddt          t          d
  
                   |                     d	d
d           |                                  |                      t          ddddt          dd                     |                     ddd           |                     ddd           d S )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MM*,BMMMMMr   c                     |                      t          ddddt          t          d                     |                     dddd	
           d S )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  sk    //*.	     '=0d  < < < < <r   c                    |                      t          dddddt          j                            t
                    t          t          j                            t
                                         |                     dd           d S )	Nr   r   rf   ro   r   r   TrW   )	rk   r'   r=   pathdirnameFILTER_ZZZ_SSHDr   basenamerZ   rO   s    r   testMultilineSshdz#Fail2banRegexTest.testMultilineSshd  s    //*.	)	)bg&&77	     0d  < < < < <r   c           	      j    |                      t          ddt          t          dz                        d S )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 ]}|                      d|z             |                     t          ddddddd	d
|z  dz   d	  	                   |                     d|dz   d|dz   d           |                     ddd           d S )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 
Vh=="X-...??:dH&;\3H$UV1	     8TU:::W_`aWaWaWabccc)+JPTUUUU
V 
Vr   c                     |                      t          ddddddddd	d

  
                   |                     d           |                     dd           d S )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>  sp    //*tT8\3H,X[T0    
 DEEEJ
+++++r   c                     |                      t          ddddddddd		  	                   |                     d
           d S )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  sX    //*tT8%::%    
 DEEEEEr   c                     |                      t          ddddddd                     |                     d           d S )	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  sW    //*"L#1      DEEEEEr   c                     |                      t          ddddddd                     |                     d           |                     d	d
d           d S )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\  ss    //*$#\37      DEEEN$9tDDDDDr   c           
      `   |                      t          ddt          t                               |                     ddz             |                                  |                      t          dddddd                     |                     dt          d	          z             |                                  |                      t          ddddd
d                     |                     dt          d          z             |                                  |                      t          dddddd                     |                     dt          d          z             |                                  |                      t          dddddd                     |                     dt          d          z             |                     ddz             |                                  |                      t          dddddd                     |                     ddz  t          d          z   dz              |                                  |                      t          ddt          t                               |                     ddz  ddd           |                                  |                      t          ddt          t                               |                     ddz  ddd           |                                  |                      t          ddt          t                               |                     dt          z             |                                  |                      t          ddt          t                               |                     ddz             |                                  |                      t          ddt          t                               |                     dd z             |                                  d S )!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 0 1 1 1 L3'A#B#BBCCC--/////*T4/?(SU U V V V L3'E#F#FFGGG--/////*T4/?0ik k l l l L3'M#N#NNOOO--/////*T4/?0ik k l l l |c*P&Q&QQRRRL;.///--/////*T#7?O0ik k l l l L5(-S)T)TTUffggg--/////*T5&(;;<<<L:-/CEU[_```--/////*T5&*==>>>L>13GIZ`deee--/////*T5&*==>>>L6)***--/////*T66:>>???L7*+++--/////*T#=vzRRSSSL#<<===--/////r   c                     dt           ddfdfd                      ddd                                          d	                                             d fd	} |              |dd           d S )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.76 c           	      l                         dd| dz   |z   dz   |z   dz                                            d                                                                  dd| dz   |z   dz   |z   dz                                            d	                                            d S )
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   ??55BC 	
 




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




		
 
   
 JKKK==?????r   commonz)\s*\S+ sshd\[<F-MLFID>\d+</F-MLFID>\]:\s+)r   )rJ   r   )r   rk   rZ   r[   )r-   r   r   r   r!   s   ` @@@r   testStalledIPByNoFailFrmtOutputz1Fail2banRegexTest.testStalledIPByNoFailFrmtOutput  s    	6
$
k  3
2
2
2%//%%if55666O$$$--///       $ .."MNNNNNNr   c           
         |                      t          ddddt          t                               |                     dddd	           |                                  |                      t          dd
ddt          t                               |                     dd	           |                     ddd	           d S )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deee/     --/////*T8T3DkS[\\]]]    /T  + + + + +r   c                     |                      t          dddd                     |                     dddd	           d S )
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  so     //*	)      13It  U U U U Ur   c                    t           j                            d           |                     t	          dddt
          ddt          dz   t          z   d	                     t                              d          }|                     d
|d         vo	d
|d         v            | 	                    d|d         z   d|d         z   d           | 
                    d           |                     d           |                     t	          dddt
          ddt          dz   t          z   d                     | 	                    d|d         z   d|d         z   d|d         z   d|d         z   d           | 
                    d           |                     d           |                     t	          dddt
          ddt          dz   t          z   d                     t                              d          dd         t                              d          dd          z   }| 	                    d|d         z   d|d         z   d|d         z   d           d S )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 R S S S 

D
!
!%//+U2Y.K;%)3KLLLeBieBi    
 )*** --STTT//*T#:Z&(NP P Q Q Q eBieBieBieBi     )*** --^___//*T#:Z((*PR R S S S 

D
!
!!A#
&)9)?)?)E)Ebcc)J
J%eBieBieBi	      r   c                     t           j                            d           |                     t	          dddt
          dddd	                     |                     d
           |                     d           d S )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  s    
,d+++ //*T#<T8)
     2333566666r   c                 `    |                      t          t          t                               d S r$   )rY   r'   r   rO   s    r   testWrongFilterFilez%Fail2banRegexTest.testWrongFilterFile#  s6    :%      r   c           
      z   t           j                            d           |                     t	          ddddt
          t                               |                     d           |                     d           |                     d	           |                     d
           |                     d           d S )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EE)***MNNNcddd  B  C  C  C  C  Cr   c                 ,   t           j                            d           |                     t	          ddddddt
          t          d		  	                   |                     d
           |                     d           |                     d           d S )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  s    
,d+++//*A&{     )***DEEEJr   c                 n   t          j        dd          }dD ]}|                     d|z             	 t          |d          }dD ]*}|                    |                    |                     +|                                 |                     t          dd	d
|dd|d                     | 	                    d|z  dd           | 
                    d           |                                 t          j        |           # |                                 t          j        |           w xY wd S )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22tD   
ZZJJLLLOOJ(3i
$	     	&,54  A A A)***JJLLLIe 	JJLLLIe3 s   B*D*D2c                 r   |                      t                      d           |                                  |                     t          d          d           |                     t          j                               |                                  |                     t          d          d           d S )Nr   z-Vz	--version)assertNotEqualrB   r[   assertEqualrZ   r   normVersionrO   s    r   testExecCmdLine_Usagez'Fail2banRegexTest.testExecCmdLine_Usaged  s    -//333--///*400!444M-//000--///*;77;;;;;r   c                     |                      t          ddt          d          d           |                     d           d S )Nr   inforh   r   ri   )r  rB   rl   rZ   rO   s    r   testExecCmdLine_Directz(Fail2banRegexTest.testExecCmdLine_Directl  sT    *	9     DEEEEEr   c                     |                      t          ddt          d          d           |                     d           d S )Nr   r  zAuthentication failurer   zNo failure-id group in )r
  rB   rl   rZ   rO   s    r   testExecCmdLine_MissFailIDz,Fail2banRegexTest.testExecCmdLine_MissFailIDs  sT    -	$     -.....r   c           
          |                      t          dddddd          d           |                     d           |                                  |                      t          d	dddd          d           |                     d
           d S )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  s    -45$    6777--///-x    /00000r   c                    t           j        st          j        d          |                     t          dt          dz   dz                        |                     d           |                     d           |                     d           | 	                                 |                     t          dt          dz   d	z   dz                        |                     d           |                     d           d S )
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   		$ M		K	L	LL//*n@AKL    
 *+++*+++DEE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 P PD D DY Y YF F FF F FF F Fn n nH H HD D D G G G
> 
> 
>N N N,< < <
< 
< 
<  V V V, , ,F F F	F 	F 	F
E 
E 
E6 6 6p#O #O #OJ+ + + 
U 
U 
U* * *X7 7 7,  C C C       << < <F F F/ / /1 1 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 i i i i i i i i i i i i J J J J J J J J J J J J        & & & $ ',,rwx88(CCbgooh77AA* * *" " ") ) ) ) )I ) ) )
  &  
 
^R 	dFL
gll>+;<<gll>+;<<W\\.2KLL M Z^  ^VV<<gll:z;??GLL1RSS ',,
<^__7<<8MNN oz;UVV^/ ^/ ^/ ^/ ^/* ^/ ^/ ^/ ^/ ^/r   