o ;s*bY@sdZdZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZd d lmZz dd lmZejZWn eyRdZYnwd d lmZmZejejed ZddZ GdddeZ!dS)z"Copyright (c) 2013 Steven HiscocksGPLN) FileContainer)MyTime) FailTicket)ActionsUtils) DummyJail)database)LogCaptureTestCaselogSysfilescCstjjrtdSt|S)N:memory:)unittestF2B memory_db Fail2BanDb)filenamerA/usr/lib/python3/dist-packages/fail2ban/tests/databasetestcase.py getFail2BanDb0srcseZdZfddZeddZejddZfddZdd Zd d Z d d Z ddZ ddZ ddZ ddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1Zd2d3ZZS)4 DatabaseTestcsJtt|tdurtdd|_tjjs t dd\}|_d|_ dS)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__rrr8s zDatabaseTest.setUpcCs(t|jtr|jdkrt|j|_|jS)Nr) isinstancer"strrrr#rrrdbDs zDatabaseTest.dbcCs t|jtr |j||_dSN)r'r"rclose)r#valuerrrr*Is   cs8tt|tdur dS|jdurt|jdSdS)zCall after every test case.N)rrtearDownrrosremover)r%rrr.Os  zDatabaseTest.tearDowncCs,|jjdkr td||j|jjdS)Nrin :memory: database)r*rrr assertEqualrr)rrrtestGetFilenameXs  zDatabaseTest.testGetFilenamecCsD||jjdd|j_||jjdd|j_||jjddS)NiQ1y6mon15d5h30mi_z2y 12mon 30d 10h 60miP)r2r*purgeager)rrr testPurgeAge]s zDatabaseTest.testPurgeAgecCs|tjtddS)Nz/this/path/should/not/exist) assertRaisessqlite3OperationalErrorrr)rrrtestCreateInvalidPathds z"DatabaseTest.testCreateInvalidPathcCsH|jjdkr td|t|j|_||jj |j vddS)Nrr1z3Jail not retained in Db after disconnect reconnect.) r*rrr testAddJailrr assertTruejailname getJailNamesr)rrrtestCreateAndReconnectjs   z#DatabaseTest.testCreateAndReconnectc Csvtds tdd|_|jdurtdd\}|_dD]}|d|t t j td|jt |jt j}t ||t |z_t|j|_|dkrq|jd d d d d ||jtdg|t|jdn|jdd dd d |t|jd|t|jdW|jr|jjdkrt |jjd|_q|jr|jjdkrt |jjd|_wdS)Nzsqlite3 --versionzno sqlite3 commandrr)6iz)[test-repair], next phase - file-size: %ddatabase_v1.dbrAzRepair seems to be successfulzCheck integrityzDatabase updatedT)all/tmp/Fail2BanDb_pUlZJh.logr zRepair seems to be failedzNew database created.rr)r executeCmdrrr*rr r!pruneLogshutilcopyfiler/pathjoinTEST_FILES_DIRopenO_RDWR ftruncater,r assertLoggedr2 getLogPathssetlenr? _dbFilenamer0_dbBackupFilename)r#r$ truncSizefrrr testRepairDbusF      zDatabaseTest.testRepairDbc CsTd|_z|jdurtdd\}|_ttjt d|jt |j|_| |j t dg| |jt dgtdddg}| |jd || |jt jt j|t|jjt jd |jjd d d }| t|d | |d d W|jr|jjdkrt|jjdSdSdS|jr|jjdkrt|jjwww)NrrrBz"DummyJail #29162448 with 0 ticketsrD 127.0.0.1gףծAabc rr iWRi@)fromtimecorrectBanTimer)r*rr r!rGrHr/rIrJrKrr2r?rQrPrgetBansupdateDb __version__r7NotImplementedErrorgetCurrentBansrR getBanTimerSr0rT)r#r$ticketticketsrrr testUpdateDbs,  zDatabaseTest.testUpdateDbcCsRd|_|jdurtdd\}|_ttjt d|jt |j|_| |j t dg| |jt dg|j}| t|dtddgd }|d | |d || |d d | |jt jt jtdd|_|jj|jdd}| t|d| |d d|t|jjt jd t|jjdS)Nrrzdatabase_v2.dbz pam-genericz/var/log/auth.logrz1.2.3.7if~T)zDec 3 09:31:08 f2btest test:auth[27658]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7zDec 3 09:31:32 f2btest test:auth[27671]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7zDec 3 09:31:34 f2btest test:auth[27673]: pam_unix(test:auth): authentication failure; logname= uid=0 euid=0 tty=test ruser= rhost=1.2.3.7rr z1.2.3.8r>)r=rZiX)r*rr r!rGrHr/rIrJrKrr2r?rQrPr\rRr setAttemptgetIPr]r^r r=r`rar7r_r0rT)r#r$bansrbrcrrr testUpdateDb2s,     zDatabaseTest.testUpdateDb2cCs6t|_|j|j||jj|jdvddS)NTzJail not added to database)r r=r*addJailr<r>r?r)rrrr;s zDatabaseTest.testAddJailcCsZ|tdd\}}t|d|_|j|j|j|||j |jt |dS)Nz.log Fail2BanDb_utf-8) r;r r!r fileContainerr*addLogr=assertInrPr/r0)r#r$rrrr testAddLogs  zDatabaseTest.testAddLogcCs||j}t|d}|d||j|j|j|j}||dk|j |j |jt |d|_| |jd| |j |j |j|t|d}|d|t |d|_| |jd| |j |j |jdt|dS)Nwz,Some text to write which will change md5sum rrmz%Some different text to change md5sum )rqrn getFileNamerLwriter,readlinegetPosr<r* updateLogr=rr2ror/r0)r#rfile_lastPosrrr testUpdateLogs2           zDatabaseTest.testUpdateLogc Csb|||j|jdddD]}|j|jd|dt|||j|jd|qdS)Nzsystemd-journal)i/hYi/hYi/hYTEST)r;r2r* getJournalPosr= updateJournalr()r#trrrtestUpdateJournal s zDatabaseTest.testUpdateJournalcCs^|tdddg}|j|j||jj|jd}|t|d|t |dtdS)NrXrrYr=r ) r;rr*addBanr=r\r2rRr<r')r#rbrcrrr testAddBans zDatabaseTest.testAddBanc Cs|tddgdtddgdtddgdtddgdtd dd d gtd dd d gtd dd dgg}|D] }|j|j|q9|d|jj|jd}|d|t|dt |D]4\}}t d||| t d|| ||| | |t||t|qb|dtj}z/dt_|D] }|j|j|q|d|jj|jd}|d|t|dW|t_n|t_w|d|j|jtd|jj|jd}|t|d|dddS)NrXr) 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)r;rr*rr=assertNotLoggedr\r2rR enumerate DefLogSysdebuggetDatarh getMatchesrFr PREFER_ENCrO)r#rcrb readticketsipriorEncrrrtestAddBanInvalidEncodedsH   "    z%DatabaseTest.testAddBanInvalidEncodedcCsX|dD]}td|ddg}|j|j|q|jj|jd}|t|d|S)N)r rrez 192.0.2.%drztest rre)r;rr*rr=r\r2rR)r#rrbrcrrr _testAdd3BansXszDatabaseTest._testAdd3BanscCs~|}|j|j|d|t|jj|jdd|j|j|d|d|t|jj|jdddS)Nrrrr )rr*delBanr=rhr2rRr\)r#rcrrr testDelBanas " zDatabaseTest.testDelBancCs6||j|j|t|jj|jdddS)Nrr)rr*rr=r2rRr\r)rrr testFlushBansjs zDatabaseTest.testFlushBanscCs||j|jtdtddg|j|jtdtddg|t|jj |jddd|t|jj |jddd |t|jj |jd dd dS) NrX<rY(2)r=bantimer rr) r;r*rr=rrtimer2rRr\r)rrrtestGetBansWithTimeps"z DatabaseTest.testGetBansWithTimecCs|d}dgtdgddgtdgddgtddgddgtddgdg}d d |D}d }|D]}|d 8}td t||d}|d|j|j|q5||j_ |j d }| | d | | t|| t||| ||| dtd td |dtddgid}|t||j|j||j d }| | dt|| t||| ||| d|jj|jd tdd}||du| | t|| t||| ||| d|jj|jd tddd}| t|d| ||dd|jj|jd tddd}| t|d|gdd|j_ |j|j||jj|jd tdd}||du| | t|| t|ddS)NrrYtest)matchesuser123 ABC rootz1234 cSsg|]}|ddqS)rrr).0rVrrr sz=DatabaseTest.testGetBansMerged_MaxMatches..P rX)datar rd)rZ)rZ maxmatchesrerr)123)r;rQrrrrgr*rr= maxMatches getBansMergedr2rh getAttemptrRrr`r< setMatches)r#rfailures matches2findrrVrbrrrtestGetBansMerged_MaxMatches|sd   z)DatabaseTest.testGetBansMerged_MaxMatchescCs|tdd}|j|tdtddg}|d|j|j |tdtddg}|d |j|j |td td d g}|d|j|j |tdtdd g}|d|j|||j d}| | d| | d | |gd |jj d|j d}| | d| | d| |ddg| t|t|jj d|j dtd td d g}|d|j|j || t|t|jj d|j dtdtdd g}|d|j|j ||t|t|jj d|j d|j }| t|d|ttdd|Ddd|D|jj |d}| t|d|jj dd}| t|d|jj dd}| t|d|jj dd}| t|d|jj dd}| t|d|jj|j d}| t|d|jjddd}| | d|jj|j dtd}| t|d|jj|j dttdd}| t|d|jj|j dttdd}| t|d|d|j|j ||jj|j dttdd}| t|d|d|j |j jd|jj|j dttdd}| t|d| |dddS)Nz DummyJail-2rfrXrrYrrrrrF)rYrrrrcss|]}|VqdSr+rhrrbrrr sz1DatabaseTest.testGetBansMerged..cSsg|]}|qSrrrrrrrsz2DatabaseTest.testGetBansMerged..r )rrrr)r=ip)r= forbantimerZ1yearz(ignore ticket (with new max ban-time %r))r;r r*rkrrrrgrr=rr2rhrridassertNotEqualrRassertSortedEquallistrQr` str2seconds setBanTimerO getMaxBanTimeactionsra)r#jail2rb newTicketrcrrrtestGetBansMergeds                 zDatabaseTest.testGetBansMergedcCs||j|j_|j|jt|j}|dtj t dit d}| d| ddg|j|||dddS)Naction_checkainfozaction.d/action_checkainfo.pyz1.2.3.4rrzban ainfo %s, %s, %s, %s)TTTT)r;r*r=r rkraddr/rIrJrKrrgr putFailTicket_Actions__checkBanrO)r#rrbrrrtestActionWithDBs     zDatabaseTest.testActionWithDBcCs||j|j|j}|t|dko|jj||jjdd}|t|dko0|jj||jjdd}|t|dk|j |j|j}|t|dkoZ|jj||jjdd}|t|dkoo|jj||jjdd}|t|dkdS)Nr F)enabledTr) r;r*delJailr=r?rprRr>r<rk)r#jailsrrrtestDelAndAddJail/s  zDatabaseTest.testDelAndAddJailcCs||j|t|jd|j|j|j|t|jd||j|j|j|t|jd|t|jj |jdd||j |jt dt dg|j|j|j|t|jd|t|jj |jdddS)Nr rrrXrY)r;r*purger2rRr?rr=rr\rrrrr)rrr testPurgeBs&     zDatabaseTest.testPurge)__name__ __module__ __qualname__rpropertyr*setterr.r3r6r:r@rWrdrjr;rqrzrrrrrrrrrrrr __classcell__rrr%rr6s:      #! '  <   9ir)" __copyright__ __license__r/sysrr r8rG server.filterr server.mytimer server.ticketrserver.actionsrr dummyjailr serverr r ImportErrorutilsr r rrIrJdirname__file__rKrrrrrrs.