o ;s*b0 @sdZdZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZmZddlmZdd lmZmZmZmZejeZejejed Zejejed Ze d Z!e"d e#e!dZ$Gddde j%Z&ddZ'eddfeddffD]-\Z(Z)e*e)e+eje(dD]Z)e),ddZ-e-.dse/e&de-0e'e-e(qqdS)z"Copyright (c) 2013 Steven HiscocksGPLN)Regex)Filter FileContainer) FilterReader) setUpMyTimetearDownMyTimeTEST_NOW CONFIG_DIRconfigfilesz\.[+\*](?!\?)[^\$\^]*z.*(?:\.[+\*].*|[^\$])$csNeZdZfddZfddZddZddZdd d Zed d Z Z S)FilterSamplesRegexcs&tt|t|_d|_tdS)zCall before every test case.N)superrsetUpdict_filters _filterTestsr self __class__@/usr/lib/python3/dist-packages/fail2ban/tests/samplestestcase.pyr4s zFilterSamplesRegex.setUpcstt|tdS)zCall after every test case.N)rrtearDownr rrrrr;s zFilterSamplesRegex.tearDowncCs(|tddt|DdkddS)z Check to ensure some tests existcSsg|] }|ddr|qS)rtestSampleRegexs startswith).0testrrr Cs  z9FilterSamplesRegex.testFiltersPresent.. z&Expected more FilterSampleRegexs testsN) assertTrueleninspect getmembersrrrrtestFiltersPresent@s z%FilterSamplesRegex.testFiltersPresentcCs||tdtd|tdtd|tdtd|tdtd|tdtdd S) z9Tests regexp RE_WRONG_GREED is intact (positive/negative)zgreedy .* testz test not hard-anchoredzgreedy .+ testz test vary .* anchored$z" test no catch-all, hard-anchored$znon-greedy .*? testznon-greedy .+? testz! test vary catch-all .* anchored$N)r$RE_WRONG_GREEDsearchRE_HOST assertFalserrrrtestReWrongGreedyCatchAllHsz,FilterSamplesRegex.testReWrongGreedyCatchAllNc Cs|j|}|r |Std}d|_d|_d|_d|_|dur!t}|}t |d||t j j d}| ||| |d||i|D]_}|ddkrZ|d}n|ddkrf|dg}n|d |f|D];}|d d kr|||_qp|d d kr||qp|d d kr||qp|d dkr||qp|d dkr||qpqM|} | D]} t| rtd|t| tdfq|t g}||j|<|S)NTFjail)basedir share_configrz multi-setsetz$Unexpected config-token %r in streamr prefregex addfailregexaddignoreregexmaxlines datepatternzFollowing regexp of "%s" contains greedy catch-all before , that is not hard-anchored at end or has not precise sub expression after : %sr)!rgetr returnRawHost checkAllRegex checkFindTimeactivercopyrunittestF2Br0 assertEqualgetFile getJailNameread getOptionsconvertfail prefRegex addFailRegexaddIgnoreRegex setMaxLinessetDatePattern getFailRegexr)r*AssertionErrorstrreplacer+r2) rfltNamenamer/optsflt filterConfoptoptval regexListfrrrr _readFilterVs\                   zFilterSamplesRegex._readFiltercCstdd|DS)Ncss&|]\}}|ds||fVqdS)ztest.Nr)r kvrrr s$z4FilterSamplesRegex._filterOptions..)ritemsrRrrr_filterOptionssz!FilterSamplesRegex._filterOptions)N) __name__ __module__ __qualname__rrr(r-rY staticmethodr_ __classcell__rrrrr2s   5rcsfdd}|S)Nc!s|tjtjtddg}t}i}i}d}|t|kr||}|d7}tj tjtd|dd}d}|D]} t | d| } t d | } | rzt| d }| dd krg|}Wq>| dd krg|_d}t|trz|n|gD]Q}|r|} | |n|} |t| t| d rt| d  }|s|| } | d} | s| rt| nd} | } |j| | d}|j| || fq}Wq>| ddkr||Wq>Wnty}z td|| |fd}~wwt |} t | d| } n|s| !ds| "sq>i}|rq>|js3} |j| dd}| |ifg|_| #d} |jD]\} }} |drPt|dsPq;|\}}|$}d}z3i}| ddkrl|%| }n| dry| d| } |%dt&| ft'}|rg}|D]'}|\}}}}|dus|dr|(||(||q||q|}|s|)|dddWq;||ddd|*t|dddd |D|D]}|\}}}}|+D]@\}}|d!vr*||d}|dur|d"kr|}|d#krt|d$i}t|tttfr$|,||q|*||q|d%d}|dur~z t-j-.|d&}WntyQt-j-.|d'}Ynwt/0|1}||j2d(7}|*||d)|t/3d&t/4||t/3d&t/4|||f|(||(||qWq;t5y}z0ddl6}t5d*| || || ||dkr||ndd+|7|8d+|7|8f d}~wwq>|t|ks%|j9+D])\} }|\}}|$}t:|D]\}} |||vp| |vd,| || fqqdS)-Nlogsz,No sample log file available for '%s' filterrrrb)modeFzUTF-8z4^#+ ?(failJSON|(?:file|filter)Options|addFILE):(.+)$r fileOptions filterOptionsztest.conditionztest.filter-namer^addFILEz %s: %s:%i#z constraintlogtypejournalztest.prefix-linenofailmatchz!Line not matched when should havez Line matched when shouldn't havezMultiple regexs matched %rcSsg|]}|dqS)rr)r xrrrr"z?testSampleRegexsFactory..testFilter..)timerrdescrmhostattemptsmatchesruz%Y-%m-%dT%H:%M:%Sz%Y-%m-%dT%H:%M:%S.%fg.Az:UTC Time mismatch %s (%s) != %s (%s) (diff %.3f seconds)zC%s: %s on: %s:%i, line: %s regex (%s): %s faildata: %s fail: %s z %s: Regex has no samples: %i: %r);r$ospathisfilejoinTEST_FILES_DIRr2r% fileinput FileInputr decode_linefilenamererrjsonloadsgroupr isinstancelistr=updaterr8evalr_rNrYappend ValueError filelinenonextrstriprstriprL processLine TEST_NOW_STRr addr,r@r]assertSortedEqualdatetimestrptimerumktime timetuple microsecondstrftimegmtimerMpprintpformat splitlinesr enumerate)!r filenames regexsUsedRe commonOptsfaildatairlogFile ignoreBlockline jsonREMatchrRfltOptsrPrSe regexsUsedIdxrW failregexrFretfoundfid fail2banTimerZr[fvt jsonTimeLocaljsonTimerfailRegexIndex failRegexr/rQrr testFiltersD                        # z+testSampleRegexsFactory..testFilterr)rQr/rrrrtestSampleRegexsFactorys-rcCs|d o |dS)Nz common.conf.conf)endswithrsrrr?srcCs|do |dS)Nzzzz-r)rrrrrrr@rtzfilter.d.ztestSampleRegexs%s)1 __copyright__ __license__rrr&rr{rsysrur>server.failregexr server.filterrrclient.filterreaderrutilsr r r r utcfromtimestamp isoformatrr|r~dirname__file__TEST_CONFIG_DIRr_resolveHostTagr+compileescaper)TestCaserrbasedir_filter_filterlistdir rpartition filterNamersetattrupperrrrrsN   ] 1