o
    B](0                     @   s<   d dl mZ d dlmZmZ d dlmZ G dd deZdS )    )NoSuchInstanceError)errinderror)debugc                   @   s8   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dS )VacmzView-based Access Control Model   )   @                      c                 C   s4   d| _ d| _d| _d| _i | _i | _i | _i | _d S )N)_contextBranchId_groupNameBranchId_accessBranchId_viewTreeBranchId_contextMap_groupNameMap
_accessMap_viewTreeMap)self r   </usr/lib/python3/dist-packages/pysnmp/proto/acmod/rfc3415.py__init__   s   
zVacm.__init__c	              	   C   s  |sd S | j }	z|	| }
W n ty   i  }
|	|< Y nw d|fd|fd|ffD ]`\}}z|
| }W n tyA   i  }|
|< Y nw z|| }W n tyW   i  }||< Y nw z|| }W n tym   i  }||< Y nw z|| }W n ty   i  }||< Y nw |||< q(d S )NreadwriteZnotify)r   KeyError)r   	groupNameZcontextPrefixsecurityModelsecurityLevelZprefixMatchZreadViewZ	writeViewZ
notifyViewgroupsviewsviewTypeviewNamematchesZcontextsmodelslevelsr   r   r   _addAccessEntry   sB   
zVacm._addAccessEntryc                 C   sP  | j }z|| }W n ty   tjtjdw z|| }W n ty,   tjtjdw z|d | | | W S  tyA   Y nw g }	| D ]J\}
}| D ]A\}}|
dkr]||kr]qP|
dkrl|d t| |krlqP| D ] \}}| D ]\}}||k|
dkt||f}|		||f qxqpqPqH|	stjtj
d|	  |	d \}}|S )NZerrorIndicationr   r   r   )r   r   r   StatusInformationr   noGroupNameZnoAccessEntryitemslenappend	notInViewsort)r   r    contextNamer!   r"   r%   r#   r$   r'   Z
candidatesmatchnamescontextr(   Zmodelr)   levelr&   Zratingr   r   r   _getFamilyViewNameJ   sF   zVacm._getFamilyViewNamec           *         s  |j j}tjtj@ otd||||||f  |jdd\}	| j|	jkrJ| j	
  |	}
	 z|	|
j}
W n	 ty>   Y nw d| j	|
j< q-|	j| _|| j	vrVtjtjd|jdd\}| j|jkr|jdd\}| j
  |}
	 z||
j}
W n	 ty   Y nw |
jt|jd  }||}|
j| j|< qt|j| _||f}z| j| }W n ty   tjtjdw |jdd\}| j|jkrT|jdd	d
dddddd	\}}}}}}}}| j
  |}
	 z||
j}
W n	 ty   Y nXw |
jdkrq|
jt|jd  }||}|d }| |||j| j||j| j||j| j||j| j||j| j||j| j||j| j q|j| _| |||||}|jdd\}| j|jkr(|jdddd\}}}| j
  dd t dddD |}
	 z||
j}
W n
 ty   Y nvw |
j| jvrg | j|
j< |
jt|jd  }||j| j}||j| j}||j| j} |! }t"t|d t|  fddt#|D }!|!rt$|}"|!D ]}#d|"|#< q|%|"}||!| dkf}$| j|
j &|$ q| j' D ]}%|%j(dd d q|j| _|}z| j| }%W n tyB   tjtj)d Y S w d }&|%D ])}$|$\}}!}'|!ret$|}(|!D ]}#d|(|#< qW|%|(})n|})|*|)ro|'}&qG|&s{tjtj)dd S )!NzuisAccessAllowed: securityModel %s, securityName %s, securityLevel %s, viewType %s, contextName %s for variableName %szSNMP-VIEW-BASED-ACM-MIBvacmContextNameTr+   vacmGroupNamevacmSecurityToGroupEntryvacmAccessStatusvacmAccessEntryvacmAccessContextPrefixvacmAccessSecurityModelvacmAccessSecurityLevelvacmAccessContextMatchvacmAccessReadViewNamevacmAccessWriteViewNamevacmAccessNotifyViewNamer   r   vacmViewTreeFamilyViewNamevacmViewTreeFamilySubtreevacmViewTreeFamilyMaskvacmViewTreeFamilyTypec                 S   s   g | ]}d | qS )r   r   ).0Zexpr   r   r   
<listcomp>)      z(Vacm.isAccessAllowed.<locals>.<listcomp>   r   r   c                    sF   g | ]\}}t D ]\}}||@ s
|d  |  k r
|d  | q
qS )r   )	enumerate)rI   iZoctetjbitZ
maskLengthZ
powerOfTwor   r   rJ   F  s    
c                 S   s   t | d | d fS )Nr   )r/   )xr   r   r   <lambda>Y  rK   z&Vacm.isAccessAllowed.<locals>.<lambda>)keyF)+ZmsgAndPduDspmibInstrumControllerr   loggerZflagACLZ
mibBuilderZimportSymbolsr   ZbranchVersionIdr   clearZgetNextNodenamer   Zsyntaxr   r,   r   ZnoSuchContextr   r   r/   ZgetIndicesFromInstIdr   r-   r   r   r*   ZgetNoder8   r   r   rangeZ	asNumbersminrM   listZcloner0   valuesr2   r1   Z
isPrefixOf)*r   Z
snmpEnginer!   ZsecurityNamer"   r%   r3   ZvariableNamerU   r9   ZnextMibNoder:   r;   ZinstIdindicesr    r<   r=   r>   r?   r@   rA   rB   rC   rD   r&   rE   rF   rG   rH   ZsubtreemaskmodeZignoredSubOidspatternZignoredSubOidentryentriesZaccessAllowedZincludedZsubOidsZnormalizedVariableNamer   rQ   r   isAccessAllowed   s  		
	


	


"


+
zVacm.isAccessAllowedN)
__name__
__module____qualname____doc__ZaccessModelIDZ_powOfTwoSeqr   r*   r8   rc   r   r   r   r   r      s    ,8r   N)	Zpysnmp.smi.errorr   Zpysnmp.protor   r   Zpysnmpr   objectr   r   r   r   r   <module>   s   