
    hG                         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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 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dl!m"Z"m#Z#m$Z$m%Z%m&Z& erddl'm(Z( dZ)dZ* G d de      Z+ G d de      Z,y)    )print_functionunicode_literalsN)IPv4NetworkIPv6Network   )TYPE_CHECKING)unicode)MC_SckMCast)AAAA)CLASS)NSECPTRQTYPERRSRVTXTA	DNSHeaderDNSQuestion	DNSRecordset_avahi_379)	CachedSetDaemonNetdevlist_ipsmin_ex)SvcHubz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         C/jellyfin/media/venv/lib/python3.12/site-packages/copyparty/mdns.pyr%   zMDNS_Sck.__init__(   sF     	h&sBR=

r"   )__name__
__module____qualname__r%   __classcell__r2   s   @r3   r    r    '   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           
      @   |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%                | j                   j&                  xs | j                   j(                  dz   }|j+                  d| j                   j(                        j-                  d      dz   }|j/                  dd	      j1                  dd	      }d
j3                  d |j5                  d      D              xs% dj                  t7        j8                  dd            | _        | j:                  j=                         | _        i | _         tC        d      | _"        tC        d      | _#        | jI                         \  | _%        | _&        | jJ                  jO                         D ci c]  \  }}|j=                         | c}}| _(        tS        | jL                  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     r3   	<genexpr>z MDNS.__init__.<locals>.<genexpr>N   s     9q19s   ?zvault-{}r      gzG?r#   ).argszm6MDNS4zm4MDNS6r$   r:   r%   r    zm_onzm_offzmvsrvformatlogsrcngenttlzm_nwa_1r   zm_fqdnnamer@   rstripencodedecodejoinsplitrandomrandinthnlowerlhnqr   rx4rx6
build_svcssvcssfqdnsitemslsvcssetlsfqdnsprobingunsoliciteddefend)r,   hubrU   algrp4grp6zskvrF   r2   s             r3   r%   zMDNS.__init__<   s   XXVVrVVrdD"288RYYdD#((,,	
 &&t,	yy!!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 rC   )log_funcrT   )r,   msgcs      r3   logzMDNS.log_   s    dkk3*r"   c                 8   | j                   j                  }dd| j                   j                  v rdn| j                   j                  d   i}dd| j                   j                  v rdn| j                   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
<   d|v r||	d<   d|v r||	d<   d|v 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-{}r>   r   rY   z{}.{})rJ   zmspcopyftpftpssmb_portzm_ldzm_lhzm_lfzm_lsrb   rl   rj   rS   rY   r^   add)r,   r   httphttpswebdavwebdavsr   smbru   rh   ri   rv   rw   rY   s                 r3   rg   zMDNS.build_svcsb   sA   iimmbDIIKK/TYY[[^Dtyy{{ 2		AG**,%((sgcl		Ityy))* YY__#F6N GFO99??99??DL IIOOE&M99??))//CK99??))//CK#:*0D&'#:+2D'(#:(,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   )rd      FT:)rclassrdatarV   x   rY   r~   r>   _services._dns-sd._udp.local.i  )r   r   z{}={}zutf-8rI   zvalue too long for mdns: [{}]r   r   ix  )&rR   valuesr   r   r   ra   r   ANYidxv6ipsr   DCF_INr   r   add_auth
add_answerrh   rj   r   INr   rS   r[   len	Exceptionappendr   rJ   zm_nonegr   add_arpackr&   r'   r(   r)   )r,   rR   probeareplysreplybyehave4have6s2r0   qtarr0r120sclasspropssnamesportsfqdnrv   rtxtszbtnss                            r3   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...r=   zsendto failed: {} ({})90)r_   rangetimesleeprunningrJ   rQ   r|   rl   rR   r   r0   r-   sendtor&   r/   r   r   r   r   rS   )r,   slp_probed6rR   r0   exs          r3   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|   rS   r   r   r   r   r   rn   ro   run2OSErrorerrnoEBADF)r,   boundr   zfr   s        r3   runzMDNS.run	  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|{}| {}
{}   zprobe ok; announcing [{}]) r   rJ   mc_hopno_pollr   selectpollrR   filenoregisterPOLLINr|   r   rn   rd   rp   r_   ro   maxre   clnrf   recvfromeatzm_no_perS   rY   r   reprr   processra   )r,   last_hopihopfd2scksrvpollr-   fdr   r   timeoutprrF   rxrdybufaddrs                   r3   r   z	MDNS.run2%  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)NFr=   )	r   rR   r   r-   closer   r)   r/   clear)r,   panicrR   s      r3   stopz	MDNS.stope  sq    88??$ 	CGGMMOGGNN3::?	 	s   ABBc           
         |d   }d|v }|j                  d      r| j                  r|r|j                  d      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-        |j.                        j1                         | j2                  k(  s4t-        |j4                        J }}|r| j6                  j9                  |      r|D cg c]	  }|dvs| c}sy | j                  dj                  |      d	       | j:                  s(|j<                  j?                  |j@                  |d
f       | jB                  jE                  ||dz         | jB                  |<   y |
jF                  D cg c]d  }t-        |j.                        j1                         | j2                  k(  r2|jH                  tJ        jL                  k(  rt-        |j4                        f }}|r| j6                  j9                  |      r|D cg c]	  }|dvs| c}sy tO               D ]"  }||v s| j6                  j                  |       $ | j6                  j9                  |      sy d}	| j:                  r|	dz  }	n|	dz  }	|	dz  }	| j                  |	j                  | j                  j                  |j                  |tQ        | j6                              d       | jS                  d       y |
jT                  jV                  s	|d   d
k7  rd }|
jX                  D ]A  }	 t-        |jZ                        j1                         }|| j2                  k7  r8|
jT                  jV                  sO|j\                  t^        j`                  t^        jb                  fv s||xs) t#        te        |
jT                  jV                  d            }|jg                  |       |j                  D ]y  }|j\                  }d|v }||t^        jb                  k(  k(  s*|rtc        |      n
ta        |      }ti        | jj                  |tJ        jl                  d|      }|jo                  |       { D |r-|j<                  j?                  |jq                         |d d        |
jX                  D ]-  }	 t-        |jZ                        j1                         }|| j2                  k7  r8d}d}|
jF                  D ]g  }	 t-        |j.                        j1                         }|| j2                  k(  s7|jr                  dkD  rd}|jH                  tJ        jL                  k(  sfd}i |r)|j<                  j?                  |j@                  |d
f       n1|d   d
k7  r)|j<                  j?                  |j@                  |d d        |rd||j@                  f| jt                  |<    y  ||
jT                  jv                  rdndz   }|
jX                  D ]e  }|r|jZ                  st-        |jZ                        j1                         }|| jx                  v s|dk(  sI|||jz                  f| jt                  |<    n ||j|                  dz   k  r}|
jF                  D ]m  }|j4                  st-        |j4                        j1                         }|| j~                  v sB|jr                  dkD  r| jt                  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.254fe80z{} [{}] [36m{} [0m|{}|r   )z::1z	127.0.0.1z(someone trying to steal our hostname: {}r   r=   皙?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  )A
startswithll_okrf   re   r{   rR   
map_clientr   r   rJ   rQ   r0   r   r|   rS   rY   r   r   parsezmvvstrauthUrnamerb   rc   r   sips
isdisjointrn   r-   r   r'   rp   getrrr   r   r   r   listr  headerid	questionsqnameqtyper   r   r   r   add_questionr   ra   r   r   r   rV   rd   tcrk   r(   r*   rm   pop)r,   r   r   r-   cipr   cacherR   nowr   r   rF   cipsr0   rspr   rc   r   rdr  foundunicastr  deadliner  r   s                             r3   r   zMDNS.eatr  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   75_7-_7'	_<1_<	A)`	` `*#`*#`31#a"`03"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   )rl   r   ro   r  rR   r   r   rJ   zm_spamr_   r   r  rp   rj   _txr'   rd   r(   )	r,   txr"  cooldownrR   r   r(  r   rz   s	            r3   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)NFr=   Tztx({},|{}|,{}): {}r   )r   r*   r-   r   r/   r   r+   r|   rS   r0   r   )r,   rR   rz   r-  r"  r   r   s          r3   r+  zMDNS._tx4  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)r4   r5   r6   r%   r|   rg   r   r   r   r   r  r   r   r+  r7   r8   s   @r3   r:   r:   ;   sB    !F+4lU#nP48>!@aF0>r"   r:   )-
__future__r   r   r   r_   r   socketr   	ipaddressr   r   r%   r   r	   r  	multicastr
   r   stolen.dnslibr   r   r   r   r   r   r   r   r   r   r   r   r   r   utilr   r   r   r   r   svchubr   rL   rN   r    r:   rD   r"   r3   <module>r6     so    7      . # " $  &    > =v (I5 Ir"   