Ñò
Y*Nc           @   sª   d  d k  Z  d  d k Z d  d k Z d  d k i Z d  d k i Z d  d k	 i
 Z d  d k l Z l Z l Z d  d k Z d  d k Td  d k l Z d d d „  ƒ  YZ d S(   iÿÿÿÿN(   t   getAttrt   getChildt   jidAttr(   t   *(   t   noexceptt   Clientc           B   sÚ   e  Z d  Z d Z d Z d Z d Z d Z d „  Z e	 d „  ƒ Z
 e	 d „  ƒ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   i    i   i   i   i   u
   conferencec         C   s[   d  |  _ d  |  _ d  |  _ t i |  _ h  |  _ h  |  _ t	 i	 ƒ  |  _
 t	 i	 ƒ  |  _ d  S(   N(   t   Nonet   clan_conference_hostt   bare_jidt
   connectionR   t   STATE_OFFLINEt   statet   entitiest   taskst   Eventt   eventDisconnectedt   eventConnected(   t   self(    (    s   scripts/common/xmpp/Client.pyt   __init__   s    					c         C   s1  t  d | d | d | d f ƒ |  i o t d ƒ t S| d o | d o | d o | d p t d ƒ t St i d | d i ƒ  |  _ | d d | d i ƒ  |  _ |  i	 t i
 ƒ |  i ƒ  |  _ |  i i |  i 7_ |  i i |  i 7_ |  i i |  i 7_ |  i i | | ƒ p t St S(   Ns"   XMPP: Connecting to XMPP %s:%s: %si    i   s4   XMPP: Client::connect: An existing connection existss?   XMPP: Connection: Wrong host or credentials have been provided.u   .u   @(   t	   LOG_NESTER	   t	   LOG_ERRORt   FalseR   t   CLAN_CONFERENCE_NAMEt   lowerR   R   t   _Client__updateStatet   STATE_CONNECT_TCPt   createConnectionR   t   _Client__onConnectedt   eventServerDisconnectedt   _Client__onServerDisconnectedt   eventStanzat   _Client__onStanzat   connectt   True(   R   t   hostt   credentials(    (    s   scripts/common/xmpp/Client.pyR    ,   s"    #

,
c         C   s·   |  i  p d  Sx! |  i i ƒ  D] } | i ƒ  q W|  i  i |  i 8_ |  i  i |  i 8_ |  i  i |  i	 8_ |  i  i
 ƒ  d  |  _  |  i t i ƒ h  |  _ d  |  _ d  |  _ d  S(   N(   R	   R   t   valuest   onDisconnectedR   R   R   R   R   R   t
   disconnectR   R   R   R
   R   R   (   R   t   entity(    (    s   scripts/common/xmpp/Client.pyR&   K   s    
 			c         C   s
   t  i ƒ  S(   N(   t   XMPPConnectiont
   Connection(   R   (    (    s   scripts/common/xmpp/Client.pyR   `   s    c         C   s   |  i  } | |  _  d  S(   N(   R   (   R   t   newStatet   oldState(    (    s   scripts/common/xmpp/Client.pyt   __updateStatec   s    	c   	      C   s$  | d } t  | d ƒ p d } t  | d ƒ p d } t | d ƒ } |  i i | ƒ } | o | i | ƒ n y\ t i t i i	 | ƒ } | o9 |  i
 t | i d ƒ ƒ i | t | i d ƒ ƒ ƒ n Wn t ƒ  n X| d j o7 t | d	 ƒ } | o t d
 | ƒ |  i ƒ  d  Sn d  S(   Nt   namet   fromu    t   idt   barei   i   s   stream:errors   system-shutdowns   XMPP: Stream error: %s(   R    R   R   t   gett   onStanzat   ret   matchR(   R)   t   STANZA_ID_TEMPLATER   t   intt   groupt   digestt   LOG_CURRENT_EXCEPTIONR   R   R   (	   R   t   stanzat
   stanzaNamet
   stanzaFromt   stanzaIdR   R'   R4   t   child(    (    s   scripts/common/xmpp/Client.pyt   __onStateOnlineg   s&    
=
c         C   sQ  | d } t  | d ƒ } t  | d ƒ } | d j o |  i | ƒ n| d j o5 |  i i i ƒ  |  i i t i |  i i d ƒ nÆ | d j o! |  i i t i	 t
 i i ƒ n˜ | d j oz | d	 j oi | d
 j o |  i i t i ƒ q9| d j o4 |  i t i ƒ |  i ƒ  |  i i t i ƒ  ƒ q9qMn t d | | ƒ d  S(   NR-   R/   t   typet	   challenget   successi    s   stream:featurest   iqt   resultt   bind_2t   sess_1s   Unhandled stanza name:(   R    t   _Client__onStanzaAuthChallengeR	   t   parsert	   newParsert
   sendStanzat   XMPPStanzast   STREAM_STARTR"   t   BIND_RESOURCER(   R)   t   RESOURCEt   SESSIONR   R   t   STATE_ONLINER   t   presenceR   (   R   R:   R;   t   stanzaIDt
   stanzaType(    (    s   scripts/common/xmpp/Client.pyt   __onStateAuthenticating‚   s&    
%!
"c      
      s´  d „  } d „  ‰  ‡  f d †  } t  i | d ƒ } | i d ƒ o |  i i t i ƒ nV| i d ƒ d i d ƒ d } d	 } x. t d
 ƒ D]  } | d t	 i
 d d ƒ 7} qŽ W| d i |  i i d |  i i d |  i i d f ƒ ƒ } d i | | | f ƒ }	 d |  i i d }
 d i | d | d ˆ  |
 ƒ f ƒ } | ˆ  |	 ƒ | ƒ } t i |  i i d |  i i d | | |  i i d | f } |  i i t i t  i | ƒ ƒ d  S(   Nc         S   s   t  i |  ƒ i ƒ  S(   N(   t   hashlibt   md5R8   (   t   s(    (    s   scripts/common/xmpp/Client.pyt   H§   s    c         S   s   t  i |  ƒ i ƒ  S(   N(   RU   RV   t	   hexdigest(   RW   (    (    s   scripts/common/xmpp/Client.pyt   HEXH«   s    c            s   ˆ  d |  | f ƒ S(   Ns   %s:%s(    (   t   kRW   (   RZ   (    s   scripts/common/xmpp/Client.pyt   HEXKD¯   s    t   datat   rspauths   nonce=i   t   "t    i    s   %xi    i   t   :s   AUTHENTICATE:xmpp/%st   00000001t   auth(   t   base64t	   b64decodet
   startswithR	   RJ   RK   t   AUTHENTICATION_MD5_ENDt   splitt   ranget   randomt   randintt   joinR#   R"   t   AUTHENTICATION_MD5_BODYt   AUTHENTICATION_MD5_RESPONSEt	   b64encode(   R   t
   nextStanzaRX   R\   RA   t   noncet   cnoncet   it   userHasht   A1t   A2t   tmpJoint   responset   authBody(    (   RZ   s   scripts/common/xmpp/Client.pyt   __onStanzaAuthChallenge¤   s,    		  	3$c         C   s9   |  i  t i ƒ |  i i d t i |  i i d ƒ d  S(   Nu   <?xml version='1.0'?>i    (   R   R   t   STATE_CONNECT_XMPPR	   RJ   RK   RL   R"   (   R   (    (    s   scripts/common/xmpp/Client.pyt   __onConnectedÌ   s    c         C   s"   t  d ƒ |  i ƒ  |  i ƒ  d  S(   Ns*   XMPP: Jabber server has closed connection.(   R   R&   R   (   R   (    (    s   scripts/common/xmpp/Client.pyt   __onServerDisconnectedÐ   s    

c         C   sæ   | d } |  i  t i j oi | d j oX |  i t i ƒ t i d |  i i d |  i i d f ƒ } |  i i	 t
 i | ƒ qâ n] |  i  t i j o |  i | ƒ n9 |  i  t i j o |  i | ƒ n t d |  i  | ƒ d  S(   NR-   s   stream:featurest    %s %si    i   s   Unhandled state (%d) stanza(   R   R   R{   R   t   STATE_AUTHENTICATINGRd   Ro   R	   R#   RJ   RK   t   AUTHENTICATION_PLAINt   _Client__onStateAuthenticatingRP   t   _Client__onStateOnlineR   (   R   R:   R;   t   b64(    (    s   scripts/common/xmpp/Client.pyt
   __onStanzaÕ   s    
-c         C   s<   | i  |  i j o t S| |  i | i  <| i |  i ƒ t S(   N(   R/   R   R   R    R	   R!   (   R   R'   (    (    s   scripts/common/xmpp/Client.pyt   attachEntityó   s
    c         C   s_   | p | i  ƒ  o t d | | i ƒ t S|  i | ƒ | |  i | i <| i |  i ƒ t	 S(   Ns   Can't validate task:(
   t   validR   t
   validationR   t   _Client__subscribeTaskR   R/   R    R	   R!   (   R   t   task(    (    s   scripts/common/xmpp/Client.pyt   addTaskþ   s    c         C   sJ   |  i  i | i ƒ } | p t d | ƒ d  S| i ƒ  |  i | ƒ d  S(   Ns2   XMPP: Can't remove task %s from entity's task list(   R   t   popR/   R   R&   t   _Client__unsubscribeTask(   R   R‰   t   detached(    (    s   scripts/common/xmpp/Client.pyt   __removeTask
  s    
c         C   s(   | i  |  i 7_  | i |  i 7_ d  S(   N(   t   eventSucceededt   _Client__onTaskSucceededt   eventFailedt   _Client__onTaskFailed(   R   R‰   (    (    s   scripts/common/xmpp/Client.pyt   __subscribeTask  s    c         C   s(   | i  |  i 8_  | i |  i 8_ d  S(   N(   R�   R�   R‘   R’   (   R   R‰   (    (    s   scripts/common/xmpp/Client.pyt   __unsubscribeTask  s    c         C   s   |  i  | ƒ d  S(   N(   t   _Client__removeTask(   R   R‰   (    (    s   scripts/common/xmpp/Client.pyt   __onTaskSucceeded  s    c         C   s   |  i  | ƒ d  S(   N(   R•   (   R   R‰   (    (    s   scripts/common/xmpp/Client.pyt   __onTaskFailed  s    (   t   __name__t
   __module__R
   R   R{   R   RP   R   R   R   R    R&   R   R   R‚   R�   RG   R   R   R   R…   RŠ   R•   Rˆ   RŒ   R�   R’   (    (    (    s   scripts/common/xmpp/Client.pyR      s0   					"	(						
			(    (   Rd   RU   R3   t   xmpp.ConnectionR)   R(   t   xmpp.Stanzast   StanzasRK   t   xmpp.Entitiest   Entitiest   XMPPEntitiesR    R   R   R   t   debug_utilst   wotdecoratorsR   R   (    (    (    s   scripts/common/xmpp/Client.pyt   <module>   s   
