
    ;i                          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ZddlZddlm	Z	m
Z
 ddlmZmZ ddlmZ  ej                   e      Zd Z G d d	      Zy)
a  
OpenDrop: an open source AirDrop implementation
Copyright (C) 2018  Milan Stute
Copyright (C) 2018  Alexander Heinrich

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <https://www.gnu.org/licenses/>.
    N   )AirDropBrowserAirDropClient)AirDropConfigAirDropReceiverFlags)AirDropServerc                  <    t        t        j                  dd         y )Nr   )
AirDropClisysargv     ?/home/ubuntu/myenv/lib/python3.12/site-packages/opendrop/cli.pymainr   #   s    sxx|r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	r
   c                 v   t        j                         }|j                  dg d       |j                  ddd       |j                  dd	d
d       |j                  ddd       |j                  dddd       |j                  dddd       |j                  ddd       |j                  ddd       |j                  ddd d       |j                  d!d"d#d$%       |j                  |      }|j                  r&t        j                  t
        j                  d&'       n%t        j                  t
        j                  d('       t        |j                  |j                  |j                  |j                  |j                  |j                  )      | _        d | _        d | _        d | _        d*| _        g | _        t+        j,                         | _        	 |j0                  d+k(  r| j3                          y |j0                  d,k(  r| j5                          y |j6                  |j9                  d-       t:        j<                  j?                  |j6                        s|j@                  s|j9                  d.       |j6                  | _        |j@                  | _!        |jD                  |j9                  d/       |jD                  | _"        | jG                          y # tH        $ rQ | j$                  | j$                  jK                          | j                   | j                   jK                          Y y Y y w xY w)0Naction)receivefindsend)choicesz-fz--filezFile to be sent)helpz-uz--urlz'-f,--file is a URL
store_true)r   r   z-rz
--receiverz4Peer to send file to (can be index, ID, or hostname)z-ez--email*z)User's email addresses (currently unused))nargsr   z-pz--phonez'User's phone numbers (currently unused)z-nz--namez)Computer name (displayed in sharing pane)z-mz--modelz*Computer model (displayed in sharing pane)z-dz--debugzEnable debug modez-iz--interfacezWhich AWDL interface to useawdl0)r   defaultz1%(asctime)s %(levelname)-8s %(name)s: %(message)s)levelformatz%(message)s)emailphonecomputer_namecomputer_modeldebug	interfaceFr   r   zNeed -f,--file when using sendzFile in -f,--file not foundz"Need -r,--receiver when using send)&argparseArgumentParseradd_argument
parse_argsr$   loggingbasicConfigDEBUGINFOr   r    r!   namemodelr%   configserverclientbrowsersending_starteddiscover	threadingLocklockr   r   r   fileerrorospathisfileurlis_urlreceiverr   KeyboardInterruptstop)selfargsparsers      r   __init__zAirDropCli.__init__(   s   ((*H.IJD(1BC' 5l 	 	
 	G 	 	

 	)3-X 	 	
 	)3-V 	 	
 	(!L 	 	
 	)"N 	 	
 	)"5l 	 	
 	-&CW 	 	
   &::mmJ
 gll=I $****))::**nn
 $NN$		#{{i'&		99$LL!ABww~~dii0LL!>? II	"hh==(LL!EF $		  	#||'!!#{{&  " '	#s    K :K CK AL87L8c                    t         j                  d       t        | j                        | _        | j                  j                  | j                         	 t        j                         j                          | j                  j                          t         j                  d| j                  j                          t        | j                  j                  d      5 }t        j                   | j"                  |       d d d        y # t        $ r Y w xY w# 1 sw Y   y xY w# | j                  j                          t         j                  d| j                  j                          t        | j                  j                  d      5 }t        j                   | j"                  |       d d d        w # 1 sw Y   w xY wxY w)Nz/Looking for receivers. Press Ctrl+C to stop ...)callback_addzSave discovery results to w)loggerinfor   r0   r3   start_found_receiverr6   EventwaitrA   rB   r$   discovery_reportopenjsondumpr5   )rC   fs     r   r   zAirDropCli.findw   sG   EF%dkk2(<(<=	,OO""$ LLLL5dkk6R6R5STUdkk22C8 ,A		$--+, , ! 		
, , LLLL5dkk6R6R5STUdkk22C8 ,A		$--+, , ,sI   "D	 !D		DD$ DD$ D!$A'G!F5,	G5F>:Gc                 h    t        j                  | j                  |f      }|j                          y )N)targetrD   )r6   Thread_send_discoverrL   )rC   rK   threads      r   rM   zAirDropCli._found_receiver   s%    !!)<)<D7Kr   c           
         	 |j                         d   }|j                  j                  d      d   }|j                  }t        |j                        }t        j                  d| d| d| dt                t        | j                  |t        |      f      }	 t        |j                  d         }|t        j                   z  r	 |j#                         }nd }|d u}	t'        | j(                        }
||||||	d	}| j*                  j-                          | j(                  j/                  |       |	rt        j1                  d
|
 d| d|        nt        j                  d| d       | j*                  j3                          y # t        $ r t        j                  d|        Y y w xY w# t        $ r t        j                   }Y w xY w# t$        $ r d }Y w xY w)Nr   z'Ignoring receiver with missing address .zAirDrop service found: z, :z, ID s   flags)r.   addressportidflagsdiscoverablezFound  index z  ID z  name zReceiver ID z is not discoverable)parsed_addresses
IndexErrorrJ   warningr.   splitr1   intr^   r$   r_   r   r0   
propertiesKeyErrorr   SUPPORTS_DISCOVER_MAYBEsend_discoverTimeoutErrorlenr5   r8   acquireappendrK   release)rC   rK   r]   
identifierhostnamer^   r2   r`   receiver_namera   index	node_infos               r   rX   zAirDropCli._send_discover   s   	++-a0G YY__S)!,
;;499~.xj7)1TF%PRtTUt{{Wc$i,@A	A12E
 '???% & 4 4 6 !M$D0DMM"!(
	 			Y'KK-weJ<w}oVWLL<
|3GHI		M  	NNDTFKL	  	A(@@E	A   % $%s5   F F- G !F*)F*-G
	G
GGc                     t        | j                        | _        | j                  j                          | j                  j	                          y )N)r   r0   r1   start_servicestart_server)rC   s    r   r   zAirDropCli.receive   s2    #DKK0!!#  "r   c                 4   | j                         }|y t        | j                  |d   |d   f      | _        t        j                  d       | j                  j                  | j                  | j                        st        j                  d       y t        j                  d       t        j                  d       | j                  j                  | j                  | j                        st        j                  d       y t        j                  d	       y )
Nr]   r^   zAsking receiver to accept ...)r?   zReceiver declinedzReceiver acceptedzUploading file ...zUploading has failedzUploading has been successful)_get_receiver_infor   r0   r2   rJ   rK   send_askr9   r?   rd   send_upload)rC   rK   s     r   r   zAirDropCli.send   s    &&(<#DKK$y/4<1PQ34{{##DIIdkk#BNN./'((){{&&tyy&ENN1234r   c                 L   t         j                  j                  | j                  j                        st
        j                  d       y t        j                         t         j                  j                  | j                  j                        z
  }|dkD  rt
        j                  d|dd       t        | j                  j                  d      5 }t        j                  |      }d d d        	 t        | j                        | _        | j                     S # 1 sw Y   3xY w# t        $ r Y nt         $ r Y nw xY wt#        | j                        dk(  rD ]  }|d   | j                  k(  s|c S  D ]  }|d	   | j                  k(  s|c S  t
        j                  d
       y )Nz<No discovery report exists, please run 'opendrop find' first<   zOld discovery report (z.1fz1 seconds), consider running 'opendrop find' againr   r_   r.   zPReceiver does not exist (check -r,--receiver format or try 'opendrop find' again)r;   r<   existsr0   rP   rJ   r:   timegetmtimerd   rQ   rR   loadrf   r@   
ValueErrorrc   rl   )rC   agerT   infosrK   s        r   ry   zAirDropCli._get_receiver_info   sf   ww~~dkk::;LLWXiikBGG,,T[[-I-IJJ8NN(S	1bc $++..4 	!IIaLE	!	.DM''	! 	!  	 		 t}}#  :.K   	DF|t}},	 	^	
 s$   D0(D% D"%	D;0D;:D;N)
__name__
__module____qualname__rF   r   rM   rX   r   r   ry   r   r   r   r
   r
   '   s(    M#^,)V#
5 !r   r
   )__doc__r&   rR   r*   r;   r   r6   r   r2   r   r   r0   r   r   r1   r   	getLoggerr   rJ   r   r
   r   r   r   <module>r      sM   &    	 
   1 7 !			8	$C Cr   