
    2iW6                         d dl Z d dlZd dlmZmZmZmZmZmZm	Z	 d dl
mZ ddlmZmZ ddlmZmZ  G d d	      Z G d
 d      Z G d d      Z G d d      Zy)    N)DictSetListUnionOptionalAnyAnyStr)_msgs   )get_commands_by_categoryget_command_info   )SimpleErrorcurrent_timec            
       T    e Zd Zdededededdf
dZdee   fdZed	edd fd
       Z	y)SelectorcommandallowedkeyschannelsreturnNc                 <    || _         || _        || _        || _        y N)r   r   r   r   )selfr   r   r   r   s        ^/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/fakeredis/model/_acl.py__init__zSelector.__init__   s    %$	'    c                 j    | j                   rdnd| j                  d| j                  d| j                  gS )N   +   -   keys   channels)r   r   r   r   r   s    r   as_arrayzSelector.as_array   s-    $gtyyR]_c_l_lmmr   datac                 v   d}d}d}d}|j                  d      }|D ]  }|j                  d      r|}|j                  d      r|dd  }|}|j                  d      r|dd  }|j                  d	      r|}Y|d
   t        d      k(  s|d
   t        d      k(  s||dd  }|d
   t        d      k(  }  | ||||      S )Nr   F       &s   %RW      %r      ~r   +-r   )split
startswithord)clsr%   r   r   r   r   itemkeys           r   
from_byteszSelector.from_bytes   s    zz$ 	.Dt$v&ABxC~~d#!"g~~d#Aw#c("d1gS&9qr(q'SX-	." 7GT844r   )
__name__
__module____qualname__bytesboolr   r   r$   classmethodr4    r   r   r   r   
   s_    ( ( (E (U (W[ (n$u+ n 5e 5
 5 5r   r   c                   N   e Zd Zd'dedefdZd(dZedee   de	ee
      fd       Zd	e	ee
      dee   defd
Zd	e	ee
      dee   dee   fdZd	e	ee
      dee   dee   fdZd	e	ee
      dee   dee   fdZd(dZde	e   defdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZdeddfdZd(dZd(dZdeddfdZdeddfdZdeeeef      fdZdee   fd Zdee   fd!Z dee   fd"Z!dee   fd#Z"dee#eee   f      fd$Z$dee   fd%Z%defd&Z&y))UserAccessControlListenablednopassc                     t               | _        || _        || _        t               | _        t               | _        ddi| _        i | _        y )N   @allF)set
_passwordsr>   _nopass_key_patterns_channel_patterns	_commands
_selectors)r   r>   r?   s      r   r   zUserAccessControlList.__init__0   s@    &)e$#),-0U-4e,<13r   r   Nc                    d| _         d| _        ddi| _        | j                  j	                          | j
                  j	                          | j                  j	                          | j                  j	                          y )NFrA   )r>   rD   rG   rC   clearrE   rF   rH   r#   s    r   resetzUserAccessControlList.reset9   s`    !5)  "$$&r   fieldsc                     | d   j                         }t        |      }|s2t        |       dkD  r$|dz   | d   j                         z   }t        |      }|S )Nr   r   r'   )lowerr   len)rL   r   command_infos      r   _get_command_infoz'UserAccessControlList._get_command_infoB   sR    )//#'0Fanvay'88G+G4Lr   rP   c                 ,   |d   j                         dk(  xs- | j                  j                  |d   j                         d      }|xs | j                  j                  dd      }|s|S |d   D ]"  }|xs | j                  j                  |d      }$ |S )Nr      authFrA      )rN   rG   get)r   rP   rL   rescategorys        r   command_allowedz%UserAccessControlList.command_allowedK   s    Qioo7*Zdnn.@.@ARTY.Z7T^^''7J$Q 	=H<++He<C	=
r   c                 b    |sg S |dd \  }}}|dk(  rg S |dk\  r|dz   n|}|dz   }|||dz   |   S )Nr)   rT   r   r   r;   )r   rP   rL   	first_keylast_keysteps         r   	_get_keyszUserAccessControlList._get_keysT   sY    I$01$5!	8T>I%-]HqLaxi(Q,566r   c                    t        | j                        dk(  rg S | j                  ||      }t               }| j                  D ]'  }|j	                  t        j                  ||            }) t        t        |      |z
        S Nr   )rO   rE   r]   rB   unionfnmatchfilterlist)r   rP   rL   r   rV   pats         r   keys_not_allowedz&UserAccessControlList.keys_not_allowed^   sr    t!!"a'I~~lF3e%% 	7C))GNN456C	7CIO$$r   c                     t        | j                        dk(  rg S |dd }t               }| j                  D ]'  }|j	                  t        j                  ||            }) t        t        |      |z
        S )Nr   r   r   )rO   rE   rB   rF   r`   ra   rb   rc   )r   rP   rL   r   rV   rd   s         r   channels_not_allowedz*UserAccessControlList.channels_not_allowedg   sn    t!!"a'I!A;e)) 	;C))GNN8S9:C	;CMC'((r   c                 F    d| _         | j                  j                          y )NT)rD   rC   rJ   r#   s    r   
set_nopassz UserAccessControlList.set_nopassp   s    r   passwordc                     |d uxr |dk7  }| j                   r| S |syt        j                  |      j                         j	                         }|| j
                  v xr | j                  S )Nr   F)rD   hashlibsha256	hexdigestencoderC   r>   )r   rj   password_providedpassword_hexs       r   check_passwordz$UserAccessControlList.check_passwordt   sd    "*$"6"J8s?<<((("~~h/99;BBDt.?4<<?r   rq   c                 H    d| _         | j                  j                  |       y NF)rD   rC   addr   rq   s     r   add_password_hexz&UserAccessControlList.add_password_hex}   s    L)r   c                     d| _         t        j                  |      j                         j	                         }| j                  |       y rt   )rD   rl   rm   rn   ro   rw   r   rj   rq   s      r   add_passwordz"UserAccessControlList.add_password   s7    ~~h/99;BBDl+r   c                 :    | j                   j                  |       y r   )rC   discardrv   s     r   remove_password_hexz)UserAccessControlList.remove_password_hex   s    -r   c                     t        j                  |      j                         j                         }| j	                  |       y r   )rl   rm   rn   ro   r}   ry   s      r   remove_passwordz%UserAccessControlList.remove_password   s0    ~~h/99;BBD  .r   selectorc                     |d   t        d      k(  |dd  }}|d   t        d      k(  rA|| j                  |<   t        |dd        }|D ]  }|| j                  v s| j                  |=   y || j                  |<   y )Nr   r,   r   @)r0   rG   r   )r   r   r>   r   category_commandss        r   add_command_or_categoryz-UserAccessControlList.add_command_or_category   s    #A;#c(2HQRL1:S!&-DNN7# 8 E, 0dnn,w/0 '.DNN7#r   key_patternc                 :    | j                   j                  |       y r   )rE   ru   r   r   s     r   add_key_patternz%UserAccessControlList.add_key_pattern   s    {+r   c                 8    | j                   j                          y r   )rE   rJ   r#   s    r   reset_key_patternsz(UserAccessControlList.reset_key_patterns   s      "r   c                 8    | j                   j                          y r   )rF   rJ   r#   s    r   reset_channels_patternsz-UserAccessControlList.reset_channels_patterns   s    $$&r   channel_patternc                 :    | j                   j                  |       y r   )rF   ru   r   r   s     r   add_channel_patternz)UserAccessControlList.add_channel_pattern   s    ""?3r   c                 `    t         j                  |      }|| j                  |j                  <   y r   )r   r4   rH   r   )r   r   s     r   add_selectorz"UserAccessControlList.add_selector   s&    &&x0,4(()r   c                     g }| j                   j                         D ]R  \  }}d|j                  rdndz   |j                         z   |j                  |j
                  d}|j                  |       T |S )Nz-@all r,   r-   )commandsr   r   )rH   itemsr   decoder   r   append)r   resultsr   r   ss        r   _get_selectorsz$UserAccessControlList._get_selectors   sr    (*!%!6!6!8 	GX$x/?/?SIGNNL\\ $--!A
 NN1	 r   c                     g }| j                   j                         D ]  \  }}|rdnd}|j                  ||z          ! |S )Nr   r    )rG   r   r   )r   rV   r   r>   incs        r   _get_commandsz#UserAccessControlList._get_commands   sH     $ 4 4 6 	&GW!$tCJJsW}%	& 
r   c                 F    | j                   D cg c]  }d|z   	 c}S c c}w )Nr+   )rE   r   s     r   _get_key_patternsz'UserAccessControlList._get_key_patterns   s!    6:6H6HI{{"III   c                 F    | j                   D cg c]  }d|z   	 c}S c c}w )Nr(   )rF   r   s     r   _get_channel_patternsz+UserAccessControlList._get_channel_patterns   s!    >B>T>TU?&UUUr   c                     g }|j                  | j                  rdnd       | j                  r|j                  d       d| j                  v r|j                  d       d| j                  v r|j                  d       |S )Ns   ons   offs   nopass*s   allkeyss   allchannels)r   r>   rD   rE   rF   )r   flagss     r   
_get_flagsz UserAccessControlList._get_flags   sg    dllU7<<LL#$$$$LL$$(((LL(r   c                 P   g }|j                  d| j                         dt        | j                        ddj	                  | j                               ddj	                  | j                               ddj	                  | j                               d| j                         g       |S )Ns   flagss	   passwordss   commandsr'   r!   r"   s	   selectors)	extendr   rc   rC   joinr   r   r   r   )r   r   s     r   r$   zUserAccessControlList.as_array   s    35!T__%		$,,./		$0023		$4467##%	
  r   c           	      &   g }| j                   j                         D ]q  \  }}d|j                  rdndz   |z   }d|j                  dk7  rd|j                  z   ndz   }|j	                  ddj                  |j                  ||g      z   dz          s |S )	Ns   -@all r   r       resetchannelsr   r'      (   ))rH   r   r   r   r   r   r   )r   r   r   r   r   r   s         r   _get_selectors_for_rulez-UserAccessControlList._get_selectors_for_rule   s    !!%!6!6!8 	RGXX%5%5T4@7JA'IZIZ^aIaD83D3D,DgjkHNN4$))X]]Ha,H"IIDPQ	R r   c                 2   | j                         }| j                         }|dgk7  rdg|z   }| j                         | j                  D cg c]  }d|z   	 c}z   | j	                         z   | j                         z   |z   |z   }dj                  |      S c c}w )Ns   &*r      #r'   )r   r   r   rC   r   r   r   )r   	selectorsr   rj   
rule_partss        r   as_rulezUserAccessControlList.as_rule   s    002	--/w()H4HOO/3?8th?@  "# $$&' 	
  	 yy$$ @s   
B)TFr   N)'r5   r6   r7   r9   r   rK   staticmethodr   r8   r   r   rQ   rX   r]   re   rg   ri   rr   rw   rz   r}   r   r   r   r   r   r   r   r   strr   r   r   r   r   r   r$   r   r   r;   r   r   r=   r=   /   sU   4 4T 4  $u+ (492E  HT#Y,? e Y] 7htCy&9 74; 7SWX]S^ 7%Xd3i-@ %$u+ %Z^_dZe %)$s)1D )dSXk )^bch^i ) @x @4 @*U *t *,U ,t ,
. .$ ./ /$ /	. 	.$ 	.,5 ,T ,#'45 4T 45U 5t 5	T#s(^ 4 	tE{ J4; JVtE{ V	DK 	$uUDK%789 (e % %r   r=   c                   N    e Zd Zdedededededededed	efd
Zdeeef   fdZ	y)AclLogRecordcountreasoncontext_objectusername
created_ts
updated_tsclient_infoentry_idc
                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        y r   )	r   r   r   objectr   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   s
             r   r   zAclLogRecord.__init__   sD      
#%$'))"-%r   r   c                 p   t               | j                  z
  dz  }t        | j                        j	                         | j
                  | j                  | j                  | j                  |d| j                  t        | j                        t        | j                        t        | j                        d
}|S )Ni  z.3f)
r   r   r   r   r   zage-secondszclient-infozentry-idztimestamp-createdztimestamp-last-updated)r   r   r   r   ro   r   r   r   r   r   r   r   )r   age_secondsrV   s      r   as_dictzAclLogRecord.as_dict  s    #~74?_++-kk||kk)#.++DMM*!$T__!5&)$//&:"
 
r   N)
r5   r6   r7   intr8   r   r   r   r	   r   r;   r   r   r   r      st    && & 	&
 & & & & & &,c6k* r   r   c                       e Zd ZddZdee   fdZdedefdZdee   fdZ	deddfdZ
dd	Zd
edeeeef      fdZdedededededdfdZdededee   fdZy)AccessControlListr   Nc                     t        d      }|j                  d       |j                  d       |j                  d       d|i| _        g | _        y )NT)r?      *s   +@alls   default)r=   r   r   r   	_user_acl_log)r   default_user_acls     r   r   zAccessControlList.__init__   sK    0=((.,,T200:>HJZ=[(*	r   c                 H    t        | j                  j                               S r   )rc   r   r   r#   s    r   	get_userszAccessControlList.get_users(  s    DNN'')**r   r   c                 J    | j                   j                  |t                     S r   )r   
setdefaultr=   r   r   s     r   get_user_aclzAccessControlList.get_user_acl+  s    ~~((3H3JKKr   c                     g }| j                   j                         D ]/  \  }}d|z   dz   |j                         z   }|j                  |       1 |S )Ns   user r'   )r   r   r   r   )r   rV   r   user_aclrule_strs        r   as_ruleszAccessControlList.as_rules.  sX    "&.."6"6"8 	!Hh(*T1H4D4D4FFHJJx 	! 
r   c                 <    | j                   j                  |d        y r   )r   popr   s     r   del_userzAccessControlList.del_user5  s    8T*r   c                 8    | j                   j                          y r   )r   rJ   r#   s    r   	reset_logzAccessControlList.reset_log8  s    		r   r   c                     |t        | j                        kD  s|dk  rd}| j                  | d  D cg c]  }|j                          }}|j                          |S c c}w r_   )rO   r   r   reverse)r   r   xrV   s       r   logzAccessControlList.log;  sV    3tyy>!UQYE$(IIufg$67qqyy{77
 8s   Ar   r   r   r   c                    t        | j                        dkD  rp| j                  d   }|j                  |k(  rR|j                  |k(  rC|j                  |k(  r4|j
                  |k(  r%|xj                  dz  c_        t               |_        y t        d||||t               t               |t        | j                        dz   	      }| j                  j                  |       y )Nr   r   )rO   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   
last_entryentrys           r   add_log_recordz AccessControlList.add_log_recordB  s     tyy>A2J!!V+&&'1%%0''83  A% (4
%vw<><>S^`cdhdmdm`nqr`r
 			r   rL   c                 $   || j                   vry |r|d   j                         dk(  ry | j                   |   }|j                  st        d      t        j                  |      }|y |j                  ||      sn| j                  dd|d   ||       t        t        j                  j                  |j                         |d   j                         j                                     |j                  ||      }t        |      dkD  r1| j                  dd|d   ||       t        t        j                        d|d   v rR|j                  ||      }t        |      dkD  r1| j                  d	d|d   ||       t        t        j                         y y )
Nr   rS   zUser disableds   commands   toplevels   keys   @pubsubrT   s   channel)r   rN   r>   r   r=   rQ   rX   r   msgsNO_PERMISSION_ERRORformatr   re   rO   NO_PERMISSION_KEY_ERRORrg   NO_PERMISSION_CHANNEL_ERROR)r   r   r   rL   r   rP   re   rg   s           r   validate_commandz"AccessControlList.validate_commandZ  s   4>>)fQioo'72>>(+o..,>>vF''f=
KHkZd66==hoo>OQWXYQZQ`Q`QbQiQiQklmm#44\6J 1$5Ea5H(T_`d::;;a(#+#@#@v#V '(1,##J=QRS=TV^`kl!$"B"BCC - )r   r   )r5   r6   r7   r   r   r8   r   r=   r   r   r   r   r   r   r   r	   r   r   r   r;   r   r   r   r     s    ++4; +LU L/D L$u+ + +4 + d3;&7!8      	 
     
 0D DU DDQVK Dr   r   )ra   rl   typingr   r   r   r   r   r   r	   	fakeredisr
   r   _command_infor   r   _helpersr   r   r   r=   r   r   r;   r   r   <module>r      sN      @ @ @ # E 0"5 "5JE% E%P% %PRD RDr   