a Me"A@sddlZddlZddlZddlZddlZddlZddlZddlZddl Zddl Zddl Zddl Zddl ZddlZGdddejjZGdddejjZGdddejZdd Zd d Zd Zd dZddZddZejjGdddZejjGdddeZejjGdddeZejjGdddeZejjGdddeZ ejjGdddeZ!ejjGdd d eZ"ejjGd!d"d"eZ#ejjGd#d$d$eZ$ej%eej&eej'e ej(e!ej)e"ej*e$ej+e#iZ,d%d&Z-ejjGd'd(d(ej.j/Z0dS))Nc@seZdZdZdS)UnknownParamKeyzUnknown SVCB ParamKeyN)__name__ __module__ __qualname____doc__rr8/usr/lib/python3.9/site-packages/dns/rdtypes/svcbbase.pyrsrc@s`eZdZdZdZdZdZdZdZdZ dZ d Z e d d Z e d d Ze ddZe ddZdS)ParamKeyz SVCB ParamKeyrcCsdS)Nirclsrrr_maximum'szParamKey._maximumcCsdS)NZ SVCBParamKeyrrrrr _short_name+szParamKey._short_namecCsdS)NZKEYrrrrr_prefix/szParamKey._prefixcCstSN)rrrrr_unknown_exception_class3sz!ParamKey._unknown_exception_classN)rrrr MANDATORYALPNNO_DEFAULT_ALPNPORTIPV4HINTECHIPV6HINTZDOHPATH classmethodrrrrrrrrr s"   r c@seZdZdZdZdZdS) Emptinessrr r N)rrrNEVERALWAYSALLOWEDrrrrr 8sr cCstd}t|tr|d}t|trf|drZd}|dddrZt|dkrZtd|d d }t ||fS) NFzlatin-1keyTr 0r zleading zeros in key-_) isinstancebytesdecodestrlower startswithlen ValueErrorreplacer make)r$ force_genericrrr _validate_key>s    r3cCst|ddS)Nr'r&)r to_textr0r,)r$rrr key_to_textNsr5s",\cCsVd}|D]H}|tvr&|dt|7}q|dkrD|dkrD|t|7}q|d|7}q|S)N\ z\%03d)_escapedchr)Zqstringtextcrrr _escapifyWsr>cCs|dkr |Sd}t|}d}||kr ||}|d7}|dkr||krNtjj||}|d7}|r||krvtjj||}|d7}||krtjj||}|d7}|r|stjjt|dt|dt|}|dkrtjj|d |7}q||7}q|S) Nr6rr r7d %c)r.dns exception UnexpectedEndisdigit SyntaxErrorintencode)value unescapedlir=Zc2Zc3Z codepointrrr _unescapecs>   rOcCst|}d}g}d}||kr||}|d7}|tdkrf||krHtjj||}|d7}|d|7}q|tdkr||d}q|d|7}q|||S)Nrr?r r7rC,)r.ordrDrErFappend)rKrMrNitemsrLr=rrr_splits&    rTc@seZdZdZeddZdS)Paramz'Abstract base class for SVCB parameterscCstjSr)r r!rrrr emptinessszParam.emptinessN)rrrrrrVrrrrrUsrUc@sPeZdZdZddZeddZeddZdd Zedd d Z dd dZ d S) GenericParamzGeneric SVCB parametercCstjj|d|_dSNT)rDrdataRdata _as_bytesrKselfrKrrr__init__szGenericParam.__init__cCstjSr)r r#rrrrrVszGenericParam.emptinesscCs(|dust|dkrdS|t|SdSNr)r.rOrrKrrr from_valueszGenericParam.from_valuecCsdtj|jdSN")rDrYr>rKr]rrrr4szGenericParam.to_textNcCs*||}t|dkrdS||SdSr_) get_bytes remainingr.rparseroriginrKrrrfrom_wire_parsers zGenericParam.from_wire_parsercCs||jdSr)writerKr]filerirrrto_wireszGenericParam.to_wire)N)N) rrrrr^rrVrar4rjrnrrrrrWs   rWc@s@eZdZddZeddZddZed dd Zd d d ZdS)MandatoryParamcCs\tdd|D}d}|D]2}||kr6td|d|}|tjkrtdqt||_dS)NcSsg|]}t|dqS)r)r3.0r$rrr r?z+MandatoryParam.__init__..zduplicate key dz%listed the mandatory key as mandatory)sortedr/r rtuplekeys)r]rvZprior_kkrrrr^s  zMandatoryParam.__init__cCsdd|dD}||S)NcSsg|] }|qSr)rJ)rqrwrrrrrr?z-MandatoryParam.from_value..rPsplit)rrKrvrrrraszMandatoryParam.from_valuecCsdddd|jDdS)NrcrPcSsg|] }t|qSr)r5rprrrrrr?z*MandatoryParam.to_text..)joinrvrdrrrr4szMandatoryParam.to_textNcCsHg}d}|dkr@|}||kr0tjd|}||q||S)Nrzmanadatory keys not ascending)rf get_uint16rDrE FormErrorrR)rrhrirvZlast_keyr$rrrrjs   zMandatoryParam.from_wire_parsercCs"|jD]}|td|qdSN!H)rvrkstructpack)r]rmrir$rrrrns zMandatoryParam.to_wire)N)N rrrr^rrar4rjrnrrrrros   roc@s@eZdZddZeddZddZed dd Zd d d ZdS) ALPNParamcCstjj|dd|_dS)NcSstjj|dddS)NTrBF)rDrYrZr[)xrrrr?z$ALPNParam.__init__..)rDrYrZ _as_tupleids)r]rrrrr^szALPNParam.__init__cCs|tt|Sr)rTrOr`rrrraszALPNParam.from_valuecCs.ddd|jD}dtj|dS)NrPcSsg|] }t|qSr)r>)rqidrrrrrr?z%ALPNParam.to_text..rc)rzrrDrYr>rJr\rrrr4szALPNParam.to_textNcCs,g}|dkr$|}||q||Sr_)rfZget_counted_bytesrR)rrhrirrrrrrjs   zALPNParam.from_wire_parsercCs0|jD]$}|tdt|||qdS)Nz!B)rrkrrr.)r]rmrirrrrrns zALPNParam.to_wire)N)Nrrrrrrs  rc@sDeZdZeddZeddZddZed dd Zd d d ZdS)NoDefaultALPNParamcCstjSr)r r"rrrrrVszNoDefaultALPNParam.emptinesscCs |dus|dkrdStddS)Nr6z$no-default-alpn with non-empty value)r/r`rrrraszNoDefaultALPNParam.from_valuecCstdSrNotImplementedErrorrdrrrr4szNoDefaultALPNParam.to_textNcCs|dkrtjjdSr_)rfrDrEr})rrhrirrrrjs z#NoDefaultALPNParam.from_wire_parsercCstdSrrrlrrrrn$szNoDefaultALPNParam.to_wire)N)N) rrrrrVrar4rjrnrrrrr s   rc@s@eZdZddZeddZddZed dd Zd d d ZdS) PortParamcCstjj||_dSr)rDrYrZ _as_uint16port)r]rrrrr^*szPortParam.__init__cCst|}||Sr)rIr`rrrra-szPortParam.from_valuecCsd|jdSrb)rrdrrrr42szPortParam.to_textNcCs|}||Sr)r|)rrhrirrrrrj5szPortParam.from_wire_parsercCs|td|jdSr~)rkrrrrlrrrrn:szPortParam.to_wire)N)Nrrrrrr(s  rc@s@eZdZddZeddZddZed dd Zd d d ZdS) IPv4HintParamcCstjj|tjjj|_dSr)rDrYrZrZ_as_ipv4_address addressesr]rrrrr^@s zIPv4HintParam.__init__cCs|d}||SNrPrxrrKrrrrraEs zIPv4HintParam.from_valuecCsdd|jdSNrcrPrzrrdrrrr4JszIPv4HintParam.to_textNcCs6g}|dkr.|d}|tj|q||S)Nrr )rfrerRrDipv4 inet_ntoarrhrirZiprrrrjMs   zIPv4HintParam.from_wire_parsercCs"|jD]}|tj|qdSr)rrkrDr inet_atonr]rmriZaddressrrrrnUs zIPv4HintParam.to_wire)N)Nrrrrrr>s  rc@s@eZdZddZeddZddZed dd Zd d d ZdS) IPv6HintParamcCstjj|tjjj|_dSr)rDrYrZrZ_as_ipv6_addressrrrrrr^\s zIPv6HintParam.__init__cCs|d}||Srrxrrrrraas zIPv6HintParam.from_valuecCsdd|jdSrrrdrrrr4fszIPv6HintParam.to_textNcCs6g}|dkr.|d}|tj|q||S)Nr)rfrerRrDipv6rrrrrrjis   zIPv6HintParam.from_wire_parsercCs"|jD]}|tj|qdSr)rrkrDrrrrrrrnqs zIPv6HintParam.to_wire)N)NrrrrrrZs  rc@s@eZdZddZeddZddZed dd Zd d d ZdS)ECHParamcCstjj|d|_dSrX)rDrYrZr[ech)r]rrrrr^xszECHParam.__init__cCs&d|vrtdt|}||S)Nr7zescape in ECH value)r/base64Z b64decoderJr`rrrra{szECHParam.from_valuecCst|jd}d|dS)Nasciirc)rZ b64encoderr*)r]Zb64rrrr4szECHParam.to_textNcCs||}||Sr)rerfrgrrrrjszECHParam.from_wire_parsercCs||jdSr)rkrrlrrrrnszECHParam.to_wire)N)Nrrrrrrvs  rcCstt|\}}||vr*td|ddt|t}|}|durd|tjkrXtd| |}n&|r| t j t|}n | |}|||<dS)Nzduplicate key "rsrczvalue cannot be empty)r3rOrH_class_for_keygetrWrVr r!rarjrDZwireZParser)paramsr$rKr2rrVrrr_validate_and_defines    rcsleZdZdZgdZfddZdddZedd d Zdd d Z edddZ ddZ eddZ Z S)SVCBBasez Base class for SVCB-like records)prioritytargetrc st|||||_|||_|D]4\}}t|}t |t s.|dur.t |ddq.t j ||_|tj}|r|jD]} | |vrt d| ddqtj|vrtj|vrt ddS)Nrsz not a Paramzkey z# declared mandatory but not presentz)no-default-alpn present, but alpn missing)superr^rrZ_as_namerrSr r1r(rUr/rD immutableDictrrrrvrr) r]rdclassrdtyperrrrwvZ mandatoryr$ __class__rrr^s        zSVCBBase.__init__NTc Ks|j||}g}t|jD]D}|j|}|durF|t|q t|d|}||q t|dkrxd} nd} d|j || d |fS)N=r r6z %d %s%s%s) rZchoose_relativityrtrrvrRr5r4r.rrz) r]ri relativizekwrrr$rKZkvspacerrrr4s   zSVCBBase.to_textcCs4|}||||}|dkr@|} | s6td|| i} |} | rb|| q$| jtjj krxtd| j d} | t | j dkr| j dd} |jdd} | jtjj krtd | j } nH| dkr| j d| } | j | dd} n| dkr td n | j } d} t| | | qD|||||| S) Nrparameters in AliasModezparameter is not an identifierrr r{T)Z want_leadingzwhitespace after =zparameter cannot start with "=")r|get_namerZ is_eol_or_eofrHZungetZttyperDZ tokenizerZ IDENTIFIERrKfindr.Z QUOTED_STRINGr)rrrtokrirZ relativize_torrtokenrZequalsr$rKrrr from_texts<      zSVCBBase.from_textFc Cs|td|j|j|d|dt|jD]b}|td||j|}tj |d$|durt|||Wdq01s0Yq0dS)NrFr ) rkrrrrrnrtrrDZrendererZprefixed_length)r]rmcompressriZ canonicalizer$rKrrr_to_wires zSVCBBase._to_wirec Cs|}||}|dkr2|dkr2tjdi}d}|dkr|} | |krbtjd| }|} t| t} | | | ||} Wdn1s0Y| || <q:||||||S)Nrrr{zkeys not in order) r|rrfrDrEr}rrrWZ restrict_torj) rrrrhrirrrZ prior_keyr$ZvlenZpclsrKrrrrjs"      * zSVCBBase.from_wire_parsercCs|jSr)rrdrrr_processing_priority$szSVCBBase._processing_prioritycCstjj|Sr)rDZrdtypesutilZpriority_processing_order)riterablerrr_processing_order'szSVCBBase._processing_order)NT)NTN)NNF)N)rrrr __slots__r^r4rrrrjrr __classcell__rrrrrs   )  r)1renumrZdns.enumrDZ dns.exceptionZ dns.immutableZdns.ipv4Zdns.ipv6Zdns.nameZ dns.rdataZdns.rdtypes.utilZ dns.rendererZ dns.tokenizerZdns.wirerEZ DNSExceptionrIntEnumr r r3r5r:r>rOrTrrUrWrorrrrrrrrrrrrrrrrYrZrrrrrsf " &