
    ogfZ                         d 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m	Z	 ddl
mZmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ  G d de      Z G d de      Z G d de      Zy)zSerg G. Brester (sebres)z"Copyright (c) 2014 Serg G. BresterGPL    N   )MyTime)
FailTicket	BanTicket)FailManager)	ObserversObserverThread)Utils   )LogCaptureTestCase)	DummyJail)getFail2BanDb
Fail2BanDbc                   B     e Zd Z fdZ fdZd ZddZd Zd Z xZ	S )BanTimeIncrc                     t         t        |           t               | _        | j
                  | j                  _        t               | _        yCall before every test case.N)superr   setUpr   _BanTimeIncr__jailcalcBanTimer
   Observerself	__class__s    A/usr/lib/python3/dist-packages/fail2ban/tests/observertestcase.pyr   zBanTimeIncr.setUp.   s5    T "$+ ,,$++ "$-    c                 *    t         t        |           y N)r   r   tearDownr   s    r   r"   zBanTimeIncr.tearDown5   s    T#%r   c                 P    | j                   j                  | j                  ||      S r!   )r   r   r   )r   banTimebanCounts      r   r   zBanTimeIncr.calcBanTime8   s    		"	"4;;	BBr   c                    | j                   }|j                  dd       | j                  |j                  d      d       |j                  dd       | j                  |j                  d      d       |j                  dd        |j                  dd        |j                  d	|       | j                  t	        d
d      D cg c]  }|j                  d|       c}g d       |j                  dd       g d}|7t        |j                  d            }|dk  r|d|d
z
   ||dz
     gd|z
  z  z   }| j                  t	        d
d      D cg c]  }|j                  d|       c}|       |j                  dd       |j                  dd       | j                  t	        d
d      D cg c]  }|j                  d|       c}g d       |j                  dd       | j                  t	        d
d      D cg c]  }t        |j                  d|             c}g d       |j                  dd        |j                  dd       | j                  t	        d
d      D cg c]  }|j                  d|       c}g d       |j                  dd       |j                  dd       | j                  dt	        d      D cg c]-  }dt	        d      D cg c]  }|j                  dd
       c}v / c}}v        |j                  dd        | j                  dt	        d      D cg c]-  }dt	        d      D cg c]  }|j                  dd
       c}v / c}}v        |j                  d	d        |j                  dd        |j                  dd       |j                  dd        y c c}w c c}w c c}w c c}w c c}w c c}w c c}}w c c}w c c}}w )N	incrementtrueTmaxtime1dQ rndtimefactormultipliersr      X  
  `	    %   K      , r+   r+   r+   30d)
r2   r3   r4   r5   r6   r7   r8   i X i  i `	  r   r   2)
r3   r4   r5   r6   r7   r8   r+   r+   r+   r+   z1.33)
i<  ix  i  i1  ic  i  r+   r+   r+   r+   12h
r2   r3   r4   r5   r6   r7     r>   r>   r>   24h5mF
   r2   )r   setBanTimeExtraassertEqualgetBanTimeExtraranger   lensplitint
assertTrueassertFalse)r   r.   aiarrmultcntcs          r   testDefaultzBanTimeIncr.testDefault;   sf   
kk!K(1$$[148It$1$$Y/:It$Hd#M;/#(B<0aAMM#q0E
 Iu%M#""3'(7l
a	
s719~."W*=
>C#(B<0aAMM#q0 It$Hc"#(B<0aAMM#q0F
 Hf%(-a51Cc15F Hd#Iu%#(B<0aAMM#q0E Iu%It$//rSATU2Y?ammC+??SS It$rSATU2Y?ammC+??SS M4(Hd#Iu%It$c 1 1 1 6 1 @S @SsN   N.N3+N89"N="OOO/O*O=OOOOc                     | j                  d       | j                  dj                  t        d      D cg c]  }t        d|z         c}             y c c}w )Nz1 2 4 8 16 32 64 128 256r:      r   )rP   joinrE   str)r   rL   s     r   testMultiplierszBanTimeIncr.testMultipliersz   sB    -.388b	:1SAY:;<:s   Ac                    | j                   }|j                  dd       |j                  dd        |j                  dd       |j                  dd       |j                  dd        | j                  t        d	d
      D cg c]  }t	        |j                  d|             c}g d       |j                  dd       | j                  t        d	d
      D cg c]  }t	        |j                  d|             c}g d       |j                  dd       |j                  dd       | j                  t        d	d
      D cg c]  }t	        |j                  d|             c}g d       |j                  dd       |j                  dd       | j                  t        d	d
      D cg c]  }t	        |j                  d|             c}g d       |j                  dd       |j                  dd       | j                  dt        d      D cg c]6  }dt        d      D cg c]  }t	        |j                  dd	             c}v 8 c}}v        |j                  dd        | j                  dt        d      D cg c]6  }dt        d      D cg c]  }t	        |j                  dd	             c}v 8 c}}v        |j                  dd        |j                  dd        |j                  dd        |j                  dd       |j                  dd        y c c}w c c}w c c}w c c}w c c}w c c}}w c c}w c c}}w )Nr)   r?   r,   formulazGban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)r-   z2.0 / 2.885385r.   r   r/   r0   r1   r9   )
r2   r3   r4   r5   r6   r7   r8   iX i i`	 1)
i^  iQ  i/  i  r+   r+   r+   r+   r+   r+   r<   r=   r@   FrA   r2   )r   rB   rC   rE   rH   r   rI   rJ   )r   rK   rL   rO   s       r   testFormulazBanTimeIncr.testFormula   s   
kk!Iu%It$IhiH./M4((-a51Cc15E
 Iu%(-a51Cc15H Iu%Hc"(-a51Cc15G H./Iu%(-a51Cc15E Iu%It$//eTViXT%)DQc!--Q/0DDXX It$eTViXT%)DQc!--Q/0DDXX Hd#M4(Hd#Iu%It$M 6 6 6 6 EX EXsH    "L""L' "L,)"L1L;&"L6L;M"M8M6L;Mr!   )
__name__
__module____qualname__r   r"   r   rP   rU   rY   __classcell__r   s   @r   r   r   ,   s#    #&C=%~=0%r   r   c                   <     e Zd Z fdZ fdZddZd Zd Z xZS )BanTimeIncrDBc                 z   t         t        |           t        t	        j
                  d      t        yt        j                  dd      \  }| _        t        | j                        | _
        t               | _        | j                  | j                  _        t               | _        | j                  t         _        y)r   NzEUnable to import fail2ban database module as sqlite is not available.z.db	fail2ban_)r   r`   r   r   unittestSkipTesttempfilemkstemp
dbFilenamer   dbr   jaildatabaser
   r   r	   Main)r   _r   s     r   r   zBanTimeIncrDB.setUp   s    t"$			
  	''{;!T_$//*$'k$)ww$)) "$-==).r   c                     t         y| j                  j                          dt        _        t        j                  | j                         t        t        | +          yzCall after every test case.N)r   r   stopr	   rk   osremoverg   r   r`   r"   r   s    r   r"   zBanTimeIncrDB.tearDown   s@    	--).))DOOt%'r   c                     | j                   }|)|j                  |j                  j                               }|j                  d        | j                  j                  |||      }|S r!   )ri   
getBanTimeactions
setBanTimer   incrBanTime)r   ticketr$   ri   incrTimes        r   rv   zBanTimeIncrDB.incrBanTime   sX    	$_t||66897D]]&&tWf=(	/r   c           
         t         y | j                  }| j                  j                  |       |j                  j                  d       |j                  dd       |j                  dd       d}t        t        j                               }t        ||g       }| j                  t        d      D cg c]  }| j                  |d       c}g d       |j                          | j                  j                  ||       | j                  | j                  j!                  ||d d	      D cg c]  \  }}}|||f c}}}d
|dfg       |j#                  |dz          | j                  | j                  |d      d       | j                  j                  ||       | j                  | j                  j!                  ||d d	      D cg c]  \  }}}|||f c}}}d|dz   dfg       | j                  | j                  j!                  |dd d      D cg c]  \  }}}|||f c}}}d|dz   dfg       | j                  | j                  j!                  |||      D cg c]  \  }}}|||f c}}}d|dz   dfg       | j                  | j                  j%                  d|d	      g        | j                  j%                  |d	      }	| j                  t'        |	      d|d|dz   d       | j                  j%                  |d	      }	| j                  t'        |	      d|d|dz   d       | j                  j%                  ||d	      }	| j                  t'        |	      d|d|dz   d       d}t        d      D ]^  }|j#                  ||z   dz          | j                  |d      }
| j                  |
|dz         | j                  j                  ||       |
}` |j#                  ||z   dz          | j                  |d      }
| j)                  |
|dz         | j                  |
|       | j                  j                  ||       |
}t        |dz   |dz
  g       }|j                  d       |j                          | j                  j                  ||       t        |dz   |dz
  g       }|j                  d        |j                          | j                  j                  ||       | j                  j%                  |d	      }	| j                  t+        |	      d       | j                  t'        |	d!         d|d||z   dz   d"|d#       | j                  t'        |	d
         d|dz   d|dz
  d"d d$       | j                  j%                  |d%z
  d	      }	| j                  t+        |	      d       | j                  t'        |	d         d|dz   d|dz
  d"dd$       | j-                  |	d
   j/                  |             | j-                  |	d
   j/                  |             | j1                  |	d   j/                  |             | j-                  |	d   j/                  |d%z
               t        |d&z   |d z
  g       }| j1                  |j/                  |d'             | j-                  |j/                  |d(             |j                  d(       | j-                  |j/                  |d'             | j-                  |j/                  |d(             |j                  d'       | j1                  |j/                  |d(             |j                  d(       |j                          | j                  j                  ||       | j                  j%                  |d	      }	| j                  t+        |	      d       | j                  t'        |	d         d|d&z   d|d z
  d"d(d$       | j                  j3                          | j                  j%                  |d	      }	| j                  t+        |	      d       |j                  d'       |j                          | j                  j                  ||       | j                  j3                          | j                  j%                  |d	      }	| j                  t+        |	      d       | j                  |	d!   j5                         |       d)| j                  _        | j                  j3                          | j                  j%                  |d	      }	| j                  t+        |	      d
       | j                  |	d!   j5                         |dz          d*| j                  _        | j                  j3                          | j                  j%                  |d	      }	| j                  |	g        t9        d+,      }d	|j:                  _        |j                  dd       | j                  |_        | j                  j                  |       t9        d-d+.      }d	|j:                  _        | j                  |_        | j                  j                  |       t        ||g       }|j                  d/       |j                          | j                  j                  ||       t        ||d/z
  g       }|j                  d0       |jA                  d
       |j                          | j                  j                  ||       | j                  j%                  ||d	      }	| j                  t+        |	      d
       | j                  t'        |	d!         d|d|d"d/d$       | j                  j%                  ||d	      }	| j                  t+        |	      d
       | j                  t'        |	d!         d|d|d/z
  d"d0d1       | j                  j!                  ||      D ]  }| j                  |d
|d/f        n | j                  j!                  ||      D ]  }| j                  |d|d/z
  d0f        n | j                  j!                  |d2      D ]  }| j                  |d|d3f        n |jC                  d	4       |jE                         }| j1                  |jF                         | j                  t'        |      d|d|d"d/d$       |jC                  d	4       | j                  |jE                         d	       |j                  d5d6       |jC                          |jE                         }| j1                  |jF                         | j                  t'        |      d|d|d"d'd$       |jC                          | j                  |jE                         d	       y c c}w c c}}}w c c}}}w c c}}}w c c}}}w )7NrA   r'   r(   r.   z&1 2 4 8 16 32 64 128 256 512 1024 2048	192.0.2.1   )rA   rA   rA   Fr         r    T)
forbantimefromtimei)r   r   correctBanTime)ipr   zFailTicket: ip=z time=z- bantime=20 bancount=2 #attempts=0 matches=[])r   r   z[FailTicket: ip=z. bantime=20 bancount=2 #attempts=0 matches=[]]ri   r   r      r;   r+   r>   rX   i@ r   z	 bantime=z# bancount=13 #attempts=0 matches=[]z" bancount=1 #attempts=0 matches=[]i   3r0   i ] pollingbackendzDummyJail-2)namer   ip  i.  z" bancount=2 #attempts=0 matches=[])overalljailsiPF  )r   r)   10m)$r   ri   rh   addJailrt   ru   rB   rH   r   timer   rC   rE   rv   incrBanCountaddBangetBansetTimegetCurrentBansrT   assertNotEqualrF   rJ   
isTimedOutrI   purgegetID	_purgeAger   filter
ignoreSelfrj   setBanCountrestoreCurrentBansgetFailTicketrestored)r   ri   r   stimerw   rL   r%   	timeOfBanlastBanTimerestored_ticketsr$   ticket2jail1jail2ticket1rows                   r   testBanTimeIncrzBanTimeIncrDB.testBanTimeIncr   s   		$''//$,,"{F+}&NO"
fkkm
%b%$&*/(3QDVR 3
 	''..vOSww~~^`bfhlnsOtuu+K8YXy+&urN
 	..4##FB/4''..vOSww~~^`bfhlnsOtuu+K8YXy+&u
B
 OSww~~^`bdfjlpOqrr+K8YXy+&r
B
 OSww~~^`mr  ~C~  PD  E  E+K8YXy+&  E
B
 77YuU
 WW++r%+HPRTY\^T^_
 WW++U5+QRTV[^`V`a
 WW++V[+\RTV[^`V`a
 +9 a	>>%+%)*fb)7G[1_-77>>$; 	..$q()VR('g{Q/7K(''..v+r#vuX~r2'	X	''..wr#vuX~r2'	X	''..wWW++U5+Q3'(!,PRTY\gTgjkTkmxy OQRUvW\]eWegop
 WW++U8^TY+Z3'(!,OQRUvW\]eWegop
 #A&11%89#A&11%89//"1%0078#A&11%.AB 
BsFE(NB	/&//&##E3/06$$UB/0B6$$UC016$$UB/0C//&##E2./ 	B''..vWW++U5+Q3'(!,OQRUvW\]eWegij
 ''--/WW++U5+Q3'(!,C''..v''--/WW++U5+Q3'(!,#A&,,.3  $''''--/WW++U5+Q3'(!,#A&,,.37 !$''''--/WW++U5+Q#R( I
&%!%,,V,77%.''//%
	
:%!%,,77%.''//%r5"%'	T	''.. r5:r*'	U	a	''.. WW++W\+]3'(!,OQSXZ^_ WW++W\+]3'(!,OQSXY]S]_de
 WW^^B& 	cC!UD)*	 WW^^B& 	cC!U4Z/0	 WW^^BT^2 	cC!UE*+	 %0 &//&//"3v;OQSXZ^_ %05&&(%0	5) &//&//"3v;OQSXZ]^ 5&&(%0q 4 v v
 s
 Es   2w.w w'w.'w5c                    t         y t        d      x}| _        | j                  |_        | j                  j                  |       |j                  j                  d       |j                  dd       t        j                  }|j                          |j                  | j                         |j                  d       |j                  d       d| j                  _        |j!                  d	d
d       | j#                  dd       |j%                  d       |j                  d       |j                  d       t'        t)        j*                               }| j                  j-                         }| j/                  |g        d}t1        ||dz
  g       }t3               x}|j4                  _        |j9                  d       t;        d      D ]&  }|j=                  |       |j                  d||       ( |j                  d       | j/                  |j?                         d       | jA                  |jC                                 |jE                  d       | j                  jG                  ||       | j                  jI                  ||dz
  d      }	| j/                  tK        |	      d       t1        ||g       }t3               x}|j4                  _        |j9                  d       |j=                  |       |j                  d||       |j                  d       tM        jN                  |jB                  d      }
| jA                  |
       | j/                  |
jQ                         |jS                                |
}tU        jV                  |      }
| j/                  |
|       |j                  d|
|d       |j                  d       | j/                  |
jY                         d       | j/                  |
j?                         d       | j                  jI                  ||d      }	| j/                  tK        |	      d       | j/                  |	d   jY                         d       | j/                  |	d   j?                         d       t1        ||dz
  dg      }|j[                  |       | j]                  |j                  j_                                t1        |t)        j*                         dg      }|j[                  |       | jA                  |j                  j_                                |j                  d       | j                  jI                  ||d      }	| j/                  tK        |	      d       | j/                  |	d   jY                         d       | j/                  |	d   j?                         d       t1        |d z   t)        j*                         d!g      }|j                  d"       |j[                  |       | jA                  |j                  j_                                |j                  d       t1        |d z   t)        j*                         d!g      }|j                  d#       |j[                  |       | j]                  |j                  j_                                |j                  d       | j                  jI                  ||d      }	| j/                  tK        |	      d$       | j/                  |	d   jY                         d"       | j/                  |	d   j?                         d       |ja                          y )%Nr   r   rA   r'   r(   nopr   r   DB_PURGEgMbP?db_purgezPurge database event occurredT)waitg?rz   x   r{   failureFoundr      Fr   r   banFound   <   ztest-expired-ban-timeztest-actionsi@     rX   ztest-permanentr   r0   r   )1r   r   ri   rh   rj   r   rt   ru   rB   r	   rk   startdb_setadd
wait_emptyr   add_named_timerassertLogged	wait_idlerH   r   r   getBansrC   r   r   r   failManagersetMaxRetryrE   
addFailuregetBanCountrI   r   r   r   r   rF   r   wait_forgetRetrygetMaxRetryr   wraprs   putFailTicketrJ   checkBanro   )r   ri   obsr   ticketsr   rw   r   rL   r   r   failticket2s               r   testObserverzBanTimeIncrDB.testObserver  s   	y11$''$-''//$,,"{F+#))+**TWW''%... $''j%43$?--''%...
fkkm
%GGOO'7B "b%)R(&*5-7+'!8 )a&!77>4() ..6%%'+//d((**+Q''..vWW++c	Z_+`3'(!,b%$&*5-7+'! ''.$'..NN4--r2'//'7##%{'>'>'@A +NN;''7K(''*gtR(..7%%'-7&&(!, WW++V[+\3'(!,#A&113S9#A&224a8 b%(%<$=>&V4<<((*+b&++-.)9:&V//$,,'')*..WW++V[+\3'(!,#A&113S9#A&224a8 bffkkm.>-?@&BV//$,,'')*..bffkkm.>-?@&CV4<<((*+..WW++V[+\3'(!,#A&113R8#A&224a8 ((*r   r!   )	rZ   r[   r\   r   r"   rv   r   r   r]   r^   s   @r   r`   r`      s    ! (g1Rqr   r`   c                   J     e Zd Z fdZ fdZd Z G d de      Zd Z xZ	S )ObserverTestc                 *    t         t        |           yr   )r   r   r   r   s    r   r   zObserverTest.setUp7  s    d!#r   c                 *    t         t        |           yrn   )r   r   r"   r   s    r   r"   zObserverTest.tearDown;  s    d$&r   c                    t               }|j                          |j                  d       t        dg      }|j	                  d|j
                         |j	                  d|j                  d       |j                  d       | j                  |j                         | j                  |t        dg             d|_
        |j	                  d|j
                         |j	                  d|j                  d       |j                  dt        j                  z         | j                  |j                         | j                  |t        dg             d|_
        |j                  d       | j                  |t        dg             | j                  |j                                | j                  |j                                |j!                          d }y )	Nr   testcalltest2Ttest3rA   F)r
   r   r   setr   clearr   rJ   is_fullrC   pausedr   DEFAULT_SLEEP_TIMErI   isActiveisAlivero   )r   r   os      r   testObserverBanTimeIncrz$ObserverTest.testObserverBanTimeIncr?  sI   #))+--	6(m!''&!''''&!%%!..3;;1c7)n%#*''&!''''&!%%!..e...///#++1c7)n%#*..1c7)n%//#,,.!//#++- ((*#r   c                       e Zd Zd Zy)ObserverTest._BadObserverc                     t        d      )Nrun bad thread exception)RuntimeError)r   s    r   runzObserverTest._BadObserver.run_  s    	0	11r   N)rZ   r[   r\   r    r   r   _BadObserverr   ^  s    2r   r   c                 <    t         j                         }d |_        t        j                  }g fdt        _        	 |j                          |j                          |j                           j                  t        j                   fdd             |t        _         j                  d        j                  t              d        j                  d   d   t                j                  t        d   d         d       y # |t        _        w xY w)	Nc                      y)Nr   r   )vs    r   <lambda>z1ObserverTest.testObserverBadRun.<locals>.<lambda>e  s    r   c                  &    j                  |       S r!   )append)argsxs    r   r   z1ObserverTest.testObserverBadRun.<locals>.<lambda>i  s    QXXd^ r   c                  @    t              xr  j                  d      S )NUnhandled exception)rF   
_is_logged)r   r   s   r   r   z1ObserverTest.testObserverBadRun.<locals>.<lambda>n  s    CF,]tG\7] r   r{   r   r   r   r   )r   r   r   sys__excepthook__r   ro   rS   rI   r   r   r   rC   rF   r   rT   )r   r   prev_exchookr   s   `  @r   testObserverBadRunzObserverTest.testObserverBadRunb  s    !!###.##,!3#%99;88:88:??ENN$]_`ac$3)*3q611Q47L)3qtAw<!;<	 %3s    AD D)
rZ   r[   r\   r   r"   r   r
   r   r   r]   r^   s   @r   r   r   5  s#    $'>2N 2=r   r   )
__author____copyright____license__rp   r   rc   re   r   server.mytimer   server.ticketr   r   server.failmanagerr   server.observerr	   r
   server.utilsr   utilsr   	dummyjailr   databasetestcaser   r   r   r`   r   r   r   r   <module>r      sj   . (
4 	 
    " 1 , 7   %   7D%$ D%N@& @D?=% ?=r   