
    Bd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dS )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                      | _        dS 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.   sH    T  """$+ ,$+ ""$---    c                 V    t          t          |                                            d S N)r   r   tearDownr   s    r   r"   zBanTimeIncr.tearDown5   s%    T##%%%%%r   c                 D    | j                             | j        ||          S r!   )r   r   r   )r   banTimebanCounts      r   r   zBanTimeIncr.calcBanTime8   s    		"	"4;	B	BBr   Nc                    | j                             dd           |                                         d          d                               dd           |                                         d          d                               dd                                dd                                d	|           |                     fd
t	          dd          D             g d                               dd           g d}|Ht          |                    d                    }|dk     r |d|dz
           ||dz
           gd|z
  z  z   }|                     fdt	          dd          D             |                               dd                               dd           |                     fdt	          dd          D             g d                               dd           |                     fdt	          dd          D             g d                               dd                                dd           |                     fdt	          dd          D             g d                               dd                               dd           |                     dfd t	          d!          D             v                                dd            |                     dfd"t	          d!          D             v                                d	d                                dd                                dd                               dd            d S )#N	incrementtrueTmaxtime1dQ rndtimefactormultipliersc                 <    g | ]}                     d |          S X  r   .0ias     r   
<listcomp>z+BanTimeIncr.testDefault.<locals>.<listcomp>G   '    000aAMM#q000r   r      
  `	    %   K      , r+   r+   r+   30d)
r;   r<   r=   r>   r?   r@   rA   i X i  i `	  r   r   c                 <    g | ]}                     d |          S r0   r2   r3   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>S   r8   r   2c                 <    g | ]}                     d |          S r0   r2   r3   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>Z   r8   r   )
r<   r=   r>   r?   r@   rA   r+   r+   r+   r+   z1.33c                 V    g | ]%}t                              d |                    &S r0   intr   r3   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>`   /    5551Cc1555r   )
i<  ix  i  i1  ic  i  r+   r+   r+   r+   12hc                 <    g | ]}                     d |          S r0   r2   r3   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>g   r8   r   
r;   r<   r=   r>   r?   r@     rN   rN   rN   24h5mFc                 J    g | ]}d fdt          d          D             v  S )r;   c                 <    g | ]}                     d d          S r1   r   r2   r3   s     r   r7   z6BanTimeIncr.testDefault.<locals>.<listcomp>.<listcomp>n   '    ???ammC++???r   
   ranger4   cr6   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>n   9    SSSAT????U2YY????SSSr   rU   c                 J    g | ]}d fdt          d          D             v  S )r;   c                 <    g | ]}                     d d          S rS   r2   r3   s     r   r7   z6BanTimeIncr.testDefault.<locals>.<listcomp>.<listcomp>r   rT   r   rU   rV   rX   s     r   r7   z+BanTimeIncr.testDefault.<locals>.<listcomp>r   rZ   r   )	r   setBanTimeExtraassertEqualgetBanTimeExtrarW   lensplit
assertTrueassertFalse)r   r.   arrmultcntr6   s       @r   testDefaultzBanTimeIncr.testDefault;   s    
k!K(((1$$[114888It$$$1$$Y//:::It$$$Hd###M;///00005B<<000EEE  
 Iu%%%MMM#""3''((7ll
a	k
s719~."W*=
>C00005B<<000   It$$$Hc"""00005B<<000FFF  
 Hf%%%5555a555FFF   Hd###Iu%%%00005B<<000EEE   Iu%%%It$$$//SSSSrSSSS   It$$$SSSSrSSSS   M4(((Hd###Iu%%%It$$$$$r   c                     |                      d           |                      d                    d t          d          D                                  d S )Nz1 2 4 8 16 32 64 128 256rC   c                 2    g | ]}t          d |z            S )r   )str)r4   r5   s     r   r7   z/BanTimeIncr.testMultipliers.<locals>.<listcomp>~   s"    :::1SAYY:::r      )rf   joinrW   r   s    r   testMultiplierszBanTimeIncr.testMultipliersz   sR    -...388::b		:::;;<<<<<r   c                 ~   | j                             dd                               dd                                dd                               dd                               dd            |                     fd	t          d
d          D             g d                               dd           |                     fdt          d
d          D             g d                               dd                               dd           |                     fdt          d
d          D             g d                               dd                               dd           |                     fdt          d
d          D             g d                               dd                               dd           |                     dfdt          d          D             v                                dd            |                     dfdt          d          D             v                                dd                                dd                                dd                                dd                               dd            d S )Nr)   rO   r,   formulazGban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)r-   z2.0 / 2.885385r.   c                 V    g | ]%}t                              d |                    &S r0   rH   r3   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   rJ   r   r   r9   r:   rB   c                 V    g | ]%}t                              d |                    &S r0   rH   r3   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   rJ   r   )
r;   r<   r=   r>   r?   r@   rA   iX i i`	 1c                 V    g | ]%}t                              d |                    &S r0   rH   r3   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   rJ   r   )
i^  iQ  i/  i  r+   r+   r+   r+   r+   r+   rK   c                 V    g | ]%}t                              d |                    &S r0   rH   r3   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   rJ   r   rM   rP   Fc                 J    g | ]}d fdt          d          D             v  S )r;   c                 V    g | ]%}t                              d d                    &S rS   rH   r3   s     r   r7   z6BanTimeIncr.testFormula.<locals>.<listcomp>.<listcomp>   /    DDDQc!--Q//00DDDr   rU   rV   rX   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   9    XXXTDDDD%))DDDDXXXr   rU   c                 J    g | ]}d fdt          d          D             v  S )r;   c                 V    g | ]%}t                              d d                    &S rS   rH   r3   s     r   r7   z6BanTimeIncr.testFormula.<locals>.<listcomp>.<listcomp>   rw   r   rU   rV   rX   s     r   r7   z+BanTimeIncr.testFormula.<locals>.<listcomp>   rx   r   )r   r]   r^   rW   rb   rc   )r   r6   s    @r   testFormulazBanTimeIncr.testFormula   s!   
k!Iu%%%It$$$IhiiiH.///M4(((5555a555EEE  
 Iu%%%5555a555HHH   Iu%%%Hc"""5555a555GGG   H.///Iu%%%5555a555EEE   Iu%%%It$$$//XXXXeTViiXXXX   It$$$XXXXeTViiXXXX   Hd###M4(((Hd###Iu%%%It$$$$$r   r!   )
__name__
__module____qualname__r   r"   r   rf   rm   r{   __classcell__r   s   @r   r   r   ,   s        # # # # #& & & & &C C C=% =% =% =%~= = =0% 0% 0% 0% 0% 0% 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                    t          t          |                                            t          t	          j        d          t          dS t          j        dd          \  }| _        t          | j                  | _
        t                      | _        | j
        | j        _        t                      | _        | j        t           _        dS )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""$$$		
 
  	6'{;;!T_$/**$'kk$)w$) ""$-=)...r   c                     t           dS | j                                         dt          _        t          j        | j                   t          t          |           
                                 dS zCall after every test case.N)r   r   stopr	   r   osremover   r   r   r"   r   s    r   r"   zBanTimeIncrDB.tearDown   s]    	6-).)DOt%%'''''r   Nc                     | j         }|,|                    |j                                                  }|                    d            | j                            |||          }|S r!   )r   
getBanTimeactions
setBanTimer   incrBanTime)r   ticketr$   r   incrTimes        r   r   zBanTimeIncrDB.incrBanTime   sa    	$_t|6688997D]&&tWf==(	/r   c           
          t           d S  j        } j                            |           |j                            d           |                    dd           |                    dd           d}t          t          j	                              }t          ||g                                 fdt          d          D             g d	                                             j                            |                                d
  j                            ||d d          D             d|dfg                               |dz                                                        d          d            j                            |                                d  j                            ||d d          D             d|dz   dfg                                d  j                            |dd d          D             d|dz   dfg                                d  j                            |||          D             d|dz   dfg                                 j                            d|d          g             j                            |d          }                     t'          |          d|d|dz   d            j                            |d          }                     t'          |          d|d|dz   d            j                            ||d          }                     t'          |          d|d|dz   d           d}t          d          D ]i}                    ||z   d z                                   d          }                     ||dz              j                            |           |}j                    ||z   d z                                   d          }                     ||dz                                  ||            j                            |           |}t          |d!z   |d"z
  g           }|                    d#           |                                  j                            ||           t          |d$z   |d"z
  g           }|                    d%           |                                  j                            ||            j                            |d          }                     t+          |          d                                t'          |d&                   d|d||z   d z   d'|d(                                t'          |d                   d|d$z   d|d"z
  d'd%d)            j                            |d*z
  d          }                     t+          |          d                                t'          |d                   d|d!z   d|d"z
  d'd#d)                                |d                             |                                          |d                             |                                          |d                             |                                          |d                             |d*z
                       t          |d+z   |d%z
  g                                                    |d,                                                              |d-                                         d-                                                    |d,                                                              |d-                                         d,                                                    |d-                                         d-                                             j                            |            j                            |d          }                     t+          |          d                                t'          |d                   d|d+z   d|d%z
  d'd-d)            j                                          j                            |d          }                     t+          |          d                               d,                                             j                            |            j                                          j                            |d          }                     t+          |          d                                |d&                                         |           d. j        _         j                                          j                            |d          }                     t+          |          d                                |d&                                         |d$z              d/ j        _         j                                          j                            |d          }                     |g            t9          d01          }	d|	j        _        |	                    dd            j        |	_         j                            |	           t9          d2d03          }
d|
j        _         j        |
_         j                            |
           t          ||g           }|                    d4           |                                  j                            |	|           t          ||d4z
  g           }|                    d5           |                     d           |                                  j                            |
|            j                            |	|d          }                     t+          |          d                                t'          |d&                   d|d|d'd4d)            j                            |
|d          }                     t+          |          d                                t'          |d&                   d|d|d4z
  d'd5d6            j                            ||	          D ]}                     |d|d4f             j                            ||
          D ]}                     |d|d4z
  d5f             j                            |d7          D ]}                     |d|d8f            |	!                    d9           |	"                                                     j#                                        t'                    d|d|d'd4d)           |
!                    d9                                |
"                                d           |	                    d:d;           |	!                                 |	"                                                     j#                                        t'                    d|d|d'd,d)           |
!                                                      |
"                                d           d S )<NrU   r'   r(   r.   z&1 2 4 8 16 32 64 128 256 512 1024 2048	192.0.2.1c                 <    g | ]}                     d           S )rU   )r   )r4   r5   r   r   s     r   r7   z1BanTimeIncrDB.testBanTimeIncr.<locals>.<listcomp>   s)    333QDVR  333r      )rU   rU   rU   c                      g | ]\  }}}|||fS  r   r4   r%   	timeOfBanlastBanTimes       r   r7   z1BanTimeIncrDB.testBanTimeIncr.<locals>.<listcomp>   &    uuu+K8YXy+&uuur   Fr         c                      g | ]\  }}}|||fS r   r   r   s       r   r7   z1BanTimeIncrDB.testBanTimeIncr.<locals>.<listcomp>   r   r   r   c                      g | ]\  }}}|||fS r   r   r   s       r   r7   z1BanTimeIncrDB.testBanTimeIncr.<locals>.<listcomp>   s&    rrr+K8YXy+&rrrr    Tc                      g | ]\  }}}|||fS r   r   r   s       r   r7   z1BanTimeIncrDB.testBanTimeIncr.<locals>.<listcomp>  s8      E  E  E+K8YXy+&  E  E  Er   )
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=[]]r   r   r      rE   r+   rN   rr   i@ r   z	 bantime=z# bancount=13 #attempts=0 matches=[]z" bancount=1 #attempts=0 matches=[]i   3r1   i ] pollingbackendzDummyJail-2)namer   ip  i.  z" bancount=2 #attempts=0 matches=[])overalljailsiPF  )r   r)   10m)$r   r   r   addJailr   r   r]   rI   r   timer   r^   rW   incrBanCountaddBangetBansetTimer   getCurrentBansri   assertNotEqualr`   rc   
isTimedOutrb   purgegetID	_purgeAger   filter
ignoreSelfr   setBanCountrestoreCurrentBansgetFailTicketrestored)r   r   r   stimerestored_ticketsr   r5   r$   ticket2jail1jail2ticket1rowr   s   `            @r   testBanTimeIncrzBanTimeIncrDB.testBanTimeIncr   s   	6	$'//$,"{F+++}&NOOO"
fkmm

%b%$$&33333%((333<<  
 	'..vuutw~~^`bfhlnsOtOtuuurN  
 	..4##FB//444'..vuutw~~^`bfhlnsOtOtuuu
B  
 rrtw~~^`bdfjlpOqOqrrr
B  
  E  Etw~~^`mr  ~C~  PD  PD  E  E  E
B  
 7YuUU  
 W++r%+HHPRPRPRTY\^T^T^T^_  
 W++U5+QQRTRTRTV[^`V`V`V`a  
 W++V[+\\RTRTRTV[^`V`V`V`a  
 +99  a	>>%+%)***fb))7G[1_---7>>$;;..$q()))VR(('g{Q///7K((('..v+r#vuX~r22'	X	'..wr#vuX~r22'	X	'..wW++U5+QQ3'((!,,,PRPRPRTY\gTgjkTkTkTkmxmxmxy   OQRUvvvW\]eWeWeWegogogop  
 W++U8^TY+ZZ3'((!,,,OQRUvvvW\]eWeWeWegogogop  
 #A&11%88999#A&11%88999//"1%0077888#A&11%.AABBB 
BsFE(NB	/	/&//&##E3//0006$$UB//000B6$$UC001116$$UB//000C//&##E2../// 	B'..vW++U5+QQ3'((!,,,OQRUvvvW\]eWeWeWegigigij  
 '--///W++U5+QQ3'((!,,,C'..v'--///W++U5+QQ3'((!,,,#A&,,..333  $''--///W++U5+QQ3'((!,,,#A&,,..3777 !$''--///W++U5+QQ#R((( I
&
&
&%!%,V,,,7%.'//%
	
:
:
:%!%,7%.'//%r5"%%'	T	'..   r5:r**'	U	a	'..   W++W\+]]3'((!,,,OQrrSXSXSXZ^Z^Z^_   W++W\+]]3'((!,,,OQrrSXY]S]S]S]_d_d_de  
 W^^B&& 	 	cC!UD)***W^^B&& 	 	cC!U4Z/000W^^BT^22 	 	cC!UE*+++%000  &//&/"""3v;;;OQrrSXSXSXZ^Z^Z^_   %0005&&((%000	5)))  &//&/"""3v;;;OQrrSXSXSXZ]Z]Z]^   5&&((%00000r   c                    t           d S t          d          x}| _        | j        |_        | j                            |           |j                            d           |                    dd           t          j
        }|                                 |                    | j                   |                    d           |                    d           d| j        _        |                    d	d
d           |                     dd           |                    d           |                    d           |                    d           t'          t)          j                              }| j                                        }|                     |g            d}t1          ||dz
  g           }t3                      x}|j        _        |                    d           t;          d          D ].}|                    |           |                    d||           /|                    d           |                     |                                d           |                      |!                                            |"                    d           | j        #                    ||           | j        $                    ||dz
  d          }	|                     tK          |	          d           t1          ||g           }t3                      x}|j        _        |                    d           |                    |           |                    d||           |                    d           tM          j'        |j!        d          }
|                      |
           |                     |
(                                |)                                           |
}tU          j+        |          }
|                     |
|           |                    d|
|d           |                    d           |                     |
,                                d           |                     |
                                d           | j        $                    ||d          }	|                     tK          |	          d           |                     |	d         ,                                d           |                     |	d                                         d           t1          ||dz
  dg          }|-                    |           | .                    |j        /                                           t1          |t)          j                    dg          }|-                    |           |                      |j        /                                           |                    d           | j        $                    ||d          }	|                     tK          |	          d           |                     |	d         ,                                d           |                     |	d                                         d           t1          |d z   t)          j                    d!g          }|                    d"           |-                    |           |                      |j        /                                           |                    d           t1          |d z   t)          j                    d!g          }|                    d#           |-                    |           | .                    |j        /                                           |                    d           | j        $                    ||d          }	|                     tK          |	          d$           |                     |	d         ,                                d"           |                     |	d                                         d           |0                                 d S )%Nr   r   rU   r'   r(   nopr   r   DB_PURGEgMbP?db_purgezPurge database event occurredT)waitg?r   x   r   failureFoundr      Fr   r   banFound   <   ztest-expired-ban-timeztest-actionsi@     rr   ztest-permanentr   r1   r   )1r   r   r   r   r   r   r   r   r]   r	   r   startdb_setadd
wait_emptyr   add_named_timerassertLogged	wait_idlerI   r   r   getBansr^   r   r   r   failManagersetMaxRetryrW   
addFailuregetBanCountrb   r   r   r   r   r`   r   wait_forgetRetrygetMaxRetryr   wrapr   putFailTicketrc   checkBanr   )r   r   obsr   ticketsr   r   r   r5   r   r   failticket2s               r   testObserverzBanTimeIncrDB.testObserver  si   	6y1111$'$-'//$,"{F+++#))+++**TW''%..... $'j%4443$???--''%.....
fkmm

%GOO'7B "b%)R((&*5--7+'!88 ) )a&!!!77>4((((..6%%''+++//d((***+++Q'..vW++c	Z_+``3'((!,,,b%$$&*5--7+'!   ''.$'''..N4-r22'//'7##%%{'>'>'@'@AAA +N;'''7K(((''*gtR(((..7%%''---7&&((!,,, W++V[+\\3'((!,,,#A&1133S999#A&2244a888 b%(%<$=>>&V4<((**+++b&+--.)9::&V//$,''))***..W++V[+\\3'((!,,,#A&1133S999#A&2244a888 bffkmm.>-?@@&BV//$,''))***..bffkmm.>-?@@&CV4<((**+++..W++V[+\\3'((!,,,#A&1133R888#A&2244a888 ((*****r   r!   )	r|   r}   r~   r   r"   r   r   r   r   r   s   @r   r   r      s        ! ! ! ! ! ( ( ( ( (   g1 g1 g1Rq q q q q q qr   r   c                   P     e Zd Z fdZ fdZd Z G d de          Zd Z xZ	S )ObserverTestc                 V    t          t          |                                            dS r   )r   r   r   r   s    r   r   zObserverTest.setUp7  s%    d!!#####r   c                 V    t          t          |                                            dS r   )r   r   r"   r   s    r   r"   zObserverTest.tearDown;  s%    d$$&&&&&r   c                 ,   t                      }|                                 |                    d           t          dg          }|                    d|j                   |                    d|j        d           |                    d           |                     |j                   | 	                    |t          dg                     d|_
        |                    d|j                   |                    d|j        d           |                    dt          j        z             |                     |j                   | 	                    |t          dg                     d|_
        |                    d           | 	                    |t          dg                     |                     |                                           |                     |                                           |                                 d }d S )	Nr   testcalltest2Ttest3rU   F)r
   r   r   setr   clearr   rc   is_fullr^   pausedr   DEFAULT_SLEEP_TIMErb   isActiveisAliver   )r   r   os      r   testObserverBanTimeIncrz$ObserverTest.testObserverBanTimeIncr?  s   #))+++--	6(mm!''&!'''&!%!!!..3;1c7)nn%%%#*''&!'''&!%!!!..e../////#+1c7)nn%%%#*..1c7)nn%%%//#,,..!!!//#++--   ((***###r   c                       e Zd Zd ZdS )ObserverTest._BadObserverc                      t          d          )Nrun bad thread exception)RuntimeErrorrl   s    r   runzObserverTest._BadObserver.run_  s    	0	1	11r   N)r|   r}   r~   r  r   r   r   _BadObserverr	  ^  s#        2 2 2 2 2r   r  c                     t                                           }d |_        t          j        }g fdt          _        	 |                                 |                                 |                                                      t          j
         fdd                     |t          _        n# |t          _        w xY w                     d                                t                    d                                d         d         t                                          t          d         d                   d           d S )	Nc                     dS )Nr   r   )vs    r   <lambda>z1ObserverTest.testObserverBadRun.<locals>.<lambda>e  s    B r   c                  .                         |           S r!   )append)argsxs    r   r  z1ObserverTest.testObserverBadRun.<locals>.<lambda>i  s    QXXd^^ r   c                  L    t                    o                     d          S )NUnhandled exception)r`   
_is_logged)r   r  s   r   r  z1ObserverTest.testObserverBadRun.<locals>.<lambda>n  s    CFF,]tG\7]7] r   r   r  r   r   r  )r   r  r   sys__excepthook__r   r   rk   rb   r   r   r   r^   r`   r  ri   )r   r   prev_exchookr  s   `  @r   testObserverBadRunzObserverTest.testObserverBadRunb  s-   !!###;#.#,!3333#%99;;;88:::88:::??EN$]$]$]$]$]_`aaccc$33$$$$)***3q6611Q47L)))3qtAw<<!;<<<<<s   A(B7 7C)
r|   r}   r~   r   r"   r  r
   r  r  r   r   s   @r   r   r   5  s        $ $ $ $ $' ' ' ' '  >2 2 2 2 2N 2 2 2= = = = = = =r   r   )
__author____copyright____license__r   r  r   r   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)     s  . (
4 				 



    " " " " " " 1 1 1 1 1 1 1 1 , , , , , , 7 7 7 7 7 7 7 7             % % % % % %             7 7 7 7 7 7 7 7D% D% D% D% D%$ D% D% D%N@ @ @ @ @& @ @ @D?= ?= ?= ?= ?=% ?= ?= ?= ?= ?=r   