o
    B]6T                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	m
Z
 d dlmZ d dlmZmZ d dlmZ G d	d
 d
ejZG dd deZdS )    N)encoder)PyAsn1Error)base)udpudp6unix)NoSuchInstanceError)errinderror)debugc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )SnmpV1SecurityModel   c                 C   s(   d | _  | _ | _| _tj|  d S )N)'_SnmpV1SecurityModel__transportBranchId$_SnmpV1SecurityModel__paramsBranchId'_SnmpV1SecurityModel__communityBranchId&_SnmpV1SecurityModel__securityBranchIdr   AbstractSecurityModel__init__)self r   =/usr/lib/python3/dist-packages/pysnmp/proto/secmod/rfc2576.pyr      s   zSnmpV1SecurityModel.__init__c              	   C   sd  |j jjdd\}| j|jkr|j jjdd\}i | _|}	 z||j}W n	 t	y1   Y nHw |jt
|jd  }||j| }	z|	j| jvrRt | j|j< | j|j |	j W n tyw   tjtj@ ottd|j|	jf  Y qw q |j| _d| _|j jjdd\}
| j|
jkr|j jjdd	d
d\}}}i | _|
}	 z|
|j}W n	 t	y   Y nMw |jt
|
jd  }||j| j}||j| j}||j| j}z|j| j|||f< W n ty   tjtj@ otd|||f  Y qw q|
j| _tjtj@ otd| j| jf  z	| j|||f W S  ty1   tjtjdw )NSNMP-TARGET-MIBsnmpTargetParamsSecurityNamesnmpTargetParamsSecurityModelTz,_sec2com: table entries %r/%r hashing failedr   SNMP-COMMUNITY-MIBsnmpCommunityNamesnmpCommunitySecurityNamesnmpCommunityContextEngineIDsnmpCommunityContextNamez/_sec2com: table entries %r/%r/%r hashing failedzA_sec2com: built securityName to communityName map, version %s: %serrorIndication)msgAndPduDspmibInstrumController
mibBuilderimportSymbolsr   branchVersionId$_SnmpV1SecurityModel__nameToModelMapgetNextNodenamer   lengetNodesyntaxsetaddr   r   loggerflagSMr   Z!_SnmpV1SecurityModel__securityMapKeyErrorr
   StatusInformationr	   unknownCommunityName)r   
snmpEnginesecurityNamecontextEngineIdcontextNamer   r   nextMibNodeinstIdmibNoder   r   snmpCommunityContextEngineIdr   Z_securityNameZ_contextEngineIdZ_contextNamer   r   r   _sec2com   s   


zSnmpV1SecurityModel._sec2comc                     s  |j jjdd\}j|jkr|j jjdddd\ }} d_i _|}	 z||j	}W n	 t
y;   Y nw |j	t|j	d  }||j	| j}	||j	| j}
t|	}	|	d ttj tjkry|j jjdd	\}t||
}
n-|	d ttj tjkr|j jjd
d\}t||
}
n|	d ttj tjkrt|
}
|	|
f}||j	| j}|jvrt j|< z!|rՈj|  fdd|  D  n	j| j W n ty   tjtj@ otd||f  Y q)w q*|j_tjtj@ otdjjf  |j jjdd\}j|jkr|j jjdd\}i _ |}	 z||j	}W n
 t
yB   Y nMw |j	t|j	d  }||j	| }z|jj vrdt j |j< j |j |j W n ty   tjtj@ otd|j|jf  Y q/w q0|j_d_!tjtj@ otdjj f  |j jjdd\}j!|jkr|j jjddddd\}}}}i _"i _#|}	 z||j	}W n
 t
y   Y nw |j	t|j	d  }||j	| j}||j	| j}||j	| j}||j	| j}||jf}z0|j#vr%t j#|< j#| |||f |jj"vr>t j"|j< j"|j | W n tyd   tjtj@ o`td||jf  Y qw q|j_!tjtj@ o~tdj$j!j"f  tjtj@ otdj$j!j#f  j"v r|jv rj| %j" }njj" v rjg}nt&j't(j)dg }fdd|D D ]
}|*t+| q|r|j,j j$fddd  |d! }tjtj@ o td"||d! f  |S  |S t&j't(j)d)#Nr   snmpTargetAddrTAddressSnmpTagValuesnmpTargetAddrTDomainsnmpTargetAddrTagList Tz	SNMPv2-TMSnmpUDPAddresszTRANSPORT-ADDRESS-MIBTransportAddressIPv6c                    s   g | ]} |qS r   r   ).0x)r>   r   r   
<listcomp>   s    z0SnmpV1SecurityModel._com2sec.<locals>.<listcomp>z,_com2sec: table entries %r/%r hashing failedz3_com2sec: built transport-to-tag map version %s: %sr   r   r   zA_com2sec: built securityName to securityModel map, version %s: %sr   r   r   r   r   snmpCommunityTransportTagzK_com2sec: built communityName to tag map (securityModel %s), version %s: %szV_com2sec: built tag & community to securityName map (securityModel %s), version %s: %sr    c                    s   g | ]	}j | f qS r   )2_SnmpV1SecurityModel__tagAndCommunityToSecurityMap)rD   t)communityNamer   r   r   rF   =  s    c                 S   s.   t | d |v o||| d  v  t| d fS )Nr   )intstr)rE   mvr   r   r   <lambda>D  s   *z.SnmpV1SecurityModel._com2sec.<locals>.<lambda>)keyr   z[_com2sec: securityName candidates for communityName '%s' are %s; choosing securityName '%s')-r"   r#   r$   r%   r   r&   Z_SnmpV1SecurityModel__emptyTagZ'_SnmpV1SecurityModel__transportToTagMapr(   r)   r   r*   r+   r,   tupler   ZsnmpUDPDomainr   ZsnmpUDP6Domainr   ZsnmpLocalDomainrL   r-   updateZasOctetssplitr.   r   r   r/   r0   r   r'   r   Z'_SnmpV1SecurityModel__communityToTagMaprH   securityModelIDintersectionr
   r2   r	   r3   extendlistsort) r   r4   rJ   transportInformationr=   r?   r@   r8   r9   ZtargetAddrTDomainZtargetAddrTAddressrB   rC   Z
targetAddrZtargetAddrTagListr   r   r:   r   r   r;   r   rG   r5   r6   r7   ZtransportTagZ_tagAndCommunityZtagsZcandidateSecurityNamesrE   ZchosenSecurityNamer   )r>   rJ   r   r   _com2sec   s|  







/




(


zSnmpV1SecurityModel._com2secc
                 C   s   |\}
|	\}}}|  ||||}tjtj@ o!td|||||f  |}|
d| |
d |
dj|j|dddd tjtj@ oLtd|
	 f  z|t
|
fW S  ty|   tjtj@ ottdt d   tjtjd tjtjdw )	NzogenerateRequestMsg: using community %r for securityModel %r, securityName %r, contextEngineId %r contextName %rr      FZverifyConstraintsZ	matchTagsZmatchConstraintszgenerateRequestMsg: %sz-generateRequestMsg: serialization failure: %sr    )r<   r   r/   r0   setComponentByPositiongetComponentByPositionsetComponentByTypetagSetflagMPprettyPrintr   encoder   sysexc_infor
   r2   r	   serializationError)r   r4   messageProcessingModel
globalDatamaxMessageSizesecurityModelsecurityEngineIdr5   securityLevel	scopedPDUmsgr6   r7   pdurJ   securityParametersr   r   r   generateRequestMsgO  s:   



z&SnmpV1SecurityModel.generateRequestMsgc                 C   s   |\}|	\}}}| j |
}|d }tjtj@ o td||
f  |d| |d |dj|j|dddd tjtj	@ oItd|
 f  z|t|fW S  tyy   tjtj	@ oqtdt d   tjtjd	 tjtjd	w )
NrJ   zHgenerateResponseMsg: recovered community %r by securityStateReference %sr   r[   Fr\   zgenerateResponseMsg: %sz.generateResponseMsg: serialization failure: %sr    )_cachepopr   r/   r0   r]   r^   r_   r`   ra   rb   r   rc   r   rd   re   r
   r2   r	   rf   )r   r4   rg   rh   ri   rj   securityEngineIDr5   rl   rm   securityStateReferencern   r6   r7   ro   ZcachedSecurityDatarJ   r   r   r   generateResponseMsgp  s6   


z'SnmpV1SecurityModel.generateResponseMsgc	                 C   sx  |\}	}
t |	|
d}|j|d| |j|d z| ||d|	|d|
\}}}W n! tjyN   |jj	j
dd\}| jd7  _tjtj|	dw |jj	j
d	d
\}|j}|j|dt |
|||	||d |j|d tjtj@ otd|| j|||	|
f  | jj|	d}|||d f}|d }|}tjtj@ otd||f  |||||fS  |||||fS )N)rJ   rY   z#rfc2576.processIncomingMsg:writablerJ   rY   z__SNMPv2-MIBsnmpInBadCommunityNamesr   )r!   rJ   z__SNMP-FRAMEWORK-MIBsnmpEngineIDzrfc2576.processIncomingMsg)rY   rk   r5   rJ   r6   r7   zprocessIncomingMsg: looked up securityName %r securityModel %r contextEngineId %r contextName %r by communityName %r AND transportInformation %r)rJ   r[      zSprocessIncomingMsg: generated maxSizeResponseScopedPDU %s securityStateReference %s)dictZobserverZstoreExecutionContextZclearExecutionContextrZ   getr
   r2   r"   r#   r$   r%   r,   r	   r3   r   r/   r0   rT   rr   pushr^   ZgetComponent)r   r4   rg   ri   rp   rj   rl   ZwholeMsgrn   rJ   rY   Zscoper5   r6   r7   rw   rx   rt   ZstateReferencerm   ZmaxSizeResponseScopedPDUru   r   r   r   processIncomingMsg  s   

		z&SnmpV1SecurityModel.processIncomingMsgN)
__name__
__module____qualname__rT   r   r<   rZ   rq   rv   r}   r   r   r   r   r      s    b P!r   c                   @   s   e Zd ZdZdS )SnmpV2cSecurityModelr[   N)r~   r   r   rT   r   r   r   r   r     s    r   )rd   Zpyasn1.codec.berr   Zpyasn1.errorr   Zpysnmp.proto.secmodr   Zpysnmp.carrier.asyncore.dgramr   r   r   Zpysnmp.smi.errorr   Zpysnmp.protor	   r
   Zpysnmpr   r   r   r   r   r   r   r   <module>   s      D