
oTc        
   @   s  d  d l  Z  y d  d l m Z Wn! e k
 rC d  d l m Z n Xd  d l Z d  d l Z d  d l m Z	 e
 d  Z d   Z d d d d	 d
  Z d  d  Z d d  Z e e _ e e
 d d d  Z d e f d     YZ d   Z d d j g  e e  D]7 Z e j d  sd e e e e e   j f ^ q e _ e  j d  Z  d   Z! d   Z" d e d  Z# e e
 d  Z$ d   Z% d d  Z& d S(!   iN(   t   md5(   t   new(   t   httpc   	      C   s  t  j } t | d  r d  St j | j  \ } } } | j j d  } | r |  r | d k r | j   } d t	 |  j
   } | | j d <q n  | | _ | d k r| d k rt  j } | j j d  p g  } g  | D] } t |  ^ q } | r9| d g k p| | k r9t  j d d | | f   n  | j j d	  pNg  } g  | D] } t |  ^ qX} | d g k s| | k r| j d k rt  j g  d   qt  j d d | | f   qn  d  S(   Nt   ETagi   s   "%s"i+  s   If-Matcht   *i  s)   If-Match failed: ETag %r did not match %rs   If-None-Matcht   GETt   HEADi0  s(   If-None-Match failed: ETag %r matched %r(   R   R   (   t   cherrypyt   responset   hasattrt   _httpt   valid_statust   statust   headerst   gett   collapse_bodyR    t	   hexdigestR   t   requestt   elementst   strt	   HTTPErrort   methodt   HTTPRedirect(	   t   autotagsR   R   t   reasont   msgt   etagR   t
   conditionst   x(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   validate_etags   s2    			"c          C   s*  t  j }  |  j j d  } | r&t j |  j  \ } } } t  j } | j j d  } | r | | k r | d k r | d k s | d k r t  j d   q n  | j j d  } | r&| | k r&| d k r | d k s | d k r#| j	 d
 k rt  j
 g  d   q t  j d   q#q&n  d  S(   Ns   Last-Modifieds   If-Unmodified-Sincei   i+  i  s   If-Modified-Sincei0  R   R   (   R   R   (   R   R   R   R   R
   R   R   R   R   R   R   (   R   t   lastmodR   R   R   R   t   since(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   validate_sinceI   s    		$$s   X-Forwarded-Hosts   X-Forwarded-Fors   X-Forwarded-Protoc         C   sV  t  j } | rT | j j | d   } | d k rK d | j   k rK d } qT | } n  | sv | j | j j d   } n  | r | j j | |   }  n  |  s t  j j j	 } | d k r d }  q d | }  n  |  j d  d k r | d |  }  n  |  | _ | rR| j j |  } | rR| d	 k r@| j
 d
  d j   } n  | | j _ qRn  d  S(   Nt   ont   sslt   httpss   ://iP   s	   127.0.0.1s   127.0.0.1:%sis   X-Forwarded-Fort   ,(   R   R   R   R   t   Nonet   lowert   baset   findt   localt   portt   splitt   stript   remotet   ip(   R'   R)   R-   t   schemeR   t   sR*   t   xff(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   proxyf   s0    					t   Rangec         C   s:   t  j } x* |  D]" } | | j k r | j | =q q Wd  S(   N(   R   R   R   (   R   R   t   name(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   ignore_headers   s    	c         C   s1   x* |  p g  D] \ } } | t  j j | <q Wd  S(   N(   R   R   R   (   R   R4   t   value(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   response_headers   s    i  s   Forbidden Referer header.c         C   sj   y6 t  t j |  t j j d   } | | k r5 d  SWn t k
 rS | rT d  Sn Xt j | |   d  S(   Nt   Referer(   t   boolt   ret   matchR   R   R   t   KeyErrorR   (   t   patternt   acceptt   accept_missingt   errort   messageR;   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   referer   s    "t   SessionAuthc           B   sw   e  Z d  Z d   Z d   Z d   Z d   Z d   Z d d d d  Z d d	  Z	 d d
  Z
 d   Z d   Z RS(   t   usernamec         C   s   d  S(   N(    (   t   selfRD   t   password(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   check_username_and_password   s    c         C   s   d  S(   N(    (   RE   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt	   anonymous   s    c         C   s   d  S(   N(    (   RE   RD   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   on_login   s    c         C   s   d  S(   N(    (   RE   RD   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt	   on_logout   s    c         C   s   d  S(   N(    (   RE   RD   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   on_check   s    s   ..t    c         K   s   d i | d 6| d 6| d 6S(   Nsd  <html><body>
Message: %(error_msg)s
<form method="post" action="do_login">
    Login: <input type="text" name="username" value="%(username)s" size="10" /><br />
    Password: <input type="password" name="password" size="10" /><br />
    <input type="hidden" name="from_page" value="%(from_page)s" /><br />
    <input type="submit" />
</form>
</body></html>t	   from_pageRD   t	   error_msg(    (   RE   RM   RD   RN   t   kwargs(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   login_screen   s    	c         K   s   |  j  | |  } | rb |  j | | |  } | t j _ t j j j d  r^ t j j d =n  t S| t j |  j	 <t j
 _ |  j |  t j | p d   d  S(   Ns   Content-Lengtht   /(   RG   RP   R   R   t   bodyR   t   has_keyt   Truet   sessiont   session_keyR   t   loginRI   R   (   RE   RD   RF   RM   RO   RN   RR   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   do_login   s    c         K   s]   t  j } | j |  j  } d  | |  j <| rJ d  t  j _ |  j |  n  t  j |   d  S(   N(	   R   RU   R   RV   R%   R   RW   RJ   R   (   RE   RM   RO   t   sessRD   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt	   do_logout   s    	c         C   s   t  j } t  j } | j |  j  } | sD |  j   | |  j <} n  | s |  j t  j d | j   t  j	 _
 t  j	 j j d  r t  j	 j d =n  t S| t  j _ |  j |  d  S(   Nt   qss   Content-Length(   R   RU   R   R   RV   RH   RP   t   urlt   query_stringR   RR   R   RS   RT   RW   RK   (   RE   RY   R   RD   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   do_check  s    		$c         C   s}   t  j } | j } | j d  r1 |  j | j   S| j d  rP |  j | j   S| j d  ro |  j | j   S|  j   Sd  S(   NRP   RX   RZ   (	   R   R   t	   path_infot   endswithRP   t   paramsRX   RZ   R^   (   RE   R   t   path(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   run  s    		(   t   __name__t
   __module__RV   RG   RH   RI   RJ   RK   RP   RX   RZ   R^   Rc   (    (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyRC      s   					
	c          K   s@   t    } x* |  j   D] \ } } t | | |  q W| j   S(   N(   RC   t	   iteritemst   setattrRc   (   RO   t   sat   kt   v(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   session_auth  s    	s|   Session authentication hook.

Any attribute of the SessionAuth class may be overridden via a keyword arg
to this function:

s   
t   __s   %s: %sc         C   s    t  j d d d |  d t d  S(   NRL   t   HTTPt   severityt	   traceback(   R   t   logRT   (   Rn   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   log_traceback-  s    c          C   sP   g  t  j j D] \ }  } d |  | f ^ q } t  j d d j |  d  d  S(   Ns     %s: %ss   
Request Headers:
s   
Rm   (   R   R   t   header_listRp   t   join(   Ri   Rj   t   h(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   log_request_headers1  s    /c          C   s   g  }  d d l  m } | j } x6 t  j j j   D]" } | | k r2 | j |  q2 q2 Wxc | D][ } |  j d |  t  j j j | g   } | j   x | D] } |  j d |  q Wq_ Wt  j	 d t  j
   d d j |   d  d  S(	   Ni(   t
   _cprequests       %s:s
           %rs   
Request Hooks for s   :
s   
Rm   (   R   Rv   t
   hookpointsR   t   hookst   keyst   appendR   t   sortRp   R\   Rs   (   R   Rv   t   pointsRi   Rj   Rt   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt	   log_hooks6  s    	
RL   c         C   s+   | r t  j |    n t  j |    d  S(   N(   R   t   InternalRedirectR   (   R\   t   internal(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   redirectI  s    c         C   s   t  j } | j } | j t k rg |  r | j d  sd t  j | d | j  } t  j |   qd q na | j t	 k r | r | j d  r | d k r t  j | d  | j  } t  j |   q q n  d  S(   NRQ   i(
   R   R   R_   t   is_indexRT   R`   R\   R]   R   t   False(   t   missingt   extraR   t   pit   new_url(    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   trailing_slashP  s    		c             s=   d d  l      f d     t j }    |  j  |  _ d  S(   Nic         3   sK   xD |  D]< } t  |  j  s' | Vq x   |  D] } | Vq4 Wq Wd  S(   N(   t
   isinstancet   GeneratorType(   t   inputR   t   y(   t	   flattenert   types(    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyR   h  s
    (   R   R   R   RR   (   R   (    (   R   R   s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   flattena  s    	c         C   s?  |  s
 d  St  |  t  r% |  g }  n  t j j j d  } | sH |  d Sx | D] } | j d k rO | j d k r{ |  d S| j j d  r | j d  } x: |  D] } | j	 |  r | Sq Wq | j |  k r | j SqO qO Wt j j j
 d  } | d  k rd } n
 d | } | d d	 j |   7} t j d
 |   d  S(   Nt   Accepti    s   */*s   /*is*   Your client did not send an Accept header.s(   Your client sent this Accept header: %s.s4    But this resource only emits these media types: %s.s   , i  (   R   t
   basestringR   R   R   R   t   qvalueR6   R`   t
   startswithR   R%   Rs   R   (   t   mediat   rangest   elementt   mtypet   mt   ahR   (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyR>   s  s2    	
(   R3   ('   t   loggingt   hashlibR    t   ImportErrorR   R:   R   t   cherrypy.libR   R
   R   R   R    R%   R2   R5   R7   RT   t   failsafeRB   t   objectRC   Rk   Rs   t   dirRi   R   t   typet   getattrRd   t   __doc__t   DEBUGRq   Ru   R}   R   R   R   R>   (    (    (    s(   /var/www/SABnzbd/cherrypy/lib/cptools.pyt   <module>   s6   8		6		X	
N			