+
    	:iP@  c                   s    R t ^ RIt^ RIt^RIHt ^RIHt ^RIHt ^RIHt ^RIH	t	  ! R R4      t
R	 tR
 tR tR tR t ! R R4      t ! R R4      t ! R R4      t ! R R4      tR# )z7
Classes for representing and manipulating interfaces.
N)access)	refpolicy)objectmodel)matching)_c                   sb   a  ] tR t^"t o RtR tR tR t]! ]]4      t	]! R R7      t
R tRtV tR	# )
Paramz3
Object representing a parameter for an interface.
c                s    R V n         \        P                  V n        \        P                  ! 4       V n        RV n        R# ) TN)_Param__namer   SRC_TYPEtypeIdSetobj_classesrequiredself   &8/usr/lib/python3.14/site-packages/sepolgen/interfaces.py__init__ZParam.__init__&   s,    &&	$??,    c                sn    \         P                  ! V4      '       g   \        R V,          4      hWn        R# )zName [%s] is not a paramN)r    
is_idparamZ
ValueErrorr   )r   name   &&r   set_nameZParam.set_name,   s)      &&7$>??r   c                    V P                   # N)r   r   r   r   get_nameZParam.get_name1   s    {{r   c                s:    \        V P                  R ,          4      # )   NN)intr   r   r   r   <lambda>ZParam.<lambda>6   s    S2%7r   )Zfgetc                s    R V P                   : R\        P                  V P                  ,          : RRP	                  V P
                  4      : R2# )z$<sepolgen.policygen.Param instance [z,  z]>)r   r   field_to_strr	   joinr   r   r   r   __repr__ZParam.__repr__8   s:    		911$))<<chhtGWGW>XZ 	Zr   )Z__namer   r   r	   N)__name__
__module____qualname____firstlineno____doc__r   r   r   Zpropertyr   numr!   __static_attributes____classdictcell__Z__classdict__   @r   r   r   "   s>     
 Hh'D
7
8CZ Zr   r   c                 s   ^ pW9   d   W0,          pWP                   8X  d   R# V\        P                  8X  g   V\        P                  8X  d   VP                   \        P                  8X  g    VP                   \        P                  8X  dr   ^pV'       d   VP                  .pM. p\
        P                  ! VP                  V4       F  pV\        P                  9   g   K  ^ p M	  \        P                  Vn         M'^pM$\        4       pWn        Wn         WSVP                  &   V'       d&   VP                  P                  VP                  4       V# i    N)r	   r   r   TGT_TYPE	obj_class	itertoolschainr   r   Zimplicitly_typed_objectsr   r   add)r   r	   avparamsretpZavobjsZobjs   &&&&    r   __param_insertr6   >   s    
C~L66>I&&&$)2D2D*DFFi(((AFFi6H6H,H C,, q}}f=+>>>C > ''AF
 CGqvv		",,'Jr   c                s   ^ pRp\         P                  ! V P                  4      '       d-   \        V P                  \        P
                  W4      ^8X  d   ^p\         P                  ! V P                  4      '       d-   \        V P                  \        P                  W4      ^8X  d   ^p\         P                  ! V P                  4      '       d-   \        V P                  \        P                  W4      ^8X  d   ^pV# )a  Extract the parameters from an access vector.

Extract the parameters (in the form $N) from an access
vector, storing them as Param objects in a dictionary.
Some attempt is made at resolving conflicts with other
entries in the dict, but if an unresolvable conflict is
found it is reported to the caller.

The goal here is to figure out how interface parameters are
actually used in the interface - e.g., that $1 is a domain used as
a SRC_TYPE. In general an interface will look like this:

interface(`foo', `
   allow $1 foo : file read;
')

This is simple to figure out - $1 is a SRC_TYPE. A few interfaces
are more complex, for example:

interface(`foo_trans',`
   domain_auto_trans($1,fingerd_exec_t,fingerd_t)

   allow $1 fingerd_t:fd use;
   allow fingerd_t $1:fd use;
   allow fingerd_t $1:fifo_file rw_file_perms;
   allow fingerd_t $1:process sigchld;
')

Here the usage seems ambiguous, but it is not. $1 is still domain
and therefore should be returned as a SRC_TYPE.

Returns:
  0  - success
  1  - conflict found
F)
r    r   src_typer6   r   r   tgt_typer-   r.   	OBJ_CLASS)r2   r3   r4   Z	found_src   &&  r   av_extract_paramsr;   j   s    H CI%%"++y'9'92F!KC%%"++y'9'92F!KC&&",,	(;(;RHAMCJr   c                 s    \         P                  ! V P                  4      '       d'   \        V P                  \        P
                  R V4      # R # r   )r    r   roler6   r   ZROLE)r<   r3   r   r   role_extract_paramsr=      s5    ##diivFF $r   c                 s  a V3R  lp^ pV! V P                   \        P                  4      '       d   ^pV! V P                  \        P                  4      '       d   ^pV! V P
                  \        P                  4      '       d   ^p\        P                  ! V P                  4      '       d/   \        V P                  \        P                  RS4      '       d   ^pV# )c                 s   < ^ pV  F8  p\         P                  ! V4      '       g   K!  \        W1RS4      '       g   K6  ^pK:  	  V# r,   )r    r   r6   )setr	   r4   xr3   s   &&  r   extract_from_setZ2type_rule_extract_params.<locals>.extract_from_set   s>    A  ##!!488C  
r   N)	src_typesr   r   	tgt_typesr-   r   r9   r    r   Z	dest_typer6   Z	DEST_TYPE)ruler3   r@   r4   s   &f  r   type_rule_extract_paramsrD      s     C	(:(:;;	(:(:;;(()*=*=>>(($..)*=*=tVLLCJr   c                 s    ^ pV P                    FG  p\        P                  ! V4      '       g   K!  \        V\        P
                  RV4      '       g   KE  ^pKI  	  V# r,   )argsr    r   r6   r   r   )ifcallr3   r4   argr:   r   ifcall_extract_paramsrH      sK    
C{{S!! c9#5#5tVDD  Jr   c                   s,   a  ] tR t^t o R tR tRtV tR# )AttributeVectorc                sH    R V n         \        P                  ! 4       V n        R# )r   N)r   r    AccessVectorSetr   r   r   r   ZAttributeVector.__init__   s    	,,.r   c                s<    V P                   P                  V4       R # r   )r    add_avr   r2   r   r   rK   ZAttributeVector.add_av   s    2r   )r    r   N)r"   r#   r$   r%   r   rK   r(   r)   r*   r+   r   rI   rI      s     / r   rI   c                   s2   a  ] tR t^t o R tR tR tRtV tR# )AttributeSetc                s    / V n         R # r   
attributesr   r   r   r   ZAttributeSet.__init__   s	    r   c                6    WP                   VP                  &   R # r   )rO   r   )r   attrr   r   add_attrZAttributeSet.add_attr   s    %)		"r   c                sH   R  pRpV F{  pVRR pV^ ,          R8X  d$   V'       d   V P                  V4       V! V4      pK9  V'       g   KC  VP                  R4      p\        P                  ! V4      pVP	                  V4       K}  	  V'       d   V P                  V4       R# R# )c                 s    V ^R P                  4       p\        V4      ^8w  g   V^ ,          R8w  d   \        RV ,          4      h\        4       pV^,          Vn        V# )r   Z	Attributez#Syntax error Attribute statement %s)splitlenSyntaxErrorrI   r   )linefieldsa   &  r   
parse_attrZ*AttributeSet.from_file.<locals>.parse_attr   sV    !BZ%%'F6{a6!9#;!"G$"NOO!AAYAFHr   N[,rS   )rR   rT   r    AccessVectorrK   )r   fdr[   rY   rW   lr2      &&     r   	from_fileZAttributeSet.from_file   s    	 D9DAw#~MM!$t$JJsO((+  MM! r   rN   N)	r"   r#   r$   r%   r   rR   rb   r(   r)   r*   r+   r   rM   rM      s     * r   rM   c                   sR   a  ] tR t^t o R/ 3R lt/ 3R ltR tR tR tR t	Rt
V tR# )	InterfaceVectorNc                s    R V n         RV n        \        P                  ! 4       V n        / V n        V'       d   V P                  W4       RV n        R# )Tr   FN)enabledr   r    rJ   r3   from_interfaceexpanded)r   	interfacerO   s   &&&r   r   ZInterfaceVector.__init__   sE     	 ,,. 	6r   c                s<   VP                   V n         VP                  4        Fq  pVP                  \        P                  P
                  8w  d   K.  R VP                   9   d   KA  \        P                  ! V4      pV F  pV P                  V4       K  	  Ks  	  V'       d   VP                  4        F  pVP                   F  pWrP                  9  d   K  VP                  V,          pVP                   F  p	\        P                  ! V	4      pVP                  VP                   8X  d   VP                  Vn        VP                  VP                   8X  d   VP                  Vn        V P                  V4       K  	  K  	  K  	  VP                  4        F   p
\!        WP"                  4      '       g   K   K"  	  VP%                  4        F   p\'        WP"                  4      '       g   K   K"  	  VP)                  4        F   p\+        WP"                  4      '       g   K   K"  	  R# )Z	dontauditN)r   ZavrulesZ	rule_typer   ZAVRuleZALLOWr    Zavrule_to_access_vectorsrK   ZtypeattributesrO   copyr7   r	   r8   Zrolesr=   r3   Z	typerulesrD   interface_callsrH   )r   rg   rO   ZavruleZavsr2   ZtypeattributerQ   Zattr_vecrY   r<   rC   rF   s   &&&          r   re   ZInterfaceVector.from_interface   s   NN	  '')F9#3#3#9#99inn,11&9CB  * !*!9!9!;)44D#8#88 )44T:H%__!YYq\;;(--7*7*<*<BK;;(--7*7*<*<BKB - 5 "<  OO%D"455 & '')D'kk:: *  //1F$V[[99 2r   c                sr    \        WP                  4      ^8X  d    V P                  P                  V4       R# )r   N)r;   r3   r    rK   rL   r   r   rK   ZInterfaceVector.add_av3  s(    R-22r   c                s    . pVP                  R V P                  ,          4       V P                   F  pVP                  \        V4      4       K  	  RP	                  V4      # )z[InterfaceVector %s]
)appendr   r    strr    )r   Zsr2   rZ   r   	to_stringZInterfaceVector.to_string9  sI    	'$))34++BHHSW yy|r   c                s"    V P                  4       # r   )r!   r   r   r   __str__ZInterfaceVector.__str__@  s    }}r   c                s@    R V P                   : RV P                  : R2# )z<InterfaceVector :Z>)r   rd   r   r   r   r!   ZInterfaceVector.__repr__C  s    ,0IIt||DDr   )r    rd   rf   r   r3   )r"   r#   r$   r%   r   re   rK   rm   rn   r!   r(   r)   r*   r+   r   rc   rc      s5     !%" " 46 /hE Er   rc   c                   sz   a  ] tR tRt o RR ltR tR tR tR tR t	/ 3R	 lt
R/ 3R
 ltR tR tR tR tRtV tR# )InterfaceSetiG  Nc                s<    / V n         / V n        . V n        Wn        R # r   )
interfacestgt_type_maptgt_type_alloutput)r   rt   r   r   r   ZInterfaceSet.__init__H  s    r   c                sr    V P                   '       d%   V P                   P                  VR ,           4       R# R# )rj   N)rt   write)r   rl   r   r   oZInterfaceSet.oN  s&    ;;;KKcDj) r   c                sb   \        V P                  P                  4       R  R7       EF  pVP                  RVP                  ,          4       \        VP
                  P                  4       R R7       FE  pVP                  VP                  : R\        P                  VP                  ,          : R24       KG  	  VP                  R4       \        VP                  P                  4       4      pV F4  pVP                  RP                  V4      4       VP                  R4       K6  	  EK  	  R	# )
c                 r   r   r   r?   r   r   r   &InterfaceSet.to_file.<locals>.<lambda>S  s    r   )Zkeyz[InterfaceVector %s c                 r   r   rw   rx   r   r   r   ry   U  s    !&&r   ro   r   z]
r]   rj   N)Zsortedrq   valuesru   r   r3   r   r   r	   r    Zto_listr    )r   r_   ZivparamZavlr2   s   &&    r   to_fileZInterfaceSet.to_fileR  s    //17GHHBHH+bgg56		 0 0 28HIUZZ1G1G

1S1STU JHHUO**,-C"&  Ir   c                sd   R  pRpV F{  pVRR pV^ ,          R8X  d$   V'       d   V P                  V4       V! V4      pK9  V'       g   KC  VP                  R4      p\        P                  ! V4      pVP	                  V4       K}  	  V'       d   V P                  V4       V P                  4        R# )c                 s   V ^R P                  4       p\        V4      ^8  g   V^ ,          R8w  d   \        RV ,          4      h\        4       pV^,          Vn        \        V4      ^8X  d   R# VR,           F  pVP                  R4      p\        V4      ^8w  d   \        RV ,          4      h\        4       pV^ ,          Vn        \        P                  V^,          ,          Vn        WRP                  VP                  &   K  	  V# )r   rc   z)Syntax error InterfaceVector statement %sN:i   NNro   z-Invalid param in InterfaceVector statement %srS   )
rT   rU   rV   rc   r   r   r   Zstr_to_fieldr	   r3   )rW   rX   ifvZfieldr5   r{      &     r   	parse_ifvZ)InterfaceSet.from_file.<locals>.parse_ifv^  s    !BZ%%'F6{Q&)/@"@!"MPT"TUU!#CayCH6{aKK$q6Q;%&UX\&\]]qT
&33AaD9
).

5::& $ Jr   Nr\   r]   rS   )add_ifvrT   r    r^   rK   index)r   r_   r   r}   rW   r`   r2   ra   r   rb   ZInterfaceSet.from_file]  s    	$ D9DAw#~LL%oJJsO((+

2  LL

r   c                rP   r   )rq   r   )r   r}   r   r   r   ZInterfaceSet.add_ifv  s    $'!r   c                s   V P                   P                  4        F  p\        4       pVP                   Fk  p\        P                  ! VP
                  4      '       d(   V P                  P                  V4       \        4       p MVP                  VP
                  4       Km  	  V F0  pV P                  P                  V. 4      pVP                  V4       K2  	  K  	  R # r   )rq   rz   r>   r    r   r8   rs   rk   r1   rr   Z
setdefault)r   r}   rB   r2   r	   r`   r~   r   r   ZInterfaceSet.index  s    ??))+CIjj$$R[[11%%,,S1 #Ibkk* ! "%%00r: " ,r   c                s>    \        W4      pV P                  V4       R # r   )rc   r   )r   rg   rO   r}   s   &&& r   r1   ZInterfaceSet.add  s    i4Sr   c                s    \         P                  ! VP                  4       VP                  4       4       F  pV P	                  WC4       K  	  V P                  V4       V P                  4        R # r   )r/   r0   rq   	templatesr1   expand_ifcallsr   )r   headersrt   rO   is   &&&& r   add_headersZInterfaceSet.add_headers  sO    !3!3!5w7H7H7JKAHHQ# L 	G$

r   c                s   \         P                  ! V4      '       dd   \        VR ,          4      pV\        VP                  4      8  d   R# VP                  V^,
          ,          p\        V\        4      '       d   V# V.# V.# )r   N)r    r   r   rU   rE   Z
isinstanceZlist)r   ZidrF   r'   rG   s   &&&  r   	map_paramZInterfaceSet.map_param  sh    R  bf+CS%% kk#'*c4((J5L4Kr   c           	     s   V P                  VP                  V4      pVf   R # V P                  VP                  V4      pVf   R # V P                  VP                  V4      pVf   R # \        P
                  ! 4       pVP                   F+  pV P                  W4      p	V	f   K  VP                  V	4       K-  	  \        V4      ^ 8X  d   R # V F1  p
V F(  pV F  pVP                  P                  WW4       K!  	  K*  	  K3  	  R # r   )r   r7   r8   r.   r   r
   ZpermsZupdaterU   r    r1   )r   r}   r2   rF   rA   rB   r   Z	new_permsZpermr5   r7   r8   r.   s   &&&&         r   
map_add_avZInterfaceSet.map_add_av  s    NN2;;7	NN2;;7	nnR\\6:OO%	HHDt,Ay  #  y>Q!H%!,IJJNN8yL "- & "r   c                s   VR 3.pV P                   VP                  ,          pRVn        \        V4      ^ 8  d   VP	                  R4      w  rVV P                   VP                  ,          pWQ8w  d:   VP
                   F  pV P                  WHV4       K  	  VP                  '       d   K  VP                  4        F`  p	V	P                  VP                  8X  d   V P                  \        R4      4        R #  W)P                  ,          p
TP                  Y34       Kb  	  K  R #   \         d0    T P                  \        RT	P                  ,          4      4        K  i ; i)NTzFound circular interface classz#Missing interface definition for %srS   )rq   r   rf   rU   Zpopr    r   ri   Zifnamerv   r   ZKeyErrorrk   )r   rg   
if_by_nameZstackr}   ZcurZ
cur_ifcallZcur_ifvr2   rF   Znewifs   &&&        r   do_expand_ifcallsZInterfaceSet.do_expand_ifcalls  s   
 T"#ooinn-%j1n#iimOCoochh/G!..BOOCZ8 )
 ###--/==INN2FF1=>?&}}5E
 e_- 0 (   FF1BV]]RSTs   5D!!6EEc                s0   / p\         P                  ! VP                  4       VP                  4       4       F  pW2VP                  &   K  	  \         P                  ! VP                  4       VP                  4       4       F  pV P                  WB4       K  	  R # r   )r/   r0   rq   r   r   r   )r   r   r   r   rg   s   &&   r   r   ZInterfaceSet.expand_ifcalls  su     
!3!3!5w7H7H7JKA!"qvv L #););)=w?P?P?RSI""99 Tr   )rq   rt   rs   rr   r   )r"   r#   r$   r%   r   rv   r|   rb   r   r   r1   r   r   r   r   r   r(   r)   r*   r+   r   rp   rp   G  sU     *	!F( )+  +/2  M8!.H: :r   rp   )r&   rh   r/   r   r    r   r   r   Zsepolgeni18nr   r   r6   r;   r=   rD   rH   rI   rM   rc   rp   ) r   r   <module>r      sx   (       Z Z8(X2hG2	  >WE WEtp: p:r   