ó
‚•oTc           @   s‚  d  d l  Z  d  d l Z d  d l Z d  d l Z d Z e  j d d d e  j ƒ Z e  j d e  j ƒ Z e  j d ƒ Z	 d Z
 d e f d	 „  ƒ  YZ d
 e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e j f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d e f d „  ƒ  YZ d d „ Z d S(   iÿÿÿÿNs   0.8sR   GNTP/(?P<version>\d+\.\d+) (?P<messagetype>REGISTER|NOTIFY|SUBSCRIBE|\-OK|\-ERROR)sA    (?P<encryptionAlgorithmID>[A-Z0-9]+(:(?P<ivValue>[A-F0-9]+))?) ?sQ   ((?P<keyHashAlgorithmID>[A-Z0-9]+):(?P<keyHash>[A-F0-9]+).(?P<salt>[A-F0-9]+))?
s   ([\w-]+):(.+)s   
t	   BaseErrorc           B   s   e  Z d  „  Z RS(   c         C   s   t  |  j |  j ƒ } | j ƒ  S(   N(   t	   GNTPErrort	   errorcodet	   errordesct   encode(   t   selft   error(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt
   gntp_error   s    (   t   __name__t
   __module__R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR       s   t
   ParseErrorc           B   s   e  Z d  Z d Z RS(   iô  s   Error parsing the message(   R   R	   R   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR
       s   t	   AuthErrorc           B   s   e  Z d  Z d Z RS(   i  s   Error with authorization(   R   R	   R   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   %   s   t   UnsupportedErrorc           B   s   e  Z d  Z d Z RS(   iô  s    Currently unsupported by gntp.py(   R   R	   R   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   *   s   t   _GNTPBufferc           B   s   e  Z d  d „ Z RS(   t    c         G   s.   |  j  | | j d d ƒ ƒ |  j  t ƒ d  S(   Nt   utf8t   replace(   t   writeR   t   GNTP_EOL(   R   t   messaget   args(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   writefmt1   s    (   R   R	   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   /   s   t	   _GNTPBasec           B   s•   e  Z d d  d d „ Z d „  Z d „  Z d d „ Z d „  Z d „  Z d „  Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z d „  Z d d „ Z d „  Z RS(   s   1.0c         C   s4   i | d 6| d 6| d 6|  _  i  |  _ i  |  _ d  S(   Nt   versiont   messagetypet   encryptionAlgorithmID(   t   infot   headerst	   resources(   R   R   R   t
   encryption(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   __init__>   s    	c         C   s
   |  j  ƒ  S(   N(   R   (   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   __str__G   s    c         C   sQ   t  j | ƒ } | s$ t d ƒ ‚ n  | j ƒ  } | d d k rM d  | d <n  | S(   Nt   ERROR_PARSING_INFO_LINER   t   NONE(   t   GNTP_INFO_LINEt   matchR
   t	   groupdictt   None(   R   t   dataR#   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _parse_infoJ   s    t   MD5c         C   sN  i t  j d 6t  j d 6t  j d 6t  j d 6} | |  _ | j ƒ  |  _ | sj d  |  j	 d <d  |  j	 d <d  S|  j | j
 ƒ  k r• t d |  j ƒ ‚ n  | j |  j ƒ } | j d ƒ } t j ƒ  } | | ƒ j ƒ  } | | ƒ j ƒ  } | | } | | ƒ j ƒ  }	 | |	 ƒ j ƒ  }
 |  j |  j	 d	 <|
 j ƒ  |  j	 d
 <| j ƒ  |  j	 d <d  S(   NR(   t   SHA1t   SHA256t   SHA512R   t   keyHashAlgorithms   INVALID HASH "%s"R   t   keyHashAlgorithmIDt   keyHasht   salt(   t   hashlibt   md5t   sha1t   sha256t   sha512t   passwordt   uppert   encryptAlgoR%   R   t   keysR   t   getR   t   timet   ctimet	   hexdigestt   digest(   R   R5   R7   t   hasht   hashfunctiont   seedR/   t   saltHasht   keyBasist   keyR.   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   set_password\   s0    


	
c         C   sW   d } xJ t  d t | ƒ d ƒ D]0 } t | | | d !d ƒ } | t | ƒ 7} q W| S(   NR   i    i   i   (   t   ranget   lent   intt   chr(   R   t   valuet   resultt   it   tmp(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _decode_hex€   s
    c         C   s…   | d 7} t  | d ƒ } |  j j | ƒ t | ƒ } | | } |  j | | !} t | ƒ | k s t d | t | ƒ f ƒ ‚ n  | S(   Ns   

t   Lengths,   INVALID_DATA_LENGTH Expected: %s Recieved %s(   RG   t   rawt   findRF   R
   (   R   t   rawIdentifiert
   identifiert
   dataLengtht   pointerStartt
   pointerEndR&   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _decode_binaryŒ   s    

c         C   s  | |  _  | d  k r$ t d ƒ ‚ n  |  j j d d  ƒ } | d  k rX |  j  d  k rX t S| d  k rs t d ƒ ‚ n  |  j  d  k r‘ t d ƒ ‚ n  |  j  j d ƒ } |  j |  j d ƒ } | | } t j	 | ƒ j
 ƒ  } t j	 | ƒ j ƒ  } | j ƒ  |  j d j ƒ  k st d ƒ ‚ n  t S(   Ns   Missing passwordR.   s   Invalid keyHashR   R/   s   Invalid Hash(   R5   R%   R   R   R9   t   TrueR   RM   R0   R1   R=   R<   R6   (   R   R5   R.   RA   RB   RC   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _validate_password–   s$    	
c         C   s@   x9 |  j  D]. } |  j j | t ƒ s
 t d | ƒ ‚ q
 q
 Wd  S(   Ns   Missing Notification Header: (   t   _requiredHeadersR   R9   t   FalseR
   (   R   t   header(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   validate®   s    c         C   sÍ   d |  j  j d ƒ |  j  j d ƒ f } |  j  j d d  ƒ rl | d |  j  j d ƒ |  j  j d ƒ f 7} n
 | d 7} |  j  j d d  ƒ rÉ | d	 |  j  j d ƒ |  j  j d
 ƒ |  j  j d ƒ f 7} n  | S(   Nu
   GNTP/%s %sR   R   R   s    %s:%st   ivValues    NONER-   s	    %s:%s.%sR.   R/   (   R   R9   R%   (   R   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _format_info´   s    
c         C   s‹   i  } x~ | j  d ƒ D]m } t j | ƒ } | s7 q n  t | j d ƒ j ƒ  d d ƒ } t | j d ƒ j ƒ  d d ƒ } | | | <q W| S(   Ns   
i   R   R   i   (   t   splitt   GNTP_HEADERR#   t   unicodet   groupt   strip(   R   R&   t   dictt   lineR#   RC   t   val(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   _parse_dictÎ   s    !!c         C   s@   t  | t ƒ r | |  j | <n t d | d d ƒ |  j | <d  S(   Ns   %sR   R   (   t
   isinstanceRa   R   (   R   RC   RI   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt
   add_headerß   s    c         C   s*   t  j | ƒ j ƒ  } | |  j | <d | S(   Ns   x-growl-resource://%s(   R0   R1   R<   R   (   R   R&   RR   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   add_resourceå   s    c         C   sP   | |  _  | |  _ |  j j d ƒ } |  j | ƒ |  _ |  j | d ƒ |  _ d  S(   Ns   

i    (   R5   RO   R_   R'   R   Rg   R   (   R   R&   R5   t   parts(    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   decodeî   s
    		c         C   sÔ   t  ƒ  } | j |  j ƒ  ƒ x0 |  j j ƒ  D] \ } } | j d | | ƒ q, W| j ƒ  xn |  j j ƒ  D]] \ } } | j d | ƒ | j d t | ƒ ƒ | j ƒ  | j | ƒ | j ƒ  | j ƒ  qi W| j ƒ  S(   Ns   %s: %ss   Identifier: %ss
   Length: %d(	   R   R   R^   R   t	   iteritemsR   RF   R   t   getvalue(   R   t   buffert   kt   vt   resourceR&   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   ù   s    	


N(   R   R	   R%   R   R   R'   RD   RM   RV   RX   R\   R^   Rg   Ri   Rj   Rl   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   7   s   			$		
							t   GNTPRegisterc           B   sS   e  Z d  d g Z d g Z d d d „ Z d „  Z d „  Z e d „ Z	 d „  Z
 RS(	   s   Application-Names   Notifications-Counts   Notification-Namec         C   sc   t  j |  d ƒ g  |  _ | r2 |  j | | ƒ n- |  j | ƒ |  j d d ƒ |  j d d ƒ d  S(   Nt   REGISTERs   Application-Namet   pygntps   Notifications-Counti    (   R   R   t   notificationsRl   RD   Ri   (   R   R&   R5   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR      s    	c         C   s   x9 |  j  D]. } |  j j | t ƒ s
 t d | ƒ ‚ q
 q
 WxJ |  j D]? } x6 |  j D]+ } | j | t ƒ sV t d | ƒ ‚ qV qV WqF Wd  S(   Ns   Missing Registration Header: s   Missing Notification Header: (   RY   R   R9   RZ   R
   Rv   t   _requiredNotificationHeaders(   R   R[   t   notice(    (    s!   /var/www/SABnzbd/gntp/__init__.pyR\   +  s    c         C   s  | |  _  |  j  j d ƒ } |  j | ƒ |  _ |  j | ƒ |  j | d ƒ |  _ x¹ t | ƒ D]« \ } } | d k r{ q] n  | j ƒ  d k r“ q] n  |  j | ƒ } | j	 d t
 ƒ rÇ |  j j | ƒ q] | j	 d t
 ƒ r] |  j | | ƒ | d <| |  j | j	 d ƒ <q] q] Wd  S(   Ns   

i    R   s   Notification-Namet
   Identifiert   Data(   RO   R_   R'   R   RX   Rg   R   t	   enumerateRc   R9   RZ   Rv   t   appendRV   R   (   R   R&   R5   Rk   RK   t   partRx   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyRl   5  s     	c         C   sO   i  } d | | d <d | | d <|  j  j | ƒ |  j d t |  j  ƒ ƒ d  S(   Nu   %ss   Notification-Names   Notification-Enableds   Notifications-Count(   Rv   R|   Ri   RF   (   R   t   namet   enabledRx   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   add_notificationM  s
    c         C   s:  t  ƒ  } | j |  j ƒ  ƒ x0 |  j j ƒ  D] \ } } | j d | | ƒ q, W| j ƒ  t |  j ƒ d k r¿ xN |  j D]@ } x- | j ƒ  D] \ } } | j d | | ƒ q‹ W| j ƒ  qx Wn  xn |  j j ƒ  D]] \ } } | j d | ƒ | j d t | ƒ ƒ | j ƒ  | j | ƒ | j ƒ  | j ƒ  qÏ W| j	 ƒ  S(   Ns   %s: %si    s   Identifier: %ss
   Length: %d(
   R   R   R^   R   Rm   RF   Rv   R   R   Rn   (   R   Ro   Rp   Rq   Rx   Rr   R&   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   Z  s$    	


N(   R   R	   RY   Rw   R%   R   R\   Rl   RW   R€   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyRs     s   			
	t
   GNTPNoticec           B   s8   e  Z d  d d g Z d d d d d d „ Z d „  Z RS(   s   Application-Names   Notification-Names   Notification-Titlec         C   s…   t  j |  d ƒ | r) |  j | | ƒ nX |  j | ƒ | rO |  j d | ƒ n  | rh |  j d | ƒ n  | r |  j d | ƒ n  d  S(   Nt   NOTIFYs   Application-Names   Notification-Names   Notification-Title(   R   R   Rl   RD   Ri   (   R   R&   t   appR~   t   titleR5   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   ‹  s    c         C   së   | |  _  |  j  j d ƒ } |  j | ƒ |  _ |  j | ƒ |  j | d ƒ |  _ x” t | ƒ D]† \ } } | d k r{ q] n  | j ƒ  d k r“ q] n  |  j | ƒ } | j	 d t
 ƒ r] |  j | | ƒ | d <| |  j | j	 d ƒ <q] q] Wd  S(   Ns   

i    R   Ry   Rz   (   RO   R_   R'   R   RX   Rg   R   R{   Rc   R9   RZ   RV   R   (   R   R&   R5   Rk   RK   R}   Rx   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyRl   ™  s    	N(   R   R	   RY   R%   R   Rl   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   |  s
   
	t   GNTPSubscribec           B   s#   e  Z d  d g Z d d d „ Z RS(   s   Subscriber-IDs   Subscriber-Namec         C   s:   t  j |  d ƒ | r) |  j | | ƒ n |  j | ƒ d  S(   Nt	   SUBSCRIBE(   R   R   Rl   RD   (   R   R&   R5   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   »  s    N(   R   R	   RY   R%   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR…   °  s   	t   GNTPOKc           B   s    e  Z d  g Z d d d „ Z RS(   s   Response-Actionc         C   sC   t  j |  d ƒ | r& |  j | ƒ n  | r? |  j d | ƒ n  d  S(   Ns   -OKs   Response-Action(   R   R   Rl   Ri   (   R   R&   t   action(    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   Ë  s
    N(   R   R	   RY   R%   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR‡   Ã  s   	R   c           B   s/   e  Z d  d g Z d d d d „ Z d „  Z RS(   s
   Error-Codes   Error-Descriptionc         C   sS   t  j |  d ƒ | r& |  j | ƒ n  | rO |  j d | ƒ |  j d | ƒ n  d  S(   Ns   -ERRORs
   Error-Codes   Error-Description(   R   R   Rl   Ri   (   R   R&   R   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   Ü  s    c         C   s(   |  j  j d d  ƒ |  j  j d d  ƒ f S(   Ns
   Error-Codes   Error-Description(   R   R9   R%   (   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   ä  s    N(   R   R	   RY   R%   R   R   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyR   Ó  s   c         C   sÔ   t  j |  ƒ } | s$ t d ƒ ‚ n  | j ƒ  } | d d k rP t |  d | ƒS| d d k rp t |  d | ƒS| d d k r t |  d | ƒS| d d k rª t |  ƒ S| d d k rÄ t |  ƒ St d	 ƒ ‚ d  S(
   Nt   INVALID_GNTP_INFOR   Rt   R5   R‚   R†   s   -OKs   -ERRORt   INVALID_GNTP_MESSAGE(	   t   GNTP_INFO_LINE_SHORTR#   R
   R$   Rs   R   R…   R‡   R   (   R&   R5   R#   R   (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt
   parse_gntpé  s    

(   t   reR0   R:   t   StringIOt   __version__t   compilet
   IGNORECASER"   R‹   R`   R   t	   ExceptionR    R
   R   R   R   t   objectR   Rs   R   R…   R‡   R   R%   RŒ   (    (    (    s!   /var/www/SABnzbd/gntp/__init__.pyt   <module>   s2   Ýh4