o
    µ+ke"  ã                   @   sj  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZddlmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZmZ ddlmZmZ ddlmZ d	 ¡  d
¡Zd ¡  d
¡ZdZdd„ Zdd„ Ze jdd„ ƒZe  ej !d¡d¡e "eƒ d¡G dd„ deƒƒƒZ#e  ej !d¡d¡e "eƒ d¡G dd„ deƒƒƒZ$e  ej !d¡d¡G dd„ deƒƒZ%dd „ Z&d!d"„ Z'dS )#é    Né   )Úis_win32Úis_linuxÚ
is_freebsdÚ	is_darwin)Úacl_getÚacl_setÚswidth©Úget_process_idÚprocess_aliveé   )ÚBaseTestCaseÚunopened_tempfile)Úfree_pidzs
user::rw-
user:root:rw-:0
user:9999:r--:9999
group::r--
group:root:r--:0
group:9999:r--:9999
mask::rw-
other::r--
Úasciizs
user::rw-
user:root:r--:0
user:8888:r--:8888
group::r--
group:root:r--:0
group:8888:r--:8888
mask::rw-
other::r--
c                   C   s
   dt jv S )NZFAKEROOTKEY)ÚosÚenviron© r   r   ú;usr/lib/python3.10/site-packages/borg/testsuite/platform.pyÚfakeroot_detected)   s   
r   c              	   C   s:   t sdd l}z| | ¡ W dS  ttfy   Y dS w dS )Nr   TF)r   ÚpwdÚgetpwnamÚKeyErrorÚ
ValueError)Úusernamer   r   r   r   Úuser_exists-   s   
þr   c               	   C   sª   t ƒ H} t| dƒ ¡  z-d}d|i}t| |ƒ i }t| |t | ¡ƒ | dd ¡}|r7d|v r7W W d   ƒ dS W n	 tyA   Y nw 	 W d   ƒ dS 1 sNw   Y  d S )NÚwóQ   user::rw-
group::r--
mask::rw-
other::---
user:root:rw-:9999
group:root:rw-:9999
Ú
acl_accesss	   user::rw-TF)	r   ÚopenÚcloser   r   r   ÚstatÚgetÚPermissionError)ÚfilepathÚaccessÚaclZread_aclZread_acl_accessr   r   r   Úare_acls_working8   s$   
ö€ÿ$ór(   Úlinuxzlinux only testznot compatible with fakerootc                   @   s’   e Zd Zdd„ Zdd„ Zddd„Zdd	d
„Ze e	ƒ  d¡dd„ ƒZ
e e	ƒ  d¡dd„ ƒZe edƒ d¡e e	ƒ  d¡dd„ ƒƒZdd„ ZdS )ÚPlatformLinuxTestCasec                 C   ó   t  ¡ | _d S ©N©ÚtempfileÚmkdtempÚtmpdir©Úselfr   r   r   ÚsetUpN   ó   zPlatformLinuxTestCase.setUpc                 C   ó   t  | j¡ d S r,   ©ÚshutilÚrmtreer0   r1   r   r   r   ÚtearDownQ   ó   zPlatformLinuxTestCase.tearDownFc                 C   ó   i }t ||t |¡|d |S ©N©Únumeric_ids©r   r   r"   ©r2   Úpathr>   Úitemr   r   r   Úget_aclT   ó   zPlatformLinuxTestCase.get_aclNc                 C   s   ||dœ}t |||d d S )N)r   Úacl_defaultr=   ©r   )r2   rA   r&   Údefaultr>   rB   r   r   r   Úset_aclY   s   
zPlatformLinuxTestCase.set_aclúACLs do not workc                 C   sÈ   t  ¡ }|  |  |j¡i ¡ | j|jddd |  d|  |j¡d ¡ |  d|  |j¡d ¡ |  d| j|jdd	d ¡ t  ¡ }| j|jddd |  d
|  |j¡d ¡ |  d|  |j¡d ¡ d S )Nr   F©r&   r>   ó   user:root:rw-:0r   ó   group:root:rw-:0s   user:0:rw-:0Tr=   s   user:9999:rw-:9999s   group:9999:rw-:9999©r.   ÚNamedTemporaryFileÚassert_equalrC   ÚnamerH   Ú	assert_in©r2   ÚfileÚfile2r   r   r   Útest_access_acl]   s   z%PlatformLinuxTestCase.test_access_aclc                 C   sZ   |   |  | j¡i ¡ | j| jttd |   |  | j¡d t¡ |   |  | j¡d t¡ d S )N)r&   rG   r   rE   )rO   rC   r0   rH   Ú
ACCESS_ACLÚDEFAULT_ACLr1   r   r   r   Útest_default_aclj   s   z&PlatformLinuxTestCase.test_default_aclu   Ã¼belu   requires Ã¼bel userc                 C   s(  t  ¡ }|  |  |j¡i ¡ d}d ¡ }d}d ¡ }d}d |||g¡}| j|j|dd | j|jdd	d
 }|  ||¡ |  ||¡ | j|jdd	d
 }	|  ||	¡ |  ||	¡ t  ¡ }
| j|
j|dd | j|
jdd	d
 }|  ||¡ |  ||¡ | j|jdd	d
 }	|  ||	¡ |  ||	¡ d S )Ns*   user::rw-
group::r--
mask::rw-
other::---
u   user:Ã¼bel:rw-:666s   user:666:rw-:666u   group:Ã¼bel:rw-:666s   group:666:rw-:666ó   
FrJ   r=   r   T)	r.   rN   rO   rC   rP   ÚencodeÚjoinrH   rQ   )r2   rS   Znothing_specialZ
user_entryZuser_entry_numericZgroup_entryZgroup_entry_numericr'   r   Zacl_access_numericrT   r   r   r   Útest_non_ascii_aclq   s.   z(PlatformLinuxTestCase.test_non_ascii_aclc                 C   sP   ddl m} |  |dƒd¡ |  |dƒd¡ |  |dƒd¡ |  |d	ƒd
¡ d S )Nr   )Úacl_use_local_uid_gids   user:nonexistent1234:rw-:1234s   user:1234:rw-s   group:nonexistent1234:rw-:1234s   group:1234:rw-rK   s
   user:0:rw-rL   s   group:0:rw-)Zplatform.linuxr]   rO   )r2   r]   r   r   r   Ú
test_utils   s
   z PlatformLinuxTestCase.test_utils©F)NNF)Ú__name__Ú
__module__Ú__qualname__r3   r9   rC   rH   ÚunittestÚskipIfr(   rU   rX   r   r\   r^   r   r   r   r   r*   J   s    



r*   ÚdarwinzmacOS only testc                   @   sH   e Zd Zdd„ Zdd„ Zddd„Zddd	„Ze e	ƒ  d
¡dd„ ƒZ
dS )ÚPlatformDarwinTestCasec                 C   r+   r,   r-   r1   r   r   r   r3   œ   r4   zPlatformDarwinTestCase.setUpc                 C   r5   r,   r6   r1   r   r   r   r9   Ÿ   r:   zPlatformDarwinTestCase.tearDownFc                 C   r;   r<   r?   r@   r   r   r   rC   ¢   rD   zPlatformDarwinTestCase.get_aclc                 C   s   d|i}t |||d d S )NÚacl_extendedr=   rF   )r2   rA   r'   r>   rB   r   r   r   rH   §   s   zPlatformDarwinTestCase.set_aclrI   c                 C   s°   t  ¡ }t  ¡ }|  |  |j¡i ¡ | j|jddd |  d|  |j¡d ¡ |  d|  |j¡d ¡ | j|jddd |  d|  |j¡d ¡ |  d	| j|jddd ¡ d S )
Ns‚   !#acl 1
group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000:staff:0:allow:read
user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000:root:0:allow:read
Fr=   s>   group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000014:staff:20:allow:readrg   s;   user:FFFFEEEE-DDDD-CCCC-BBBB-AAAA00000000:root:0:allow:readTs=   group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000:wheel:0:allow:reads8   group:ABCDEFAB-CDEF-ABCD-EFAB-CDEF00000000::0:allow:readrM   rR   r   r   r   rU   «   s    z&PlatformDarwinTestCase.test_access_aclNr_   )r`   ra   rb   r3   r9   rC   rH   rc   rd   r(   rU   r   r   r   r   rf   ˜   s    

rf   )r)   Úfreebsdre   zPOSIX only testsc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚPlatformPosixTestCasec                 C   ó   |   tdƒd¡ d S )NÚborgé   ©rO   r	   r1   r   r   r   Útest_swidth_ascii»   ó   z'PlatformPosixTestCase.test_swidth_asciic                 C   rj   )Nu   ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é   rm   r1   r   r   r   Útest_swidth_cjk¾   ro   z%PlatformPosixTestCase.test_swidth_cjkc                 C   rj   )Nu   borgãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—é   rm   r1   r   r   r   Útest_swidth_mixedÁ   ro   z'PlatformPosixTestCase.test_swidth_mixedN)r`   ra   rb   rn   rq   rs   r   r   r   r   ri   ¸   s    ri   c                 C   sX   t ƒ }t|Ž s	J ‚|\}}}t|d ||ƒsJ ‚t|||d ƒs"J ‚t|| |ƒr*J ‚d S )NÚabcr   r
   )r   ÚidÚhostÚpidÚtidr   r   r   Útest_process_aliveÅ   s   
ry   c                  C   sj   t ƒ \} }}t| tƒsJ ‚t|tƒsJ ‚t|tƒsJ ‚t| ƒdks#J ‚|dks)J ‚t ƒ | ||fks3J ‚d S )Nr   )r   Ú
isinstanceÚstrÚintÚlen)Úhostnamerw   rx   r   r   r   Útest_process_idÎ   s   r   )(Ú	functoolsr   Úrandomr7   Úsysr.   rc   Zplatformflagsr   r   r   r   Úplatformr   r   r	   r   r   Ú r   r   Zlockingr   ÚstriprZ   rV   rW   Z_acls_workingr   r   Ú	lru_cacher(   Z
skipUnlessÚ
startswithrd   r*   rf   ri   ry   r   r   r   r   r   Ú<module>   sB    
	÷
	÷
L	