
    ogf4                        d Z dZdZddlZddlZddlZddlmZ  ej                  d      Z	 ej                  d      Z
d	ej                  d
dej                  d
dddddgZdZdZdZdZdZdZdZdee   dee   dee<   dee   dee   d
ee<   dee   dee   dee   dee<   ee   ee   ee   ee   ee   ee   ee   ee   ee   ee   ee   ee   dddZdddZ	  ej.                  d d!        ej                  d"      d#fZd% Zd&Zd'ZeefZ ej                  d(dj;                  e      z   d)z         Z G d* d+      Z G d, d-e       Z!d.Z"e"d/z   Z# G d0 d1e      Z$y#  d$ZY `xY w)2zCyril Jaquierz Copyright (c) 2004 Cyril JaquierGPL    N   )IPAddrz</?[\w\-]+/?>z^(/?)F-([A-Z0-9_\-]+)$z(?:::f{4,6}:)?(?P<ip4>)z(?P<ip6>z(?P<dns>[\w\-.^_]*\w) z(?P<cidr>\d+)               z\[?(?:|z)\]?z(?:z)(?:/z)?\]?z(?P<fid>\S+)z(?P<fport>\w+))IP4zF-IP4/IP6zF-IP6/ADDRzF-ADDR/CIDRzF-CIDR/SUBNETz	F-SUBNET/DNSzF-DNS/zF-ID/zF-PORT/fidfport)idportz^re(?i:val)$reVALz(?<!\\)\((?:\?:)?(\(\?[a-z]+)\)z\1: c                 N    | j                         } t        j                  | |       S N)lowerR_MAPget)tags    ;/usr/lib/python3/dist-packages/fail2ban/server/failregex.py
mapTag2Optr!   e   s    
yy{		#s    alt_tuple_z^(z)(.*?)(?:_\d+)?$c                       e Zd ZddZd Zedd       Zd Zed        ZddZ	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zy)Regexc                    d | _         t        j                  |fi |}|j                         dk(  rt	        d      t
        r t
        d   j                  t
        d   |      }	 t        j                  ||rt        j                  nd      | _
        || _        g | _        g | _        | j                  j                  D cg c]#  }t        |      t        t         d         kD  s"|% c}D ]  }t"        j%                  |      }|s|j'                  d      t)        |j'                  d            }}|t*        k(  r| j                  j-                  ||f       m| j                  j-                  ||f        | j                  j/                          | j                  j/                          t        | j                        r| j                  nd | _        t        | j                        r| j                  nd | _        | j                  s| j                  r| j4                  | _        y | j6                  | _        y c c}w # t0        j2                  $ r}t	        d|d|      d }~ww xY w)Nr   zCannot add empty regexr   r   r   z&Unable to compile regular expression 'z':
)_matchCacher&   _resolveHostTaglstripRegexExceptionR_GLOB2LOCFLAGSsubrecompile	MULTILINE	_regexObj_regex
_altValues_tupleValues
groupindexlenCOMPLNAME_PRECOMPLNAME_CREmatchgroupr!   ALTNAME_PREappendsortsre_constantserror_getGroupsWithAlt
_getGroups	getGroups)selfregex	multilinekwargsknges           r    __init__zRegex.__init__   s   $ 


0
0%
\\^r	0	111!!/!"4e<5JJuibllQG4>4;4?411T1SVc-PQBR>S5SQT &qAAGGAJ
1771:.Q	[
ooaU#
!u%& ??(+DOO(<T__$4?,/0A0A,Bt((4
 /3ooARAR4))$.Y]YhYh$.! U 
		 	
 
 s8   #AH9 =#H4!H4%H9 C5H9 4H9 9I"II"c                 N    | j                   j                  d| j                  dS )N(r   )	__class____name__r2   rC   s    r    __str__zRegex.__str__   s    ^^,,dkk	::r"   c                 ^    t               ddifd}t        j                  ||       S )Nnlr   c                    | j                         }|dd }|dk(  rt        dvrt           S t           S |dk(  rd   }|dz   d<   d|fz  S 	 t        |   S # t
        $ r Y nw xY wt        j                  |      } | rD| j                         } | d   }| d   rj                  |      ry	|S d|<   t        |      }d
|dS |S )Nr   HOST)no	SKIPLINESrS   z!\n(?P<skiplines%i>(?:(?:.*\n)*?))r   r   z(?P<>)r:   R_HOSTRI_HOSTRI_ADDRRH4TAGKeyErrorFCUSTNAME_CREr9   groupsr   r!   )mr   tnrS   openTagspropsuseDnss       r    substTagz'Regex._resolveHostTag.<locals>.substTag   s    	
3Ab	2FlV72'@@@@K	tBq&E$K/2%77	":
 		
 21	
A	
1BtRZHRL	BB :s   A 	A#"A#)dictFTAG_CREr-   )rD   re   rf   rc   rd   s    ` @@r    r)   zRegex._resolveHostTag   s1     V(%$N 
h	&&r"   c                     | j                   S r   )r2   rP   s    r    getRegexzRegex.getRegex   s    	r"   c                 z    dj                  | D cg c]  }dj                  |d d d          c}      dz   S c c}w )N
r   r   )join)
tupleLinesvs     r    _tupleLinesBufzRegex._tupleLinesBuf   s4    	Z8BGGAccFO8	9D	@@8s   8Nc                    |}t        |t              st        j                  |      }| j                  j                  |      | _        | j                  r||}t        |      dk  r|| _        g | _	        y 	 | j                  j                  j                  dd| j                  j                         dz         dz   }	 | j                  j                  j                  d| j                  j                         dz
        dz   }| j                  j                  j!                  dd|      }| j                  j                  j!                  dd|      }||| | _        |d | | _	        d}| j#                         D ]z  }	t%        | j                  |d        D ]]  \  }
}dj'                  |d d d         |	k(  s!| j                  j)                  | j                  j+                  ||
z                ||
z  } z | | j                  j-                  ||d         y y # t        $ r d}Y dw xY w# t        $ r# t        | j                  j                        }Y Nw xY w)Nr   rl   r   r   r   )
isinstancestrr&   rp   r1   searchr(   r6   _matchedTupleLines_unmatchedTupleLinesstringrindexstart
ValueErrorindexendcountgetSkippedLines	enumeraterm   r<   popextend)rC   rn   orgLinesbufmatchLineStartmatchLineEnd
lineCount1
lineCount2rH   skippedLinera   matchedTupleLines               r    rt   zRegex.search   sL   #	J	$			j	)3^^**3/$	:	(mq&D "D&&--44
At%%'*-/01^
1$$++11
D  "Q&(*+,\
 !!((..	1nJ!!((..	1lJ&z*=D (* 5D	A++-  )
ab!!# 		!#A#&	';	6  ''##AaC(*Avq 	$$Xjk%:;G   ^  1((//0\1s&   7AH =AH$ H! H!$(IIc                     | j                   ryy)NTF)r(   rP   s    r    
hasMatchedzRegex.hasMatched$  s    	

r"   c                 6    | j                   j                         S r   )r(   	groupdictrP   s    r    rA   zRegex._getGroups.  s    				#	#	%%r"   c                    | j                   j                         }| j                  r?| j                  D ]0  \  }}|j                  |      }|s|j                  |      r,|||<   2 | j                  rV| j                  D ]G  \  }}|j                  |      }|j                  |      }t        |t              r||fz  }n||f}|||<   I |S r   )r(   r   r3   r   r4   rr   tuple)rC   failrG   rH   ro   ts         r    r@   zRegex._getGroupsWithAlt1  s    				#	#	%$ 
__oo sqA!T!W
 
 sqAA!U1$YQ
AQDG 
+r"   c                      y r   r   rP   s    r    rB   zRegex.getGroupsF  s    r"   c                 .   | j                   sg S d}d}	 	 | j                   j                  d|z        !|| j                   j                  d|z        z  }|dz  }F# t        $ r Y n!t        $ r dt        j
                  vr Y nw xY w|j                  d      S )Nr   r   zskiplines%ir   PyPyF)r(   r:   
IndexErrorr^   sysversion
splitlines)rC   skippedLinesrH   s      r    r~   zRegex.getSkippedLinesO  s    			
9,!

ma/0<T%%++MA,=>>\FA	 	
  
	
 
S[[ 
	
 
	 	 	''s   AA 	B%BBc                 >    | j                         sg S | j                  S r   )r   rv   rP   s    r    getUnmatchedTupleLineszRegex.getUnmatchedTupleLinesh  s    		
9

#
##r"   c                     | j                         sg S | j                  D cg c]  }dj                  |       c}S c c}w Nr   )r   rv   rm   rC   lines     r    getUnmatchedLineszRegex.getUnmatchedLinesn  s3    		
9%)%>%>
?T2774=
??
?   <c                 >    | j                         sg S | j                  S r   )r   ru   rP   s    r    getMatchedTupleLineszRegex.getMatchedTupleLines{  s    		
9

!
!!r"   c                     | j                         sg S | j                  D cg c]  }dj                  |       c}S c c}w r   )r   ru   rm   r   s     r    getMatchedLineszRegex.getMatchedLines  s3    		
9%)%<%<
=T2774=
==
=r   )F)yesr   )rO   
__module____qualname__rK   rQ   staticmethodr)   rj   rp   rt   r   rA   r@   rB   r~   r   r   r   r   r   r"   r    r&   r&   y   sr     iD; .' .'l A A(<\&*(2$@">r"   r&   c                       e Zd Zy)r+   N)rO   r   r   r   r"   r    r+   r+     s    r"   r+   )r   ip4ip6dns)mlfidc                   *    e Zd ZddZefdZd Zd Zy)	FailRegexNc                 0   t        j                  | |fi | t        D cg c]  }|| j                  j                  v s| c}sH|-t        D cg c]  }||j                  j                  v s| c}st        d| j                  z        y y c c}w c c}w )NzNo failure-id group in '%s')r&   rK   FAILURE_ID_PRESENTSr1   r5   r+   r2   )rC   rD   	prefRegexrF   grps        r    rK   zFailRegex.__init__  s    ..u''-
R38Q8Q1Q3
R+Usi6I6I6T6T/TU	5C	DD 	V S
RUs   BBB-Bc                    d }|D ]"  }	 | j                   j                  |      }|" n |>| j                   j                  }| j                   j
                  }t        d|d|d      t        |      S # t        t        f$ r Y w xY w)NzNo group found in 'z	' using '')r(   r:   r   r^   rw   r.   r+   rs   )rC   r`   r   r   srs         r    	getFailIDzFailRegex.getFailID  s    # 
c



 
 
%C 
o	
 	[11	q!D	EE	S/ x
  s   A55BBc                 $    | j                  d      S )N)r   r   r   )r   rP   s    r    getHostzFailRegex.getHost  s    	-	..r"   c                     | j                         }t        | j                  d      t        |j	                  d      xs t        j
                              S )N)r   r   cidr)rB   r   r   intr   CIDR_UNSPEC)rC   r   s     r    getIPzFailRegex.getIP  s=    		$	~.DHHV4D4ZHZHZ0[	\\r"   r   )rO   r   r   rK   FAILURE_ID_GROPSr   r   r   r   r"   r    r   r     s    E  - ,/]r"   r   )%
__author____copyright____license__r.   r>   r   ipdnsr   r/   rh   r_   IP_4_REIP_6_RErZ   RI_IPV4RI_IPV6RI_DNSr\   r[   RI_CIDR	RI_SUBNETr]   r   rt   r,   r!   r;   TUPNAME_PREr7   rm   r8   r&   	Exceptionr+   r   r   r   r   r"   r    <module>r      s  ( 
2 	  
  2::&'

45 '-nn6(
  
	)/&/Kw#)'?F6NDw28/6'?TZ[bTcey  /7O
/7O '?7O'?7O9I
.6N"-
6 		
>7#RZZ BCVM k*

5388M#::=PPQL> L>dY  0  '3 4] 4]{	s   ''E( (E.