
    l
jfB                        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mZm	Z	m
Z
 d dlZd dlmZmZ d dlZd dlZd dlZej                  Zdj%                  g d      Zdj%                  g d      Zej*                  ej,                  z  ej.                  z  ZdZd	 Zd
 Z G d d      Z G d de
j:                        Z G d de
j:                        Zd Z d Z! G d d      Z" G d d      Z#y)    N)Path)GLibGioGObject)FileTypeReceiveError,)standard::sizestandard::allocated-sizestandard::namestandard::typestandard::symlink-targettime::modifiedtime::modified-usec
unix::mode)	r
   r   r   r   r   zstandard::content-typer   r   r   i c              #   `  K   t         j                  j                  |       }	 |j                  d       }	 |j                  dd       }|j                         dk(  rn)t        j                  |j                               }| O|j                          y # t        j
                  $ r Y y w xY ww)Ni   r   )avatar_chunk)r   Filenew_for_pathreadr   Error
read_bytesget_sizewarp_pb2RemoteMachineAvatarget_dataclose)pathgfilestreambytesresponses        $/usr/libexec/warpinator/transfers.pyload_file_in_chunksr$   /   s     HH!!$'ED! !!+t4>>q //U^^=MN  LLN :: s(    B.B A!B.B+(B.*B++B.c                    t         j                  j                  t         j                  j                  |      d| j                  | j
                  t        j                         fz        }t        j                  j                  |      }|j                  |d        t        j                  |j                         |       y )Nz%s-%d-%d.tmp)osr   joindirnamesender
start_timer   get_monotonic_timer   r   r   make_symbolic_linkreplaceget_path)opr   targettmppathtmpfiles        r#   r,   r,   A   s|    ggll277??40.BIIr}}^b^u^u^wCx2xyGhh##G,Gvt,JJw!4(    c                       e Zd ZddZy)r   Nc
                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        y N)	uribasenamerelative_pathsize	file_typesymlink_target	file_modemtime
mtime_usec)
selfr7   r8   rel_pathr:   r;   r<   r=   r>   r?   s
             r#   __init__zFile.__init__J   sC     %	","
$r3   )Nr   r   r   __name__
__module____qualname__rB    r3   r#   r   r   I   s    	%r3   r   c                   $     e Zd Z fdZd Z xZS )
FileSenderc                     t         t        |           || _        || _        || _        t        j                         | _        d | _	        y r6   )
superrI   rB   r/   	timestampcancellableprefsget_block_size
block_sizeerror)r@   r/   rL   rM   	__class__s       r#   rB   zFileSender.__init__V   s=    j$(*"&..0
r3   c              #     K   | j                   j                  D ]b  }| j                  j                         r y t	        j
                  d|j                  |j                  |j                  fz         t        j                  |j                  |j                        }|j                  t        j                  k(  r:t        j                  |j                  |j                  |j                  |       |j                  t        j                   k(  rFt        j                  |j                  |j                  |j"                  |j                  |       >d }	 t$        j&                  j)                  |j*                        }|j-                  d       }d}d}	 |rn| j                  j                         r y |j/                  | j0                  d       }|j3                         }|| j0                  k  rd}| j                   j4                  j7                  |       |r|}	d}nd }	t        j                  |j                  |j                  |j9                         |j                  |	       |j;                          e | j                   j4                  jA                          y # t<        $ r+}
	 |j;                          n#  Y nxY w|
| _        Y d }
~
 y d }
~
ww xY ww)Nzget mtime: %lu.%u -- %s)r>   r?   )r9   r;   r=   time)r9   r;   r<   r=   rT   FT)r9   r;   chunkr=   rT   )!r/   resolved_filesrM   is_setloggingdebugr>   r?   r9   r   FileTimer;   r   	DIRECTORY	FileChunkr=   SYMBOLIC_LINKr<   r   r   new_for_urir7   r   r   rP   r   progress_trackerupdate_progressr   r   	ExceptionrQ   finished)r@   fileftimer    r   	file_donefirst_chunkblast_size_readrT   es              r#   read_chunkszFileSender.read_chunks_   sP    GG** D	D&&(MM3tzz4??TXTfTf6ggh%%DJJ37??DE~~!3!33((t7I7I37>>37>>.35 5 8#9#99((t7I7I37>>8<8K8K37>>.3	5 5 .HH00:E"ZZ-F %I"&K$!++224""--dootD)*)DOO;(,I00@@P&#(D*/K#'D&00t?Q?Q;?>>78zz|;?>>6:	< <+ 6 LLNsD	L 	  ))+ ! 
 !"DJ
sP   EKAJ$6K8CJ$<(K$	K.J?>K?KKKKK)rD   rE   rF   rB   rj   __classcell__rR   s   @r#   rI   rI   U   s    G,r3   rI   c                   H     e Zd Z fdZd Zd Zd Zd Zd Zd Z	d Z
 xZS )	FileReceiverc                    t         t        |           t        t	        j
                               j                         | _        || _        t	        j                         xr t        j                         | _        t	        j                         xr t        j                         | _        d | _        d | _        d | _        d | _        d| _        d| _        d| _        g | _        y Nr   )rK   rn   rB   r   rN   get_save_pathresolve	save_pathr/   preserve_permissionsutilsave_folder_is_native_fspreserve_permspreserve_timestampcurrent_pathcurrent_gfilecurrent_typecurrent_streamcurrent_modecurrent_mtimecurrent_mtime_usecfolder_permission_change_list)r@   r/   rR   s     r#   rB   zFileReceiver.__init__   s    lD*,e1134<<>#88:^t?\?\?^"'":":"<"`A^A^A` ! ""#
 .0*r3   c                     t        j                  d       | j                  j                  D ]+  }| j                  |z  }| j                  t        |             - y )Nz9Removing any existing files matching the pending transfer)rX   rY   r/   top_dir_basenamesrs   rm_anystr)r@   namer   s      r#   clean_existing_filesz!FileReceiver.clean_existing_files   sF    QRGG-- 	#D>>D(DKKD	"	#r3   c                    | j                   t        | j                         }	 |j                  | j                        }t	        j
                  |j                                | j                  j                  |j                  d         }t        j                  dt        |      z         | j                  |       y y # t        t        f$ r+}t        j                  dt        |      z         Y d }~y d }~ww xY w)Nz>Partial file or directory from aborted transfer is invalid: %sr   z&Removing partial file or directory: %s)ry   r   relative_tors   ru   test_resolved_path_safetyas_posix
ValueErrorr   rX   criticalr   joinpathpartsrY   r   )r@   currentrelativeri   abs_top_dirs        r#   clean_current_top_dir_filez'FileReceiver.clean_current_top_dir_file   s    (4,,-G"..t~~>..x/@/@/BC
 ..11(..2CDKMMBSEUUVKK$ ) -   !adghidj!jks   >B= =C7!C22C7c                     	 	 t        j                  |       y # t        $ r t        j                  |       Y y w xY w# t
        $ r Y y t        $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz#Problem removing existing files: %s)	r&   removeIsADirectoryErrorshutilrmtreeFileNotFoundErrorra   rX   warning)r@   r   ri   s      r#   r   zFileReceiver.rm_any   sd    	G$		$$ $d#$  	 	GOOAAEFF	Gs+    := := 	A2A2A--A2c                 P   t        | j                  j                  |j                              }|| j                  k7  r| j                          || _        |j                  | _        |j                  | _	        |j                  j                  | _        |j                  j                  | _        |j                  j                  t!        | j"                  j$                              st'        d|j                  z        | j"                  j(                  dk(  rt'        d      | j*                  sCt-        j.                  |j                         t0        j2                  j5                  |      | _        |j                  t6        j8                  k(  rt;        j<                  |d       y |j                  t6        j>                  k(  r"tA        | j"                  ||jB                         y | jD                  9| j*                  jG                  t0        jH                  jJ                  d       | _"        |jL                  sy | jD                  jO                  tQ        jR                  |jL                        d        | j"                  jT                  jW                  tY        |jL                               y )Nz>File path is not descended from a valid toplevel directory: %sr   z(File count exceeds original request sizeT)exist_ok)-r   rs   r   r9   ry   close_current_filer=   r}   r;   r{   rT   r>   r~   r?   r   
startswithtupler/   r   r   remaining_countrz   ru   r   r   r   r   r   r[   r&   makedirsr]   r,   r<   r|   createFileCreateFlagsNONErU   write_bytesr   Bytesr_   r`   len)r@   sr   s      r#   receive_datazFileReceiver.receive_data   s   4>>**1??;<4$$$##% $D !D !D!"D&'ff&7&7D#??--eDGG4M4M.NO"#cfgfufu#uvv77""a'IJJ!!**1??;!$!6!6t!<D;;(,,,KKt,[[H222twwa.>.>?""*&*&8&8&?&?@S@S@X@XZ^&_#77++DJJqww,?FGG$$44S\Br3   c           	      *   | j                   y | j                  r!| j                  j                          d | _        | j                  r| j                  dkD  r| j
                  t        j                  k7  rt        j                  d| j                  | j                  | j                  fz         t        j                  j                         }|j                  t        j                   | j                         |j#                  t        j$                  | j                         	 | j                   j'                  |t        j(                  j*                  d        | j4                  r| j6                  dkD  r| j
                  t        j                  k7  r	 | j
                  t        j8                  k(  r[t        j                  d| j                  d| j6                         t;        j<                  | j                  | j6                         n1| j>                  jA                  | j                  | j6                  f       d| _        d| _        d | _        d| _        d | _
        d | _         | jF                  xjH                  d	z  c_$        y # t,        j.                  $ r:}t        j0                  d| j                  d|j2                         Y d }~td }~ww xY w# tB        $ r8}t        j0                  d| j                  dtE        |             Y d }~d }~ww xY w)
Nr   zRestoring mtime: %s --> %lu.%uz%Unable to restore original mtime to '': zRestoring permissions:  --> )modez+Unable to restore original permissions to '   )%rz   r|   r   rx   r~   r{   r   r]   rX   rY   ry   r   r   FileInfonewset_attribute_uint64FILE_ATTRIBUTE_TIME_MODIFIEDset_attribute_uint32!FILE_ATTRIBUTE_TIME_MODIFIED_USECset_attributes_from_infoFileQueryInfoFlagsr   r   r   r   messagerw   r}   REGULARr&   chmodr   appendra   r   r/   r   )r@   infori   s      r#   r   zFileReceiver.close_current_file   sc   %%%'"&D ""t'9'9A'=$BSBSW_WmWmBmMM:$$d&8&8$:Q:QRS T <<##%D%%c&F&FHZHZ[%%c&K&KTMdMdeq"";;D#BXBXB]B]_cd 4#4#4q#8T=N=NRZRhRh=ht$$(8(88MMHYHY[_[l[l"mnHHT..T5F5FG66==t?P?PRVRcRc>de "#  !1$+ :: qRVRcRcefenen oppq  tX\XiXiknopkq rssts1    5J B)K K/K		K	L.LLc           	      x   | j                   rj| j                  r]| j                  j                         \  }}	 t        j                  d|d|       t        j                  ||       | j                  r\y y y # t        $ r8}t        j                  d| j                  dt        |             Y d }~Ld }~ww xY w)NzRestoring folder permissions: r   z2Unable to restore original permissions to folder 'r   )rw   r   poprX   rY   r&   r   ra   r   ry   r   )r@   r   r   ri   s       r#   apply_folder_permissionsz%FileReceiver.apply_folder_permissions)  s    44 "??CCE
dMMtUY"Z[HHT4( 44  ! OOcgctctvyz{v|$}~~s   1A8 8	B9.B44B9c                     | j                          | j                          | j                  j                  j	                          y r6   )r   r   r/   r_   rb   r@   s    r#   receive_finishedzFileReceiver.receive_finished5  s0    !%%'  ))+r3   )rD   rE   rF   rB   r   r   r   r   r   r   r   rk   rl   s   @r#   rn   rn      s0    0(#% 	GC@)%V
,r3   rn   c                    d }|j                  t        j                        }|j                         }||kD  r|n|}|j	                         }	|	t
        j                  k(  r|j                         }|j                  d      }
|
dkD  r	|
t        z  nd}|rt        j                  ||      }n|}|j                  t        j                        }|j                  t        j                        }t        |||||	||||	      }| j                  j!                  |       | xj"                  |z  c_        | xj$                  dz  c_        y )Nr   r   r   )get_attribute_uint64r   &FILE_ATTRIBUTE_STANDARD_ALLOCATED_SIZEr   get_file_typer   r]   get_symlink_targetget_attribute_uint32	MODE_MASKru   relpath_from_urir   r   r   rV   r   
total_sizetotal_count)r/   r8   r7   base_urir   r<   
alloc_size	file_sizer:   r;   st_moder=   r9   r>   r?   rc   s                   r#   add_filer   <  s   N **3+U+UVJI!J.9JD""$IH***002''5G*1A+9$AI--c8< %%c&F&FGE**3+P+PQJX}dI~yZ_aklDT"MMTMNNaNr3   c                    
 g } j                   }d }t        |      dk(  rt        
nt        

 fd	 |D ]  }t        j
                  j                  |      }|j                  |j                                |j                  
t        j                  j                  d       }|j                         }t        |      dk(  r$|j                  t        j                         _        |rY|j                         t         j"                  k(  r8|j%                         j'                         }t)         ||d |        ||       
t)         ||d |        | _        |S # t,        $ r}	|	}Y d }	~	|S d }	~	ww xY w)Nr   c                    t         j                  j                  |       }|j                  	t         j                  j
                  d       }|j                  d       }|r|j                  |      }|j                         }|j                         }|j                         }|t        j                  k(  rt        
||||        ||       nt        
||||       |j                  d       }|ry y r6   )r   r   r^   enumerate_childrenr   NOFOLLOW_SYMLINKS	next_file	get_childget_uriget_basenamer   r   r[   r   )
folder_uritop_dirfolder_file
enumeratorr   child	child_urichild_basenamer;   infosr/   process_folders            r#   r   z(gather_file_info.<locals>.process_folderj  s    ((..z:K$778;8N8N8`8`8<>J ''-D",,T2!MMO	!&!3!3!5 ..0	 2 22RGTJ"9g6RGTJ!++D1 r3   )urisr   FILE_INFOS_SINGLE_FILE
FILE_INFOSr   r   r^   r   r   
query_infor   r   get_attribute_string$FILE_ATTRIBUTE_STANDARD_CONTENT_TYPEmime_if_singler   r   r[   
get_parentr   r   r   ra   )r/   r   uri_listrQ   r7   rc   r   r8   r   ri   r   r   s   `         @@r#   gather_file_infor   ^  sJ   77x=A*EE	20	 <xx++C0!(():):)<=uc.D.D.I.I4P,,.x=A%(,(A(A#BjBj(kB%D..0H4F4FF"oo/779GR3d;"30R3d;<  $5B    	E	s   D%E 	E4'E//E4c                       e Zd Zd Zy)Progressc                 <    || _         || _        || _        d| _        y )N )progresstime_left_secbytes_per_secprogress_text)r@   r   r   r   s       r#   rB   zProgress.__init__  s!     **r3   NrC   rG   r3   r#   r   r     s     r3   r   c                   <    e Zd Zd Zej
                  d        Zd Zy)OpProgressTrackerc                     || _         |j                  | _        d| _        t        j                         | _        | j
                  | _        y rp   )r/   r   total_transferredr   r+   transfer_start_timelast_update_time)r@   r/   s     r#   rB   zOpProgressTracker.__init__  s;    --!"#'#:#:#<  $ 8 8r3   c                 <   | xj                   |z  c_         t        j                         }|| j                  z
  t        kD  r|| _        | j                   | j
                  z  }|| j                  z
  }| j                   |z  }t        |dz  dz        }|dk(  rd}| j
                  | j                   z
  |z  }t        j                  dt        j                  |      dt        j                  |      d       t        |||      }| j                  j                  |       y y )Ni  r   r   z
Progress: z time left, z/s)r   r   r+   r   PROGRESS_UPDATE_FREQr   r   intrX   rY   ru   format_time_spanformat_sizer   r/   progress_report)	r@   	size_readnowr   elapsedbytes_per_micror   r   r   s	            r#   r`   z!OpProgressTracker.update_progress  s	   )+%%'4(((,@@$'D!--?HD444G"44w>O$ 6 =>M! !!__t/E/EEVMMMD<Q<QR_<`bfbrbr  tA  cB  C  D&xNOGG##O4# Ar3   c                 P    | j                   j                  t        ddd             y )Ng      ?r   )r/   r   r   r   s    r#   rb   zOpProgressTracker.finished  s    a 34r3   N)rD   rE   rF   rB   misc_idler`   rb   rG   r3   r#   r   r     s$    9 
ZZ5 505r3   r   )$r&   rX   statr   gettextpathlibr   gi.repositoryr   r   r   ru   r   r   rN   r  r   _r'   r   r   S_IRWXUS_IRWXGS_IRWXOr   r   r$   r,   r   ObjectrI   rn   r   r   r   r   rG   r3   r#   <module>r     s    
      , ,  '   OOXX 	 	
  
# 
  \\DLL(4<<7	& $)
% 
%Q, Q,fQ,7>> Q,h D9v   "5 "5r3   