Ë
    "ïàj©  ã                   ó  — d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ  e	j                  e«      Z ej                  «       Z ej"                  «       Zej'                  de› de› �«        G d	„ d
e«      Z G d„ de«      Zy)at  
WSGI middleware to impersonate a Unix user based on the HTTP username.
This middleware changes the effective user ID (euid) and group ID (egid) of the
current process to match the Unix user corresponding to the HTTP username.
This is useful for applications that need to access files or resources with the
permissions of a specific Unix user.

NOTE: **Experimental**:
This middleware is not thread-safe and should not be used in a
multithreaded environment. It is designed to be used in a single-threaded
context where the effective user ID and group ID can be safely changed and
restored.

----------------------------------------------------------------------------
Sample configuration for wsgidav.yaml::

    # User/Group Impersonating
    # (Requires `wsgidav.samples.impersonator.Impersonator`, which is disabled by default.)
    impersonator:
        # enabling impersonating
        enable: false

        # custom map WebDAV (HTTP) usernames to Unix usernames
        # custom_user_mapping:
        #     leonlee: leo
        #     jenifer: jenny

        # or, use WebDAV (HTTP) usernames as is
        custom_user_mapping: null
é    N)ÚAbstractContextManager)ÚOptionalÚTuple)Úutil)ÚBaseMiddlewarez impersonator: initial uid:gid = ú:c                   ó8   — e Zd Zdeeeef      ddfd„Zd„ Zd„ Zy)ÚImpersonateContextÚidsÚreturnNc                 óf  — |€d| _         y d| _         |d   | _        |d   | _        t        j                  «       | _        t        j                  «       | _        | j
                  t        k7  s| j                  t        k7  r4t        d| j
                  › d| j                  › dt        › dt        › d�	«      ‚y )	NFTr   é   z"old ids mismatched with init ids: r   z versus zH, multithreading MUST be disabled for impersonator to function correctly)Ú_enabledÚ	_new_euidÚ	_new_egidÚosÚgeteuidÚ	_old_euidÚgetegidÚ	_old_egidÚ
_init_euidÚ
_init_egidÚ	Exception)Úselfr   s     úK/srv/dav/.venv/lib/python3.12/site-packages/wsgidav/samples/impersonator.pyÚ__init__zImpersonateContext.__init__2   s£   € Øˆ;Ø!ˆDŒMØØˆŒØ˜Q™ˆŒØ˜Q™ˆŒÜŸ™›ˆŒÜŸ™›ˆŒà�>‰>œZÒ'¨4¯>©>¼ZÒ+GÜØ4Ø—>‘>Ð" ! D§N¡NÐ#3°8¼J¸<ÀqÌÈð UYðYóð ð ,Hó    c                 óø   — | j                   sy t        j                  | j                  «       t        j                  | j
                  «       t        j                  d| j                  › d| j
                  › �«       y )Nzimpersonator: set uid:gid = r   )r   r   Úseteuidr   Úsetegidr   Ú_loggerÚdebug©r   s    r   Ú	__enter__zImpersonateContext.__enter__C   sP   € Ø�}Š}ØÜ
�
‰
�4—>‘>Ô"Ü
�
‰
�4—>‘>Ô"Ü�‰Ð4°T·^±^Ð4DÀAÀdÇnÁnÐEUÐVÕWr   c                óø   — | j                   sy t        j                  | j                  «       t        j                  | j
                  «       t        j                  d| j                  › d| j
                  › �«       y )Nzimpersonator: reset uid:gid = r   )r   r   r   r   r    r   r!   r"   )r   Úexc_typeÚ	exc_valueÚ	tracebacks       r   Ú__exit__zImpersonateContext.__exit__J   sR   € Ø�}Š}ØÜ
�
‰
�4—>‘>Ô"Ü
�
‰
�4—>‘>Ô"Ü�‰Ø,¨T¯^©^Ð,<¸A¸d¿n¹nÐ=MÐNõ	
r   )	Ú__name__Ú
__module__Ú__qualname__r   r   Úintr   r$   r)   © r   r   r
   r
   1   s-   „ ð˜H U¨3°¨8¡_Ñ5ð ¸$ó ò"Xó
r   r
   c                   óJ   ‡ — e Zd Zˆ fd„Zd„ Zd„ Zdedeee	e	f      fd„Z
ˆ xZS )ÚImpersonatorc                 ó(   •— t         ‰| �  |||«       y )N)Úsuperr   )r   Úwsgidav_appÚnext_appÚconfigÚ	__class__s       €r   r   zImpersonator.__init__U   s   ø€ Ü‰Ñ˜ h°Õ7r   c              #   óÊ   K  — |j                  dd«      }| j                  |«      }t        |«      5  | j                  ||«      E d {  –—†  d d d «       y 7 Œ# 1 sw Y   y xY w­w)Nzwsgidav.auth.user_nameÚ )ÚgetÚ_map_idr
   r4   )r   ÚenvironÚstart_responseÚusernamer   s        r   Ú__call__zImpersonator.__call__X   s^   è ø€ Ø—;‘;Ð7¸Ó<ˆØ�l‰l˜8Ó$ˆÜ Ó$ñ 	>Ø—}‘} W¨nÓ=×=Ð=÷	>ð 	>Ø=ø÷	>ð 	>üs.   ‚/A#±AÁAÁAÁ	A#ÁAÁA ÁA#c                 ó(   — | j                  dd«       S )Nzimpersonator.enableF)Ú
get_configr#   s    r   Úis_disabledzImpersonator.is_disabled^   s   € Ø—?‘?Ð#8¸%Ó@Ð@Ð@r   r=   r   c                 óø  — | j                  «       ry d }|sd}n6| j                  dd «      €|}n!| j                  d«      j                  |d «      }|€t        d|› d�«      ‚t        j                  d|xs d› d|› �«       	 t        j                  |«      }t        j                  d|› d	|j                  › d
|j                  › �«       |j                  |j                  fS # t        $ r t        d|› d�«      d ‚w xY w)NÚnobodyz impersonator.custom_user_mappingzFailed mapping HTTP username 'z' to Unix usernamezimpersonator: HTTP user z(anonymous)z -> Unix user zimpersonator: Unix user z -> uid:gid = r   zUnix username 'z' does not exist)rA   r@   r9   ÚRuntimeErrorr!   r"   ÚpwdÚgetpwnamÚpw_uidÚpw_gidr   )r   r=   Úunix_usernameÚpasswds       r   r:   zImpersonator._map_ida   s"  € Ø×ÑÔØàˆáØ$‰MØ�_‰_Ð?ÀÓFÐNØ$‰Mà ŸO™OÐ,NÓO×SÑSØ˜$óˆMð Ð ÜØ0°°
Ð:LÐMóð ô 	�‰Ø& xÒ'@°=Ð&AÀÐP]ÈÐ_ô	
ð
	2Ü—\‘\ -Ó0ˆFô �M‰MØ*¨=¨/¸ÈÏÉÀÐVWÐX^×XeÑXeÐWfÐgôð —M‘M 6§=¡=Ð1Ð1øô ò 	ÜØ! - Ð0@ÐAóàðð	ús   Â C ÃC9)r*   r+   r,   r   r>   rA   Ústrr   r   r-   r:   Ú__classcell__)r6   s   @r   r0   r0   T   s3   ø„ ô8ò>òAð"2 ð "2¨°°s¸C°x±Ñ(A÷ "2r   r0   )Ú__doc__r   rE   Ú
contextlibr   Útypingr   r   Úwsgidavr   Úwsgidav.mw.base_mwr   Úget_module_loggerr*   r!   r   r   r   r   r"   r
   r0   r.   r   r   ú<module>rS      s~   ðñó> 
Û 
Ý -ß "å Ý -à
 ˆ$×
 Ñ
  Ó
*€ØˆR�Z‰Z‹\€
ØˆR�Z‰Z‹\€
Ø ‡�Ð0°°¸A¸j¸\ÐJÔ Kô 
Ð/ô  
ôF/2�>õ /2r   