
    ogf0              
       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	Z	ddl
mZ ddlmZmZ ddlmZ dd	lmZmZmZmZ ej                  j-                  e      j/                         Zej2                  j5                  ej2                  j7                  e      d
      Zej2                  j5                  ej2                  j7                  e      d      Z ej>                  d      Z  ejB                  d ejD                  e       z   dz         Z# G d de	jH                        Z%d Z&ed fed ffD ]  \  Z'Z( e)e( ejT                  ej2                  j5                  e'd                  D ]J  Z(e(jW                  d      d   Z,e,j[                  d      r) e.e%de,j_                         z   e&e,e'             L  y)z"Copyright (c) 2013 Steven HiscocksGPL    N   )Regex)FilterFileContainer)FilterReader   )setUpMyTimetearDownMyTimeTEST_NOW
CONFIG_DIRconfigfiles<HOST>z\.[+\*](?!\?)[^\$\^]*z.*(?:\.[+\*].*|[^\$])$c                   L     e Zd Z fdZ fdZd Zd ZddZed        Z	 xZ
S )FilterSamplesRegexc                 j    t         t        |           t               | _        d| _        t                y)zCall before every test case.N)superr   setUpdict_filters_filterTestsr
   self	__class__s    @/usr/lib/python3/dist-packages/fail2ban/tests/samplestestcase.pyr   zFilterSamplesRegex.setUp3   s'    D')&$-$-    c                 >    t         t        |           t                y)zCall after every test case.N)r   r   tearDownr   r   s    r   r   zFilterSamplesRegex.tearDown:   s    D*,r   c           
          | j                  t        t        j                  |       D cg c]  }|d   j	                  d      r| c}      dk\  d       yc c}w )z Check to ensure some tests existr   testSampleRegexs
   z&Expected more FilterSampleRegexs testsN)
assertTrueleninspect
getmembers
startswith)r   tests     r   testFiltersPresentz%FilterSamplesRegex.testFiltersPresent?   sZ    //++D1 /Aw,- 	 / 0	 ,	-/s   Ac                    | j                  t        j                  dt        z   dz                | j                  t        j                  dt        z   dz                | j	                  t        j                  dt        z   dz                | j	                  t        j                  dt        z   dz                | j	                  t        j                  dt        z   dz                y	)
z9Tests regexp RE_WRONG_GREED is intact (positive/negative)zgreedy .* testz test not hard-anchoredzgreedy .+ testz test vary .* anchored$z" test no catch-all, hard-anchored$znon-greedy .*? testznon-greedy .+? testz! test vary catch-all .* anchored$N)r#   RE_WRONG_GREEDsearchRE_HOSTassertFalse)r   s    r   testReWrongGreedyCatchAllz,FilterSamplesRegex.testReWrongGreedyCatchAllG   s    //)G36OOPR//)G36OOPR)G36ZZ[].8;TTUW.8;^^_ar   c           
      R   | j                   j                  |      }|r|S t        d       }d|_        d|_        d|_        d|_        |
t               }|j                         }t        |d||t        j                  j                        }| j                  |j                         |       | j                  |j                         d       |j!                          |j#                  i        |j%                         D ]  }|d   dk(  r|d   }n$|d   dk(  r|d   g}n| j'                  d	|d
       D ]z  }|d   dk(  r||_        |d   dk(  r|j+                  |       -|d   dk(  r|j-                  |       G|d   dk(  r|j/                  |       a|d   dk(  sj|j1                  |       |  |j3                         }	|	D ]E  }
t4        j7                  |
      st9        d|dt;        |
      j=                  t>        d             |tA               g}|| j                   |<   |S )NTFjail)basedirshare_configr   z	multi-set   setzUnexpected config-token z
 in streamr   	prefregexaddfailregexaddignoreregexmaxlinesdatepatternzFollowing regexp of "z|" contains greedy catch-all before <HOST>, that is not hard-anchored at end or has not precise sub expression after <HOST>:
r   )!r   getr   returnRawHostcheckAllRegexcheckFindTimeactiver   copyr   unittestF2Br3   assertEqualgetFilegetJailNameread
getOptionsconvertfail	prefRegexaddFailRegexaddIgnoreRegexsetMaxLinessetDatePatterngetFailRegexr+   r,   AssertionErrorstrreplacer-   r5   )r   fltNamenamer2   optsflt
filterConfoptoptval	regexListfrs              r   _readFilterzFilterSamplesRegex._readFilterU   s   '"#
:t#####*	\$&4	$D&$!:!:<*:%%'.:))+V4//!  c	!fVFA%!fXFII=> 
 v
1vS]	Q>	!f	Q#	#	Q:	__V	Q=	 
  *  ) 4bB
s2ww13 4 44 
ce#$--	*r   c                 B    t        d | j                         D              S )Nc              3   N   K   | ]  \  }}|j                  d       r||f  yw)ztest.N)r'   ).0kvs      r   	<genexpr>z4FilterSamplesRegex._filterOptions.<locals>.<genexpr>   s#     M41aq||G7LAMs   %	%)r   itemsrU   s    r   _filterOptionsz!FilterSamplesRegex._filterOptions   s    M4::<MMMr   )N)__name__
__module____qualname__r   r   r)   r/   r\   staticmethodre   __classcell__)r   s   @r   r   r   1   s4    
-a3j N Nr   r   c                       fd}|S )Nc                    | j                  t        j                  j                  t        j                  j	                  t
        d$            d$z         $g}t               }i }i }d}|t        |      k  r||   }|dz  }t        t        j                  j	                  t
        d|      dd      }d|_	        d}d}	|D ]F  }
|	dz  }	t        j                  d	|
      }|r	 t        j                  |j                  d
            }|j                  d      dk(  r|}^|j                  d      dk(  rg | _        d}t!        |t"              r|n|gD ]  }|r"|j%                         }|j'                  |       n|}| j                  t!        |t(                     |j+                  d      rt-        |j+                  d             }|rw| j/                  |      }|j+                  d      }|s|rt1        |      nd}$|z   }| j3                  |$#|      }| j                  j5                  |||f        w|j                  d      dk(  r|j5                  |       	 t;        |      }
n'|s!|
j=                  d      s|
j?                         si }|r| j                  s"$}| j3                  |$#d       }||i fg| _        |
jA                  d      }
| j                  D ]"  \  }}}|j+                  d      rt-        |d         s(|\  }}|jC                         }d}	 i }|j+                  d      dk7  r|jE                  |
      }nB|j+                  d      r|j+                  d      |
z   }
|jE                  dtF        |
ftH              }|r\g }|D ]S  }|\  }}}}||j+                  d      r&|jK                  |       |jK                  ||          C|j5                  |       U |}|s$| jM                  |j+                  dd      d       .| j                  |j+                  dd      d       | jO                  t        |      dd|D cg c]  }|d   	 c}z         |D ]  }|\  }}}}|jQ                         D ]  \  }}|dvs|j+                  |d       }|'|d k(  r|}|d!k(  rt        |j+                  d"i             }t!        |t        t"        t(        f      r| jS                  ||       t| jO                  ||        |j+                  d#d       }|	 tT        jT                  jW                  |d$      }tY        jZ                  |j]                               }||j^                  d&z  z  }| jO                  ||d'|tY        j`                  d$tY        jb                  |            |tY        j`                  d$tY        jb                  |            ||z
  fz         |jK                  |       |jK                  ||           % I |t        |      k  r| jl                  jQ                         D ]M  \  }}|\  }}|jC                         }to        |      D ]%  \  }!}"| j                  |!|v xs |"|v d*||!|"fz         ' O y # t6        $ r$}t7        d||j9                         |	fz        d }~ww xY wc c}w # t6        $ r$ tT        jT                  jW                  |d%      }Y w xY w# td        $ r}dd l3} te        d(|||j9                         |	|
||dk7  r||   nd d)j	                  | ji                  |      jk                               d)j	                  | ji                        jk                               f	z        d }~ww xY w)+Nlogsz,No sample log file available for '%s' filterr   r	   zUTF-8T)doOpenFz4^#+ ?(failJSON|(?:file|filter)Options|addFILE):(.+)$r   fileOptionsfilterOptionsztest.conditionztest.filter-name rd   addFILEz	%s: %s:%i#z

constraintlogtypejournalztest.prefix-linenofailmatchz!Line not matched when should havez Line matched when shouldn't havezMultiple regexs matched %r)timery   descrt   hostattemptsmatchesrz   z%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)8r#   ospathisfilejoinTEST_FILES_DIRr5   r$   r   waitForLineEndrery   jsonloadsgroupr   
isinstancelistr@   updater   r;   evalre   rQ   r\   append
ValueErrorgetFileNamenextr'   striprstriprO   processLineTEST_NOW_STRr   addr.   rC   rc   assertSortedEqualdatetimestrptimerz   mktime	timetuplemicrosecondstrftimegmtimerP   pprintpformat
splitlinesr   	enumerate)%r   	filenamesregexsUsedRe
commonOptsfaildataifilenamelogFileignoreBlocklnnumlinejsonREMatchrU   fltOptsrS   rV   eregexsUsedIdxrZ   	failregexrI   retfoundfidfail2banTimexr`   ra   fvtjsonTimeLocaljsonTimer   failRegexIndex	failRegexr2   rT   s%                                      r   
testFilterz+testSampleRegexsFactory.<locals>.testFilter   sw   //77>>"'',,~vt<=1D8: f), *(!	C	Nl8AFA277<<t%7 "7;5 L7t	QJE((QSWXK%*K--a01h			1		.z			1		0t{$.x$>XJ 88!	X	
4./88$%)9 :;;&&t,88./73w<'>wWE				!	!7C"6	7#8$ 			1		*! 
+ MT	,DJJLXH WGT7>S"C,-T;;vD"// S7d\"40F+GS-!!#YYL7d	)			)__T"s
((%
&xx*+d2__b,5x@s	u 3-0*	3d;$((8,			9	%			)I.	/	S sWe4+- oohll7E2)+
s3x#c':!':;=  ".#,/)y#|T>># !41a;;hhq$J&[2*_DHHY+,2rCt,-

 
 Q
'
			"a	 !  <<%q
-	O!**33A7JK ;;}6689M--	99x	E
&94;;|;TU	4==!4dkk(6KL		 
"
"	$ #	),-E".SS7sL7 	
C	Np mm))+ ,lgs3!9$-i$8 , ~yOO}$A	\(A'	*+,,,Q  *{	7 %() * **r (;2  	O!**33A7MN	O  7  G'')5ib9-d		&..*5578		&..&1134	#66 7 77s   $:ZB)Z	A-Z8%Z"C,[+=[+Z60[+
B[+ Z;<C	[+	Z3Z..Z36[+;)[(	$[+'[(	([++	^4B]??^ )rT   r2   r   s   `` r   testSampleRegexsFactoryr      s    l,\ 	r   c                 L    | j                  d       xr | j                  d      S )Nzcommon.conf.conf)endswithr   s    r   <lambda>r   @  s     AJJ}55M!**W:M r   c                 J    | j                  d      xr | j                  d      S )Nzzzz-r   )r'   r   r   s    r   r   r   A  s    Q\\&1Iajj6I r   zfilter.d.ztestSampleRegexs%s)0__copyright____license__r   r%   r   r   r   sysrz   rA   server.failregexr   server.filterr   r   client.filterreaderr   utilsr
   r   r   r   utcfromtimestamp	isoformatr   r   r   dirname__file__TEST_CONFIG_DIRr   _resolveHostTagr-   compileescaper+   TestCaser   r   basedir_filter_filterlistdir
rpartition
filterNamer'   setattrupperr   r   r   <module>r      s  , 5    	 	 
   $ 1 . D D   11(;EEG'',,rwwx8(Cbggooh7A  %


)4yryy7IILeef[N** [Nzod MNIJ 3Hg w

277<<*568 3W!!#&q)*			s	#
:++--J13	3	3r   