ó
‚•oTc           @   s  d  d l  Z  d  d l Z d  d l m Z d  d l m Z d  d l Z d  d l Z d  d l Z d  d l	 Td  d l
 Z y, d  d l m Z e Z e j Z [ e Z Wn3 e k
 rÓ d Z e Z d e f d „  ƒ  YZ n Xd  d l Z e j Z [ d  d l Z e j e ƒ d „  Z d	 „  Z d
 „  Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ  d e f d „  ƒ  YZ! d „  Z" e" ƒ  Z# d S(   iÿÿÿÿN(   t   Thread(   t   NNTPPermanentError(   t   *(   t   SSLt   WantReadErrorc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s   | |  _  d  S(   N(   t	   parameter(   t   selft   value(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   __init__.   s    c         C   s   t  |  j ƒ S(   N(   t   reprR   (   R   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   __str__0   s    (   t   __name__t
   __module__R   R
   (    (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR   -   s   	c         C   si   t  |  j |  j ƒ } | d  k r6 |  j |  j 7_ n	 d |  _ | t |  _ |  _ t	 j
 j j j ƒ  d  S(   Ni    (   t   GetServerParmst   hostt   portt   Nonet   bad_const   threadst   Falset   infot   requestt   sabnzbdt
   downloadert
   Downloadert   dot   wakeup(   t   serverR   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   _retrieve_infoB   s    	c         C   s5   |  j  s1 t |  _  t d t d |  f ƒ j ƒ  n  d  S(   Nt   targett   args(   R   t   TrueR    R   t   start(   R   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   request_server_infoO   s    		c         C   sÿ   y t  | ƒ Wn d } n Xt j j ƒ  } yl t j |  | d t j ƒ } | d k si t rm | d k rm | Sg  | D]  } d | d d k rt | ^ qt SWn_ | d k s½ t rö | d k rö y, t j |  | t j t j t j	 t j
 ƒ SWqö qö Xn  d  SXd  S(   Niw   i    i   i   t   :i   (   t   intR   t   cfgt   ipv6_serverst   sockett   getaddrinfot   SOCK_STREAMt   _EXTERNAL_IPV6t   AF_INET6t
   IPPROTO_IPt   AI_CANONNAMER   (   R   R   t   optt   ipst   ip(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR   W   s$    
/c   	      C   sD  yž |  j  | | f ƒ |  j d ƒ | r{ t r{ xI t rw y |  j ƒ  PWq2 t k
 rs t j |  g g  g  d ƒ q2 Xq2 Wn  | d  k	 r | j | |  j	 ƒ  <n  WnŸ t
 j k
 r} zV t | t ƒ rÔ | \ } } n" t j t | ƒ } } | | f } | t j k rn  Wd  | j | ƒ Xn# t j k
 r?} | j | ƒ n Xd  S(   Ni    g      ð?(   t   connectt   setblockingt   _sslR   t   do_handshakeR   t   selectR   t   nwt   filenoR&   t   errort
   isinstancet   tuplet   errnot	   ETIMEDOUTt   strt   EINPROGRESSt   Error(	   t   sockR   R   t
   sslenabledt	   write_fdst   nntpt   et   _errnot   strerror(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   cont   s.    	
$t   NNTPc           B   s&   e  Z d d e d d  „ Z d „  Z RS(   c
      
   C   sø  | |  _  | |  _ | |  _ | |  _ d  |  _ | sc | rK t | | ƒ } qc t j t	 j
 d ƒ ‚ n  | d \ }
 } } } } | rt rt j j j ƒ  } | d k r» t j t j ƒ } n3 | d k rÜ t j t j ƒ } n t j t j ƒ } t | t j |
 | | ƒ ƒ |  _ nS | rMt rMt j t d ƒ ƒ t j |
 | | ƒ |  _ n t j |
 | | ƒ |  _ yí | s¥t d t d |  j |  j  |  j | |	 |  f ƒ j ƒ  n¬ | r¾|  j j d ƒ n  |  j j |  j  |  j f ƒ | só|  j j d ƒ n  | rQt rQxO t rMy |  j j ƒ  PWqt  k
 rIt! j! |  j g g  g  d	 ƒ qXqWn  WnŸ t j k
 rÑ} zV t" | t# ƒ rˆ| \ } } n" t	 j$ t% | ƒ } } | | f } | t	 j& k r¼n  Wd  |  j | ƒ Xn# t j' k
 ró} |  j | ƒ n Xd  S(
   Ns:   Address not available - Check for internet or DNS problemsi    t   v2t   v3s7   Error importing OpenSSL module. Connecting with NON-SSLR   R   i
   g      ð?((   R   R   R5   t   blockingR   t	   error_msgR   R&   R7   R:   t   EADDRNOTAVAILR2   R   R$   t   ssl_typet   gett   Contextt   SSLv2_METHODt   SSLv3_METHODt   SSLv23_METHODt   SSLConnectionR?   t   loggingt   TaR    RF   R    t
   settimeoutR0   R1   R   R3   R   R4   R8   R9   R;   R<   R=   R>   (   R   R   R   R   R@   R5   t   usert   passwordt   blockRA   t   aft   socktypet   protot	   canonnamet   saRM   t   ctxRC   RD   RE   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR   š   s`    					$7	+c         C   s—   d t  | ƒ k r d } n  d t  | ƒ } d | |  j j |  j |  j f } | |  _ |  j rw t j t	 j
 | ƒ ‚ n t j | ƒ | |  j j _ d  S(   Nt   SSL23_GET_SERVER_HELLOs+   This server does not allow SSL on this ports   Failed to connect: %ss   %s %s@%s:%s(   R<   R5   t   thrdnumR   R   RK   RJ   R&   R7   R:   t   ECONNREFUSEDRT   R   R   t   warning(   R   R7   t   msg(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR7   à   s    	"		N(   R   R   R   R   R   R7   (    (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyRG   ™   s   Ft   NewsWrapperc           B   sh   e  Z e d  „ Z d „  Z d „  Z d „  Z d „  Z e d „ Z d „  Z	 e
 e
 d „ Z e d „ Z RS(	   c         C   s”   | |  _  | |  _ | |  _ d  |  _ d  |  _ d |  _ g  |  _ d  |  _ d  |  _	 t
 |  _ t
 |  _ t
 |  _ d  |  _ t
 |  _ t
 |  _ t
 |  _ d  S(   Nt    (   R   Ra   RJ   R   t   timeoutt   articlet   datat   linesRB   t   recvR   t	   connectedt	   user_sentt	   pass_sentt   groupt   user_okt   pass_okt   force_login(   R   R   Ra   RY   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR   í   s     															c      
   C   s}   t  |  j j |  j j |  j j |  j j |  |  j j |  j j |  j | ƒ	 |  _	 |  j	 j
 j |  _ t j ƒ  |  j j |  _ d  S(   N(   RG   R   t   hostipR   R   t   sslt   usernameRX   RJ   RB   R?   Rk   t   timeRg   (   R   RA   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   init_connect  s    *$c         C   s  |  j  j p |  j  j p |  j sQ t |  _ t |  _ t |  _ t |  _ t |  _	 n  | d k r |  j r d } t |  _ t |  _ n  | d k rÆ t |  _ t
 |  _ t
 |  _ t
 |  _ t
 |  _ t
 |  _	 n  | d k rè t |  j d ƒ ‚ n |  j s d |  j  j } |  j j j | ƒ t |  _ nW |  j sw| d k rAt |  _ qw| d	 k rwt |  _ t |  _ t |  _	 t |  _ qwn  |  j r¹|  j r¹d
 |  j  j } |  j j j | ƒ t |  _ nA |  j rú|  j	 rú| d	 k rît |  j d ƒ ‚ qút |  _ n  t j ƒ  |  j  j |  _ d  S(   Nt   501t   481t   480t   400t   502i    s   authinfo user %s
t   381t   281s   authinfo pass %s
(   R{   R|   (   R   Ru   RX   Rr   R   Rl   Rm   Rp   Rn   Rq   R   R   Rj   RB   R?   t   sendallRv   Rg   (   R   t   codet   command(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   finish_connect  sP    !															c         C   s—   t  j  ƒ  |  j j |  _ | rQ |  j j r> d |  j j } q€ d |  j j } n/ |  j j rp d |  j j } n d |  j j } |  j j j | ƒ d  S(   Ns   STAT <%s>
s   HEAD <%s>
s   BODY <%s>
s   ARTICLE <%s>
(	   Rv   R   Rg   t	   have_statRh   t	   have_bodyRB   R?   R   (   R   t   precheckR   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   body@  s    c         C   s:   t  j  ƒ  |  j j |  _ d | } |  j j j | ƒ d  S(   Ns
   GROUP %s
(   Rv   R   Rg   RB   R?   R   (   R   Ro   R   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt
   send_groupM  s    
c         C   s0  t  j  ƒ  |  j j |  _ xE y |  j d ƒ } PWq t k
 r\ | rL q q] d t t f Sq Xq W|  j | 7_ |  j j d ƒ } t	 | ƒ d k r¸ d |  j k r¸ |  j j d ƒ } n  | j
 ƒ  |  _ |  j j | ƒ |  j r|  j d d k r|  j d d !|  _ t	 | ƒ t t f St	 | ƒ t t f Sd  S(	   Ni €  i    s   
i   s   s   
iÿÿÿÿt   .(   Rv   R   Rg   Rk   R   R   R   Ri   t   splitt   lent   popRj   t   extend(   R   RY   t   chunkt	   new_lines(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt
   recv_chunkR  s&    !c         C   s(   d  |  _ d  |  _ d |  _ g  |  _ d  S(   NRf   (   R   Rg   Rh   Ri   Rj   (   R   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt
   soft_resetu  s    			c         C   s¢   |  j  rS y= | r5 |  j  j j d ƒ t j d ƒ n  |  j  j j ƒ  WqS qS Xn  |  j |  j |  j ƒ | r‹ t j ƒ  |  j j	 |  _	 n t j ƒ  d |  _	 d  S(   Ns   QUIT
gš™™™™™¹?i   (
   RB   R?   R   Rv   t   sleept   closeR   R   Ra   Rg   (   R   t   waitt   quit(    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt
   hard_reset{  s    	c         C   s]   |  j  rS y= | r5 |  j  j j d ƒ t j d ƒ n  |  j  j j ƒ  WqS qS Xn  |  `  d  S(   Ns   QUIT
gš™™™™™¹?(   RB   R?   R   Rv   R‘   R’   (   R   R”   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt	   terminate  s    	(   R   R   R   R   Rw   R‚   R†   R‡   R   R   R   R•   R–   (    (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyRe   ì   s   		4		#	RS   c        "   B   s4   e  Z d  „  Z x  d% D] Z d# e e f d$ Uq WRS(&   c         G   s%   t  t j | ƒ |  _ t ƒ  |  _ d  S(   N(   t   applyR2   t
   Connectiont	   _ssl_connt   _RLockt   _lock(   R   R   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyR     s    t   get_contextt   pendingt   sendt   writeRk   t   readt   renegotiatet   bindt   listenR0   t   acceptR1   R6   t   shutdownR’   t   get_cipher_listt   getpeernamet   getsocknamet
   getsockoptt
   setsockoptt   makefilet   get_app_datat   set_app_datat   state_stringt   sock_shutdownt   get_peer_certificatet	   want_readt
   want_writet   set_connect_statet   set_accept_statet
   connect_exR   R3   RV   s·   def %s(self, *args):
            self._lock.acquire()
            try:
                return apply(self._ssl_conn.%s, args)
            finally:
                self._lock.release()
N("   Rœ   R   Rž   RŸ   Rk   R    R¡   R¢   R£   R0   R¤   R1   R6   R¥   R’   R¦   R§   R¨   R©   Rª   R«   R¬   R­   R®   R¯   R°   R±   R²   R³   R´   Rµ   R   R3   RV   (   R   R   R   t   f(    (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyRS   œ  s   	      
c          C   s©   y. t  j d d t  j t  j t  j t  j ƒ }  Wn t SXya |  d \ } } } } } t  j  | | | ƒ } | j d ƒ | j | d d !ƒ | j	 ƒ  t
 SWn t SXd  S(   Ns   www.google.comiP   i    i   i   (   R&   R'   R*   R(   R+   R,   R   RV   R0   R’   R   (   R   RZ   R[   R\   R]   R^   R?   (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt	   test_ipv6±  s    
($   R:   R&   t	   threadingR    t   nntplibR   Rv   RT   R   t   sabnzbd.constantst   sabnzbd.cfgt   OpenSSLR   R2   R   R   t   HAVE_SSLt   ImportErrorR   R   t	   Exceptiont   RLockRš   R4   t   setdefaulttimeoutt   DEF_TIMEOUTR   R!   R   RF   t   objectRG   Re   RS   R·   R)   (    (    (    s'   /var/www/SABnzbd/sabnzbd/newswrapper.pyt   <module>   s@   
	
					%S°	