o ;s*bâYã@sèdZdZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z ddl m Z ddlmZmZd d lmZz dd lmZejZWn eyRdZYnwd d lmZmZej ej e¡d ¡Zdd„Z Gdd„deƒZ!dS)z"Copyright (c) 2013 Steven HiscocksÚGPLéNé)Ú FileContainer)ÚMyTime)Ú FailTicket)ÚActionsÚUtilsé)Ú DummyJail)Údatabase)ÚLogCaptureTestCaseÚlogSysÚfilescCstjjrtdƒSt|ƒS)Nú:memory:)ÚunittestÚF2BÚ memory_dbÚ Fail2BanDb)Úfilename©rúA/usr/lib/python3/dist-packages/fail2ban/tests/databasetestcase.pyÚ getFail2BanDb0srcsòeZdZ‡fdd„Zedd„ƒZejdd„ƒZ‡fdd„Zdd „Zd d „Z d d „Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Z‡ZS)4Ú DatabaseTestcsJtt|ƒ ¡tdurt d¡‚d|_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:) ÚsuperrÚsetUprrÚSkipTestÚ dbFilenamerrÚtempfileÚmkstempÚ_db)ÚselfÚ_©Ú __class__rrr8sÿ zDatabaseTest.setUpcCs(t|jtƒr|jdkrt|jƒ|_|jS)Nr)Ú isinstancer"Ústrrr©r#rrrÚdbDs zDatabaseTest.dbcCs t|jtƒr |j ¡||_dS©N)r'r"rÚclose)r#Úvaluerrrr*Is   cs8tt|ƒ ¡tdur dS|jdurt |j¡dSdS)zCall after every test case.N)rrÚtearDownrrÚosÚremover)r%rrr.Os  ÿzDatabaseTest.tearDowncCs,|jjdkr t d¡‚| |j|jj¡dS)Nrúin :memory: database)r*rrrÚ assertEqualrr)rrrÚtestGetFilenameXs  zDatabaseTest.testGetFilenamecCsD| |jjd¡d|j_| |jjd¡d|j_| |jjd¡dS)Ni€QÚ1y6mon15d5h30mi¨_æz2y 12mon 30d 10h 60miP¿Ì)r2r*Úpurgeager)rrrÚ testPurgeAge]s zDatabaseTest.testPurgeAgecCs| tjtd¡dS)Nz/this/path/should/not/exist)Ú assertRaisesÚsqlite3ÚOperationalErrorrr)rrrÚtestCreateInvalidPathds ýz"DatabaseTest.testCreateInvalidPathcCsH|jjdkr t d¡‚| ¡t|jƒ|_| |jj |j  ¡vd¡dS)Nrr1z3Jail not retained in Db after disconnect reconnect.) r*rrrÚ testAddJailrrÚ assertTrueÚjailÚnameÚ getJailNamesr)rrrÚtestCreateAndReconnectjs   þz#DatabaseTest.testCreateAndReconnectc Csvt d¡s t d¡‚d|_|jdurt dd¡\}|_dD]›}| d|¡t   t j   td¡|j¡t  |jt j¡}t  ||¡t  |¡z_t|jƒ|_|dkrq|jd d d d d | |j ¡tdgƒ¡| t|j ¡ƒd¡n|jdd dd d | t|j ¡ƒd¡| t|j ¡ƒd¡W|jr¤|jjdkr¤t  |jj¡d|_q|jr¸|jjdkr¸t  |jj¡d|_wdS)Nzsqlite3 --versionzno sqlite3 commandrr)é°6i z)[test-repair], next phase - file-size: %dúdatabase_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!ÚpruneLogÚshutilÚcopyfiler/ÚpathÚjoinÚTEST_FILES_DIRÚopenÚO_RDWRÚ ftruncater,rÚ assertLoggedr2Ú getLogPathsÚsetÚlenr?Ú _dbFilenamer0Ú_dbBackupFilename)r#r$Ú truncSizeÚfrrrÚ testRepairDbusF   ÿ   ÿÿ€€þèzDatabaseTest.testRepairDbc CsTd|_z“|jdurt dd¡\}|_t tj t d¡|j¡t |jƒ|_|  |j  ¡t dgƒ¡|  |j ¡t dgƒ¡tdddgƒ}|  |j ¡d |¡|  |j t j¡t j¡| t|jjt jd ¡|jjd d d }|  t|ƒd ¡|  |d  ¡d ¡W|jr“|jjdkr•t |jj¡dSdSdS|jr¨|jjdkr©t |jj¡www)NrrrBz"DummyJail #29162448 with 0 ticketsrDú 127.0.0.1g×£ÆÕ®ÔAúabc rr iW»Ri@â)ÚfromtimeÚcorrectBanTimer)r*rr r!rGrHr/rIrJrKrr2r?rQrPrÚgetBansÚupdateDbÚ __version__r7ÚNotImplementedErrorÚgetCurrentBansrRÚ getBanTimerSr0rT)r#r$ÚticketÚticketsrrrÚ testUpdateDb˜s, ÿ ÿÿzDatabaseTest.testUpdateDbcCsRd|_|jdurt dd¡\}|_t tj t d¡|j¡t |jƒ|_|  |j  ¡t dgƒ¡|  |j ¡t dgƒ¡|j ¡}|  t|ƒd¡tddgd ¢ƒ}| d ¡|  |d |¡|  |d  ¡d ¡|  |j t j¡t j¡tdd|_|jj|jdd}|  t|ƒd¡|  |d  ¡d¡| t|jjt jd ¡t |jj¡dS)Nrrzdatabase_v2.dbz pam-genericz/var/log/auth.logrz1.2.3.7ifÊ~T)zŠDec 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.7zŠDec 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.7zŠDec 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.7érr z1.2.3.8©r>)r=rZiX)r*rr r!rGrHr/rIrJrKrr2r?rQrPr\rRrÚ setAttemptÚgetIPr]r^r r=r`rar7r_r0rT)r#r$ÚbansrbrcrrrÚ testUpdateDb2¯s, ÿ    zDatabaseTest.testUpdateDb2cCs6tƒ|_|j |j¡| |jj|j d¡vd¡dS)NTzJail not added to database)r r=r*ÚaddJailr<r>r?r)rrrr;Ðs þzDatabaseTest.testAddJailcCsZ| ¡t dd¡\}}t|dƒ|_|j |j|j¡| ||j  |j¡¡t   |¡dS)Nz.logÚ Fail2BanDb_úutf-8) r;r r!rÚ fileContainerr*ÚaddLogr=ÚassertInrPr/r0)r#r$rrrrÚ testAddLog×s  zDatabaseTest.testAddLogcCs| ¡|j ¡}t|dƒ}| d¡| ¡|j ¡|j ¡|j ¡|j ¡}| |dk¡|j   |j |j¡t |dƒ|_|  |j ¡d¡|  |j  |j |j¡|¡t|dƒ}| d¡| ¡t |dƒ|_|  |j ¡d¡|  |j  |j |j¡d¡t |¡dS)NÚwz,Some text to write which will change md5sum rrmz%Some different text to change md5sum )rqrnÚ getFileNamerLÚwriter,ÚreadlineÚgetPosr<r*Ú updateLogr=rr2ror/r0)r#rÚfile_ÚlastPosrrrÚ testUpdateLogâs2        ÿ   ÿzDatabaseTest.testUpdateLogc Csb| ¡| |j |jd¡d¡dD]}|j |jd|dt|ƒ¡| |j |jd¡|¡qdS)Nzsystemd-journal)i/hYi/hYi/hYÚTEST)r;r2r*Ú getJournalPosr=Ú updateJournalr()r#ÚtrrrÚtestUpdateJournal s þzDatabaseTest.testUpdateJournalcCs^| ¡tdddgƒ}|j |j|¡|jj|jd}| t|ƒd¡| t |dtƒ¡dS)NrXrrY©r=r ) r;rr*ÚaddBanr=r\r2rRr<r')r#rbrcrrrÚ testAddBans ÿzDatabaseTest.testAddBanc Csô| ¡tddgd¢ƒtddgd¢ƒtddgd¢ƒtddgd¢ƒtd dd d gƒtd dd d gƒtd dd dgƒg}|D] }|j |j|¡q9| d¡|jj|jd}| d¡| t|ƒd¡t |ƒD]4\}}t   d|||  ¡¡t   d||  ¡¡| ||  ¡|  ¡¡| t|| ¡ƒt| ¡ƒ¡qb| d¡tj}z/dt_|D] }|j |j|¡q¥| d¡|jj|jd}| d¡| t|ƒd¡W|t_n|t_w| d¡|j |jtdƒ¡|jj|jd}| t|ƒd¡| dd¡dS)NrXr)ú user "test"õuser "Ñâåòà"uuser "äöüß"ú 127.0.0.2z 127.0.0.3)rƒs user "Ñâåòà"suser "äöüß"z 127.0.0.4)rƒr„uuser "äöüß"z 127.0.0.5rƒuunterminated Ãz 127.0.0.6z 127.0.0.7sunterminated Ïzjson dumps failedr€zjson loads failedézreadtickets[%d]: %rz == tickets[%d]: %rz[test-phase 2] simulate errorszf2b-test::non-existing-encodingéz[test-phase 3] still operable?z 127.0.0.8é)r;rr*rr=ÚassertNotLoggedr\r2rRÚ enumerateÚ DefLogSysÚdebugÚgetDatarhÚ getMatchesrFr Ú PREFER_ENCrO)r#rcrbÚ readticketsÚiÚpriorEncrrrÚtestAddBanInvalidEncodedsHù   "    z%DatabaseTest.testAddBanInvalidEncodedcCsX| ¡dD]}td|ddgƒ}|j |j|¡q|jj|jd}| t|ƒd¡|S)N)r rrez 192.0.2.%drztest r€re)r;rr*rr=r\r2rR)r#r‘rbrcrrrÚ _testAdd3BansXszDatabaseTest._testAdd3BanscCs~| ¡}|j |j|d ¡¡| t|jj|jdƒd¡|j |j|d ¡|d ¡¡| t|jj|jdƒd¡dS)Nrr€rr )r”r*ÚdelBanr=rhr2rRr\)r#rcrrrÚ testDelBanas " zDatabaseTest.testDelBancCs6| ¡|j |j¡| t|jj|jdƒd¡dS)Nr€r)r”r*r•r=r2rRr\r)rrrÚ testFlushBansjs zDatabaseTest.testFlushBanscCsª| ¡|j |jtdt ¡ddgƒ¡|j |jtdt ¡ddgƒ¡| t|jj |jddƒd¡| t|jj |jddƒd ¡| t|jj |jd dƒd ¡dS) NrXé<rYé(é2)r=Úbantimer éréÿÿÿÿr) r;r*rr=rrÚtimer2rRr\r)rrrÚtestGetBansWithTimepsÿÿ"z DatabaseTest.testGetBansWithTimecCs| ¡d}dgtdgƒdœdgtdgƒdœdgtddgƒdœdgtddgƒdœg}d d „|Dƒ}d }|D]}|d 8}td t ¡||d}| d¡|j |j|¡q5||j_ |j  d ¡}|  |  ¡d ¡|  |  ¡t|ƒ¡|  t| ¡ƒ|¡|  | ¡|| d…¡td t ¡d |dtddgƒid}| t|ƒ¡|j |j|¡|j  d ¡}|  |  ¡dt|ƒ¡|  t| ¡ƒ|¡|  | ¡|| d…¡|jj|jd t ¡dd}| |du¡|  |  ¡t|ƒ¡|  t| ¡ƒ|¡|  | ¡|| d…¡|jj|jd t ¡ddd}|  t| ¡ƒd¡|  | ¡|dd¡|jj|jd t ¡ddd}|  t| ¡ƒd¡| gd¢¡d|j_ |j |j|¡|jj|jd t ¡dd}| |du¡|  |  ¡t|ƒ¡|  t| ¡ƒd¡dS)NrrYÚtest)ÚmatchesÚuserú123 úABC Úrootz1234 cSsg|]}|dd‘qS)r¡rr)Ú.0rVrrrÚ …sz=DatabaseTest.testGetBansMerged_MaxMatches..éPé rX)Údatar r¢éd)rZ)rZÚ maxmatchesrer¡r)Ú1Ú2Ú3)r;rQrrržrgr*rr=Ú maxMatchesÚ getBansMergedr2rhÚ getAttemptrRrŽr`r<Ú setMatches)r#r°ÚfailuresÚ matches2findr‘rVrbrrrÚtestGetBansMerged_MaxMatches|sdü  ÿ ÿÿz)DatabaseTest.testGetBansMerged_MaxMatchescCs„| ¡tdd}|j |¡tdt ¡ddgƒ}| d¡|j |j |¡tdt ¡ddgƒ}| d ¡|j |j |¡td t ¡d d gƒ}| d¡|j |j |¡tdt ¡dd gƒ}| d¡|j ||¡|j  d¡}|  |  ¡d¡|  |  ¡d ¡|  | ¡gd ¢¡|jj d|j d}|  |  ¡d¡|  |  ¡d¡|  | ¡ddg¡|  t|ƒt|jj d|j dƒ¡td t ¡d d gƒ}| d¡|j |j |¡|  t|ƒt|jj d|j dƒ¡tdt ¡dd gƒ}| d¡|j |j |¡| t|ƒt|jj d|j dƒ¡|j  ¡}|  t|ƒd¡| ttdd„|Dƒƒƒdd„|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 dt ¡d}|  t|ƒd¡|jj|j dt ¡t d¡d}|  t|ƒd¡|jj|j dt ¡t d¡d}|  t|ƒd¡| d¡|j |j |¡|jj|j dt ¡t d¡d}|  t|ƒd¡| d|j  ¡¡|j j d¡|jj|j dt ¡t d¡d}|  t|ƒd¡|  |d ¡d¡dS)Nz DummyJail-2rfrXr™rYr©ér£rœr…r¤éF)rYr£r¤r€rcss|]}| ¡VqdSr+©rh©r¦rbrrrÚ ìs€z1DatabaseTest.testGetBansMerged..cSsg|]}| ¡‘qSrr¹rºrrrr§ísz2DatabaseTest.testGetBansMerged..r é)r›rˆérr)r=Úip)r=Ú forbantimerZÚ1yearz(ignore ticket (with new max ban-time %r))r;r r*rkrrržrgrr=r±r2rhr²rŽÚidÚassertNotEqualrRÚassertSortedEqualÚlistrQr`Ú str2secondsÚ setBanTimerOÚ getMaxBanTimeÚactionsra)r#Újail2rbÚ newTicketrcrrrÚtestGetBansMergedµs¬       þ þ þ  þ ÿ ÿ ÿ  ÿ ÿzDatabaseTest.testGetBansMergedcCsˆ| ¡|j|j_|j |j¡t|jƒ}| dtj  t d¡i¡t dƒ}|  d¡|  ddg¡|j |¡| ¡| dd¡dS)NÚaction_checkainfozaction.d/action_checkainfo.pyz1.2.3.4r½r zban ainfo %s, %s, %s, %s)TTTT)r;r*r=r rkrÚaddr/rIrJrKrrgr³Ú putFailTicketÚ_Actions__checkBanrO)r#rÈrbrrrÚtestActionWithDBs   ý  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|ƒdk¡dS)Nr F)ÚenabledTr) r;r*ÚdelJailr=r?rprRr>r<rk)r#ÚjailsrrrÚtestDelAndAddJail/s  zDatabaseTest.testDelAndAddJailcCs| ¡|j ¡| t|j ¡ƒd¡|j |j¡|j ¡| t|j ¡ƒd¡| ¡|j |j¡|j ¡| t|j ¡ƒd¡| t|jj |jdƒd¡| ¡|j  |jt dt   ¡dgƒ¡|j |j¡|j ¡| t|j ¡ƒd¡| t|jj |jdƒd¡dS)Nr rr€rXrY)r;r*Úpurger2rRr?rÒr=r‚r\rrrržr)rrrÚ testPurgeBs&   ÿ  zDatabaseTest.testPurge)Ú__name__Ú __module__Ú __qualname__rÚpropertyr*Úsetterr.r3r6r:r@rWrdrjr;rqrzrr‚r“r”r–r—rŸr¶rËrÐrÔrÖÚ __classcell__rrr%rr6s:      #! '  <   9ir)"Ú __copyright__Ú __license__r/Úsysrr r8rGÚ server.filterrÚ server.mytimerÚ server.ticketrÚserver.actionsrrÚ dummyjailr Úserverr rÚ ImportErrorÚutilsr r r‹rIrJÚdirnameÚ__file__rKrrrrrrÚs.       ÿ