
    ogf                     r   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ZddlZddl	Z	ddl
mZmZmZmZ ddlmZ ddlmZ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"m#Z# ejH                  jK                  ejH                  jM                  e'      d      Z(i Z)ddl!m*Z* e	jV                  jX                  Z-ejH                  jK                  ejH                  jM                  e'      d      Z.i Z/ G d de	j`                        Z1 G d de"      Z2 G d de"      Z3 G d de"      Z4 G d de"      Z5y)z!Cyril Jaquier, Yaroslav Halchenkoz>Copyright (c) 2004 Cyril Jaquier, 2011-2013 Yaroslav HalchenkoGPL    N   )ConfigReaderConfigReaderUnsharedDefinitionInitConfigReaderNoSectionError)configparserinc)
JailReaderextractOptionssplitWithOptions)FilterReader)JailsReader)ActionReaderCommandAction)Configurator)MyTime)version   )LogCaptureTestCasewith_tmpdirfiles)
CONFIG_DIRconfigc                   d     e Zd Z fdZd ZddZd ZddZd Zd Z	d Z
d	 Zd
 Zd Zd Z xZS )ConfigReaderTestc                     t         t        |           t        j                  d      | _        t        | j
                        | _        y)zCall before every test case.zf2b-temp)prefixbasedirN)superr   setUptempfilemkdtempdr   c)self	__class__s    E/usr/lib/python3/dist-packages/fail2ban/tests/clientreadertestcase.pyr!   zConfigReaderTest.setUp7   s3    $%':.$&/$&    c                 B    t        j                  | j                         y)zCall after every test case.N)shutilrmtreer$   r&   s    r(   tearDownzConfigReaderTest.tearDown=   s    --r)   c                    t         j                  j                  |v r}t         j                  j                  |      }t         j                  j	                  | j
                  |      }t         j                  j                  |      st        j                  |       t        | j
                  d|d      }||j                  d|z         ||j                  |       |j                          y )N/wz
[section]
option = %s
	)ospathsepdirnamejoinr$   existsmakedirsopenwriteclose)r&   fnamevaluecontentr$   d_fs          r(   _writezConfigReaderTest._writeA   s    WW[[E	wwu1
TVVQ2
''..
KKO
dffe$c*!
77    777'')r)   c                     t        j                  | j                  d|       | j                  | j                  j                  d             y )Nr0   r%   )r2   unlinkr$   
assertTruer%   read)r&   r<   s     r(   _removezConfigReaderTest._removeR   s0    ))tvvu%&//$&&++c"#r)   c                     | j                  | j                  j                  |             | j                  j                  ddg      d   S )Nsection)intoptionrJ   )rD   r%   rE   
getOptions)r&   r@   s     r(   
_getoptionzConfigReaderTest._getoptionV   s:    //$&&++a.!			9'8&9	:8	DDr)   c                    | j                   j                  d       | j                   j                  ddd       | j                   j                  ddd       | j                   j                  ddd       | j                   j                  dd      }| j	                  |dd	d
d       | j                   j                  dd      }| j	                  |dd	d d       | j                   j                  ddddd      }| j	                  |dd	d
d       y )N
Definitiona1br%   test))rI   rO   r   )boolrQ   r   )rI   r%   r   r   Tr   )rO   rQ   r%   ))rI   rO   )rS   rQ   )rI   r%   )rI   r   )rS   r   )r%   add_sectionsetrK   assertSortedEqual)r&   optss     r(   testConvertzConfigReaderTest.testConvertZ   s    &&\"&&**\3$&&**\3$&&**\3'			<7
9$QT:;			<.
0$QT=>			<	+J7
9$QT:;r)   c                    t         j                  j                  | j                  d      }| j	                  dd       | j                  | j                  d      d       t        j                  |d       t        j                  |t         j                        s+| j                  | j                  j                  d             y dd l}t        j                  d|j                         z        )Nzd.confr   r$   z0Skipping on %s -- access rights are not enforced)r2   r3   r6   r$   rA   assertEqualrL   chmodaccessR_OKassertFalser%   rE   platformunittestSkipTest)r&   r@   r_   s      r(   testInaccessibleFilez%ConfigReaderTest.testInaccessibleFilei   s    ggll4668$!++h4??3'+((1a. 
1bgg	DFFKK$%			MPXPaPaPcc	ddr)   c                    | j                  | j                  j                  d             | j                  dd       | j	                  | j                         d       | j                  dd       | j	                  | j                         d       | j                  dd       | j	                  | j                         d	       | j                  d
d       | j	                  | j                         d	       | j                  dd       | j	                  | j                         d       | j                  dd       | j	                  | j                         d       | j                  dd       | j	                  | j                         d       | j                  d       | j                  d       | j	                  | j                         d       | j                  d       | j	                  | j                         d	       | j                  d       | j	                  | j                         d       | j                  d
       | j	                  | j                         d       y )Nr%   c.confrP   r   2r   zc.d/98.conf998i  zc.d/90.conf990zc.d/99.conf999i  zc.local3   zc.d/1.local4   i  )r^   r%   rE   rA   rZ   rL   rF   r-   s    r(   testOptionalDotDDirz$ConfigReaderTest.testOptionalDotDDirv   s   466;;s#$++h4??$a(++h4??$a(++mU#4??$c*++mU#4??$c*++mU#4??$c*++i4??$a(++mS!4??$a(,,},,y4??$c*,,}4??$c*,,}4??$c*,,}4??$a(r)   c                    | j                  dd d       | j                  dd d       | j                  dd d       | j                  dd d	       | j                  d
d d        G d dt              } |ddi       | _        | j                  j                  | j                         | j                  | j                  j                                | j                  j                  i d       | j                  j                         }| j                  |j                  d      d       | j                  |j                  d      d       | j                  |j                  d      d       y )Nrd   zS
[INCLUDES]
before = ib.conf
after  = ia.conf
[Definition]
test = %(default/test)s
r=   r>   zib.confz,
[DEFAULT]
test = A
[Definition]
option = 1
zib.localz,
[DEFAULT]
test = B
[Definition]
option = 2
zia.confz,
[DEFAULT]
test = C
[Definition]
oafter = 3
zia.localz,
[DEFAULT]
test = D
[Definition]
oafter = 4
c                   $    e Zd ZddgddgddgdZy)?ConfigReaderTest.testLocalInIncludes.<locals>.TestDefConfReaderrI   Nstring)rJ   oafterrR   )__name__
__module____qualname___configOpts r)   r(   TestDefConfReaderrq      s    t}t};r)   ry   r%   rJ   T)allr   rs   rl   rR   D)rA   r   r%   
setBaseDirr$   rD   rE   rK   getCombinedrZ   get)r&   ry   os      r(   testLocalInIncludesz$ConfigReaderTest.testLocalInIncludes   s9   ++hd -+  ++it .+  ++j /+  ++it .+  ++j /+ 4  S(B/$&&&DFF//$&&++- &&BD!
ff!155?A&155?A&155=#&r)   c                    | j                  | j                  j                  d             | j                  dd d       | j	                  | j                  j                  d             | j                  | j                  j                         ddg       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd	      d
       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d       y )Nizi.confzu
[DEFAULT]
b = a
zz = the%(__name__)s

[section]
y = 4%(b)s
e = 5${b}
z = %(__name__)s

[section2]
z = 3%(__name__)s
ro   rH   section2y4aez5${b}zzz
thesection	3section2)r^   r%   rE   rA   rD   rZ   sectionsr~   r-   s    r(   testInterpolationsz#ConfigReaderTest.testInterpolations   s
   466;;s#$++hd -+  //$&&++c"#466??$y*&=>466::i-t4466::i-w7466::i-y9466::i.=466::j#.<r)   c                    | j                  | j                  j                  d             | j                  dd d       | j	                  | j                  j                  d             | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d	       y )
Ngg.confz4
[DEFAULT]
# A comment
b = a
c = d ;in line comment
ro   DEFAULTrQ   rO   r%   r$   )r^   r%   rE   rA   rD   rZ   r~   r-   s    r(   testCommentszConfigReaderTest.testComments   s    466;;s#$++hd -+  //$&&++c"#466::i-s3466::i-s3r)   c                    | j                  | j                  j                  d             | j                  dd d       | j	                  | j                  j                  d             | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d	       | j                  | j                  j                  d
d      d       | j                  | j                  j                  d
d      d       | j                  | j                  j                  d
d      d       | j                  | j                  j                  d
d      d       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d       | j                  | j                  j                  dd      d       | j                  t        | j                  j                  dd       | j                  t        | j                  j                  d
d       y )Nr   r   z
[DEFAULT]
a = def-a
b = def-b,a:`%(a)s`
c = def-c,b:"%(b)s"
d = def-d-b:"%(known/b)s"

[jail]
a = jail-a-%(test/a)s
b = jail-b-%(test/b)s
y = %(test/y)s

[test]
a = test-a-%(default/a)s
b = test-b-%(known/b)s
x = %(test/x)s
y = %(jail/y)s
ro   rR   rO   ztest-a-def-arQ   ztest-b-def-b,a:`test-a-def-a`jailzjail-a-test-a-def-az+jail-b-test-b-def-b,a:`jail-a-test-a-def-a`r%   z5def-c,b:"jail-b-test-b-def-b,a:`jail-a-test-a-def-a`"r$   z'def-d-b:"def-b,a:`jail-a-test-a-def-a`"z'def-c,b:"test-b-def-b,a:`test-a-def-a`"z def-d-b:"def-b,a:`test-a-def-a`"r   zdef-c,b:"def-b,a:`def-a`"zdef-d-b:"def-b,a:`def-a`"xr   )	r^   r%   rE   rA   rD   rZ   r~   assertRaises	Exceptionr-   s    r(   testTargetedSectionOptionsz+ConfigReaderTest.testTargetedSectionOptions   s   466;;s#$++hd -+ $ //$&&++c"#466::fc*N;466::fc*,KL466::fc*,AB466::fc*,YZ466::fc*,cd466::fc*,UV466::fc*,UV466::fc*,NO466::i-/JK466::i-/JKItvvzz637Itvvzz637r)   )NN)r%   )rt   ru   rv   r!   r.   rA   rF   rL   rX   rb   rm   r   r   r   r   __classcell__r'   s   @r(   r   r   5   sB    0"$E<e)4.'`=.
4 8r)   r   c                        e Zd Z f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ed        Zd Z xZS )JailReaderTestc                 ,    t        t        | 
  |i | y N)r    r   __init__r&   argskwargsr'   s      r(   r   zJailReaderTest.__init__  s    &77r)   c                    dD ]  }| j                  t        d|d      ddg       | j                  t        d|d      ddg       | j                  t        d|d      ddg       | j                  t        d|d      ddg       | j                  t        d|d      ddg       | j                  t        d|d      ddg       | j                  t        d	|d      d	dg        y )
N)
	 rO   rQ   za[x=y]za[x=y][z=z]za[x="y][z"]z
a[x="y z"]z
a[x="y	z"]z
a[x="y
z"])rZ   r   )r&   r4   s     r(   testSplitWithOptionsz#JailReaderTest.testSplitWithOptions  s     Wc$s_5#QTAUV$C%9:(QTAUV$%>?-QTAUV$%>?-QTAUV$%=>,QTAUV$%>?-QTAUV$%>?-QTAUVWr)   c                 p    t        dt        t              }| j                  t        |j
                         y )NXXXABSENTXXXr   share_config)r
   r   CONFIG_DIR_SHARE_CFGr   
ValueErrorrE   r&   r   s     r(   testIncorrectJailz JailReaderTest.testIncorrectJail  s%    	NJEY	Z$J		*r)   c                 .   t        dt        t              }| j                  |j	                                | j                  |j                                | j                  |j                                | j                  d       | j                  d       y )Nemptyactionr   z"No filter set for jail emptyactionz'No actions were defined for emptyaction)r
   IMPERFECT_CONFIGIMPERFECT_CONFIG_SHARE_CFGrD   rE   rK   	isEnabledassertLoggedr   s     r(   testJailActionEmptyz"JailReaderTest.testJailActionEmpty  sh    	M+;Jd	e$//$))+//$//#$//$.."#89=>r)   c                 <   t        dt        t              }| j                  |j	                                | j                  |j                                | j                  |j                                | j                  dt        z         | j                  d       y )Nmissingbitsjailr   zJFound no accessible config files for 'filter.d/catchallthebadies' under %szUnable to read the filter	r
   r   r   rD   rE   r^   rK   r   r   r   s     r(   testJailActionFilterMissingz*JailReaderTest.testJailActionFilterMissing"  sq    	%/?Nh	i$//$))+4??$%//$.."#`csst/0r)   c                    t        dt        t              }| j                  |j	                                | j                  |j                                | j                  |j                                | j                  d       y )Nbrokenactiondefr   z$Invalid action definition 'joho[foo'r   r   s     r(   testJailActionBrokenDefz&JailReaderTest.testJailActionBrokenDef*  ^    	%/?*
,$//$))+4??$%//$.."#:;r)   c                 (   t        dt        t              }| j                  |j	                                | j                  |j                                | j                  |j                                | j                  |j                  d   d       y )N
tz_correctr   logtimezoneUTC+0200)	r
   r   r   rD   rE   rK   r   rZ   optionsr   s     r(   testJailLogTimeZonez"JailReaderTest.testJailLogTimeZone2  se    	L*:*
,$//$))+//$//#$//$.."#4<<.
;r)   c                    t        dt        t              }| j                  |j	                                | j                  |j                                | j                  |j                                | j                  d       y )Nbrokenfilterdefr   z$Invalid filter definition 'flt[test'r   r   s     r(   testJailFilterBrokenDefz&JailReaderTest.testJailFilterBrokenDef:  r   r)   c                    t         j                  j                  d       t        dt        t
              }| j                  |j                                | j                  |j                                | j                  |j                                | j                  |j                         d       |j                  d       | j                  |j                         d       y )NTstocksshdr   zssh-funky-blocker)r`   F2BSkipIfCfgMissingr
   r   r   rD   rE   rK   r^   r   rZ   getNamesetNamer   s     r(   testStockSSHJailzJailReaderTest.testStockSSHJailB  s    
,,d+	FJ=Q	R$//$))+//$//#$4>>#$4<<>6*,,"#4<<>#67r)   c           	         t         j                  j                  d       t        dt        t
        d      }| j                  |j                                | j                  |j                                | j                  |j                                |j                         }| j                  g dg|D cg c]  }t        |      dkD  s|d   dk(  s| c}       | j                  g dg|D cg c]  }t        |      dkD  s|d   d	k(  s| c}       | j                  g d
g|D cg c]  }t        |      dkD  s|d   dk(  s| c}       |j                  g d      }d}|D ]A  }| j                  t        |      dkD  xr |d   j                  d             |dz  }||kD  sA y  y c c}w c c}w c c}w )NTr   sshd-override-flt-optsr   r   force_enable)rU   r   	prefregexz^Testr   r   )rU   r   addjournalmatchz
_COMM=testr   )rU   r   maxlinesr   r   )rU   r   usednsnor   regexr   )r`   r   r   r
   r   r   rD   rE   rK   r   convertrZ   lenindexr^   endswith)r&   r   streamr   	usednsidxr   s         r(   testOverrideFilterOptInJailz*JailReaderTest.testOverrideFilterOptInJailL  s   
,,d+	,6F*
?$//$))+//$//#$//$.."#<<>& KL<!Q!!(;A<> VWB!Q!!0A(AABD DE;!Q!!
(:A;= llLM)! aCFQJ91Q4==#9:61)mU = C <s6   8F2
F2
F2
3F7
F7
F7
.F<
F<
F<
c                    t         j                  j                  d       dD ]  }dD ]  }t        d|j	                         z   t
        t        d      }| j                  |j                                | j                  |j                                |j                         }| j                  d|j                         dd	|z  gg|D cg c]  }t        |      d
kD  s|d
   dk(  s| c}         y c c}w )NTr   )r   r   )JRNLFILETESTINITchecklogtype_r   rU   addfailregexz^%s failure from <HOST>$r   )r`   r   r   r
   lowerr   r   rD   rE   rK   r   rZ   r   r   )r&   r   prefliner   r   r   s         r(   testLogTypeOfBackendInJailz)JailReaderTest.testLogTypeOfBackendInJailf  s    
,,d+ 
Ca3 Cxohnn&66@P,4ADOODIIK OODOO%&\\^Fudllnn>X[c>cdeAA3q6A:!A$.*@aACC
C Bs   C4C4$C4c                    d}dddif}t        |      }| j                  ||       | j                  di ft        d             | j                  ddddft        d	             | j                  d
i ft        d
             | j                  dddift        d             | j                  dddift        d             | j                  t        t         d       | j                  t        t         d       | j                  t        t         d       | j                  t        t         d       | j                  t        t         d       d}di f}t        |      }| j                  ||       d}ddddddddd d!d"d"d#f}t        |      }| j                  ||       t        |j	                  dd$            }|d%   t        d& |d'   j                         D              f}| j                  ||       y )(Nzmail-whois[name=SSH]z
mail-whoisnameSSHzmail.who_iscatdog)rO   rQ   zmail.who_is[a=cat,b=dog]zmail--ho_ismailrO   ,zmail[a=',']rQ   zmail[a=b, ]z	mail-how[z-mail[a="test with interim (wrong) "" quotes"]z-mail[a='test with interim (wrong) '' quotes']zmail[a='x, y, z', b=x, y, z]z	mail['s']zabc[]abczoption[opt01=abc,opt02="123",opt03="with=okay?",opt04="andwith,okay...",opt05="how about spaces",opt06="single'in'double",opt07='double"in"single',  opt08= leave some space, opt09=one for luck, opt10=, opt11=]rJ   123z
with=okay?zandwith,okay...zhow about spaceszsingle'in'doublezdouble"in"singlezleave some spacezone for luck )opt01opt02opt03opt04opt05opt06opt07opt08opt09opt10opt11][r   c              3   J   K   | ]  \  }}||j                  d d      f  yw)r   r   N)replace).0kvs      r(   	<genexpr>z1JailReaderTest.testSplitOption.<locals>.<genexpr>  s$     BdaAIIc4 !Bs   !#r   )r   rZ   r   r   r  dictitems)r&   rJ   expectedresult	expected2s        r(   testSplitOptionzJailReaderTest.testSplitOptionu  s   !&VUO,(&!&8V$M2&}(EFM5#9:NKe<fgM2&}(EFFS#J')FGFS#J')FGJ<J0cdJ0cdJ0RSJ@ &R[(&!&8V$ c&  ( &!&8V$ &..d34&{Bhqk.?.?.ABB) 9f%r)   c                    t        ddt        t              }| j                  |j	                                | j                  |j                                | j                  |j                  d   d       | j                  |j                  d   d       | j                  |j                  D cg c]  }|j                          c}g dd	ddd
ddgdd
gddggggg dd	dddddgddgddgddggggg dd	dddddgddgddggggg       y c c}w )N	multi-logT)r   r   r   logpathza.log
b.log
c.logactionzeaction[actname='ban']
action[actname='log', logpath="a.log
b.log
c.log
d.log"]
action[actname='test'])rU   r  	addactionban	multi-setr  	actionbanz4echo "name: ban, ban: <ip>, logs: a.log
b.log
c.log"actnamer   )rU   r  r  logr  z:echo "name: log, ban: <ip>, logs: a.log
b.log
c.log
d.log"za.log
b.log
c.log
d.log)rU   r  r  rR   rR   z5echo "name: test, ban: <ip>, logs: a.log
b.log
c.log")r
   r   r   rD   rE   rK   rZ   r   rV   _JailReader__actionsr   )r&   r   rO   s      r(   testMultiLineOptionz"JailReaderTest.testMultiLineOption  sN   	Kd<L[u	v$//$))+//$//#$4<<	*,AB4<<)  ,^  _t/H/HI!!))+I,{KSXJK[[ / 
 -{KSXQR,-/D[ / 
 .[(TZKL[] 0 L Is   -D	c           
         t         j                  j                  d       t        ddt              }t        j                  |d       |j                  j                         }t        d      |d<   | j                  |j                                |j                         }g }|D ]q  }t        |      dk  r|d   d	k(  r|d   d
k(  r|j                  |       4|d   dk(  s=|j                  |d   D cg c]  }|d   d
k(  sd	g|dd z   |z    c}       s dt         z  }| j#                  t        |      d       | j#                  |d   d	dddd
|g       | j#                  |d   d	dddd
|g       y c c}w )NTr   blocklisttest)r   r   r   ))rt   r  )filterr   )	failregexz^test <HOST>$)senderzf2b-test@example.com)blocklist_de_apikeyztest-key)r  zX%(action_blocklist_de)s
mynetwatchman[port=1234,protocol=udp,agent="%(fail2ban_agent)s"]rl   r   rU   agentr  r   zFail2Ban/%sr   r  blocklist_demynetwatchman)r`   r   r   r
   r   r   rE   _cfgget_sectionsr  rD   rK   r   r   appendextendr   rZ   )r&   r   r   r   actcmdr   	useragents           r(   testVersionAgentzJailReaderTest.testVersionAgent  sm   
,,d+	O$
	K$D&!YY##%(" $ (? //$//#$<<>&
# Lc	#h!m	!fo#a&G+JJsOA+JJAJ1!A$'/#a("Q&JKL g%)3s8Q3q6E?HngW`ab3q6E?HowXabc	 Ks   3E3
E3
c                 d   t         j                  j                  |d      }t        |d      j	                          t         j                  j                  |d      }t        j
                  d|       | j                  t        j                  t         j                  j                  |d            |g       | j                  t        j                  |      g        | j                  d|z         | j                  t        j                  t         j                  j                  |d            g        y )Nf1r1   f2nonexisting*z4File %s is a dangling link, thus cannot be monitored)
r2   r3   r6   r9   r;   symlinkrZ   r
   _globr   )r&   r$   r+  r,  s       r(   testGlobzJailReaderTest.testGlob  s     
ww||At"r3-	ww||At"**]2 :##BGGLLC$89B4@:##B',JROP:##BGGLLM$BCRHr)   c                    t        i       }| j                  |j                         g        | j                  |j	                  d             | j                  t        |j                  di        | j                  t        |j                  d       | j                  t        |j                  dd       | j                  t        |j                  di        y )Nr   rR   any)r   rZ   r   r^   has_sectionr   r   merge_sectionr   r~   rK   )r&   r%   s     r(   testCommonFunctionz!JailReaderTest.testCommonFunction  s    #!1::<$1==()NAOOVR@NAIIv6NAEE659NALL&"=r)   )rt   ru   rv   r   r   r   r   r   r   r   r   r   r   r   r  r  r)  r   r1  r7  r   r   s   @r(   r   r     si    8	W+?1<<<84C3&j0dB I I >r)   r   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)FilterReaderTestc                    g ddddg dgg dg dg dg d	g}t        ddi       }|j                  t               |j                          |j	                  d        | j                  |j                         |       t        ddd
dit        t              }|j                          |j	                  d        d|d   d<   | j                  |j                         |       y )N)rU   
testcase01r   r   r  r;  r   )z^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?Authentication failure for .* from <HOST>\s*$z^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$a  ^\s*(?:\S+ )?(?:kernel: \[\d+\.\d+\] )?(?:@vserver_\S+ )?(?:(?:\[\d+\])?:\s+[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?|[\[\(]?sshd(?:\(\S+\))?[\]\)]?:?(?:\[\d+\])?:)?\s*(?:error: PAM: )?User not known to the\nunderlying authentication.+$<SKIPLINES>^.+ module for .* from <HOST>\s*$)rU   r;  addignoreregexz"^.+ john from host 192.168.1.1\s*$)rU   r;  r   z
_COMM=sshd+z_SYSTEMD_UNIT=sshd.servicez_UID=0)rU   r;  r   zFIELD= with spaces r=  zAFIELD= with + char and spaces)rU   r;  datepatternz%Y %m %d %H:%M:%Sr   5r   r      r   )r   r|   TEST_FILES_DIRrE   rK   rV   r   TEST_FILES_DIR_SHARE_CFG)r&   outputfilterReaders      r(   rX   zFilterReaderTest.testConvert  s    '~ 06 7*?B</&2 lL"=,.)$ --/8lL:s:K)>C,$&)B---/8r)   c                     t        dddddt        t              }|j                          |j	                  d        |j                         }| j                  |d   d       | j                  d       y )Nr;  z<test>X)r   rR   r@  r   z6Wrong int value 'X' for 'maxlines'. Using default one:)r   rD  rC  rE   rK   r}   assertNotEqualr   r&   rF  rW   s      r(   testConvertOptionsz#FilterReaderTest.testConvertOptions-  sj    lLxY\:])>C,$		!	!	#$d:&,LMr)   c                     g dg}t        ddi t        t              }|j                          |j	                  d        |j                         }| j                  ||       y )N)rU   jailnamer   z to=sweet@example.com fromip=<IP>
substitionrM  r@  r   rD  rC  rE   rK   r   rV   r&   rE  rF  r%   s       r(   !testFilterReaderSubstitionDefaultz2FilterReaderTest.testFilterReaderSubstitionDefault6  sX    ST&lJ)>C,$!F#r)   c                     t        ddi t        t              }|j                          |j	                  d        |j                         }| j                  d|d   v        y )N
testcase02rM  r@  r   r  )r   rD  rC  rE   rK   r}   rD   rJ  s      r(   testFilterReaderSubstKnownz+FilterReaderTest.testFilterReaderSubstKnown?  sX     lJ)>C,$		!	!	#$//&D--.r)   c                     g dg}t        ddddit        t              }|j                          |j	                  d        |j                         }| j                  ||       y )N)rU   rM  r   zto=sour@example.com fromip=<IP>rN  rM  honeypotzsour@example.comr@  rO  rP  s       r(   testFilterReaderSubstitionSetz.FilterReaderTest.testFilterReaderSubstitionSetJ  s^    RS&lJEW8X)>C,$!F#r)   c                     g dg}t        d      \  }}t        dd|t        t              }|j	                          |j                  d        |j                         }| j                  ||       y )N)rU   rM  r   z?^to=test,sweet@example.com,test2,sweet@example.com fromip=<IP>$zusubstition[failregex="^<known/failregex>$", honeypot="<sweet>,<known/honeypot>", sweet="test,<known/honeypot>,test2"]rN  rM  r@  r   r   rD  rC  rE   rK   r   rV   r&   rE  
filterName	filterOptrF  r%   s         r(   testFilterReaderSubstitionKnownz0FilterReaderTest.testFilterReaderSubstitionKnownS  sk    rs&(z|*ilJ	)>C,$!F#r)   c                     g dg}t        d      \  }}t        dd|t        t              }|j	                          |j                  d        |j                         }| j                  ||       y )N)rU   rM  r   z)^\s*to=fail2ban@localhost fromip=<IP>\s*$zUsubstition[failregex="^\s*<Definition/failregex>\s*$", honeypot="<default/honeypot>"]rN  rM  r@  rY  rZ  s         r(   !testFilterReaderSubstitionSectionz2FilterReaderTest.testFilterReaderSubstitionSection^  sk    ^_&(\^*ilJ	)>C,$!F#r)   c                    t        ddddit        t              }|j                          |j	                  d        | j                  t        t         j                  |       t        dddddt        t              }|j                          |j	                  d        | j                  t        t         j                  |       y )NrN  rM  rV  z
<honeypot>r@  z<sweet>)rV  sweet)r   rD  rC  rE   rK   r   r   r   )r&   rF  s     r(   testFilterReaderSubstitionFailz/FilterReaderTest.testFilterReaderSubstitionFaili  s    lJ\8R)>C,$J 4 4lClJYYe8f)>C,$J 4 4lCr)   c                 |   t         j                  j                  t         j                  j                  t        d            }t        t         j                  j                  |d      di       }| j                  |j                         t         j                  j                  |d      t         j                  j                  |d      g       	 |j                  d        |j                  dd       |j                  dd       |j                  dd       y # t        $ r}| j                  d	|z         Y d }~y d }~ww xY w)
Nfilter.dztestcase01.confr;  ztestcase-common.confrN   __prefix_liner  ignoreregexz)unexpected options after readexplicit: %s)r2   r3   abspathr6   rC  r   rZ   readexplicitrK   r~   r   fail)r&   path_rF  r   s       r(   testFilterReaderExplicitz)FilterReaderTest.testFilterReaderExplicitw  s    
''//"'',,~zB
C%bggll52CDlTVW,<,,.GGLL./eEV1WX@4 L/2L+.L-0	 @998A>??@s   AD 	D;D66D;N)rt   ru   rv   rX   rK  rQ  rT  rW  r]  r_  rb  rk  rx   r)   r(   r9  r9    s3    *9XN$	/$	$	$D@r)   r9  c                   *    e Zd ZddZd Zed        Zy)JailsReaderTestCacheNc                     t        ||      }|j                  |       |j                          |j                          |j	                          | j                  |j                  d              y )Nr   r   )r   r|   	readEarlygetEarlyOptionsreadAllrD   rK   )r&   r   r   r   configurators        r(   _readWholeConfz#JailsReaderTestCache._readWholeConf  sW    <lS,'" //,))$/0r)   c                     d}| j                         j                  d      D ]!  }t        j                  d|z   |      s|dz  }# |S )Nr   r   z^\s*Reading files?: .*/r   )getLogrsplitrematch)r&   	filematchcntss       r(   _getLoggedReadCountz(JailsReaderTestCache._getLoggedReadCount  sK    	#;;=% ahh))3Q71HC 
*r)   c                 R   t         j                  j                          t        j                  }t
        j                  t        _        	 t        j                  |       t        j                  t        |       t        j                  t        dz   |dz          t        j                  t        dz   |dz          t               }| j                  ||       | j                  d      }| j                  |dk(  d|z         | j                  |d	|
       | j                  d      }| j                  |dk(  d|z         | j                  d      }| j                  |dk(  d|z         | j                  d      }| j                  |dk(  d|z         |t        _        y # |t        _        w xY w)Nz
/jail.confz/jail.localz/fail2ban.confz/fail2ban.localr3  z
jail.localr   z3Unexpected count by reading of jail files, cnt = %sTro  zjail\.localz:Unexpected count by second reading of jail files, cnt = %szfilter\.d/common\.confz5Unexpected count by reading of filter files, cnt = %szaction\.d/iptables\.confz5Unexpected count by reading of action files, cnt = %s)r`   r   
SkipIfFastr	   logLevelloggingDEBUGr+   r,   copytreer   copyr  rt  r}  rD   )r&   r   saved_ll	share_cfgr{  s        r(   testTestJailConfCachez*JailsReaderTestCache.testTestJailConfCache  sj   
,,%%($]]/'	==	??:w'	;;zL('M*AB	;;z,,g8I.IJ v9 wY7		!	!,	/3 ??3!8RUXXY wT	J		!	!.	13??3!8Y\__` 
	!	!";	<3??3!8TWZZ[		!	!"=	>3??3!8TWZZ[&?h?s   	EF F&)FN)rt   ru   rv   rt  r}  r   r  rx   r)   r(   rm  rm    s     1 #' #'r)   rm  c                   t     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
ed	        Zd
 Zd Zed        Z xZS )JailsReaderTestc                 ,    t        t        | 
  |i | y r   )r    r  r   r   s      r(   r   zJailsReaderTest.__init__  s    '88r)   c                     t         j                  j                  d      s-t        d      }| j	                  t
        |j                         y y )Nz/XXXr   )r2   r3   r7   r   r   r   rE   )r&   readers     r(   testProvidingBadBasedirz'JailsReaderTest.testProvidingBadBasedir  s5    		'6Z- 
 r)   c                 Z   t        t        t              }| j                  |j	                                | j                  |j                  d             | j                  t        |j                         |j                  d      }d | _
        | j                  |g dg ddd	d
g dgdd	gg dg dg dg dg dddddddgddgddgggg dg dg dg dddgddgddgddgg ddd gd!d"gd!d#gd!d$gd!d%gg       | j                  d&       | j                  d'       | j                  d(       y ))Nr   F)ignoreWrongTallow_no_files)addr   auto)r  test-known-interpr  r  r  r   )z*failure test 1 (filter.d/test.conf) <HOST>z+failure test 2 (filter.d/test.local) <HOST>z"failure test 3 (jail.local) <HOST>start)r  missinglogfilesr  )rU   r  r   <IP>)r  brokenactionr  )rU   r  r   r  )rU   r  r  r  r  r  r  zhit with big stick <ip>r  r   )r  parse_to_end_of_jail.confr  )rU   r  r   r  )rU   r   r   r  )rU   r   r   r   r   r  r  )r  r   r  r   zconfig-errorz~Jail 'brokenactiondef' skipped, because of wrong configuration: Invalid action definition 'joho[foo': unexpected option syntaxz~Jail 'brokenfilterdef' skipped, because of wrong configuration: Invalid filter definition 'flt[test': unexpected option syntaxzoJail 'missingaction' skipped, because of wrong configuration: Unable to read action 'noactionfileforthisaction'zmJail 'missingbitsjail' skipped, because of wrong configuration: Unable to read the filter 'catchallthebadies'z!Errors in jail 'missingbitsjail'.zSkipping...z6No file(s) found for glob /weapons/of/mass/destruction)r   r   r   rD   rE   r^   rK   r   r   r   maxDiffrV   r   assertNotLogged)r&   jailscomm_commandss      r(   testReadTestJailConfz$JailsReaderTest.testReadTestJailConf  s}   
.=W
X%//%**,5###67J.--t-4-$,"(%~ 8 
 !"&6#38.(N,- n= 
 1@14m n)*(l EF EFuwsuE$%L 78}%LMr)   c           
         t         j                  j                  d       t        j                  t        j
                  j                  t        dd            D ]j  }t        j
                  j                  |      j                  dd      }t        |di t              }| j                  |j                                	 |j                  i        |j%                  d      r| j'                  d|j)                         d|z         | j                  |j*                  j-                  dd      j/                         d|z         |j1                  t2        j4                  t7        d      z        }| j9                  |j-                  d      dd|z         |dv sD| j'                  d|j-                  dd      d|z         m y # t        $ r8}| j                  d	|d
t!        |      j"                  d|       Y d }~4d }~ww xY w)NTr   action.d*.confz.confr   r   r   zaction r   z: z-commonrN   z.Action file %r is lacking [Definition] sectionmsgr  z#Action file %r is lacking actionban)timeoutbantime)ignorer   z5Action file %r does not contains jail-name 'f2b-TEST')pfziptables-allportsiptables-multiportzf2b-TESTactionstartzSAction file %r: interpolation of actionstart does not contains jail-name 'f2b-TEST')r`   r   r   globr2   r3   r6   r   basenamer  r   rD   rE   rK   r   ri  typert   r   assertInr   _optsr~   stripr}   r   _escapedTagsrU   rZ   )r&   actionConfig
actionNameactionReaderr   rW   s         r(   testReadStockActionConfz'JailsReaderTest.testReadStockActionConf  s   
,,d+iiZX NO pl  .66wC:z62zJ<??<$$&'GB 

i
(MM, 5 5 7	9L	H  J 	OOL&&**;;AAC	.	=  ? ##&&-C)DD $ FDTXXf%v	@<	O  Q FF	]]:txxr:
_bn
n  p-p  GIIZa1A1A1EFFGs   ?G	H	-HH	c           	         t         j                  j                  d       t        t        t
              }| j                  |j                                | j                  |j                                |j                         }| j                  |g        t               }|j                         D ].  }|dk(  r
|j                  |d      }t        |      \  }}|j                  |       | j                  t!        |             t#        |||t
        t              }| j                  |j                         d|z          |j                  i        | j                  |j$                  j                  dd	      j'                                |j                  |d
      }| j                  t!        |j'                                      t)        |      D ]  }	t        |	      \  }
}| j                  t!        |
             | j                  t+        |t,                     |
dk(  r| j/                  d|       t1        |
|i t
        t              }| j                  |j                                |j                  i        |j                         }| j                  t!        |             | j                  |j$                  j                  dd	      j'                                 1 y )NTr   r   INCLUDESr  r@  zFailed to read filter:r  r   r  r  portr  )r`   r   r   r   r   r   rD   rE   rK   r   rZ   rU   r   r~   r   r  r   r   r  r  r   
isinstancer  r  r   )r&   r  r  
allFiltersr   r[  r\  rF  actionsr&  actNameactOptr  cmdss                 r(   testReadStockJailConfz%JailsReaderTest.testReadStockJailConf  sD   
,,d+
j7K
L%//%**,//%""$%--/- ="% u* nn %Ed
j		$):)*5:y>>*??3z?# z4%z;<??<$$&'?*'LM2 ??<%%))+r:@@BCYYtX&7??3w}}'( w' Es$S)OGVOOCL!OOJvt,-&&	]]66"r&
<LOOL%%'(B!DOOCI 	OOL&&**;;AACDE-%Er)   c           
         t         j                  j                  d       t        t        dt
              }| j                  |j                                | j                  |j                                t        d t        j                  t        j                  j                  ddd            D              }t        d |j                  D              }d | _        | j                  |j!                  |      d	|j#                  |      z         | j                  |j!                  |      d
|j#                  |      z         y )NTr   r   r   r   c              3      K   | ]h  }|j                  d       sU|j                  d      sDt        j                  j                  t        j                  j	                  |      d         d    j yw)zcommon.confz-aggressive.confr   r   N)r   r2   r3   splitextsplit)r  rO   s     r(   r  zBJailsReaderTest.testReadStockJailFilterComplete.<locals>.<genexpr>^  sX      JJJ}%4F)G   q!1!!45a8 Js   A.A0r   rd  r  c              3   R   K   | ]  }t        |j                  d          d    ! yw)r  r   N)r   r   )r  r   s     r(   r  zBJailsReaderTest.testReadStockJailFilterComplete.<locals>.<genexpr>b  s(      15>$,,x()!,s   %'z=More filters exists than are referenced in stock jail.conf %rz2Stock jail.conf references non-existent filters %r)r`   r   r   r   r   r   rD   rE   rK   rU   r  r2   r3   r6   r  r  issubset
difference)r&   r  filtersfilters_jails       r(   testReadStockJailFilterCompletez/JailsReaderTest.testReadStockJailFilterCompleteX  s   
,,d+
jtJ^
_%//%**,//%""$% JIIbggll8ZBCJ J'  9> , $,//'""<0CgFXFXYeFffh//,''08<;R;RSZ;[[]r)   c                    t         j                  j                  d       t        t        dt
              }| j                  |j                                | j                  |j                                |j                  d      }| j                  t        |             |D ]K  }t        |      dk\  s|d   |d   gdd	gk(  s"| j                  t        j                  |d         dkD         M d
D ]G  }| j                  d|gd |D               | j                  d|ddg|       | j                  d|g|       I | j                  |d   d   d       |j                  D ]"  }|j                   }|j#                         }| j                  t        |      d|z         |D ]  }|j                         }|j#                         }	dt%        |      v s1| j                  d|j&                         d}
|d|	g}|D ]e  }t        |      dkD  r)|d   dk(  r!|dd |k(  rd|d   D cg c]  }|d   	 c}v }
n(t        |      dkD  r|d   dk(  r|dd |k(  r
|d   dk(  rd}
|
se n | j                  |
d|dt%        |              % y c c}w )NTr   r  r  rj   r   r   rU   r  )r   recidiver  c              3   V   K   | ]!  }t        |      d k(  s|d   dk(  s|dd  # yw)rj   r   r  Nr   )r   )r  r'  s     r(   r  zDJailsReaderTest.testReadStockJailConfForceEnabled.<locals>.<genexpr>  s*     KSQ3q6U?S!WKs   ))
)r   warnr  rB  zNo actions found for jail %sr  z<blocktype>	blocktypeFr  rl   r  r   rA  z	Found no z command among )r`   r   r   r   r   r   rD   rE   rK   r   r   r   str2secondsr  rZ   _JailsReader__jailsr  r   str	_initOpts)r&   r  r  commandjr  	jail_namer  commandsaction_nameblocktype_presenttarget_commandr'  s                r(   !testReadStockJailConfForceEnabledz1JailsReaderTest.testReadStockJailConfForceEnabledk  s   
,,d+ jtJ^
_%//%**,//%""$%--t-4- //#m$%  8g	'laWQZ4	8JJOOF&&wqz2Q678   .a ==%KKM ==%Hf-}==='1}-. =$Q'1%% +a##7yy{9 ??3w<)I5  7  +v~~H.."KH%	]]; 0 01 (K8^ 
g,
wqz[8q|~%(wqz,JSV,JJL1u!4q|~%'!**C 	 
__
#h-)  +%++* -Ks   !Jc                    t         j                  j                  d       t               }|j	                  t
               | j                  |j                         t
               |j                          |j                         }| j                  |d   d       | j                  |d   d       |j                          |j                          |j                          |j                         fd}| j                   |d       |d	      cxk  xr  |d
      k  nc        | j                   |d       |d      kD         | j                   |d       |d      kD         | j                  g dg dg dg dg dg dg dg       |j                   j	                  d       | j                  |j                   j                         d       | j                  |j                         t
               y )NTr   socketz/var/run/fail2ban/fail2ban.sockpidfilez/var/run/fail2ban/fail2ban.pidc                 v    t              D ]  \  }}|d   dk(  s|d   | k(  s|c S  t        d| d      )Nr   rU   r   zDid not find command 'set z' among commands )	enumerater   )rJ   r   r   r  s      r(   find_setz7JailsReaderTest.testStockConfigurator.<locals>.find_set  sN    " tq!tu}1X 
8 
 r)   syslogsocketloglevel	logtarget
dbpurgeagedbfiledbmaxmatches)rU   r  r  )rU   r  INFO)rU   r  z/var/log/fail2ban.log)rU   	allowipv6r  )rU   r  z"/var/lib/fail2ban/fail2ban.sqlite3)rU   r  
   )rU   r  1dz/tmp)r`   r   r   r   r|   r   rZ   
getBaseDirrp  rq  rr  rK   convertToProtocolgetConfigStreamrD   rV   _Configurator__jails)r&   rs  rW   r  r  s       @r(   testStockConfiguratorz%JailsReaderTest.testStockConfigurator  s   
,,d+,*%<**,j9		%	%	'$4>#DE4	?$DE  "))+( //Nhz2JXk5JJ //(<(8H+==>//(>*Xh-??@ #1 ;#  ##..v6<44??A6J<**,j9r)   c                    t        j                  t         j                  j                  |d             t        j                  t         j                  j                  |d             t	        t         j                  j                  |dd      d      j                          t	        t         j                  j                  |dd      d      j                          t	        t         j                  j                  |d      d      }|j                  d       |j                          t        |i       }| j                  |j                                | j                  |j                                |j                  d	
      }|D cg c]  }|d d g dk(  r|dd   }}| j                  t        t        d |D                    d       | j                  |d   d   d       y c c}w )Nrd  r  ztestaction1.confr1   ztestfilter1.conf	jail.confz
[testjail1]
enabled = true
action = testaction1[actname=test1]
         testaction1[actname=test2]
         testaction.py
         testaction.py[actname=test3]
filter = testfilter1
r   Tr  rj   )rU   	testjail1r  c              3   &   K   | ]	  }|d      yw)r   Nrx   )r  r  s     r(   r  z9JailsReaderTest.testMultipleSameAction.<locals>.<genexpr>  s     ?6!9?s   rl   rB  z{})r2   mkdirr3   r6   r9   r;   r:   r   rD   rE   rK   r   rZ   r   rU   )r&   r   jailfdr  r  commadd_actionss          r(   testMultipleSameActionz&JailsReaderTest.testMultipleSameAction  so   ((277<<,-((277<<,-rww||GZ);<cBHHJrww||GZ);<cBHHJWk2C8&,,   	,,.
gB
7%//%**,//%""$%--t-4-&3 5d
2Ah33 ab 5+ 5 3s?;??@!D ;r?2&-5s   G!c                 J    | j                  t        d| j                  d       y )Nz'Have not found any log file for .* jailpollingbackend)assertRaisesRegexr   _testLogPathr-   s    r(   testLogPathFileFilterBackendz,JailsReaderTest.testLogPathFileFilterBackend  s%    %Oi  )r)   c                     	 ddl m} | j                  d       | j                  d       y # t        $ r}t        j                  d      d }~ww xY w)Nr   )FilterSystemdz&systemd python interface not availablesystemdr  zsystemd[journalflags=2])server.filtersystemdr  r   r`   ra   r  )r&   r  r   s      r(   testLogPathSystemdBackendz)JailsReaderTest.testLogPathSystemdBackend   sV    E3 I&56 
 E			C	DDEs   - 	AAAc                 \   t        t        j                  j                  |d      d      }|j	                  d|d|d       |j                          t        |      }| j                  |j                                | j                  |j                                |j                          y )Nr  r1   z&
[testjail1]
enabled = true
backend = z
logpath = ze/not/exist.log
          /this/path/should/not/exist.log
action = 
filter = 
failregex = test <HOST>
r   )r9   r2   r3   r6   r:   r;   r   rD   rE   rK   r   )r&   r   r  r  r  s        r(   r  zJailsReaderTest._testLogPath  sz    Wk2C8&,, 	 	 	,,.
g
&%//%**,//%""$%--/r)   )rt   ru   rv   r   r  r  r  r  r  r  r  r   r  r  r  r  r   r   s   @r(   r  r    se    9.
/Nbp6<E~]&=+~2:h . .:)7  r)   r  )6
__author____copyright____license__r  r  r2   rx  r+   r"   r`   client.configreaderr   r   r   r   clientr	   client.jailreaderr
   r   r   client.filterreaderr   client.jailsreaderr   client.actionreaderr   r   client.configuratorr   server.mytimer   r   utilsr   r   r3   r6   r5   __file__rC  rD  r   r   r   r   r   r   TestCaser   r   r9  rm  r  rx   r)   r(   <module>r     s	  ( 1
P   	 	   , , $ L L . , = . "  2bggooh7A  ||00 77<< 98D  N8x(( N8bv>' v>rG@) G@T7'- 7'tV( Vr)   