
    i|K                        d dl mZm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 ddlmZ ddlmZmZ ddlmZmZmZmZmZmZ 	 ej4                  j7                  d	      sej4                  j7                  d
      r e       ddlmZ ddlmZ  ddlm!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ dZ,erddl1m2Z2 ej4                  j7                  d      rd dl3m4Z4  e5d e4e'             dZ6dZ7 G d de      Z8 G d de      Z9y# e$ rI dZ,d dl-mZ d dl-mZ  d dl-m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm.Z.m(Z(m)Z)m*Z* de j^                  d<   de j`                  d<   Y w xY w)    )print_functionunicode_literalsN)IPv4NetworkIPv6Network   )TYPE_CHECKING)unicode)MC_SckMCast)IP6_LL	CachedSetDaemonNetdevlist_ipsmin_exPRTY_SYS_ALLPRTY_SYS_DNSLIB)AAAA)CLASS)NSECPTRQTYPERRSRVTXTA	DNSHeaderDNSQuestion	DNSRecordset_avahi_379TF)r   r   r   r   r   r   r   Bimapr   r   r   F_INi  )SvcHubPRTY_MODSPEC)getsourcefilezPRTY_MODSPEC: dnslib:z224.0.0.251zff02::fbc                        e Zd Z fdZ xZS )MDNS_Sckc                     t         t        |   |||||       d| _        d| _        d| _        d| _        d| _        d| _        y )N            F)	superr'   __init__bp_probebp_ipbp_svcbp_byelast_txtx_ex)selfsckndgrpipnet	__class__s         A/home/ubuntu/myenv/lib/python3.12/site-packages/copyparty/mdns.pyr,   zMDNS_Sck.__init__M   sF     	h&sBR=

r)   )__name__
__module____qualname__r,   __classcell__r9   s   @r:   r'   r'   L   s     r)   r'   c                   ^     e Zd Z fdZddZd Zd Zd Zd Zd Z	ddZ
d	 Zd
 Zd Z xZS )MDNSc           
      L   |j                   }|j                  rdnt        }|j                  rdnt        }t
        t        |   |t        |j                  |j                  ||d|j                   j                         i | _        dj                  |      | _        || _        d| _        | j                   j"                  st$        r
t'                | j                   j(                  xs | j                   j*                  dz   }|j-                  d| j                   j*                        j/                  d      dz   }|j1                  dd	      j3                  dd	      }d
j5                  d |j7                  d      D              xs% dj                  t9        j:                  dd            | _        | j<                  j?                         | _         i | _!        tE        d      | _#        tE        d      | _$        | jK                         \  | _&        | _'        | jL                  jQ                         D ci c]  \  }}|j?                         | c}}| _)        tU        | jN                  D 	cg c]  }	|	j?                          c}	      | _+        d| _,        g | _-        i | _.        y c c}}w c c}	w )N   zmDNS-{}i,  z.localz--name.asciireplace-c              3   &   K   | ]	  }|s|  y wN ).0xs     r:   	<genexpr>z MDNS.__init__.<locals>.<genexpr>s   s     9q19s   ?zvault-{}r      gzG?r*   )/argszm6MDNS4zm4MDNS6r+   rA   r,   r'   zm_onzm_offzmvsrvformatlogsrcngenttlzm_nwa_1DNS_VNDr    zm_fqdnnamerG   rstripencodedecodejoinsplitrandomrandinthnlowerlhnqr   rx4rx6
build_svcssvcssfqdnsitemslsvcssetlsfqdnsprobingunsoliciteddefend)r3   hubr\   algrp4grp6zskvrM   r9   s             r:   r,   zMDNS.__init__a   s   XXVVrVVrdD"288RYYdD#((,,	
 &&t,	yy!!gOYY=499>>H#<ZZ$))..188=CYYw	*11'9E((9bhhsm99 
fnnQ45 	 77==? T?T?!%!2	4;/3yy/@Atq!aggilA
t{{;!AGGI;< B;s   +J"J!c                 >    | j                  | j                  ||       y rJ   )log_funcr[   )r3   msgcs      r:   logzMDNS.log   s    dkk3*r)   c                 t   | j                   }| j                   j                  }|j                  }d|dk7  r|nd|j                  v rdn|j                  d   i}|j                  }d|dk7  r|nd|j                  v rdn|j                  d   i}|j                         }|j                         }dx|d<   |d<   dd|v r| j                   j                  n| j                   j                  i}d| j                   j                  i}	| j                   j                  xs d}
|
r
|
|d	<   |
|d	<   | j                   j                  r2| j                   j                  |d	<   | j                   j                  |d	<   | j                   j                  r| j                   j                  |d	<   | j                   j                  r| j                   j                  |	d	<   i }d
|v r
|d   r||d<   d|v r
|d   r||d<   d|v r
|d   r||d<   d|v r
|d   r||d<   d|j                         v r||d<   d|j                         v r|	|d<   t               }|j                         D ]f  \  }}dj!                  | j                   j"                  |j%                  d      d   dd        }||d<   |j'                  dj!                  ||             h ||fS )NportP   r   i  uf/pathdz_webdav._tcp.local.Dz_webdavs._tcp.local.hz_http._tcp.local.Hz_https._tcp.local.z_ftp._tcp.local.sz_smb._tcp.local.z{}-c-{}rE   r   ra   z{}.{})rQ   zmszm_httppzm_httpscopyftpftpssmb_portzm_ldzm_lhzm_lfzm_lsrj   rt   rr   rZ   ra   rf   add)r3   arr   zihttphttpswebdavwebdavsr   smbr}   rp   rq   r~   r   ra   s                   r:   ro   zMDNS.build_svcs   sr   YYiimmZZbBh"*B"$$q'J[[rRxC244KSRTT!WM**,%((sgcl		Ityy))* YY__#F6N GFO99??99??DL IIOOE&M99??))//CK99??))//CK#:$v,*0D&'#:%-+2D'(#:$v,(,D$%#:%-).D%&#))+'*D#$#))+'*D#$%JJL 	0DAq##DIINNAGGCLOAB4GHDAfIJJw~~dA./	0
 V|r)   c                 
   | j                   j                         D ]  }t        t        dd      t	        | j
                  t        j                              }t        t        dd            }t        t        dd            }t        t        dd            }dx}}| j                   j                         D ]-  }|j                  |j                  k7  r|j                  rd},d}/ |j                  D ]  }	d|	v r-t        j                  }
t        j                  t        |	      d}n,t        j                  }
t        j                  t        |	      d}t        | j
                  |
fddi|}t        | j
                  |
fdd	i|}|j!                  |       |j#                  |       |j#                  |       |j#                  |        | j$                  j'                         D ]  \  }}|d
   }|d   }|dz   |z   }d}t        |t        j(                  t        j*                  dt)        |            }|j#                  |       t        |t        j(                  t        j*                  dt)        |            }|j#                  |       t        |t        j,                  t        j                  d	t-        dd|| j
                              }|j#                  |       |j#                  |       t        |t        j,                  t        j                  dt-        dd|| j
                              }|j#                  |       g }dD ]i  }||vrdj/                  |||         j1                  d      }t3        |      dkD  rd}t5        |j/                  ||               |j7                  |       k t        |t        j8                  t        j                  dt9        |            }|j#                  |        |r|s| j:                  j<                  st?        | j
                  |rdndg      }t        | j
                  t        j>                  t        j                  d	|      }|jA                  |       t3        |jC                               dk  r|jA                  |       |jC                         |_"        |jC                         |_#        |jC                         |_$        |jC                         |_%        |jH                  |_#         y )Nr   )rl      FT:)rclassrdatar]   x   ra   r   rE   _services._dns-sd._udp.local.i  )r   r   z{}={}zutf-8rP   zvalue too long for mdns: [{}]r   r   ix  )&rY   valuesr   r   r   ri   r   ANYidxv6ipsr   DCr"   r   r   add_auth
add_answerrp   rr   r   INr   rZ   rc   len	Exceptionappendr   rQ   zm_nonegr   add_arpackr-   r.   r/   r0   )r3   rY   probeareplysreplybyehave4have6s2r7   qtr   r0r120sclasspropssnamesportsfqdnr~   rtxtszbtnss                            r:   build_replieszMDNS.build_replies   s   88??$ T	#Ci1oTWWeii1PQEyF34FyF34FIa01C!!EEhhoo' !77bff$55 E E! gg #"9B$&GGd2h?BB$&GGae<B11b1$''2535"5
 t$!!$'!!$'r"##& "&!2 !%fff,3q%))RUUD#f+>!!!$vuyy"%%s5zB!!!$ueii#s1a7PQ!!!$!!!$ueii!SAudgg5NOq!& 	$A~  584;;GDB2w};'q(:;;KKO	$ ueii$D	B!!!$C!%F eTYY-?-?$''eF#=>tww

BGGS"=a v{{}%,MM!$ ::<CLCICJCJ 

CIiT	#r)   c           	         t        j                          dz  }t        d      D ]  }t        j                  |       d}| j                  s y | j
                  j                  r| j                  d       t               }| j                  j                         D ]r  }|j                  |v r	 |j                  j                  |j                  |j                  df       |j                   r"|j"                  D ]  }|j%                  |        t  y # t&        $ r6}| j                  dj)                  |j                  |      d       Y d }~d }~ww xY w)Ng      ?   zsending hostname probe...rD   zsendto failed: {} ({})90)rg   rangetimesleeprunningrQ   rX   r   rt   rY   r   r7   r4   sendtor-   r6   r   r   r   r   rZ   )r3   slp_probed6rY   r7   exs          r:   send_probeszMDNS.send_probes  s   mmo$q 	PAJJsOC<<yy}}45 uGxx( 
P66W$PGGNN3<<#''4Avv"%'' ,B#KKO,
P	P* ! PHH5<<SVVRH$OOPs   )A D	E,EEc                 V   	 | j                         }|s| j                  dd       y | j	                          t        | j                         t        j                         dz   }|| _        ||dz   |dz   |dz   g| _	        	 | j                          | j                  d	d       y #  d}| j                  |j                  t                     d       g }Y xY w# t        $ rI}|j                  t        j                  k7  r | j                  dj                  |      d       Y d }~d }~ww xY w)
Nz'no server IP matches the mdns config
{}r   z4failed to announce copyparty services on the networkr         zstopping due to {}r   stopped)create_serversr   rZ   r   r   r   r   r   rv   rw   run2OSErrorerrnoEBADF)r3   boundr   zfr   s        r:   runzMDNS.run3  s   	'')E HHKQOt YY[1_QQQ7	<IIK 	A/	:AHHQXXfh'+E  	<xx5;;&HH)004d;;		<s#   B" ?C "/C	D(?D##D(c           
         t        j                          }| j                  j                  }	 | j                  j                  r
t	               i }t        j                         }| j                  D ]7  }|j                         }|||<   |j                  |t
        j                         9 	 | j                  r| j                  s| j                  s| j                  rdt!        j                          dz  z   nB| j"                  r.t%        d| j"                  d   t        j                          z
        n|r||z   nd}	|rA|j                  |	dz        }
|
D cg c]!  }|d	   t
        j                  z  s|d      # }}n't        j
                  | j                  g g |	      }|d   }| j&                  j)                          | j*                  j)                          d
}d}|D ]*  }	 |j-                  d      \  }}| j/                  |||       , | j                  s| j=                          }| j                  t        j                          k  r7d}| j                  |j3                  | j>                  d d       d       d| _        | j                  ry y # t        $ r;}d }| j                  j                  sd}| j                  ||fz  d       Y d }~$d }~ww xY wc c}w #  | j                  s| j                  dd       Y  y | j                  j0                  rY ;dj3                  | j                  |   j4                  |t7        |      t9        |      dd t;                     }| j                  |d       Y xY w)Nz8WARNING: failed to poll(), will use select() instead: %rr   {Gz?Q?g?r      i  r   r)   )0r   i   r   r   z{} {} [33m|{}| {}
{}r      zprobe ok; announcing [{}]) r   rQ   mc_hopno_pollr   selectpollrY   filenoregisterPOLLINr   r   rv   rl   rx   rg   rw   maxrm   clnrn   recvfromeatzm_no_perZ   ra   r   reprr   processri   )r3   last_hopihopfd2scksrvpollr4   fdr   r   timeoutprrM   rxrdybufaddrs                   r:   r   z	MDNS.run2O  s   99;yy	'yy  k!FkkmGxx 4ZZ\ r
  V]]34 ll <<466T[[ v}}-- ## t//2TYY[@A)-ho3  \\'D.1,.Gq!A$2FfQqTlGGmmDHHb"g>!fHHLLNHHLLNCD ## #T 2ICHHS$,#" <<||diik)/$''#2,/3 W ll  	'G99$$NbUA&		'  H#<<A.yy)) 3::**D#c(DIaOVXA HHQNs=   A<J K-
K'K	K0KK M4=M4AM4c                 2   d| _         | j                  j                         D ]R  }	 |r|j                  j	                          n2|j                  j                  |j                  |j                  df       T | j                  j                          y #  Y txY w)NFrD   )	r   rY   r   r4   closer   r0   r6   clear)r3   panicrY   s      r:   stopz	MDNS.stop  sq    88??$ 	CGGMMOGGNN3::?	 	s   ABBc           
         |d   }d|v }|j                  d      r| j                  r|r|j                  t              sy |r| j                  n| j                  }||j
                  v ry |r| j                  |   n| j                  |      }|sy |j                  |       t        j                         }| j                  j                  r`||j                  k7  rQ||j                  vrCd}	| j                  |	j                  |j                   |j                  |t#        |            d       t%        j&                  |      }
| j                  j(                  r| j                  t+        |
             |
j,                  D cg c]H  }t/        |j0                        j3                         | j4                  k(  s4t/        |j6                        J }}|r| j8                  j;                  |      r|D cg c]	  }|dvs| c}sy | j                  dj                  |      d       | j<                  s(|j>                  jA                  |jB                  |d	f       | jD                  jG                  ||d
z         | jD                  |<   y |
jH                  D cg c]d  }t/        |j0                        j3                         | j4                  k(  r2|jJ                  tL        jN                  k(  rt/        |j6                        f }}|r| j8                  j;                  |      r|D cg c]	  }|dvs| c}sy tQ               D ]"  }||v s| j8                  j                  |       $ | j8                  j;                  |      sy d}	| j<                  r|	dz  }	n|	dz  }	|	dz  }	| j                  |	j                  | j                  j                   |j                   |tS        | j8                              d       | jU                  d       y |
jV                  jX                  s	|d   d	k7  rd }|
jZ                  D ]A  }	 t/        |j\                        j3                         }|| j4                  k7  r8|
jV                  jX                  sO|j^                  t`        jb                  t`        jd                  fv s||xs) t%        tg        |
jV                  jX                  d            }|ji                  |       |j                  D ]y  }|j^                  }d|v }||t`        jd                  k(  k(  s*|rte        |      n
tc        |      }tk        | jl                  |tL        jn                  d|      }|jq                  |       { D |r-|j>                  jA                  |js                         |d d        |
jZ                  D ]-  }	 t/        |j\                        j3                         }|| j4                  k7  r8d}d}|
jH                  D ]g  }	 t/        |j0                        j3                         }|| j4                  k(  s7|jt                  dkD  rd}|jJ                  tL        jN                  k(  sfd}i |r)|j>                  jA                  |jB                  |d	f       n1|d   d	k7  r)|j>                  jA                  |jB                  |d d        |rd||jB                  f| jv                  |<    y  ||
jV                  jx                  rdndz   }|
jZ                  D ]e  }|r|j\                  st/        |j\                        j3                         }|| jz                  v s|dk(  sI|||j|                  f| jv                  |<    n ||j~                  dz   k  r}|
jH                  D ]m  }|j6                  st/        |j6                        j3                         }|| j                  v sB|jt                  dkD  r| jv                  j                  |d         y  y y c c}w c c}w c c}w c c}w #  | j                  dj                  |             Y xY w#  | j                  dj                  |             Y xY w#  | j                  dj                  |             Y xY w)Nr   r   z169.254z{} [{}] [36m{} [0m|{}|r   )z::1z	127.0.0.1z(someone trying to steal our hostname: {}r   rD   皙?zmdns zeroconf: z'Cannot start; hostname '{}' is occupiedz(Emergency stop; hostname '{}' got stolenzL on {}! Use --name to set another hostname.

Name taken by {}

Your IPs: {}
r   Tzinvalid question: {}r   
   r   Fzinvalid rr: {}<   g      ?r   r      i  )B
startswithll_okr   rn   rm   r   rY   
map_clientr   r   rQ   rX   r7   r   r   rZ   ra   r   r   parsezmvvstrauthUrnamerj   rk   r   sips
isdisjointrv   r4   r   r.   rx   getrrr   r   r"   r   listr  headerid	questionsqnameqtyper   r   r   r   add_questionr   ri   r   r   r   r]   rl   tcrs   r/   r1   ru   pop)r3   r  r  r4   cipr   cacherY   nowr   r   rM   cipsr7   rspr   rk   r   rdr  foundunicastr  deadliner$  r   s                             r:   r   zMDNS.eat  s   1gCZNN9%djjs~~f-DHH%''> "txx}(<		#iik99==SCFF]s#''/A0AHHQXXchhSX>EOOC 99>>HHSV %&FFMqaj.>.>.@DHH.L!''
MMDII((.#E!q0D'DAEHH?FFtLaP<<syy3+6  ${{sC#I>DKK
 TT
z!TXX-!((bgg2E aggJ
 

 DII((.#E!q0D'DAE j &:IIMM"%& 99''-!A||>>??ddAHHQXXdiinnchhd499oNPQRIIdO 88;;$q'T/C[[ /AGG***,C
 $((?88;;177uww

.C#CJ9QXX[[&+I!JC$$Q'!gg /WW BY"

"23-/bQrUB!#DGGRB!?BNN2.//( sxxz484  #	Aj&&(
 dhh EGdd 'bhhK--/E
 DHH$vv{ $yyBGG+"&' syy3+6aDsyy$r(3 #syy1sG#	J #$7  	AAGGaggJ$$&E

"e/N&N'cjj9s	 r!!dd xx"(())+DLL(vv}

3- "y NE
 F:HH3::1=>./66q9:HH-44R89sO   ;5_;1_;+	` 5` A)`	`
$`
.#`.#`75#a"`47"a"bc                    t               }t        j                         }d}| j                  r| j                  d   |k  r| j                  j                  d       d}| j                  j                         D ]  }|j                  |        | j                  st| j                  j                  r^t        j                         | j                  j                  z   t        j                         dz  z   }| j                  j                  |       t        | j                  j                               D ]D  \  }}||k  r| j                  ||j                  d      s*| j                  j                  |       F t        | j                   j                               D ]=  \  }\  }}}||k  r| j                   j                  |       | j                  |||       ? |D ]  }| j                  ||j"                  |       ! y )Ng?r   r  r   r   )rt   r   rw   r(  rY   r   r   rQ   zm_spamrg   r   r   rx   rr   _txr.   rl   r/   )	r3   txr+  cooldownrY   r   r1  r)  r   s	            r:   r   zMDNS.process?  s   Uiik 0 0 3c 9  #Hxx( s ##		(9(9YY[499#4#44v}}7MM  ''+!$++"3"3"56 	%MCX~xxSYY-$	% *.dfflln)= 	)%C%(CX~FFJJsOHHS#x(	)  	0CHHS#**h/	0r)   c           	         t        j                          }||j                  |z   k  ry	 |j                  j                  ||j                  df       ||_        y# t
        $ r[}|j                  rY d }~yd|_        d}| j                  |j                  |j                  t        |      ||      d       Y d }~yd }~ww xY w)NFrD   Tztx({},|{}|,{}): {}r   )r   r1   r4   r   r6   r   r2   r   rZ   r7   r   )r3   rY   r   r6  r+  r   r   s          r:   r4  zMDNS._tx^  s    iikx''		BGGNN3$0CK   	ByyCI$AHHQXXcffc#h"=qAA	Bs   /A 	B="B83A B88B=)r   )F)r;   r<   r=   r,   r   ro   r   r   r   r   r  r   r   r4  r>   r?   s   @r:   rA   rA   `   sB    !F+9vU#nP48>!@aF0>r)   rA   ):
__future__r   r   r   osrg   r   socketr   	ipaddressr   r   r,   r   r	   r  	multicastr
   r   utilr   r   r   r   r   r   environr  ImportErrorstolen.dnslibr   r   r   r   r   r   r   r   r   r   r   r   r   r    r_   dnslibr!   forwardreversesvchubr#   inspectr%   printrS   rU   r'   rA   rK   r)   r:   <module>rG     s"   7  	     . # " $ E E+ 	zz~~n%8I)Jm +    G0 ::>>.!%	
!=#34 	v (N5 Nq   G #     BJJvBJJv+ s   A%D AEE