
    <iW6                         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dS )    N)DictSetListUnionOptionalAnyAnyStr)_msgs   )get_commands_by_categoryget_command_info   )SimpleErrorcurrent_timec            
       b    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	dS )SelectorcommandallowedkeyschannelsreturnNc                 >    || _         || _        || _        || _        d S N)r   r   r   r   )selfr   r   r   r   s        /Users/kimhansen/Desktop/03 Workspace/ceo-agents/chl-effectiveness/mcp-servers/whoop/.venv/lib/python3.11/site-packages/fakeredis/model/_acl.py__init__zSelector.__init__   s"    %$	'    c                 B    | 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)    .$gtyR]_c_lmmr   datac                    d}d}d}d}|                     d          }|D ]}|                    d          r|}|                    d          r
|dd          }|}|                    d          r
|dd          }|                    d	          r|}r|d
         t          d          k    s|d
         t          d          k    r#|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&&  ABBxC~~d## !""g~~d## Aw#c((""d1gS&9&9qrr(q'SXX-s7GT8444r   )
__name__
__module____qualname__bytesboolr   r   r$   classmethodr4    r   r   r   r   
   s        ( ( (E (U (W[ ( ( ( (n$u+ n n n n 5e 5
 5 5 5 [5 5 5r   r   c                      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&dS )+UserAccessControlListTFenablednopassc                     t                      | _        || _        || _        t                      | _        t                      | _        ddi| _        i | _        d S )N   @allF)set
_passwordsr>   _nopass_key_patterns_channel_patterns	_commands
_selectors)r   r>   r?   s      r   r   zUserAccessControlList.__init__0   sJ    &)ee$#),-0UU-4e,<13r   r   Nc                     d| _         d| _        ddi| _        | j                                         | j                                         | j                                         | j                                         d S )NFrA   )r>   rD   rG   rC   clearrE   rF   rH   r#   s    r   resetzUserAccessControlList.reset9   st    !5)  """$$&&&r   fieldsc                     | d                                          }t          |          }|sBt          |           dk    r/|dz   | d                                          z   }t          |          }|S )Nr   r   r'   )lowerr   len)rL   r   command_infos      r   _get_command_infoz'UserAccessControlList._get_command_infoB   sg    )//##'00 	5Fanvay'8'88G+G44Lr   rP   c                 :   |d                                          dk    p2| j                            |d                                          d          }|p| j                            dd          }|s|S |d         D ]}|p| j                            |d          } |S )Nr      authFrA      )rN   rG   get)r   rP   rL   rescategorys        r   command_allowedz%UserAccessControlList.command_allowedK   s    Qioo7*Zdn.@.@ARARTY.Z.Z7T^''77 	J$Q 	= 	=H<++He<<CC
r   c                 v    |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   sf     	I$01$5!	8T>>I%-]]HqLLaxi(Q,566r   c                     t          | j                  dk    rg S |                     ||          }t                      }| j        D ]*}|                    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^   s    t!""a''I~~lF33ee% 	7 	7C))GN45566CCCIIO$$$r   c                    t          | j                  dk    rg S |dd         }t                      }| j        D ]*}|                    t          j        ||                    }+t          t          |          |z
            S )Nr   r   r   )rO   rE   rB   rF   r_   r`   ra   rb   )r   rP   rL   r   rV   rc   s         r   channels_not_allowedz*UserAccessControlList.channels_not_allowedg   s}    t!""a''I!A#;ee) 	; 	;C))GN8S99::CCCMMC'(((r   c                 F    d| _         | j                                         d S )NT)rD   rC   rJ   r#   s    r   
set_nopassz UserAccessControlList.set_nopassp   s#    r   passwordc                     |d uo|dk    }| j         r| S |sdS t          j        |                                                                          }|| j        v o| j        S )Nr   F)rD   hashlibsha256	hexdigestencoderC   r>   )r   ri   password_providedpassword_hexs       r   check_passwordz$UserAccessControlList.check_passwordt   sq    "*$"6"J8s?< 	(((" 	5~h//99;;BBDDt.?4<?r   rp   c                 H    d| _         | j                            |           d S NF)rD   rC   addr   rp   s     r   add_password_hexz&UserAccessControlList.add_password_hex}   s%    L)))))r   c                     d| _         t          j        |                                                                          }|                     |           d S rs   )rD   rk   rl   rm   rn   rv   r   ri   rp   s      r   add_passwordz"UserAccessControlList.add_password   sJ    ~h//99;;BBDDl+++++r   c                 :    | j                             |           d S r   )rC   discardru   s     r   remove_password_hexz)UserAccessControlList.remove_password_hex   s    -----r   c                     t          j        |                                                                          }|                     |           d S r   )rk   rl   rm   rn   r|   rx   s      r   remove_passwordz%UserAccessControlList.remove_password   sC    ~h//99;;BBDD  .....r   selectorc                    |d         t          d          k    |dd          }}|d         t          d          k    r9|| j        |<   t          |dd                    }|D ]}|| j        v r| j        |= d S || j        |<   d S )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((2HQRRL1:S!!&-DN7# 8 E E, 0 0dn,,w/0 0 '.DN7###r   key_patternc                 :    | j                             |           d S r   )rE   rt   )r   r   s     r   add_key_patternz%UserAccessControlList.add_key_pattern   s    {+++++r   c                 8    | j                                          d S r   )rE   rJ   r#   s    r   reset_key_patternsz(UserAccessControlList.reset_key_patterns   s      """""r   c                 8    | j                                          d S r   )rF   rJ   r#   s    r   reset_channels_patternsz-UserAccessControlList.reset_channels_patterns   s    $$&&&&&r   channel_patternc                 :    | j                             |           d S r   )rF   rt   )r   r   s     r   add_channel_patternz)UserAccessControlList.add_channel_pattern   s    ""?33333r   c                 X    t                               |          }|| j        |j        <   d S r   )r   r4   rH   r   )r   r   s     r   add_selectorz"UserAccessControlList.add_selector   s*    &&x00,4()))r   c                     g }| j                                         D ]K\  }}d|j        rdndz   |                                z   |j        |j        d}|                    |           L|S )Nz-@all r,   r-   )commandsr   r   )rH   itemsr   decoder   r   append)r   resultsr   r   ss        r   _get_selectorsz$UserAccessControlList._get_selectors   s    (*!%!6!6!8!8 	 	GX$x/?(HSIGNNL\L\\ $-! !A
 NN1r   c                     g }| j                                         D ]#\  }}|rdnd}|                    ||z              $|S )Nr   r    )rG   r   r   )r   rV   r   r>   incs        r   _get_commandsz#UserAccessControlList._get_commands   sU     $ 4 4 6 6 	& 	&GW!+$$tCJJsW}%%%%
r   c                 $    d | j         D             S )Nc                     g | ]}d |z   S )r+   r;   ).0r   s     r   
<listcomp>z;UserAccessControlList._get_key_patterns.<locals>.<listcomp>   s    III{{"IIIr   )rE   r#   s    r   _get_key_patternsz'UserAccessControlList._get_key_patterns   s    IId6HIIIIr   c                 $    d | j         D             S )Nc                     g | ]}d |z   S )r(   r;   )r   r   s     r   r   z?UserAccessControlList._get_channel_patterns.<locals>.<listcomp>   s    UUU?&UUUr   )rF   r#   s    r   _get_channel_patternsz+UserAccessControlList._get_channel_patterns   s    UUd>TUUUUr   c                     g }|                     | j        rdnd           | j        r|                     d           d| j        v r|                     d           d| j        v r|                     d           |S )Ns   ons   offs   nopass*s   allkeyss   allchannels)r   r>   rD   rE   rF   )r   flagss     r   
_get_flagsz UserAccessControlList._get_flags   s    dl6UU777< 	$LL###$$$$LL$$$$(((LL(((r   c                    g }|                     d|                                 dt          | j                  dd                    |                                           dd                    |                                           dd                    |                                           d|                                 g           |S )Ns   flagss	   passwordss   commandsr'   r!   r"   s	   selectors)	extendr   rb   rC   joinr   r   r   r   )r   r   s     r   r$   zUserAccessControlList.as_array   s    35!!T_%%		$,,..//		$002233		$446677##%%	
 	
 	
  r   c           	      
   g }| j                                         D ]f\  }}d|j        rdndz   |z   }d|j        dk    r
d|j        z   ndz   }|                    dd                    |j        ||g          z   dz              g|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!8 	R 	RGXX%5?TT4@7JA'IZ^aIaIaD83D,D,DgjkHNN4$))X]Ha,H"I"IIDPQQQQr   c                 B   |                                  }|                                 }|dgk    rdg|z   }|                                 d | j        D             z   |                                 z   |                                 z   |z   |z   }d                    |          S )Ns   &*r   c                     g | ]}d |z   S )   #r;   )r   ri   s     r   r   z1UserAccessControlList.as_rule.<locals>.<listcomp>   s    ???8th???r   r'   )r   r   r   rC   r   r   r   )r   	selectorsr   
rule_partss       r   as_rulezUserAccessControlList.as_rule   s    0022	--//w()H4HOO??t???@  ""# $$&&' 	
  	 yy$$$r   )TFr   N)'r5   r6   r7   r9   r   rK   staticmethodr   r8   r   r   rQ   rX   r]   rd   rf   rh   rq   rv   ry   r|   r~   r   r   r   r   r   r   r   strr   r   r   r   r   r   r$   r   r   r;   r   r   r=   r=   /   s       4 4 4T 4 4 4 4        $u+ (492E    \HT#Y,? e Y]    7htCy&9 74; 7SWX]S^ 7 7 7 7%Xd3i-@ %$u+ %Z^_dZe % % % %)$s)1D )dSXk )^bch^i ) ) ) )       @x @4 @ @ @ @*U *t * * * *,U ,t , , , ,
. .$ . . . ./ /$ / / / /	. 	.$ 	. 	. 	. 	.,5 ,T , , , ,# # # #' ' ' '45 4T 4 4 4 45U 5t 5 5 5 5	T#s(^ 4 	 	 	 	tE{    J4; J J J JVtE{ V V V V	DK 	 	 	 	$uUDK%789    (e    % % % % % % %r   r=   c                   V    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	dS )AclLogRecordcountreasoncontext_objectusername
created_ts
updated_tsclient_infoentry_idc
                     || _         || _        || _        || _        || _        || _        || _        || _        |	| _        d S 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__   sH      
#%$'))"-%r   r   c                 <   t                      | j        z
  dz  }t          | 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   rn   r   r   r   r   r   r   r   )r   age_secondsrV   s      r   as_dictzAclLogRecord.as_dict  s    #~~74?__++--k|k)//+DM**!$T_!5!5&)$/&:&:"
 "
 
r   N)
r5   r6   r7   intr8   r   r   r   r	   r   r;   r   r   r   r      s        && & 	&
 & & & & & & & & &,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dS )AccessControlListr   Nc                     t          d          }|                    d           |                    d           |                    d           d|i| _        g | _        d S )NT)r?      *s   +@alls   default)r=   r   r   r   	_user_acl_log)r   default_user_acls     r   r   zAccessControlList.__init__   sg    0===((...,,T22200:::>HJZ=[(*			r   c                 N    t          | j                                                  S r   )rb   r   r   r#   s    r   	get_userszAccessControlList.get_users(  s    DN''))***r   r   c                 P    | j                             |t                                S r   )r   
setdefaultr=   r   r   s     r   get_user_aclzAccessControlList.get_user_acl+  s!    ~((3H3J3JKKKr   c                     g }| j                                         D ]7\  }}d|z   dz   |                                z   }|                    |           8|S )Ns   user r'   )r   r   r   r   )r   rV   r   user_aclrule_strs        r   as_ruleszAccessControlList.as_rules.  sc    "&."6"6"8"8 	! 	!Hh(*T1H4D4D4F4FFHJJx    
r   c                 <    | j                             |d            d S r   )r   popr   s     r   del_userzAccessControlList.del_user5  s     8T*****r   c                 8    | j                                          d S r   )r   rJ   r#   s    r   	reset_logzAccessControlList.reset_log8  s    	r   r   c                     |t          | j                  k    s|dk     rd}d | j        | d          D             }|                                 |S )Nr   c                 6    g | ]}|                                 S r;   )r   )r   xs     r   r   z)AccessControlList.log.<locals>.<listcomp>>  s     777qqyy{{777r   )rO   r   reverse)r   r   rV   s      r   logzAccessControlList.log;  sT    3ty>>!!UQYYE77DIufgg$6777
r   r   r   r   r   c                    t          | j                  dk    r^| j        d         }|j        |k    rF|j        |k    r;|j        |k    r0|j        |k    r%|xj        dz  c_        t                      |_        d S t          d||||t                      t                      |t          | j                  dz   	  	        }| j        
                    |           d S )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     ty>>A2J!V++&'11%00'833  A%  (4
%vw<>><>>S^`cdhdm`n`nqr`r
 
 		r   rL   c                    || j         vrd S |r |d                                         dk    rd S | j         |         }|j        st          d          t                              |          }|d S |                    ||          s|                     dd|d         ||           t          t          j	        
                    |                                |d                                                                                             |                    ||          }t          |          dk    r8|                     dd|d         ||           t          t          j                  d|d         v ra|                    ||          }t          |          dk    r:|                     d	d|d         ||           t          t          j                  d S d S )
Nr   rS   zUser disableds   commands   toplevels   keys   @pubsubrT   s   channel)r   rN   r>   r   r=   rQ   rX   r   msgsNO_PERMISSION_ERRORformatr   rd   rO   NO_PERMISSION_KEY_ERRORrf   NO_PERMISSION_CHANNEL_ERROR)r   r   r   rL   r   rP   rd   rf   s           r   validate_commandz"AccessControlList.validate_commandZ  s   4>))F 	fQioo''722F>(+ 	/o...,>>vFFF''f== 	n
KHkZZZd6==hoo>O>OQWXYQZQ`Q`QbQbQiQiQkQkllmmm#44\6JJ  1$$5Ea5H(T_```d:;;;a((#+#@#@v#V#V '((1,,##J=QRS=TV^`klll!$"BC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     sz       + + + ++4; + + + +LU L/D L L L L$u+    + +4 + + + +    d3;&7!8         	 
     
       0D DU DDQVK D D D D D Dr   r   )r`   rk   typingr   r   r   r   r   r   r	   	fakeredisr
   r   _command_infor   r   _helpersr   r   r   r=   r   r   r;   r   r   <module>r      sX     @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ # # # # # # E E E E E E E E 0 0 0 0 0 0 0 0"5 "5 "5 "5 "5 "5 "5 "5JE% E% E% E% E% E% E% E%P% % % % % % % %PRD RD RD RD RD RD RD RD RD RDr   