ogfZVdZdZddlZddlZddlZddlZddlZddlZddlm Z m Z ddl m Z ddl mZddlmZmZd d lmZ dd lmZej,Zd d lmZmZej8j;ej8j=ed Z dZ!GddeZ"y#e$rdZYUwxYw)z"Copyright (c) 2013 Steven HiscocksGPLN) FileContainerFilter)MyTime) FailTicket)ActionsUtils) DummyJail)database)LogCaptureTestCaselogSysfilescbtjjr tdSt|S)N:memory:)unittestF2B memory_db Fail2BanDb)filenames A/usr/lib/python3/dist-packages/fail2ban/tests/databasetestcase.py getFail2BanDbr0s% LL J 8ceZdZfdZedZej dZfdZdZdZ dZ dZ d Z d Z d Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZxZS) DatabaseTestctt| tt j dd|_tjjstjdd\}|_d|_ y)zCall before every test case.NzEUnable to import fail2ban database module as sqlite is not available..db fail2ban_:auto-create-in-memory:) superrsetUprrSkipTest dbFilenamerrtempfilemkstemp_db)self_ __class__s rr"zDatabaseTest.setUp8sd d!#    $/    (( <1do &$(rct|jtr)|jdk(rt|j|_|jS)Nr ) isinstancer'strrr$r(s rdbzDatabaseTest.dbDs5#488/H#HDOO,48 /rczt|jtr|jj||_yN)r,r'rclose)r(values rr/zDatabaseTest.dbIs%*%88>> $(rctt| ty|j t j |jyy)zCall after every test case.N)r!rtearDownrr$osremove)r(r*s rr5zDatabaseTest.tearDownOs8 d$&  __ 99T__!rc|jjdk(rtjd|j |j |jjy)Nrin :memory: database)r/rrr# assertEqualr$r.s rtestGetFilenamezDatabaseTest.testGetFilenameXsD WW#   1 224??DGG$4$45rc,|j|jjdd|j_|j|jjdd|j_|j|jjdy)NiQ1y6mon15d5h30mi_z2y 12mon 30d 10h 60miP)r:r/purgeager.s r testPurgeAgezDatabaseTest.testPurgeAge]sh477##U+%$''477##X.+$''477##Z0rcN|jtjtdy)Nz/this/path/should/not/exist) assertRaisessqlite3OperationalErrorrr.s rtestCreateInvalidPathz"DatabaseTest.testCreateInvalidPathds   "rc4|jjdk(rtjd|j t |j |_|j|jj|jjvdy)Nrr9z3Jail not retained in Db after disconnect reconnect.) r/rrr# testAddJailrr$ assertTruejailname getJailNamesr.s rtestCreateAndReconnectz#DatabaseTest.testCreateAndReconnectjsn WW#   1 22 t '$'//99>>TWW))++8:rctjdstjdd|_|j t jdd\}|_dD]#}|jd|ztjtjjtd|j tj|j tj }tj"||tj$| t'|j |_|dk(r}|j)d d d d |j+|jj-t/dg|j+t1|jj3dn{|j)dd dd |j+t1|jj-d|j+t1|jj3d|js|jj4dk7stj6|jj8d|_&y#|jrK|jj4dk7r1tj6|jj8d|_wwwxYw)Nzsqlite3 --versionzno sqlite3 commandrr)6iz)[test-repair], next phase - file-size: %ddatabase_v1.dbrMzRepair seems to be successfulzCheck integrityzDatabase updatedT)all/tmp/Fail2BanDb_pUlZJh.logr zRepair seems to be failedzNew database created.rr)r executeCmdrr#r/r$r%r&pruneLogshutilcopyfiler6pathjoinTEST_FILES_DIRopenO_RDWR ftruncater2r assertLoggedr: getLogPathssetlenrJ _dbFilenamer7_dbBackupFilename)r(r) truncSizefs r testRepairDbzDatabaseTest.testRepairDbus#   - .   / 00 $' __ (( <1do!i==T>TU($''*:*:J>TWW))$//!rc|jtjdd\}}t|d|_|j j |j|j}|j|du|j||j j|jtj|y)Nz.log Fail2BanDb_utf-8) rFr%r&r fileContainerr/addLogrHrGassertInr\r6r7)r(r)rposs r _testAddLogzDatabaseTest._testAddLogs  7+!X$Xw7$ tyy$"4"45#//#+--$''--dii89))Hrcz|j|jj}t|d}|j d|j |jj|jj |jj |jj}|j|dkD|jj|j|jt|d|_|j|jjd|j|jj|j|j|t|d}|j d|j t|d|_|j|jjd|j|jj|j|jdtj |y)Nwz,Some text to write which will change md5sum rr}z%Some different text to change md5sum )rr~ getFileNamerXwriter2readlinegetPosrGr/ updateLogrHrr:rr6r7)r(rfile_lastPoss r testUpdateLogzDatabaseTest.testUpdateLogs   + + -( x %++=>++-    % % ''//'A+''DIIt112%Xw7$4%%,,.277>>$))T//0'; x %++67++-$Xw7$4%%,,.277>>$))T//0$8))Hrc r|j|j|jj|jdddD]l}|jj |jd|dt |z|j|jj|jd|ny)Nzsystemd-journal)i/hYi/hYi/hYTEST)rFr:r/ getJournalPosrH updateJournalr-)r(ts rtestUpdateJournalzDatabaseTest.testUpdateJournal s477((4EFM /La77$5q&Q-HDGG))$))5FGKLrcR|jtdddg}|jj|j||jj |j}|j t|d|jt|dty)NrerrfrHr ) rFrr/addBanrHrir:r^rGr,)r(rorps r testAddBanzDatabaseTest.testAddBansz k1wi 0&''..F# GGOOO +'3w<#// gaj*%'rc |jtddgdtddgdtddgdtddgdtd dd d gtd dd d gtd dd dgg}|D](}|jj|j|*|j d|jj |j}|j d|jt|dt|D]\}}tjd|||jtjd||j|j||j|j|jt||jt|j|jdt j"} dt _|D](}|jj|j|*|j%d|jj |j}|j%d|jt|d|t _|jd|jj|jtd|jj |j}|jt|d|j ddy#|t _wxYw)Nrer) user "test"user "Ñâåòà"uuser "äöüß" 127.0.0.2z 127.0.0.3)rs user ""suser "äöüß"z 127.0.0.4)rruuser "äöüß"z 127.0.0.5ruunterminated Ïz 127.0.0.6z 127.0.0.7sunterminated zjson dumps failedrzjson loads failedzreadtickets[%d]: %rz == tickets[%d]: %rz[test-phase 2] simulate errorszf2b-test::non-existing-encodingz[test-phase 3] still operable?z 127.0.0.8)rFrr/rrHassertNotLoggedrir:r^ enumerate DefLogSysdebuggetDatarv getMatchesrRr PREFER_ENCr[)r(rpro readticketsipriorEncs rtestAddBanInvalidEncodedz%DatabaseTest.testAddBanInvalidEncodeds{Axy{Axy{Az{{Ahi{A /BCD{A /BCD{A /CDE '%f77>>$))V$%*+TYY/+*+3{#Q' W%Pia ??(![^-C-C-EF ??(!V^^-=>KN((*FLLN;C A1134c&:K:K:M6NO P --01  (":8&vGGNN499f%&()dii0;()C $b)!8--01''..J{34TYY/+3{#R(*,?@"8s ;BL55 Mc$|jdD]9}td|zddg}|jj|j|;|jj |j}|j t|d|S)N)r rrsz 192.0.2.%drztest rrs)rFrr/rrHrir:r^)r(rrorps r _testAdd3BanszDatabaseTest._testAdd3BansYs{ %a  q(1xj 9677>>$))V$% GGOOO +'3w<# .rc |j}|jj|j|dj |j t |jj|jd|jj|j|dj |dj |j t |jj|jdy)Nrrrr )rr/delBanrHrvr:r^ri)r(rps r testDelBanzDatabaseTest.testDelBanbs    '''..GAJ,,./3twwDII67;''..GAJ,,. 0@0@0BC3twwDII67;rc|j|jj|j|j t |jj |jdy)Nrr)rr/rrHr:r^rir.s r testFlushBanszDatabaseTest.testFlushBansksJ''..3twwDII67;rc|j|jj|jt dt j dz dg|jj|jt dt j dz dg|jt|jj|jdd|jt|jj|jdd |jt|jj|jd d y) Nre<rf(2)rHbantimer rr) rFr/rrHrrtimer:r^rir.s rtestGetBansWithTimez DatabaseTest.testGetBansWithTimeqs''..99jfkkmb&87)DF''..99jfkkmb&87)DF3twwDIIbABAF3twwDIIbABAF3twwDIIbABAFrc  |jd}dgtdgddgtdgddgtddgddgtddgdg}|Dcgc] }|d d  }}d }|D]a}|d z}td tj|z |}|j d|j j|j|c||j _ |j jd }|j|jd |j|jt||jt|j||j|j|| dtd tjd z |dtddgi}|j t||j j|j||j jd }|j|jdt|z|jt|j||j|j|| d|j j!|jd tjdz }|j#|du|j|jt||jt|j||j|j|| d|j j!|jd tjdz d}|jt|jd|j|j|dd |j j!|jd tjdz d }|jt|jd |j%gdd |j _ |j j|j||j j!|jd tjdz }|j#|du|j|jt||jt|jd ycc}w)Nrrftest)matchesuser123 ABC rootz1234 rrP re)datar rd)rg)rg maxmatchesrs)123)rFr]rrrrur/rrH maxMatches getBansMergedr:rv getAttemptr^rrmrG setMatches)r(rfailuresrb matches2findrros rtestGetBansMerged_MaxMatchesz)DatabaseTest.testGetBansMerged_MaxMatches}sA*y#vh-0y#vh-0y#vv&6"78z3'7#89 ( ,44a!I,q/4,4! %a71 {FKKMA$5A >6 Q77>>$))V$ % "$'' 77  -&6<<>;/6$$&H 63v((*+Z86$$& j[\(BC k6;;=2#5| ff%&' )&CM"''..F# 77  -&6$$&CM(9:3v((*+Z86$$& j[\(BC 77 ! !$))[6;;=QTCT ! U&//&$%6$$&H 63v((*+Z86$$& j[\(BC 77 ! !$))[6;;=QTCT " &3v((*+Q/6$$& I(>? 77 ! !$))[6;;=QTCT " &3v((*+Q/M"$''''..F# 77 ! !$))[6;;=QTCT ! U&//&$%6$$&H 63v((*+Q/]5sT>c |jtd}|jj|t dt j dz dg}|jd|jj|j|t dt j dz dg}|jd |jj|j|t d t j d z d g}|jd|jj|j|t dt j dz d g}|jd|jj|||jjd}|j|jd|j|jd |j|jgd |jjd|j}|j|jd|j|jd|j|jddg|jt|t|jjd|jt d t j d z d g}|jd|jj|j||jt|t|jjd|jt dt j dz d g}|jd|jj|j||j!t|t|jjd|j|jj}|jt#|d|j%t't)d|D|Dcgc]}|jc}|jj|}|jt#|d|jjd}|jt#|d|jjd}|jt#|d|jjd}|jt#|d|jjd}|jt#|d|jj+|j}|jt#|d|jj+dd}|j|jd|jj+|jdt j }|jt#|d|jj+|jdt j t j,dz}|jt#|d|jj+|jdt j t j,dz}|jt#|d|j/d|jj|j||jj+|jdt j t j,dz}|jt#|d|j1d|jj3z|jj4j/d|jj+|jdt j t j,dz}|jt#|d|j|dj7dycc}w)Nz DummyJail-2rtrerrfrrrrrF)rfrrrrc3<K|]}|jywr1)rv).0ros r z1DatabaseTest.testGetBansMerged..s 1vFLLN 1sr )rrrr)rHip)rH forbantimerg1yearz(ignore ticket (with new max ban-time %r))rFr r/rzrrrrurrHrr:rvrridassertNotEqualr^assertSortedEquallistr]rm str2seconds setBanTimer[ getMaxBanTimeactionsrn)r(jail2ro newTicketrps rtestGetBansMergedzDatabaseTest.testGetBansMergeds  '%''//% k6;;=2#5y A&B''..F# k6;;=2#5y A&B''..F# k6;;=2#5y A&B''..F# k6;;=2#5y A&B''.. 77  -&6<<>;/6$$&+6$$&(CD 77 499 =&6<<>;/6$$&+6$$&'(:;f:dggKdii89;fkkmb&87)D)B''..I&f:dggKdii89;fkkmb&87)D)B''..I&f:dggKdii89; GG ! ! #'3w<# 1 112!()vFLLN)+ GG ! !u ! -'3w<# GG ! !" ! -'3w<# GG ! !" ! -'3w<# GG ! !! ! ,'3w<# GG ! !" ! -'3w<# GG " " " 2'3w<# 77 ! !t ! <&6<<>;/ GG " " b KKM # '3w<# GG " " b KKMF..w7 7 # 9'3w<# GG " " b KKMF..w7 7 # 9'3w<#B''..F# GG " " b KKMF..w7 7 # 9'3w<#>AXAXAZZ[))r" GG " " b KKMF..w7 7 # 9'3w<#71:((*B/_*s c% c|j|j|j_|jj |j|jj }|j dtjjtdi|jjdt|jx|j_}|jj!dt#d}|j%d|j'ddg|jj)||j+|j-dd z|j-d d zy) Naction_checkainfozaction.d/action_checkainfo.pyrrz1.2.3.4rrzban ainfo %s, %s, %s, %s)TTTTzjail info %d, %d, %d, %d)r rr)rFr/rHr rzraddr6rUrVrW banManager setBanTotalr _Jail__filter failManager setFailTotalrrur putFailTicket_Actions__checkBanr[)r(rfltros rtestActionWithDBzDatabaseTest.testActionWithDBsww$))''//$)) II  ' ++77<< ?@   $"("33$))C//r" i &AVV$%))&! .1IIJ.?@rc$|j|jj|j|jj }|j t |dk(xr|jj||jj d}|j t |dk(xr|jj||jj d}|jt |dk(|jj|j|jj }|j t |dk(xr|jj||jj d}|j t |dk(xr|jj||jj d}|jt |dk(y)Nr F)enabledTr) rFr/delJailrHrJrr^rIrGrz)r(jailss rtestDelAndAddJailzDatabaseTest.testDelAndAddJail4sj''//$)) ''   %--E a2DIINNE: ''  u  -%--E a2DIINNE: ''  t  ,%//#e*/"''//$)) ''   %--E a2DIINNE: ''  t  ,%--E a2DIINNE: ''  u  -%//#e*/"rc.|j|jj|jt |jj d|jj |j|jj|jt |jj d|j|jj |j|jj|jt |jj d|jt |jj|jd|j|jj|jtdtjdg|jj |j|jj|jt |jj d|jt |jj|jdy)Nr rrrerf)rFr/purger:r^rJrrHrrirrrrr.s r testPurgezDatabaseTest.testPurgeGs''--/3tww++-.2''//$))''--/3tww++-.2//''//$))''--/3tww++-.23twwDII67;''..99jfkkmgY?A''//$))''--/3tww++-.23twwDII67;r)__name__ __module__ __qualname__r"propertyr/setterr5r;r?rDrKrcrqrxrFrrrrrrrrrrrrrr __classcell__)r*s@rrr6s '  ))  6 1" :!F).'B! %NL':Ax<< G70rg1RA*#&rs,5   1"&+ !!;bggooh7A h<%h<sBB('B(