
?]Mc           @   s  d  Z  d d k Z d d k Z d d k Z d d k Z d d k Z d d k l Z d d k Z d d k	 l
 Z
 d d k l Z d d k l Z d d k l Z d d k l Z d d	 k l Z d d
 k l Z d d k l Z d d k l Z d d k l Z d d k l Z e i 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' j
 o 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.
iN(   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   i18ni    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 h  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(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   InitVarsH   s    c         C   s+   d  |  _ t i i |  i   d  |  _ d  S(   Ns   request.pck(   t   Nonet   _ListAdmin__dbt   ost   patht   joint   fullpatht   _ListAdmin__filename(   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   InitTempVarsL   s    	c         C   s   |  i  d  j o |  i   p t  y7 t |  i  } z t i |  |  _  Wd  | i   XWq t	 j
 oB } | i
 t
 i j o   n h  |  _  t t i f |  i  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(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __opendbP   s     	c      
   C   s   |  i  d  j	 o |  i   p t  t t i f |  i  d <|  i d } t i	 d  } zX t
 | d  } z7 t i |  i  | d  | i   t i | i    Wd  | i   XWd  t i	 |  Xd  |  _  t i | |  i  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%   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt	   __closedb_   s    
	c         C   sW   |  i    p t  x< t o4 |  i } |  i d 7_ |  i i |  p Pq q W| S(   Ni   (   R   R   t   TrueR   R   t   has_key(   R   t   next(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __nextidw   s     	
c         C   s   |  i    d  S(   N(   t   _ListAdmin__closedb(   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   SaveRequestsDb   s    c         C   s   |  i    t |  i  d S(   Ni   (   t   _ListAdmin__opendbt   lenR   (   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   NumRequestsPending   s    
c         C   s_   |  i    g  } |  i i   D]* \ } \ } } | | j o | | q q ~ } | i   | S(   N(   R8   R   t   itemst   sort(   R   t   rtypet   _[1]t   kt   opt   datat   ids(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __getmsgids   s    
G
c         C   s   |  i  t  S(   N(   t   _ListAdmin__getmsgidst   HELDMSG(   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   GetHeldMessageIds   s    c         C   s   |  i  t  S(   N(   RD   t   SUBSCRIPTION(   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   GetSubscriptionIds   s    c         C   s   |  i  t  S(   N(   RD   t   UNSUBSCRIPTION(   R   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   GetUnsubscriptionIds   s    c         C   s!   |  i    |  i | \ } } | S(   N(   R8   R   (   R   t   idt   typeRA   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt	   GetRecord   s    
c         C   s!   |  i    |  i | \ } } | S(   N(   R8   R   (   R   RK   RL   RA   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   GetRecordType   s    
c   
      C   s   |  i    |  i | \ } } | t j o" |  i | | | | | |  }	 nP | t j o |  i | | |  }	 n* | t j p t  |  i | | |  }	 |	 t	 j o |  i | =n d  S(   N(
   R8   R   RE   t   _ListAdmin__handlepostRI   t    _ListAdmin__handleunsubscriptionRG   R   t   _ListAdmin__handlesubscriptiont   DEFER(
   R   RK   t   valuet   commentt   preservet   forwardt   addrR=   RA   t   status(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   HandleRequest   s    
c         C   s_  | i    } |  i   |  i   } | i   } t i o
 d } n d } d |  i   | | f } t i d  } z t	 t i
 i t i |  d  }	 z^ t i o t i | |	 d  n t |	  }
 |
 i | d  |	 i   t i |	 i    Wd  |	 i   XWd  t i |  X| i d t d   } t i   | | | | | f } t | f |  i | <| S(	   Nt   pckt   txts   heldmsg-%s-%d.%si   R(   i   t   subjects   (no subject)(   t   copyR8   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   timeRE   R   (   R   t   msgt   reasont   msgdataRK   t   sendert   extt   filenameR0   R%   t   gt
   msgsubjectRA   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   HoldMessage   s0    


!

c   $      C   s6  | \ } } }	 }
 } } t  i i t i |  } | ot  i i |  d i t  } d | d <t i |  } y t |  } Wn0 t j
 o$ } | i	 t	 i
 j o   n t SXz t i |  } Wd  | i   Xt  i i t i |  } t  i i |  \ } } | d } t | d  } z  t |  } | i | d  Wd  | i   Xn d  } d  } d  } t } | t i j o
 t } n}| t i j o y t |  } Wn0 t j
 o$ } | i	 t	 i
 j o   n t SXt |  } d | d <d | d <y | d =Wn t j
 o n Xt i i d	 d  | d
 <t d d | i d d   t t i  } | i  | d | n | t i! j o` d } |  i" |  } t i# |	 t i$ |   }	 |  i% t& d  | | p
 t& d  d | n | t i' j p t(  d } | oM| oFy t |  } Wn> t j
 o2 } | i	 t	 i
 j o   n t) i* |   n Xt+ | g  } t, |  d j o# | d \ } } |  i" |  } n1 g  } | D] \ } }  | |  q~ } |  i- } t. i/   }! t. i0 |  z+ t1 i2 | |  i3   t& d  d | }" Wd  t. i4 |!  X|" i5 d  |" i6 |  |" i7 |   n | o d h |  i8   d 6| d 6t9 |  i: d d  d 6t9 |	  i: d d  d 6}# | o |# d | i: d d  7}# n t d |#  n | t j oH y t  i; |  Wq2t< j
 o$ } | i	 t	 i
 j o   n t SXn | S(   Ni   t   spami    s   .msgR(   t   approvedt   adminapprovedt   filebaset	   localtimes   X-Mailman-Approved-Att   vettes%   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   %%Rj   R\   s
   
	Reason: (=   R   R   R   R   Rb   t   splitt   DASHR   R    R!   R"   t   LOSTR   R   R   t   SPAM_DIRt   splitextR   Rc   R   t   REMOVERR   t   APPROVEt   readMessaget   KeyErrort   emailR   t
   formatdateR
   Rd   R	   t   INQUEUE_DIRt   enqueuet   REJECTt   getMemberLanguaget   onelinet
   GetCharSett   _ListAdmin__refuseRe   t   DISCARDR   R   t   LostHeldMessageR   R9   t   preferred_languageR   t   get_translationt   set_languageR   t   UserNotificationt   GetBouncesEmailt   set_translationt   set_typet   attacht   sendRa   t   strt   replacet   unlinkt   OSError($   R   t   recordRS   RT   RU   RV   RW   t   ptimeRj   R\   Rh   Rl   Ri   R   t   partst   spamfileR%   R&   Rg   t   outpatht   headRk   t   outfpRm   R{   RX   t   inqRx   R]   t   addrst   realnameR>   t   at   otranst   fmsgt   note(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __handlepost   s    
 

 

	 '	 
c         C   s  |  i    |  i   } t i   | | | | | f } t | f |  i | <t d d |  i   |  |  i o |  i } t	 d  }	 t
 i d h | d 6|  i   d 6|  i d 6|  i d d	 d
 d 6d |  }
 |  i   } t i | | |	 |
 |  i  } | i |  h d
 d 6 n d  S(   NRu   s%   %s: held subscription request from %ss;   New subscription request to list %(realname)s from %(addr)ss   subauth.txtt   usernameRz   t   hostnamet   admindbt   absolutei   t   admindb_urlt   mlistt   tomoderators(   R8   R^   Rf   RG   R   R
   Ra   t   admin_immed_notifyt	   real_nameRe   R   t   maketextt	   host_namet   GetScriptURLt   GetOwnerEmailR   R   R   R   (   R   RW   t   fullnamet   passwordt   digestRx   RK   RA   R   R\   t   textt	   owneraddrRg   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   HoldSubscriptionp  s*    

	
		

	c      	   C   s*  | \ } } } } } }	 | t  i j o t S| t  i j o t d d |  i   |  n | t  i j oS |  i t d  | | p
 t d  d |	 t d d |  i   | | p d  nj | t  i j p t	  y/ t
 | | | | |	  }
 |  i |
 d d Wn t i j
 o n X|  i   t S(	   NRu   s*   %s: discarded subscription request from %ss   Subscription requests   [No reason given]Rx   s5   %s: rejected subscription request from %s
	Reason: %st   whences   via admin approval(   R   RR   R   R
   Ra   R   R   Re   t	   SUBSCRIBER   R   t   ApprovedAddMemberR   t   MMAlreadyAMemberR8   R   (   R   R   RS   RT   t   stimeRW   R   R   R   Rx   t   userdesc(    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __handlesubscription  s(    	!
c         C   s   |  i    |  i   } t | f |  i | <t d d |  i   |  |  i o |  i } t d  } t	 i
 d h | d 6|  i   d 6|  i d 6|  i d d	 d
 d 6d |  } |  i   } t i | | | | |  i  } | i |  h d
 d 6 n d  S(   NRu   s'   %s: held unsubscription request from %ss8   New unsubscription request from %(realname)s by %(addr)ss   unsubauth.txtR   Rz   R   R   R   i   R   R   R   (   R8   R^   RI   R   R
   Ra   R   R   Re   R   R   R   R   R   R   R   R   R   (   R   RW   RK   R   R\   R   R   Rg   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   HoldUnsubscription  s(    
	
		

	c         C   s   | } | t  i j o t S| t  i j o t d d |  i   |  n | t  i j o@ |  i t d  | |  t d d |  i   | | p d  nB | t  i j p t	  y |  i
 |  Wn t i j
 o n Xt S(   NRu   s,   %s: discarded unsubscription request from %ss   Unsubscription requests7   %s: rejected unsubscription request from %s
	Reason: %ss   [No reason given](   R   RR   R   R
   Ra   R   R   Re   t   UNSUBSCRIBER   t   ApprovedDeleteMemberR   t   NotAMemberErrorR   (   R   R   RS   RT   RW   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __handleunsubscription  s     	!c      	   C   s  |  i  } | d  j o |  i |  } n t i d h | d 6| d 6| d 6|  i   d 6d | d |  } t i   } t i |  zG | o0 t	 i
 | d t d	  d
 t |  g  } n t d  }	 Wd  t i |  Xt i | |  i   |	 | |  }
 |
 i |   d  S(   Ns
   refuse.txtRz   t   requestRh   t	   adminaddrRx   R   s   ---------- s   Original Messages    ----------s-   Request to mailing list %(realname)s rejected(   R   R   R   R   R   R   R   R   R   t   NLR   Re   R   R   R   R   R   (   R   R   t   recipRT   t   origmsgRx   R   R   R   R\   Rg   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   __refuse  s.    	
c         C   s  t  i i |  i   d  } yA t |  } z t i |  |  _ Wd  | i   Xt  i	 |  Wn t
 j
 o } | i t i j o   n t  i i |  i   d  } y4 t |  } z t i |  |  _ Wd  | i   XWqt
 j
 o, } | i t i j o   n h  |  _ qXn Xx|  i i   D]\ } } t |  d j o | \ } } ng t |  d j o; | d d j o
 t } n t } | | f |  i | <q(n t p t d |  i  | t j o t |  d j o% | \ } }	 }
 } d	 } |  i } nS t |  d
 j o | \ } }	 }
 } } d	 } n! t |  d j p
 t d  q(| | |	 | |
 | | f f |  i | <q(| t j o{ t |  d
 j o | \ } } } } } h  } n! t |  d j p
 t d  q(| | | | | | | f f |  i | <q(q(W|  i   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;   R9   RG   RE   t   FalseR   R   R   R6   (   R   Rl   R%   R&   RK   t   xR@   t   infot   whenRW   t   passwdR   R   Rx   Rj   R\   Rh   R   Ri   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   _UpdateRecords  sh       


N(   t   __name__t
   __module__R   R   R8   R6   R^   R7   R:   RD   RF   RH   RJ   RM   RN   R   RY   Ro   RO   R   RQ   R   RP   R   R   (    (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyR   G   s.   														0		(			c         C   s   t  i i |   d } t |   } zM | d j o t i | t i  } n$ | d j p t  t i	 |  } Wd  | i
   X| S(   Ni   s   .txts   .pck(   R   R   R   R   R   t   message_from_fileR   R   R   R   R   (   R   Rk   R%   Rg   (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyR   S  s    (*   t   __doc__R   Rf   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   Re   R#   RE   RG   RI   RR   R   R   R~   R   R2   R   t	   NameErrorR   R   (    (    (    s%   /usr/lib/mailman/Mailman/ListAdmin.pyt   <module>   sJ   	  
