ó
9ü½cc           @   s¤  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z d d l Z d d l	 m
 Z
 d d l m Z d d l m Z d d l m Z d d l m Z d d	 l m Z d d
 l m Z d d l m Z d d l m Z d d l m Z d d l m Z e j a d „  Z d Z d Z d Z d Z  d Z! d Z" d Z# d Z$ d Z% y e& e' f Wn e( k
 rƒd Z& d Z' n Xd f  d „  ƒ  YZ) d „  Z* d S(   s  Mixin class for MailList which handles administrative requests.

Two types of admin requests are currently supported: adding members to a
closed or semi-closed list, and moderated posts.

Pending subscriptions which are requiring a user's confirmation are handled
elsewhere.
iÿÿÿÿN(   t   StringIO(   t   MIMEMessage(   t	   Generator(   t   getaddresses(   t   mm_cfg(   t   Utils(   t   Message(   t   Errors(   t   UserDesc(   t   get_switchboard(   t   syslog(   t   i18nc         C   s   |  S(   N(    (   t   s(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   D_0   s    i    i   i   i   t   -s   
t	   ListAdminc           B   sã   e  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 d d d d „ Z i  d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d d d „ Z d „  Z RS(   c         C   s   d |  _  d  S(   Ni   (   t   next_request_id(   t   self(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   InitVarsJ   s    c         C   s+   d  |  _ t j j |  j ƒ  d ƒ |  _ d  S(   Ns   request.pck(   t   Nonet   _ListAdmin__dbt   ost   patht   joint   fullpatht   _ListAdmin__filename(   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   InitTempVarsN   s    	c         C   s¬   |  j  d  k r¨ |  j ƒ  s! t ‚ y7 t |  j ƒ } z t j | ƒ |  _  Wd  | j ƒ  XWq¨ t	 k
 r¤ } | j
 t
 j k r‚ ‚  n  i  |  _  t t j f |  j  d <q¨ Xn  d  S(   Nt   version(   R   R   t   Lockedt   AssertionErrort   openR   t   cPicklet   loadt   closet   IOErrort   errnot   ENOENTt   IGNR   t   REQUESTS_FILE_SCHEMA_VERSION(   R   t   fpt   e(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __opendbR   s     	c         C   sß   |  j  d  k	 rÛ |  j ƒ  s! t ‚ t t j f |  j  d <|  j d } t j	 d ƒ } zX t
 | d ƒ } z7 t j |  j  | d ƒ | j ƒ  t j | j ƒ  ƒ Wd  | j ƒ  XWd  t j	 | ƒ Xd  |  _  t j | |  j ƒ n  d  S(   NR   s   .tmpi   t   wi   (   R   R   R   R   R%   R   R&   R   R   t   umaskR   R   t   dumpt   flusht   fsynct   filenoR!   t   rename(   R   t   tmpfilet   omaskR'   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt	   __closedba   s    
	c         C   sQ   |  j  ƒ  s t ‚ x8 t rL |  j } |  j d 7_ |  j j | ƒ s Pq q W| S(   Ni   (   R   R   t   TrueR   R   t   has_key(   R   t   next(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __nextidy   s    		c         C   s   |  j  ƒ  d  S(   N(   t   _ListAdmin__closedb(   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   SaveRequestsDb‚   s    c         C   s   |  j  ƒ  t |  j ƒ d S(   Ni   (   t   _ListAdmin__opendbt   lenR   (   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   NumRequestsPending…   s    
c         C   sR   |  j  ƒ  g  |  j j ƒ  D]$ \ } \ } } | | k r | ^ q } | j ƒ  | S(   N(   R:   R   t   itemst   sort(   R   t   rtypet   kt   opt   datat   ids(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __getmsgidsŠ   s    
:
c         C   s   |  j  t ƒ S(   N(   t   _ListAdmin__getmsgidst   HELDMSG(   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   GetHeldMessageIds   s    c         C   s   |  j  t ƒ S(   N(   RE   t   SUBSCRIPTION(   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   GetSubscriptionIds“   s    c         C   s   |  j  t ƒ S(   N(   RE   t   UNSUBSCRIPTION(   R   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   GetUnsubscriptionIds–   s    c         C   s!   |  j  ƒ  |  j | \ } } | S(   N(   R:   R   (   R   t   idt   typeRB   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt	   GetRecord™   s    
c         C   s!   |  j  ƒ  |  j | \ } } | S(   N(   R:   R   (   R   RL   RM   RB   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   GetRecordTypež   s    
c   
      C   s²   |  j  ƒ  |  j | \ } } | t k rJ |  j | | | | | | ƒ }	 nK | t k rn |  j | | | ƒ }	 n' | t k s€ t ‚ |  j | | | ƒ }	 |	 t	 k r® |  j | =n  d  S(   N(
   R:   R   RF   t   _ListAdmin__handlepostRJ   t    _ListAdmin__handleunsubscriptionRH   R   t   _ListAdmin__handlesubscriptiont   DEFER(
   R   RL   t   valuet   commentt   preservet   forwardt   addrR?   RB   t   status(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   HandleRequest£   s    
c         C   sp  | j  ƒ  } |  j ƒ  |  j ƒ  } | j ƒ  } t j r@ d } n d } d |  j ƒ  | | f } t j d ƒ } z t	 t j
 j t j | ƒ d ƒ }	 z\ t j r´ t j | |	 d ƒ n t |	 ƒ }
 |
 j | d ƒ |	 j ƒ  t j |	 j ƒ  ƒ Wd  |	 j ƒ  XWd  t j | ƒ X| j d t d ƒ ƒ } | s;t d	 ƒ } n  t j ƒ  | | | | | f } t | f |  j | <| S(
   Nt   pckt   txts   heldmsg-%s-%d.%si   R*   i   t   subjects   (no subject)s	   <missing>(   t   copyR:   t   _ListAdmin__nextidt
   get_senderR   t   HOLD_MESSAGES_AS_PICKLESt   internal_nameR   R+   R   R   R   t   DATA_DIRR   R,   R   t   flattenR-   R.   R/   R!   t   gett   _t   timeRF   R   (   R   t   msgt   reasont   msgdataRL   t   sendert   extt   filenameR2   R'   t   gt
   msgsubjectRB   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   HoldMessage¶   s4    
		!	
c   #      C   sk  | \ } } }	 }
 } } t  j j t j | ƒ } | r¤t  j j | ƒ d j t ƒ } d | d <t j | ƒ } y t | ƒ } Wn, t k
 r¬ } | j	 t	 j
 k r¨ ‚  n  t SXzP | j d ƒ rÑ t j | ƒ } n+ | j d ƒ sð t d | ƒ ‚ | j ƒ  } Wd  | j ƒ  Xt  j j t j | ƒ } t  j j | ƒ \ } } | d } t | d ƒ } z? | j d ƒ r…t | ƒ } | j | d ƒ n | j | ƒ Wd  | j ƒ  Xn  d  } d  } d  } t } | t j k rÔt } nx| t j k rÄy t | ƒ } Wn, t k
 r!} | j	 t	 j
 k r‚  n  t SXt | ƒ } d | d	 <d | d
 <y | d =Wn t k
 r`n Xt j j d d ƒ | d <t  d d |  j! ƒ  | j" d d ƒ ƒ t# t j$ ƒ } | j% | d | ƒnˆ | t j& k r1d } |  j' | ƒ } t j( |	 t j) | ƒ ƒ }	 |  j* t+ d ƒ | | p$t+ d ƒ d | ƒn | t j, k sFt ‚ d } | r| ry t | ƒ } Wn: t k
 r¤} | j	 t	 j
 k r’‚  n  t- j. | ƒ ‚ n Xt/ | g ƒ } t0 | ƒ d k rè| d \ } } |  j' | ƒ } n( g  | D] \ } } | ^ qï} |  j1 } t2 j3 ƒ  }  t2 j4 | ƒ z+ t5 j6 | |  j7 ƒ  t+ d ƒ d | ƒ}! Wd  t2 j8 |  ƒ X|! j9 d ƒ |! j: | ƒ |! j; |  ƒ n  | rd i |  j! ƒ  d 6| d 6t< | ƒ j= d d ƒ d 6t< |	 ƒ j= d d ƒ d  6}" | r|" d! | j= d d ƒ 7}" n  t  d |" ƒ n  | t k rgy t  j> | ƒ Wqgt? k
 rc} | j	 t	 j
 k r_‚  n  t SXn  | S("   Ni   t   spami    s   .pcks   .txts   %s not .pck or .txts   .msgR*   t   approvedt   adminapprovedt   filebaset	   localtimes   X-Mailman-Approved-Att   vettes)   %s: held message approved, message-id: %ss
   message-ids   n/at	   _metadatat   Refuseds,   Posting of your message titled "%(subject)s"s   [No reason given]t   langt	   Discardeds   Forward of moderated messages   message/rfc822sL   %(listname)s: %(rejection)s posting:
	From: %(sender)s
	Subject: %(subject)st   listnamet	   rejectiont   %s   %%Rk   R]   s
   
	Reason: (@   R   R   R   R   Rc   t   splitt   DASHR   R"   R#   R$   t   LOSTt   endswithR   R    R   t   readR!   t   SPAM_DIRt   splitextR   Rd   t   writeR   t   REMOVERS   t   APPROVEt   readMessaget   KeyErrort   emailR   t
   formatdateR
   Rb   Re   R	   t   INQUEUE_DIRt   enqueuet   REJECTt   getMemberLanguaget   onelinet
   GetCharSett   _ListAdmin__refuseRf   t   DISCARDR   t   LostHeldMessageR   R;   t   preferred_languageR   t   get_translationt   set_languageR   t   UserNotificationt   GetBouncesEmailt   set_translationt   set_typet   attacht   sendt   strt   replacet   unlinkt   OSError(#   R   t   recordRT   RU   RV   RW   RX   t   ptimeRk   R]   Ri   Rm   Rj   R   t   partst   spamfileR'   R(   Rh   t   outpatht   headRl   t   outfpRn   R|   RY   t   inqRy   R^   t   addrst   realnamet   at   otranst   fmsgt   note(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __handlepostè   sÐ    
 
	 

		
 	 c         C   s/  |  j  ƒ  |  j ƒ  } t j ƒ  | | | | | f } t | f |  j | <t d d |  j ƒ  | ƒ |  j r+t j	 |  j
 ƒ |  j } t d ƒ }	 t j d i | d 6|  j ƒ  d 6|  j d 6|  j d d	 d
 ƒd 6d |  ƒ}
 |  j ƒ  } t j | | |	 |
 |  j
 ƒ } | j |  i d
 d 6 t j	 | ƒ n  d  S(   NRv   s%   %s: held subscription request from %ss;   New subscription request to list %(realname)s from %(addr)ss   subauth.txtt   usernameR{   t   hostnamet   admindbt   absolutei   t   admindb_urlt   mlistt   tomoderators(   R:   R_   Rg   RH   R   R
   Rb   t   admin_immed_notifyR   R—   R•   t	   real_nameRf   R   t   maketextt	   host_namet   GetScriptURLt   GetOwnerEmailR   R˜   R   (   R   RX   t   fullnamet   passwordt   digestRy   RL   RB   R«   R]   t   textt	   owneraddrRh   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   HoldSubscription|  s.    

				

	c         C   s9  | \ } } } } } }	 | t  j k r+ t S| t  j k rV t d d |  j ƒ  | ƒ nß | t  j k rµ |  j t d ƒ | | p† t d ƒ d |	 ƒt d d |  j ƒ  | | p® d ƒ n€ | t  j k sÊ t	 ‚ yJ t
 a t d ƒ }
 t j a t | | | | |	 ƒ } |  j | d |
 ƒWn t j k
 r*n X|  j ƒ  t S(	   NRv   s*   %s: discarded subscription request from %ss   Subscription requests   [No reason given]Ry   s5   %s: rejected subscription request from %s
	Reason: %ss   via admin approvalt   whence(   R   RS   R“   R
   Rb   RŽ   R’   Rf   t	   SUBSCRIBER   R   R   R   t   ApprovedAddMemberR   t   MMAlreadyAMemberR:   R†   (   R   R¢   RT   RU   t   stimeRX   R¾   R¿   RÀ   Ry   RÄ   t   userdesc(    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __handlesubscription§  s.    		
c         C   sô   |  j  ƒ  |  j ƒ  } t | f |  j | <t d d |  j ƒ  | ƒ |  j rð |  j } t d ƒ } t	 j
 d i | d 6|  j ƒ  d 6|  j d 6|  j d d	 d
 ƒd 6d |  ƒ} |  j ƒ  } t j | | | | |  j ƒ } | j |  i d
 d 6 n  d  S(   NRv   s'   %s: held unsubscription request from %ss8   New unsubscription request from %(realname)s by %(addr)ss   unsubauth.txtR±   R{   R²   R³   R´   i   Rµ   R¶   R·   (   R:   R_   RJ   R   R
   Rb   R¸   R¹   Rf   R   Rº   R»   R¼   R½   R   R˜   R•   R   (   R   RX   RL   R«   R]   RÁ   RÂ   Rh   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   HoldUnsubscriptionÆ  s(    
				

	c         C   sÒ   | } | t  j k r t S| t  j k rD t d d |  j ƒ  | ƒ nŠ | t  j k r‘ |  j t d ƒ | | ƒ t d d |  j ƒ  | | pŠ d ƒ n= | t  j k s¦ t	 ‚ y |  j
 | ƒ Wn t j k
 rÍ n Xt S(   NRv   s,   %s: discarded unsubscription request from %ss   Unsubscription requests7   %s: rejected unsubscription request from %s
	Reason: %ss   [No reason given](   R   RS   R“   R
   Rb   RŽ   R’   Rf   t   UNSUBSCRIBER   t   ApprovedDeleteMemberR   t   NotAMemberErrorR†   (   R   R¢   RT   RU   RX   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __handleunsubscriptionâ  s     	c         C   s  |  j  } | d  k r' |  j | ƒ } n  t j d i | d 6| d 6| d 6|  j ƒ  d 6d | d |  ƒ} t j ƒ  } t j | ƒ zE | r¸ t	 j
 | d t d	 ƒ d
 t | ƒ g ƒ } n  t d ƒ }	 Wd  t j | ƒ Xt j | |  j ƒ  |	 | | ƒ }
 |
 j |  ƒ d  S(   Ns
   refuse.txtR{   t   requestRi   t	   adminaddrRy   R¶   s   ---------- s   Original Messages    ----------s-   Request to mailing list %(realname)s rejected(   R¹   R   R   R   Rº   R½   R   R–   R—   t   NLR   Rf   Rž   Rš   R   R˜   R   (   R   RÐ   t   recipRU   t   origmsgRy   R«   RÁ   R­   R]   Rh   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   __refuseö  s.    	
c         C   s  t  j j |  j ƒ  d ƒ } yA t | ƒ } z t j | ƒ |  _ Wd  | j ƒ  Xt  j	 | ƒ Wn± t
 k
 r} | j t j k r† ‚  n  t  j j |  j ƒ  d ƒ } y4 t | ƒ } z t j | ƒ |  _ Wd  | j ƒ  XWqt
 k
 r} | j t j k rÿ ‚  n  i  |  _ qXn Xxá|  j j ƒ  D]Ð\ } } t | ƒ d k rM| \ } } nc t | ƒ d k r—| d d k rxt } n t } | | f |  j | <q n t s°t d |  j ƒ ‚ | t k rkt | ƒ d k rò| \ } }	 }
 } d	 } |  j } nQ t | ƒ d
 k r"| \ } }	 }
 } } d	 } n! t | ƒ d k s t d ƒ ‚ q | | |	 | |
 | | f f |  j | <q | t k r t | ƒ d
 k r§| \ } } } } } i  } n! t | ƒ d k s t d ƒ ‚ q | | | | | | | f f |  j | <q q W|  j ƒ  d  S(   Ns
   request.dbs   request.pcki   i   i   i    i   s   Unknown record format in %st    i   s"   Unknown subscription record layouts   Unknown held msg record layout(   i    i   (   R   R   R   R   R   t   marshalR    R   R!   R    R"   R#   R$   R   R=   R;   RH   RF   t   FalseR   R   R•   R8   (   R   Rm   R'   R(   RL   t   xRA   t   infot   whenRX   t   passwdRÀ   R¾   Ry   Rk   R]   Ri   RÁ   Rj   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   _UpdateRecords  sf      			N(   t   __name__t
   __module__R   R   R:   R8   R_   R9   R<   RE   RG   RI   RK   RN   RO   R   RZ   Rp   RP   RÃ   RR   RË   RQ   R’   RÝ   (    (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyR   I   s.   														2	”	+			c         C   s}   t  j j |  ƒ d } t |  ƒ } zI | d k rI t j | t j ƒ } n! | d k s[ t ‚ t j	 | ƒ } Wd  | j
 ƒ  X| S(   Ni   s   .txts   .pck(   R   R   R„   R   RŠ   t   message_from_fileR   R   R   R    R!   (   R   Rl   R'   Rh   (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyRˆ   f  s    (+   t   __doc__R   Rg   R#   R   R×   t	   cStringIOR    RŠ   t   email.MIMEMessageR   t   email.GeneratorR   t   email.UtilsR   t   MailmanR   R   R   R   t   Mailman.UserDescR   t   Mailman.Queue.sbcacheR	   t   Mailman.Logging.SyslogR
   R   Rf   R   R%   RF   RH   RJ   RS   R†   R€   R   RÒ   R4   RØ   t	   NameErrorR   Rˆ   (    (    (    s0   /export/web/mailman/mailman/Mailman/ListAdmin.pyt   <module>   sL   		
ÿ ÿ 