
    ogfC                         d Z dZdZddlZddlZddlZddlmZ ddlm	Z	  e	e
      Zd	 Zdd
Z G d d      Z G d de      Z edd      e_        y)zJFail2Ban Developers, Alexander Koeppe, Serg G. Brester, Yaroslav Halchenkoz+Copyright (c) 2004-2016 Fail2ban DevelopersGPL    N   )Utils   )	getLoggerc                 <    t        | t              r| S t        |       S )z8A little helper to guarantee ip being an IPAddr instance
isinstanceIPAddr)ips    7/usr/lib/python3/dist-packages/fail2ban/server/ipdns.pyasipr   '   s    r6	)r
    c           	      d   	 | xs t        j                         } d t        j                  | ddt         j                  dt         j                        D        }|r*| dz   }d}|D ]  }|j                  |      r|c S |r|} |S 	 t        j                  |       S # t         j                  $ r Y *w xY w)zGet fully-qualified hostname of given host, thereby resolve of an external
	IPs and name will be preferred before the local domain (or a loopback), see gh-2438
	c              3   0   K   | ]  }|d    r|d      yw)   N ).0ais     r   	<genexpr>zgetfqdn.<locals>.<genexpr>3   s#      
1 a5s   Nr   .)socketgethostnamegetaddrinfo
SOCK_DGRAMAI_CANONNAME
startswitherrorgetfqdn)namenamespreffirstr   s        r   r   r   -   s    		%##%$%%$6$$a)<)<%
 
s(45 r	}}TY"%
 <  	t 	 s   A7B :B =B B/.B/c                       e Zd Z ej                  dd      Z ej                  dd      Zed        Zed        Z	ed        Z
edd       ZdZed	        Zd
Zed        ZdZed        ZdZed        Zy)DNSUtilsi  ,  maxCountmaxTimec                    t         j                  j                  |       }||S t               }d}t        j
                  t        j                  ft        j                  t        j                  ffD ]  \  }}	 t	        j                  | d|dt        j                        D ]X  }t        |      dk  st        |d         s t        t        |d   d         |      }|j                  sH|j                  |       Z  |s|rt"        j%                  d| |       t         j                  j                  | |       |S # t         $ r}|}Y d}~d}~ww xY w)z_ Convert a DNS into an IP address using the Python socket module.
			Thanks to Kevin Drapel.
		Nr      z4Unable to find a corresponding IP address for %s: %s)r%   CACHE_nameToIpgetsetr   AF_INETr   FAM_IPv4AF_INET6FAM_IPv6r   IPPROTO_TCPlenstrisValidadd	ExceptionlogSyswarning)dnsipssaveerrfamipfamresultr   es           r   dnsToIpzDNSUtils.dnsToIpS   s    	##C(#_
:#'nnfoo6&//8Z[ jc5
$$S$Q8J8JK Fas6!9~x VAYq\"E
*R


	ggbk 
	>>H#wW
c3'	*  Gs   7A.D8&D88	EEEc                 8   t         j                  j                  | d      }|dk7  r|S 	 t        j                  |       d   }t         j                  j                  | |       |S # t        j
                  $ r#}t        j                  d| |       d }Y d }~Sd }~ww xY w)Nr   r   z'Unable to find a name for the IP %s: %s)	r%   CACHE_ipToNamer-   r   gethostbyaddrr   r9   debugr.   )r   vrA   s      r   ipToNamezDNSUtils.ipToNameq   s     !!"b)!"W
8B"1 b!$	
(	 
 	<<92qA1s   A# #B6BBc                 ,   t               }t        j                  |       }|(t        |      }|j                  r|j	                  |       |dv rF|sDt
        j                  |       }|j                  |       |r|dk(  rt        j                  d| |       |S )z/ Return the IP of DNS found in a given text.
		)yeswarnrK   z'Determined IP using DNS Lookup: %s = %s)
r.   r   searchIPr6   r7   r%   rB   updater9   r:   )textuseDnsipListplainIPr   s        r   textToIpzDNSUtils.textToIp   s     5&OOD!'w2jj
JJrN v2	==Vv
NN<	6 
-r   c                 f   dd| f}t         j                  j                  |      }|>d}| rt        t        j
                  fnt        j
                  t        fD ]  }	  |       } n t         j                  j                  ||       |S # t        $ r }t        j                  d|       Y d}~Td}~ww xY w)z;Get short hostname or fully-qualified hostname of host selfselfhostnameN z#Retrieving own hostnames failed: %s)
r%   rD   r-   r   r   r   r8   r9   r:   r.   )fqdnkeyr    rU   rA   s        r   getHostnamezDNSUtils.getHostname   s     

D!#		 	 	$	$S	)$	\
4%)Wf  !0B0BG/L>x>JT
> c4(	+	  >^^91==>s   B	B0B++B0)rT   r;   c                  B   t         j                  j                  t         j                        } | At	        dt         j                  d      t         j                  d      g      t	        dg      z
  } t         j                  j	                  t         j                  |        | S )zGet own host names of self	localhostFTrV   )r%   rD   r-   _getSelfNames_keyr.   rY   )r!   s    r   getSelfNameszDNSUtils.getSelfNames   s     
!
!
%
%h&@&@
A%
]%%e,h.B.B4.H RD	5 h88%@	,r   )rT   r<   c                     t         j                  j                  t         j                        } | Ft	               } t         j                         D ]%  }	 | t	        t         j                  |d            z  } ' t         j                  j	                  t         j                  |        | S # t        $ r!}t        j                  d||       Y d}~}d}~ww xY w)zGet own IP addresses of selfNrJ   z#Retrieving own IPs of %s failed: %s)
r%   r,   r-   _getSelfIPs_keyr.   r]   rR   r8   r9   r:   )r<   rU   rA   s      r   
getSelfIPszDNSUtils.getSelfIPs   s     	##H$<$<=#[	3((* HxHC!!(E233SH h66<	*	  H^^98QGGHs   "B&&	C/CCNc                 p    | t         _        t        j                  d| | rd       | S d       | S d       | S )Nz
IPv6 is %sonoffauto)r%   _IPv6IsAllowedr9   rF   )values    r   setIPv6IsAllowedzDNSUtils.setIPv6IsAllowed   s@    !(,,|5;LedY	, 27Y	, SYY	,r   )rT   zipv6-allowedc                  L   t         j                  t         j                  S t         j                  j                  t         j                        } | | S t        d t         j                         D              } t         j                  j                  t         j                  |        | S )Nc              3   8   K   | ]  }d |j                   v   yw):N)ntoa)r   r   s     r   r   z)DNSUtils.IPv6IsAllowed.<locals>.<genexpr>   s     	;r3"''>	;s   )r%   re   r,   r-   _IPv6IsAllowed_keyanyr`   r.   )rG   s    r   IPv6IsAllowedzDNSUtils.IPv6IsAllowed   sz    (

!
!!!!("="=>!]
8		;X%8%8%:	;;!
h991=	
(r   )T)__name__
__module____qualname__r   Cacher,   rD   staticmethodrB   rH   rR   rY   r\   r]   r_   r`   re   rg   rl   rn   r   r   r   r%   r%   M   s     %++tT:%++tT: :    ,  * $  "     . r   r%   c                   f    e Zd ZdZdZdZ ej                  deded      ZdZ	dZ
 ej                  d	d
      ZdZdZeej"                  z
  Zeej&                  z
  Zef fd	Zed        ZefdZd Zd Zd Zed        Zed        Zej"                  dej&                  diZed        Z ed        Z!ed        Z"ed        Z#ed        Z$d Z%d Z&d Z'd  Z(d! Z)d" Z*ed#        Z+ed$        Z,d/d%Z-d& Z.ed'        Z/ed(        Z0d) Z1d* Z2d+ Z3 e3       Z4ed,        Z5ed-        Z6ed.        Z7 xZ8S )0r   z7Encapsulate functionality for IPv4 and IPv6 addresses
	z(?:\d{1,3}\.){3}\d{1,3}z;(?:[0-9a-fA-F]{1,4}::?|::){1,7}(?:[0-9a-fA-F]{1,4}|(?<=:):)z^(?:(?P<IPv4>z)|\[?(?P<IPv6>z)\]?)$N)_family_addr_plen	_maskplen_rawi'  r&   r'   c                    |t         j                  k(  r&t        |t        t        f      rt         j
                  }|t         j
                  k(  r't        t         |   |       }|j                  ||       |S ||f}t         j                  j                  |      }||S |t         j                  k(  rRt         j                  |      \  }}||f}|t         j                  k7  r#t         j                  j                  |      }||S t        t         |   |       }|j                  ||       |j                  t         j
                  k7  r t         j                  j                  ||       |S N)r   CIDR_UNSPECr
   tuplelistCIDR_RAWsuper__new___IPAddr__init	CACHE_OBJr-   _IPAddr__wrap_ipstrru   r.   )clsipstrcidrr   args	__class__s        r   r   zIPAddr.__new__  s#   	VJuudm$D
//4	V__fc"3'299UD
9
$D!"^
9	V$$U+;5$$-4
f   					d	#B	~YVS!#&"))E4ZZ6??"	b!	)r   c                 J   t        |       dkD  r| d   dk(  r| d   dk(  r| dd } d| vr| t        j                  fS | j                  dd      }t        |      dkD  rt	        d| d	      d
|d   v sd|d   v rt        j                  |d         |d<   t        |d         |d<   |S )Nr   r   [r{   ]r   /zinvalid ipstr z, too many plen representationr   rj   )r4   r   r~   split
ValueError
masktoplenint)r   ss     r   __wrap_ipstrzIPAddr.__wrap_ipstr  s     	Z!^aCE"I,<2;5
##
##kk#q!VaZ	O	PPAaD[C1Q4K


AaD
!1Q4	QqT!A$	
(r   c                    t         j                  | _        d| _        d| _        d| _        || _        |t        j                  k7  r|(|t        j                  k  rt        j                  |z
  g}n t         j                  t         j                  g}|D ]!  }	 t        j                  ||      }|| _         n | j                  t         j                  k(  rNt        j                  d      \  | _        d| _        ||dk\  rd|z	   }| xj                  |z  c_        || _        y| j                  t         j                  k(  rt        j                  d      \  }}|dz  |z  | _        d| _        |(|dk\  r#d	|z	   }| xj                  |z  c_        || _        y| j                  t        j                         r'|dz  | _        t         j                  | _        d| _        yyyyyt        j                  | _        y# t         j                  $ r Y yw xY w)
zP initialize IP object by converting IP address string
			to binary to integer
		r   N!L        !QQ@      	    )r   	AF_UNSPECru   rv   rw   rx   ry   r   r   r/   r1   	inet_ptonr   structunpackisInNetIP6_4COMPAT)rT   r   r   familybinarymaskhilos           r   __initzIPAddr.__init0  s    !!$,$*$*$.$)	V__
4&//1oo$%Fnnfoo.F vvu-VT\
	 llfnn$--f-KDJDJ DAID !T	ZZ4ZTZ']]5&)FB(bDJDJ DAI0D89T	ZZ4ZTZ 
f((	)z/TZNNT\TZ 
* 	( &. //4<A << s   G55HHc                 ,    t        | j                        S r}   )reprrk   rT   s    r   __repr__zIPAddr.__repr__g  s    	diir   c                 x    t        | j                  t              r| j                  S t        | j                        S r}   )r
   rk   r5   r   s    r   __str__zIPAddr.__str__j  s&     C0Dc$))nDr   c                 (    t         | j                  ffS )zIPAddr pickle-handler, that simply wraps IPAddr to the str

		Returns a string as instance to be pickled, because fail2ban-client can't
		unserialize IPAddr objects
		)r5   rk   r   s    r   
__reduce__zIPAddr.__reduce__m  s     		|	r   c                     | j                   S r}   )rv   r   s    r   addrzIPAddr.addru      	r   c                     | j                   S r}   )ru   r   s    r   r   zIPAddr.familyy  s    	r   inet4inet6c                 T    t         j                  j                  | j                        S r}   )r   FAM2STRr-   ru   r   s    r   	familyStrzIPAddr.familyStr~  s    			DLL	))r   c                     | j                   S r}   )rw   r   s    r   plenzIPAddr.plen  r   r   c                     | j                   S )zlThe raw address

		Should only be set to a non-empty string if prior address
		conversion wasn't possible
		)ry   r   s    r   rawz
IPAddr.raw  s     
r   c                 <    | j                   t        j                  k7  S )z6Either the object corresponds to a valid IP address
		)ru   r   r   r   s    r   r6   zIPAddr.isValid  s     
))	))r   c                     | j                   t        j                  dt        j                  dij	                  | j
                  d      k(  S )zIReturns whether the object is a single IP address (not DNS and subnet)
		r   r   i)rw   r   r/   r1   r-   ru   r   s    r   isSinglezIPAddr.isSingle  s6     
FOOSAEEdllTYZ	ZZr   c                    | j                   t        j                  k(  rt        |t              s| j                  |k(  S t        |t              s|yt        |      }| j                   |j                   k7  ry| j                   t
        j                  k(  r| j                  |j                  k(  S | j                  |j                  k(  xr | j                  |j                  k(  S NF)	ru   r   r   r
   ry   r   r   rv   rw   rT   others     r   __eq__zIPAddr.__eq__  s    	\\V__$Zv-F
))u
	E6	"mE%=5	\\U]]"5	\\V%%%
))uzz
!!JJ%++ JJ%++r   c                     | |k(   S r}   r   r   s     r   __ne__zIPAddr.__ne__  s    em	r   c                    | j                   t        j                  k(  rt        |t              s| j                  |k  S t        |t              s|yt        |      }| j                   |j                   k  xs | j
                  |j
                  k  S r   )ru   r   r   r
   ry   rv   r   s     r   __lt__zIPAddr.__lt__  si    	\\V__$Zv-F
))e
	E6	"mE%=5		%	Aekk)AAr   c                 D    t        |t              st        |      }| |S r}   r	   r   s     r   __add__zIPAddr.__add__  s     	E6	"%=5	r   c                 D    t        |t              st        |      }|| S r}   r	   r   s     r   __radd__zIPAddr.__radd__  s     	E6	"%=5$	r   c                 ,    t        | j                        S r}   )hashrk   r   s    r   __hash__zIPAddr.__hash__  s    	diir   c                     | j                   t        j                  k(  rd| j                  z  S | j                   t        j                  k(  rd| j                  z  S y)z<Hex representation of the IP address (for debug purposes)
		z%08xz%032xrV   )ru   r   r/   rv   r1   r   s    r   hexdumpzIPAddr.hexdump  sE     
\\V^^#
4::
||v&
DJJ

r   c                    d}| j                   rKt        j                  d| j                        }| j                  r| j                  dk  rd| j                  z  }nx| j
                  r`| j                  dz	  }| j                  dz  }t        j                  d||      }| j                  r+| j                  dk  rd| j                  z  }n| j                  S t        j                  | j                  |      |z   S )	zi represent IP object as text like the deprecated
			C pendant inet.ntoa but address family independent
		rV   r   r   z/%dr   l    r   r   )
isIPv4r   packrv   rw   isIPv6ry   r   	inet_ntopru   )rT   r7   r   r   r   s        r   rk   zIPAddr.ntoa  s    
 	#	[[KKdjj)6
jjTZZ"_
$**
C{{

b2

''2KKr2&6
jjTZZ#%
$**
C
))			$,,	/#	55r   c                     | j                   r | j                  j                  d      }|!d}n| j                  r| j                  }|d}nydj                  t        |            d|S )a   return the DNS PTR string of the provided IP address object

			If "suffix" is provided it will be appended as the second and top
			level reverse domain.
			If omitted it is implicitly set to the second and top level reverse
			domain of the according IP address family
		r   zin-addr.arpa.z	ip6.arpa.rV   )r   rk   r   r   r   joinreversed)rT   suffixexploded_ips      r   getPTRzIPAddr.getPTR  s]     
[[%;nF{{;nF
HHXk23V	<<r   c                 @    t         j                  | j                        S )z?Return the host name (DNS) of the provided IP address object
		)r%   rH   rk   r   s    r   getHostzIPAddr.getHost  s     
		499	%%r   c                 <    | j                   t        j                  k(  S )z4Either the IP object is of address family AF_INET
		)r   r   r/   r   s    r   r   zIPAddr.isIPv4   s     
	&&r   c                 <    | j                   t        j                  k(  S )z5Either the IP object is of address family AF_INET6
		)r   r   r1   r   s    r   r   zIPAddr.isIPv6  s     
	''r   c                 \   |j                   s0|j                  dk7  r!| t        j                  |j                        v S | j                  |j                  k7  ry| j
                  rd|j                  z	   }n| j                  rd|j                  z	   }ny| j                  |z  |j                  k(  S )z9Return either the IP object is in the provided network
		rV   Fr   r   )	r6   r   r%   rB   r   r   r   r   r   )rT   netr   s      r   r   zIPAddr.isInNet  s     
B
(""377+
++	[[CJJ
	[[#(("
#4{{.#((:
;4

))d
sxx	''r   c                 V    t        |t              xr || k(  xs |j                  |       S )z;Return whether the object (as network) contains given IP
		)r
   r   r   )rT   r   s     r   containszIPAddr.contains  s(     
B		DR4Z%C2::d3CDr   c                      ddz  dz
  } d}| d|dddi}d}t        dd      D ]%  }|d|z  z  }|dk  rd|z
  |||z  <   d|z
  ||| z  <   ' |S )Nr   r   r   r   r         )range)m6m4mmapmis        r   __getMaskMapzIPAddr.__getMaskMap%  s}    	S!|""
c2r1a	 $!C= aQ;1"f6DRL'4B<	
 
+r   c                     d}| j                   | j                   S t        j                  j                  | j                        }|t        dt        |       d      || _         |S )Nr   zinvalid mask z, no plen representation)rx   r   MAP_ADDR2MASKPLENr-   rv   r   r5   )rT   mplens     r   maskplenzIPAddr.maskplen3  sX    
%	^^
..

"
"
&
&tzz
2%
]	TL	MM$.	,r   c                 ,    t        |       j                  S )zIConvert mask string to prefix length

		To be used only for IPv4 masks
		)r   r   )r   s    r   r   zIPAddr.masktoplen>  s     
		r   c                     t         j                  j                  |       }|sy|j                  d      }|dk7  r|S |j                  d      S )zBSearch if text is an IP address, and return it if so, else None
		NIPv4rV   IPv6)r   
IP_4_6_CREmatchgroup)rN   r   r   s      r   rL   zIPAddr.searchIPF  sI     


!
!$
'%	

++f
%
b[
<	V	r   r}   )9ro   rp   rq   __doc__IP_4_REIP_6_RErecompiler   r   	__slots__r   rr   r   r   r~   r   r/   r0   r1   r2   r   rs   r   r   r   r   r   propertyr   r   r   r   r   r   r6   r   r   r   r   r   r   r   r   rk   r   r   r   r   r   r   _IPAddr__getMaskMapr   r   r   rL   __classcell__)r   s   @r   r   r      s    *Mbjj3:GDF  : U[[%6v~~%v&) 6  " * 5"nE     NNGV__g>
* *     * *
 [ [
B 
 

   6 6,=*&
 ' '
 ( (
(&E
 "^
    	 	r   r   z
::ffff:0:0`   )rV   )
__author____copyright____license__r   r   r   utilsr   helpersr   ro   r9   r   r   r%   objectr   r   r   r   r   <module>r     sj   ( Z
=   	   
8	@X X@cV cN L"- r   