
    ek[                     .   d dl Z d dlZd dl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Zd dlmZmZmZ d dl
mZmZmZ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Z!ejD                  jG                  d      d    Z$d Z% G d d      Z&y)    N)OptionParser)get_os_name)UI_LISTsetglobaluigetglobalui)
threadutilaccountsfoldermbnames)globals)CustomConfigParser)
stacktrace)
Repository)MSGCOPY_NAMESPACEMAX_ACCOUNTS c                 <   t        j                         }| D ]s  }t        j                  ||      }t        j                  t
        |j                  d|z        }|j                  d       |j                          |j                  |       u |j                          y)zDThe target when in multithreading mode for running accounts threads.Account sync %s)targetnameTN)r   accountThreadsr	   SyncableAccountInstanceLimitedThreadACCOUNT_LIMITED_THREAD_NAME
syncrunner	setDaemonstartaddwait)list_accountsconfigthreadsaccountnameaccountthreads         +/usr/share/offlineimap3/offlineimap/init.py	syncitallr'   .   s     '')G$ **6;?11'%%"[0

 	F LLN    c                   N    e Zd ZdZd Zd Zd ZddZd Zd Z	d Z
d	 Zd
 Zd Zy)OfflineImapzThe main class that encapsulates the high level use of OfflineImap.

    To invoke OfflineImap you would call it with::

      oi = OfflineImap()
      oi.run()
    c                     	 t         j                  }d|dt        }	 dd l}|d|j                  }|S # t        $ r t        j                         }Y C d}Y HxY w#  Y |S xY w)Nz Unknownz
imaplib2 vz
, Python vr   , )imaplib__version__AttributeErrorversionPYTHON_VERSIONsslOPENSSL_VERSION)selfl_imaplib_versioninfor2   s       r&   get_env_infozOfflineImap.get_env_infoK   sq    	+ ' 3 3 .?O	#S%8%89D   	2 ' 1	+ *	s   6 A AAA"c                    | j                         \  }}|j                  r| j                  |       y|j                  r| j	                  |       y|j
                  ryt        j                  | j                  | j                  |j                         t        j                  | j                  j                  dd             t        j                          y|j                  r| j                  |      S | j!                  |      S )z+Parse the commandline and invoke everythinggeneralr	   N)_OfflineImap__parse_cmd_optionsdiagnostics_OfflineImap__serverdiagnosticsmigrate_fmd5_OfflineImap__migratefmd5mbnames_pruner   initr!   uidryrunprunegetwritedeletefolder_OfflineImap__deletefolder_OfflineImap__sync)r4   optionsargss      r&   runzOfflineImap.run_   s     002$$W-!!w'""LLdggw~~>MM$++//)Z@AMMO!!&&w//;;w''r(   c                 L   t        t        j                  t        j                  dt        j                        }|j                  ddddd       |j                  d	dd
dd       |j                  ddddd       |j                  ddddd       |j                  dddd       |j                  dddd       |j                  dddd d       |j                  d d!d"d#       |j                  d$d%dd&       |j                  d'dd(dd)       |j                  d*d+d,d-       |j                  d.d/d0d1d23       |j                  d4dd5dd6       |j                  d7dd8dd9       |j                  d:d;d<=       |j                  d>d?d d@dAB       |j                  dCddDddE       |j                  dFddGddH       |j                  dIddJddK       |j                  dLddMddN       |j                         \  }}t        j                  |       |j                  rBt        dOt        j                  dP| j                                t        j                  dQ       |j                  sdR}|t        j                   vst        j                   |   s t        j"                  j%                  dS      }nt        j                   |   }t        j"                  j'                  |dTdU      |_        t        j"                  j)                  |j                        s$t        j"                  j%                  dV      |_        |j                  }n)t        j"                  j%                  |j                        }t+               }t        j"                  j)                  |      s-t-        j.                  dW|z         t        j                  dX       |j1                  |       |j2                  r|j4                  st-        j6                  dY       dZ|_        t        j"                  j)                  |j2                        r#t-        j6                  d[|j2                  z         nt        j8                  |j2                         t-        j6                  d\|j2                  z         |j:                  rg|j:                  D ]X  }|j=                  d]dX      \  }	}
d^|	v r(|	j=                  d^dX      \  }}	|j?                  d_d`      }nda}|jA                  ||	|
       Z |jC                  dadbdc      }|jD                  |jD                  }dd|v rV|j=                  dd      de   }t-        j6                  dfdPj'                  tG        tI        jJ                                     z         |jL                  rdc}|jN                  r|jA                  dadgdh       |jQ                  dadgdi       |jR                  r|jA                  dadjdh       |jQ                  dadjdh       |jT                  r|jA                  dadkdh       |jQ                  dadkdi       	 tI        |jW                            |      | _,        t]        | jX                         |j^                  r%| jX                  ja                  |j^                         |jb                  r| jX                  je                          | jX                  jg                          | jX                  ji                  | j                                |jj                  r| jX                  jl                  jo                  t,        jp                         |jj                  jW                         dnk(  rdo|_5        dp|jj                  j=                  dq      v r|j4                  r"| jX                  js                  dr       dZ|_        |jj                  j=                  dq      dsgz   }|D ]-  }|ju                         }| jX                  jw                  |       / |jx                  rS|j{                  dtdu      r|j}                  dtdu       t        j                  |      D ]  }|j}                  dv|z   du        |j                  r0t        j                  |      D ]  }|jA                  dv|z   d8d        |j                  r||j                  j=                  dq      }dw|z  }dx}t        j                  |      D ]B  }dv|z   }dy|j                  |dz      z   }|jA                  |d{|       |jA                  |d||       D |j^                  r| jX                  j^                  t        _D        |j                  dad}dQ      }|dQkD  rt        j                  |       t        j                  t        |j                  dad~dX             |j                  d      D ]p  }t~        j                  |z   t        |z   fD ]O  }|j4                  rt        j                  |dX       &t        j                  ||j                  dy|z   dd             Q r || _N        ||fS # tZ        $ r^ t-        j.                  dl|dmdPj'                  tG        tI        jJ                                            t        j                  dX       Y Iw xY w)Nz.

)r0   descriptionz-V
store_truer0   Fzshow full version infos)actiondestdefaulthelpz	--dry-runrB   zdry run modez--infor;   z7output information on the configured email repositoriesz-1singlethreadingz6(the number one) disable all multithreading operationsz-P
profiledirDIRz#sets OfflineIMAP into profile mode.)rP   metavarrR   z-ar	   zaccount1[,account2[,...]]zlist of accounts to syncz-c
configfileFILEz%specifies a configuration file to use)rP   rV   rQ   rR   z-d	debugtypeztype1[,type2[,...]]zAenables debugging for OfflineIMAP  (types: imap, maildir, thread)z-llogfilezlog to FILEz-ssyslogzlog to syslogz-ffolderszfolder1[,folder2[,...]]zonly sync the specified foldersz-kconfigoverrideappendz[section:]option=valuez"override configuration file option)rP   rO   rV   rR   z-orunoncez"run only once (ignore autorefresh)z-qquickz4run only quick synchronizations (don't update flags)z-u	interfacez_specifies an alternative user interface (quiet, basic, syslog, ttyui, blinkenlights, machineui))rP   rR   z--delete-folderrF   
FOLDERNAMEz*Delete a folder (on the remote repository))rP   rQ   rV   rR   z--migrate-fmd5-using-nametransr=   z0migrate FMD5 hashes from versions prior to 6.3.5z--mbnames-pruner?   z3remove mbnames entries for accounts not in accountsz--ignore-keyringignore_keyringz1Ignore password which is stored in system keyringz--update-keyringupdate_keyringz(Update system keyring with used passwordzofflineimap vr,   r   XDG_CONFIG_HOMEz	~/.configofflineimapr!   z~/.offlineimaprcz/ *** Config file '%s' does not exist; aborting!   z(Profile mode: Forcing to singlethreaded.Tz,Profile mode: Directory '%s' already exists!z<Profile mode: Potentially large data will be created in '%s'=:_r   r9   rA   ttyui.z2Using old interface name, consider using one of %szdry-runTrueFalsezignore-keyringzupdate-keyringzUI 'z!' does not exist, choose one of: allzimap,maildir,threadr%   ,z&Debug mode: Forcing to singlethreaded. DEFAULTautorefreshzAccount zlambda f: f in %sz[]zRepository remoterepositoryfolderfilterfolderincludessocktimeoutmaxsyncaccountsr   maxconnections   )Or   rf   r.   __copyright____license__
add_option
parse_argsglobset_optionsr0   printr7   sysexitrW   osenvironpath
expanduserjoinexistsr   loggingerrorreadrT   rS   warningmkdirr]   splitreplaceset
getdefaultra   listr   keysr;   rB   set_if_not_existsrc   rd   lowerrA   KeyErrorr   rZ   
setlogfiler[   setup_sysloghandlerinit_bannerr6   rY   loggersetLevelDEBUG_msgstrip	add_debugr_   
has_optionremove_optionr	   getaccountlistr`   r\   rD   stderrgetdefaultintsocketsetdefaulttimeoutr   initInstanceLimitr   getsectionlistFOLDER_NAMESPACEr   r!   )r4   parserrI   rJ   xdg_varxdg_homeconfigfilenamer!   optionkeyvaluesecnamesectionui_type
debugtypesdtypefoldernamesrv   rw   r#   account_sectionremote_repo_sectionrx   	reposname	namespaces                            r&   __parse_cmd_optionszOfflineImap.__parse_cmd_optionsp   s	   ++'2'@'@'2'>'>@
 	$!-I"'8 	 	:
 	+!-H"'- 	 	/
 	(!-M"'X 	 	Z
 	$!-4E"'W 	 	Y
 	$\5D 	 	F 	$Z"=9 	 	; 	$\6"&F 	 	H 	$["7 A 	 	B
 	$Y, 	 	. 	$!-H"'. 	 	0
 	$Y";@ 	 	B 	$%5!)":C 	 	E
 	$!-I"'C 	 	E
 	$!-G"'U 	 	W
 	$[ Z 	 	[ 	+."&".K 	 	M
 	:!-NEQ 	 	S 	+!-OUT 	 	V 	,!-4DeR 	 	T 	,!-4DeI 	 	K !++-$!??''):):)<>  HHQK !!'Gbjj(

70C77--k:::g.!#hx!PG77>>'"4"45%'WW%7%78J%K"$//NWW//0B0BCN#%ww~~n-MMK() *HHQKN# ** JK*.'ww~~g001 N ' 2 2!3 4 ++,OO .070B0BC D !!!00 0%||C3e#:%(YYsA%6NWc%ooc37G'G

7C/0 ##ItW=(''G'>mmC(,GOO $&*iiW\\^0D&EF GG >>JJy)V4  Iw? !!JJy"2F;  ,<fE !!JJy"2F;  ,<gF	gmmo.v6DG
 	DGG ??GGw/ >>GG'') 	T&&()GGNN##GMM2  &&(E1$9! 1 1 7 7 <<#33EF*.' **005<J# )!!%() ??  M:$$Y>#226: J$$Z'%9=IJ ==#226: @

:/$?@ ??!////4K.<L!N'66v> +",{":&3&,jjBT&U'V#

.M

.0@)++ ??CJ**9mQG?$$[1$$'  ,=qA	

  ..|< 	I '77)C/);= 
	**00A>00!,,)I5,a1
	 }k  	MM"DIId7<<>.B$CE FHHQK	s   8!h< <A#j#"j#c                 J   t        j                         j                  }d }g }t        t	        j
                         j                               D ]  \  }}g }t        j                  |      D ]C  \  }	}
}}|j                  d|	|
|fz         |s"|j                  d|j                         z         E ||k(  r|d|dz    }|j                  d       |j                  |         ||      }| j                  j                  dd       |D ]F  \  }}|d	k(  rd
}nd}| j                  j                  d||dj                  ||dz   d       fz         H | j                  j                  ddt        t        t	        j
                         j                                     z         y)z= Signal handler: dump a stack trace for each existing thread.c                     t        j                  d       }| D ]  }|t        |      xx   dz  cc<    t        d t        |j	                               D              S )Nc                       y)Nr    r   r(   r&   <lambda>z@OfflineImap.__dumpstacks.<locals>.unique_count.<locals>.<lambda>  s    r(   rg   c              3   *   K   | ]  \  }}||f  y w)Nr   ).0kvs      r&   	<genexpr>zAOfflineImap.__dumpstacks.<locals>.unique_count.<locals>.<genexpr>  s     ;41aA;s   )collectionsdefaultdicttupler   items)ldr   s      r&   unique_countz.OfflineImap.__dumpstacks.<locals>.unique_count  sN    ''	2A !%(q !;4	?;;;r(   z  File: "%s", line %d, in %sz    %sNr{   z'  => Stopped to handle current signal. r%   z** Thread List:
rg   z%s Thread is at:
%s
z%s Threads are at:
%s

zDumped a total of %d Threads.)	threadingcurrentThreadidentr   r   _current_framesr   	tracebackextract_stackr^   r   rA   debugr   lenr   )r4   contextsighandler_deepcurrentThreadIdr   stack_displaysthreadIdstackstack_displayfilenamelinenor   linestackstimesmsgs                   r&   __dumpstackszOfflineImap.__dumpstacks  s    $11399	< #C$7$7$9$?$?$AB 
	1OHeM090G0G0N D,&$$$%C(0&$'?&@ A!((TZZ\)BC	D
 (* -.F/A2E/F G$$%NO!!-0
	1 n-h 34" 	WLE5z.0GGMM(C5$))EWq[/BR<S2T*U$UV	W 	h ?$s22499;<=!> 	?r(   c                    g }d }| j                   j                  dd      }|j                  r|j                  }|j                  d      D cg c]  }|j	                          }}t        j
                  | j                         }|D ]J  }||v r|j                  |       ddj                  |      z  }| j                  j                  d|z         L t        |      dk  rd}|| j                  j                  d|	       |S c c}w )
Nr9   r	   rq   zValid accounts are: %sr,   zThe account '%s' does not existrg   zNo accounts are defined!)errormsg)r!   rD   r	   r   lstripr   r^   r   rA   r   r   	terminate)r4   rI   activeaccountsr   activeaccountnamesxallaccountsr#   s           r&   _get_activeaccountszOfflineImap._get_activeaccounts  s    ![[__Y
C!(!1!12D2J2J32OPQahhjPP--dkk:- 	OKk)%%k23IIk*,?+MN	O ~"1HGGa(3# Qs   Dc                      fd}	 d _         t               dk7  rt        j                  t        j                  |       t        j                  t        j                  |       t        j                  t        j
                  |       t        j                  t        j                  |       t        j                  t        j                  |       t        j                  t        j                  |       t        j                  t        j                  |        j                  |      }t        j                   j                   j                  |j                         |j                   r j#                  ||j$                         nat'        j(                  t*        d| j                  f      }t&        j,                  |_        |j1                          t'        j2                          t        j4                           j                  j7                          y# t8        $ r  t:        $ r?} j                  j=                  |        j                  j7                          Y d}~yd}~ww xY w)zInvoke the correct single/multithread syncing

        self.config is supposed to have been correctly initialized
        already.c                    | t         j                  k(  r+t        j                  j	                  j
                  d       y | t         j                  t         j                  fv rDt               j                  d       t        j                  j	                  j
                  d       y | t         j                  t         j                  t         j                  fv rt               j                  d       t        j                  j	                  j
                  d       dj                  j                  v rj                  d       xj                   dz  c_        j                   dk\  r/t               j                  d       t#        j$                  d       y y | t         j&                  k(  r8t)        j*                  t"        j,                         t/        j0                          y y )	Nrg   zTerminating after this sync...r{   zlPreparing to shutdown after sync (this may take some time), press CTRL-C three times to shutdown immediately   r%      zSignaled thrice. Aborting!)signalSIGUSR1r	   Accountset_abort_eventr!   SIGUSR2SIGABRTr   warnSIGTERMSIGINTSIGHUPrA   	debuglist_OfflineImap__dumpstacksnum_sigtermr   r   SIGQUITr   dumpr   r   abort)sigframer4   s     r&   sig_handlerz'OfflineImap.__sync.<locals>.sig_handler  sE   fnn$  00a@88""#CD  00a@FF"" $C D   00a@tww000%%a(   A% ##q(M&&'CDHHQK ) &

+
 'r(   r   windowszSync Runner)r   r   rJ   Nrg   )r   r   r   r   r   r   r   r   r   r   r   r   r@   r!   rA   rB   rS   !_OfflineImap__sync_singlethreadedrT   r   ExitNotifyThreadr'   STOP_MONITORexit_messager   monitorrE   r   
SystemExit	Exceptionr   )r4   rI   r  r   tes   `     r&   __synczOfflineImap.__sync  s   	4)	 D }	)fmm[9fnnk:fnnk:fnnk:fnnk:fmm[9fnnk: "55g>NLLdggw~~>&&**>7;M;MN //$&($++7 ",!8!8	""$ MMOGG 	 	GGMM!GG	s   HH I()5I##I(c           
      V   |D ]  }t        j                  | j                  |      }d|j                         z  t	        j
                         _        |s|j                          a	 ddl}|j                         }	 |j                  dt               t                     }ddlm} |j#                         j%                  d      }|j'                  t(        j*                  j-                  ||d|j                         d              y# t        $ r ddl
}Y w xY w# t        $ r Y w xY w)	zmExecuted in singlethreaded mode only.

        :param accs: A list of accounts that should be synced
        r   r   Nzaccount.syncrunner())datetimez%Y%m%d%H%M%Srj   z.prof)r	   r   r!   getnamer   r   r   r   cProfileImportErrorprofileProfilerunctxr   localsr  r  nowstrftime
dump_statsr   r   r   )	r4   r    rT   r#   r$   r  profr  dts	            r&   __sync_singlethreadedz!OfflineImap.__sync_singlethreaded  s    
 ) 	IK..t{{KHG!GOO$55 ##%*""$#. (;;'=wy&(SD .\\^,,^<GOO4E F!H I'	I # #"#
 " s$   %D	:#D	DD	D('D(c                     | j                   j                  dt        j                  z         | j	                  |      D ]2  }t        j                  | j                  |      }|j                          4 y )Nz  imaplib2: %s)	rA   r6   r-   r.   r   r	   r   r!   serverdiagnostics)r4   rI   r#   r$   s       r&   __serverdiagnosticszOfflineImap.__serverdiagnostics#  sZ    %(;(;;<33G< 	(K&&t{{K@G%%'	(r(   c                 
   | j                  |      }t        |      dk7  r| j                  j                  d       yt	        j
                  | j                  |j                               }|j                  |j                        S )Nrg   z*you must supply only one account with '-a')	r   r   rA   r   r	   r   r!   poprF   )r4   rI   r    r$   s       r&   __deletefolderzOfflineImap.__deletefolder)  si    009}"GGMMFG""4;;0A0A0CD##G$8$899r(   c                 D   | j                  |      D ]  }t        j                  | j                  |      }t	        |d      }|j                         t        j                  j                  k7  r[|j                         }|D ]  }|j                  |j                           y )Nlocal)r   r	   r   r!   r   getfoldertyper
   MaildirMaildirFolder
getfoldersmigratefmd5rB   )r4   rI   r#   r$   	localrepor\   fs          r&   __migratefmd5zOfflineImap.__migratefmd51  s    33G< 	.K&&t{{K@G"7G4I&&(FNN,H,HH**,G .gnn-.	.r(   N)rg   r{   )__name__
__module____qualname____doc__r7   rK   r:   r   r   rH   r  r<   rG   r>   r   r(   r&   r*   r*   B   s?    (("N`!?F4IVI6(:.r(   r*   )'r   r   r   r   r   r   r   r   optparser   rf   offlineimap.utils.distro_utilsr   imaplib2r-   offlineimap.uir   r   r   r   r	   r
   r   r   r   offlineimap.CustomConfigr   offlineimap.utilsr   offlineimap.repositoryr   offlineimap.folder.IMAPr   r   r0   r   r1   r'   r*   r   r(   r&   <module>r<     sx   $ 
 
       !  6  = < = = ' 7 ( - 5, ""3'*(w. w.r(   