ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     ÿØÿà JFIF      ÿÛ „ 	 ( %!1!%)+//.383,7(-.+



-%%-////---/-.+/--+------/------/--0+--/-/-----.-----ÿÀ  ¥2" ÿÄ               ÿÄ J  	     ! 1AQ"aq2‘#BR‚¡ÁÑ3br’¢±Âð$CSƒ²á4c“%DsÓñÿÄ              ÿÄ *        !1AQa‘"2q3±ð#b¡ÿÚ   ? ¼QxJQaÍuò¸Zö Úü8,ÐÚú
"SSn<rçù–´âE—^ªBÖ9À\†¸ÔÁT­ÃÛ5
ëd´³Í#Ý;Þ38œî ¶H£M:wÎ3…³…âpÔF&‚FK¸9„â4àGEõªfÿ ‘ñ(ßw­pŽF|È¥ù®häðÍÑ¶¹‘[ÒinÙW¶ùñY˜Q{›K"išÒ[Ú8žë\F¹@-?v"ÔU”,ìöžkÿ {I‡£šÍ?e
ríV
..............................................................................................................................................................................
.............................................................................                                                  
                                                                                                                                                                                     3
bW.                 @   sh   d Z ddl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
 dZdZdZdZG dd	 d	eZdS )
z*Help for building DNS wire format messages    )BytesION   )long      c               @   st   e Zd ZdZdddZdd Zd	d
 Zejj	fddZ
dd Zdd ZdddZejjfddZdd Zdd ZdS )Rendererai  Helper class for building DNS wire-format messages.

    Most applications can use the higher-level L{dns.message.Message}
    class and its to_wire() method to generate wire-format messages.
    This class is for those applications which need finer control
    over the generation of messages.

    Typical use::

        r = dns.renderer.Renderer(id=1, flags=0x80, max_size=512)
        r.add_question(qname, qtype, qclass)
        r.add_rrset(dns.renderer.ANSWER, rrset_1)
        r.add_rrset(dns.renderer.ANSWER, rrset_2)
        r.add_rrset(dns.renderer.AUTHORITY, ns_rrset)
        r.add_edns(0, 0, 4096)
        r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_1)
        r.add_rrset(dns.renderer.ADDTIONAL, ad_rrset_2)
        r.write_header()
        r.add_tsig(keyname, secret, 300, 1, 0, '', request_mac)
        wire = r.get_wire()

    @ivar output: where rendering is written
    @type output: BytesIO object
    @ivar id: the message id
    @type id: int
    @ivar flags: the message flags
    @type flags: int
    @ivar max_size: the maximum size of the message
    @type max_size: int
    @ivar origin: the origin to use when rendering relative names
    @type origin: dns.name.Name object
    @ivar compress: the compression table
    @type compress: dict
    @ivar section: the section currently being rendered
    @type section: int (dns.renderer.QUESTION, dns.renderer.ANSWER,
    dns.renderer.AUTHORITY, or dns.renderer.ADDITIONAL)
    @ivar counts: list of the number of RRs in each section
    @type counts: int list of length 4
    @ivar mac: the MAC of the rendered message (if TSIG was used)
    @type mac: string
    Nr     c             C   sh   t  | _|dkr tjdd| _n|| _|| _|| _|| _i | _t	| _
ddddg| _| jjd d| _dS )a  Initialize a new renderer.

        @param id: the message id
        @type id: int
        @param flags: the DNS message flags
        @type flags: int
        @param max_size: the maximum message size; the default is 65535.
        If rendering results in a message greater than I{max_size},
        then L{dns.exception.TooBig} will be raised.
        @type max_size: int
        @param origin: the origin to use when rendering relative names
        @type origin: dns.name.Name or None.
        Nr   i          s               )r   outputrandomZrandintidflagsmax_sizeorigincompressQUESTIONsectioncountswritemac)selfr   r   r   r    r   /usr/lib/python3.6/renderer.py__init__N   s    zRenderer.__init__c             C   s^   | j j| | j j  g }x(| jj D ]\}}||kr&|j| q&W x|D ]}| j|= qJW dS )zTruncate the output buffer at offset I{where}, and remove any
        compression table entries that pointed beyond the truncation
        point.

        @param where: the offset
        @type where: int
        N)r   seektruncater   itemsappend)r   whereZkeys_to_deletekvr   r   r   	_rollbackk   s    	

zRenderer._rollbackc             C   s&   | j |kr"| j |krtjj|| _ dS )aZ  Set the renderer's current section.

        Sections must be rendered order: QUESTION, ANSWER, AUTHORITY,
        ADDITIONAL.  Sections may be empty.

        @param section: the section
        @type section: int
        @raises dns.exception.FormError: an attempt was made to set
        a section value less than the current section.
        N)r   dns	exceptionZ	FormError)r   r   r   r   r   _set_section}   s    

zRenderer._set_sectionc             C   sz   | j t | jj }|j| j| j| j | jjtj	d|| | jj }|| j
krd| j| tjj| jt  d7  < dS )a  Add a question to the message.

        @param qname: the question name
        @type qname: dns.name.Name
        @param rdtype: the question rdata type
        @type rdtype: int
        @param rdclass: the question rdata class
        @type rdclass: int
        z!HHr   N)r&   r   r   tellto_wirer   r   r   structpackr   r#   r$   r%   TooBigr   )r   ZqnameZrdtypeZrdclassbeforeafterr   r   r   add_question   s    




zRenderer.add_questionc             K   sh   | j | | jj }|j| j| j| jf|}| jj }|| jkrR| j| tj	j
| j|  |7  < dS )a  Add the rrset to the specified section.

        Any keyword arguments are passed on to the rdataset's to_wire()
        routine.

        @param section: the section
        @type section: int
        @param rrset: the rrset
        @type rrset: dns.rrset.RRset object
        N)r&   r   r'   r(   r   r   r   r#   r$   r%   r+   r   )r   r   Zrrsetkwr,   nr-   r   r   r   	add_rrset   s    




zRenderer.add_rrsetc             K   sj   | j | | jj }|j|| j| j| jf|}| jj }|| jkrT| j| tj	j
| j|  |7  < dS )a  Add the rdataset to the specified section, using the specified
        name as the owner name.

        Any keyword arguments are passed on to the rdataset's to_wire()
        routine.

        @param section: the section
        @type section: int
        @param name: the owner name
        @type name: dns.name.Name object
        @param rdataset: the rdataset
        @type rdataset: dns.rdataset.Rdataset object
        N)r&   r   r'   r(   r   r   r   r#   r$   r%   r+   r   )r   r   nameZrdatasetr/   r,   r0   r-   r   r   r   add_rdataset   s    




zRenderer.add_rdatasetc             C   s  |t dM }||d> O }| jt | jj }| jjtjddtj	j
||d |dk	rJ| jj }x|D ]}tjd|jd}| jj| | jj }	|j| j | jj }
|
|	 dk st| jj|	d  tjd	|
|	 }| jj| | jjdd qfW | jj }|| dk st| jj|d  tjd	|| }| jj| | jjdd | jj }|| jkrr| j| tjj| jt  d
7  < dS )a  Add an EDNS OPT record to the message.

        @param edns: The EDNS level to use.
        @type edns: int
        @param ednsflags: EDNS flag values.
        @type ednsflags: int
        @param payload: The EDNS sender's payload field, which is the maximum
        size of UDP datagram the sender can handle.
        @type payload: int
        @param options: The EDNS options list
        @type options: list of dns.edns.Option instances
        @see: RFC 2671
        l   ~    z!BHHIHr   Nz!HHi   r   z!Hr   )r   r&   
ADDITIONALr   r'   r   r)   r*   r$   	rdatatypeOPTZotyper(   AssertionErrorr   r   r#   r%   r+   r   )r   ZednsZ	ednsflagsZpayloadZoptionsr,   ZlstartoptZstuffstartendZlendr-   r   r   r   add_edns   s<    










zRenderer.add_ednsc	             C   sB  | j t | jj }	| jj }
tjj|
||tt	j	 ||||||d
\}| _
}|j| j| j| j | jjtjdtjjtjjdd | jj }| jj| | jj }|| dk st|| jkr| j|	 tjj| jj|d  | jjtjd||  | jt  d7  < | jjd | jjtjd| jt  | jjdd d	S )
a  Add a TSIG signature to the message.

        @param keyname: the TSIG key name
        @type keyname: dns.name.Name object
        @param secret: the secret to use
        @type secret: string
        @param fudge: TSIG time fudge
        @type fudge: int
        @param id: the message id to encode in the tsig signature
        @type id: int
        @param tsig_error: TSIG error code; default is 0.
        @type tsig_error: int
        @param other_data: TSIG other data.
        @type other_data: string
        @param request_mac: This message is a response to the request which
        had the specified MAC.
        @type request_mac: string
        @param algorithm: the TSIG algorithm to use
        @type algorithm: dns.name.Name object
        )	algorithmz!HHIHr   i   r   z!Hr   
   N)r&   r5   r   r'   getvaluer$   tsigZsigninttimer   r(   r   r   r   r)   r*   r6   ZTSIG
rdataclassANYr8   r   r#   r%   r+   r   r   )r   ZkeynameZsecretZfudger   Z
tsig_errorZ
other_dataZrequest_macr=   r,   sZ
tsig_rdataZctxZrdata_startr-   r   r   r   add_tsig   s:    







zRenderer.add_tsigc          
   C   sX   | j jd | j jtjd| j| j| jd | jd | jd | jd  | j jdd dS )zWrite the DNS message header.

        Writing the DNS message header is done after all sections
        have been rendered, but before the optional TSIG signature
        is added.
        r   z!HHHHHHr   r   r   N)r   r   r   r)   r*   r   r   r   )r   r   r   r   write_header5  s
    zRenderer.write_headerc             C   s
   | j j S )z@Return the wire format message.

        @rtype: string
        )r   r?   )r   r   r   r   get_wireC  s    zRenderer.get_wire)Nr   r   N)N)__name__
__module____qualname____doc__r   r#   r&   r$   rC   INr.   r1   r3   r<   r@   Zdefault_algorithmrF   rG   rH   r   r   r   r   r   "   s   *

04r   )rL   ior   r)   r   rB   Zdns.exceptionr$   Zdns.tsigZ_compatr   r   ZANSWERZ	AUTHORITYr5   objectr   r   r   r   r   <module>   s   