ó
lN®Rc           @   s”  d  d l  Z  d  d l Z d  d l Z d d l m Z d g Z d e f d „  ƒ  YZ d „  Z e e j	 ƒ Z	 e e j
 ƒ Z
 e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z e e j ƒ Z 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 f d „  ƒ  YZ d S(   iÿÿÿÿNi   (   t   krb5_ctypest   Contextt   Errorc           B   s   e  Z d  „  Z d „  Z RS(   c         C   s;   | |  _  t j | | ƒ } | j |  _ t j | | ƒ d  S(   N(   t   codeR    t   krb5_get_error_messaget   valuet   messaget   krb5_free_error_message(   t   selft   ctx_rawR   t   msg_c(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   __init__
   s    	c         C   s   |  j  S(   N(   R   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   __str__   s    (   t   __name__t
   __module__R   R   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   	   s   	c            s8   ˆ  j  t j k	 r ˆ  St j ˆ  ƒ ‡  f d †  ƒ } | S(   Nc            s+   ˆ  |  | Œ } | r' t  |  | ƒ ‚ n  | S(   N(   R   (   t   ctxt   argst   ret(   t   fn(    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   wrapped   s    (   t   restypeR    t   krb5_error_codet	   functoolst   wraps(   R   R   (    (   R   s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   check_error   s    c          G   s1   t  j |  Œ  } | r- t t  j ƒ  | ƒ ‚ n  | S(   N(   R    t   krb5_decode_ticketR   t   krb5_context(   R   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   ,   s    c         C   s?   t  |  t ƒ r |  St  |  t ƒ r/ |  j d ƒ St d ƒ ‚ d  S(   Ns   utf-8s   Expected string(   t
   isinstancet   strt   unicodet   encodet	   TypeError(   t   obj(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   to_str2   s
    c           B   s>   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s    t  j ƒ  |  _ t |  j ƒ d  S(   N(   R    R   t   _handlet   krb5_init_context(   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   :   s    c         C   s#   t  |  j ƒ r t |  j ƒ n  d  S(   N(   t   boolR"   t   krb5_free_context(   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   __del__>   s    c         C   s#   t  |  ƒ } t |  j | j ƒ | S(   N(   t   CCachet   krb5_cc_defaultR"   (   R   t   ccache(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt
   cc_defaultB   s    c         C   s›   t  | ƒ } g  | D] } t  | ƒ ^ q } t |  ƒ } g  | D] } t j | ƒ ^ q> } | j t j ƒ  ƒ t |  j | j t | ƒ t j | ƒ | Œ | S(   N(   R!   t	   Principalt   ctypest   c_char_pt   appendt   krb5_build_principalR"   t   len(   R   t   realmt   namet   compt	   principalt	   name_args(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   build_principalG   s    "		c         C   s^   t  | ƒ } t j ƒ  } t j t j | ƒ t j t j ƒ ƒ | _ t	 | ƒ | _
 |  j | ƒ S(   N(   R!   R    t	   krb5_dataR,   t   castR-   t   POINTERt   c_chart   dataR0   t   lengtht   _decode_ticket(   R   R;   t   data_c(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   decode_ticketT   s    c         C   s    t  |  ƒ } t | | j ƒ | S(   N(   t   TicketR   R"   (   R   R>   t   ticket(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR=   ^   s    (   R   R   R   R&   R*   R6   R?   R=   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   9   s   					
R'   c           B   s2   e  Z d  „  Z d „  Z d „  Z e e d „ Z RS(   c         C   s   | |  _  t j ƒ  |  _ d  S(   N(   t   _ctxR    t   krb5_ccacheR"   (   R   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   d   s    	c         C   s,   t  |  j ƒ r( t |  j j |  j ƒ n  d  S(   N(   R$   R"   t   krb5_cc_closeRB   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR&   h   s    c         C   s/   t  |  j ƒ } t |  j j |  j | j ƒ | S(   N(   R+   RB   t   krb5_cc_get_principalR"   (   R   R4   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   get_principall   s
    
c         C   s‹   d } | r | t  j O} n  | r2 | t  j O} n  t  j ƒ  } | j | _ | j | _ t |  j ƒ } t	 |  j j | |  j | | j ƒ | S(   Ni    (
   R    t   KRB5_GC_CACHEDt   KRB5_GC_USER_USERt
   krb5_credsR"   t   clientt   servert   CredentialsRB   t   krb5_get_credentials(   R   RJ   RK   t
   cache_onlyt   user_to_usert   flagst   in_credst   creds(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   get_credentialss   s    
(   R   R   R   R&   RF   t   FalseRS   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR'   c   s
   			R+   c           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  t j ƒ  |  _ d  S(   N(   RB   R    t   krb5_principalR"   (   R   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   ‡   s    	c         C   s,   t  |  j ƒ r( t |  j j |  j ƒ n  d  S(   N(   R$   R"   t   krb5_free_principalRB   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR&   ‹   s    c         C   sE   t  j ƒ  } t |  j j |  j | ƒ | j } t |  j j | ƒ | S(   N(   R,   R-   t   krb5_unparse_nameRB   R"   R   t   krb5_free_unparsed_name(   R   t   name_cR2   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   unparse_name   s
    	c         C   s
   |  j  ƒ  S(   N(   RZ   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   –   s    c         C   s   d |  j  j |  j ƒ  f S(   Ns   <%s: %s>(   t	   __class__R   RZ   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   __repr__™   s    (   R   R   R   R&   RZ   R   R\   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR+   †   s
   				RL   c           B   s5   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   s   | |  _  t j ƒ  |  _ d  S(   N(   RB   R    t   krb5_creds_ptrR"   (   R   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR      s    	c         C   s,   t  |  j ƒ r( t |  j j |  j ƒ n  d  S(   N(   R$   R"   t   krb5_free_credsRB   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR&   ¡   s    c         C   s   |  j  j |  j j j ƒ S(   N(   RB   R=   R"   t   contentsRA   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR?   ¥   s    c         C   s   |  j  j |  j j j ƒ S(   N(   RB   t   _decode_second_ticketR"   R_   t   second_ticket(   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   decode_second_ticket§   s    	c   	      C   s€  i  } |  j  j j j } | j j ƒ  | d <i | j d 6g  t | j ƒ D] } | j | j ƒ  ^ qH d 6| d <|  j	 ƒ  j
 ƒ  | d <|  j  j j } i | j d 6t j | j ƒ  ƒ d 6| d <|  j  j j } g  t d	 ƒ D]$ } | d
 d | >@rø d
 n d ^ qÚ | d <|  j  j j j d | d <|  j  j j j rQ|  j  j j j d | d <n  |  j  j j j d | d <|  j  j j j rš|  j  j j j d | d <n  |  j  j j j } | j j ƒ  | d <i | j d 6g  t | j ƒ D] } | j | j ƒ  ^ qÜd 6| d <g  } d } xW t |  j  j j | ƒ rh|  j  j j | j } | j i | j d 6| j ƒ  d 6ƒ qW| r|| | d <n  | S(   Nt   crealmt   nameTypet
   nameStringt   cnameRA   t   keytypet   keyvaluet   keyi    i   i   i    RP   iè  t   authtimet	   starttimet   endtimet	   renewTillt   srealmt   snamet   addrTypet   addresst   caddr(   R"   R_   RJ   R1   t   as_strt   typet   xrangeR<   R;   R?   t   to_dictt   keyblockt   enctypet   base64t	   b64encodet   contents_as_strt   ticket_flagst   ranget   timesRj   Rk   Rl   t
   renew_tillRK   R$   t	   addressesR.   t   addrtype(	   R   R   t   client_datat   iRw   RP   t   server_datat   addrst   addr(    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyRv   «   sJ    
4
8
4	
(   R   R   R   R&   R?   Rb   Rv   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyRL   œ   s
   				R@   c           B   s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C   s   | |  _  t j ƒ  |  _ d  S(   N(   RB   R    t   krb5_ticket_ptrR"   (   R   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR   Ü   s    	c         C   s,   t  |  j ƒ r( t |  j j |  j ƒ n  d  S(   N(   R$   R"   t   krb5_free_ticketRB   (   R   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR&   à   s    c         C   sÏ   i  } d | d <|  j  j j j } | j j ƒ  | d <i | j d 6g  t | j ƒ D] } | j | j ƒ  ^ qR d 6| d <i |  j  j j	 j
 d 6|  j  j j	 j d 6t j |  j  j j	 j j ƒ  ƒ d	 6| d
 <| S(   Ni   t   tktVnoR1   Rd   Re   Ro   t   kvnot   etypet   ciphert   encPart(   R"   R_   RK   R1   Rs   Rt   Ru   R<   R;   t   enc_partRŠ   Rx   Ry   Rz   t
   ciphertext(   R   R   R„   Rƒ   (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyRv   ä   s    

4#(   R   R   R   R&   Rv   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyR@   Û   s   		(   Ry   R,   R   t    R    t   __all__t	   ExceptionR   R   R#   R%   R(   RD   RE   RV   RW   RX   R/   RM   R^   Rˆ   R   R!   t   objectR   R'   R+   RL   R@   (    (    (    s6   /afs/athena.mit.edu/contrib/scripts/bindev/lib/krb5.pyt   <module>   s2   	
			*#?