
    i                         d Z ddlZddlZddlZddlmZ  ed      Zdede	fdZ
d Zed	k(  r e       Z ej                  erdnd
       yy)u-   파일 뷰어 API 보안 및 기능 테스트    N)Pathz/home/jay/workspacerel_path_rawreturnc                    | sddddS t         j                  j                  |       dv rddddS d}t        fd	|D              sddd
dS d}t        j
                  j                        d   j                         }||vr	ddd| dS d}t        j
                  j                        t        fd|D              sj                  d      rddddS t        z  j                         }t        j                         }t        |      j                  t        |            sddddS |j                         sddddS |j                         sddddS dt        |      dS )u   서버의 /api/file 검증 로직 시뮬레이션. 성공 시 {"ok": True, "path": ...}, 실패 시 {"ok": False, "code": ..., "error": ...}F  zMissing 'path' parameter)okcodeerrorz..  zPath traversal not allowed)memory/reports/memory/tasks/memory/specs/zmemory/meetings/c              3   @   K   | ]  }j                  |        y wN)
startswith).0prefixrel_paths     O/home/jay/workspace/.worktrees/task-2116-dev1/teams/dev1/tests/test_file_api.py	<genexpr>z(validate_file_request.<locals>.<genexpr>   s     Jvx""6*J   z.Access denied: path not in allowed directories)z.mdz.txtz.jsonz.yamlz.ymlz.py   zFile type not allowed: )z.envz.credentialsz.keysc              3   @   K   | ]  }j                  |        y wr   )endswith)r   blockedfilenames     r   r   z(validate_file_request.<locals>.<genexpr>%   s     
H'8W%
Hr   .zAccess denied: sensitive filez Access denied: outside workspace  zFile not foundz
Not a fileT)r   path	file_path)urllibparseunquoteanyosr   splitextlowerbasenamer   WORKSPACE_DIRresolvestrexistsis_file)	r   ALLOWED_PREFIXESALLOWED_EXTENSIONSextBLOCKED_EXTENSIONSr    workspace_resolvedr   r   s	          @@r   validate_file_requestr3      s   S3MNN||##L1H xS3OPP aJ9IJJS3cdd J
''

8
$Q
'
-
-
/C
$$S5LSE3RSS ;ww)H

H5G
HHHL_L_`cLdS3RSS )224I&..0y>$$S);%<=S3UVVS3CDDS<@@s9~FF    c            	        	
 g 
d	dd=	
fd	} t        d       t        dz  dz  }|j                         rAt        |j	                  d            }|r%d|d   j
                   } | dt        |      d	       t        dz  d
z  }|j                         rAt        |j	                  d            }|r%d|d   j
                   } | dt        |      d	       t        dz  dz  }|j                         rAt        |j	                  d            }|r%d|d   j
                   } | dt        |      d	       t        d        | dt        d      dd        | dt        d      dd        | dt        d      dd       t        d        | dt        d      dd        | dt        d      dd        | dt        d      dd        | d t        d!      dd        | d"t        d#      dd       t        d$        | d%t        d&      dd        | d't        d(      dd        | d)t        d*      dd       t        d+        | d,t        d-      dd        | d.t        d/      dd       t        d0        | d1t        d2      dd3        | d4t        d5      dd6       t        d7j                  
             t        d7d8        t        d9	 d: d;	z    d<       dk(  S )>Nr   c                     |d   |k(  }|r|s|xr |j                  d      |k(  }|rdnd}|rdz  ndz  j                  d| d|         |s,j                  d| d	|        j                  d
|        y y )Nr   r	   PASSFAILr   z  [z] z         Expected: ok=z, code=z         Got: )getappend)	nameresultexpected_okexpected_coder   statusfailedpassedresultss	         r   checkztest_all.<locals>.check<   s    D\[(;

6*m;B6aKFaKFVHBtf-.NN3K=WXNN^F845 r4   u   === 기능 테스트 ===memorytasksz*.mdr   u   정상 task 파일 접근Treportsr   u   정상 report 파일 접근specsr   u   정상 specs 파일 접근u)   
=== 보안 테스트: Path Traversal ===u   .. 포함 경로 차단z"memory/reports/../../../etc/passwdFr   u   ../ 시작 차단z../etc/passwdu   인코딩된 .. 차단z%memory/reports/..%2F..%2Fetc%2Fpasswdu-   
=== 보안 테스트: 화이트리스트 ===u!   허용되지 않은 경로 차단zteams/dev1/secret.pyu   루트 파일 접근 차단z	CLAUDE.mdu   scripts 접근 차단zscripts/deploy.shu   memory/ 직접 접근 차단zmemory/task-timers.jsonu   memory/logs 접근 차단zmemory/logs/ci-latest.jsonu$   
=== 보안 테스트: 확장자 ===u   .exe 차단zmemory/reports/test.exeu
   .sh 차단zmemory/reports/test.shu   확장자 없는 파일 차단zmemory/reports/testu(   
=== 보안 테스트: 민감 파일 ===u   .env 파일 차단zmemory/reports/.envu   dot 파일 차단zmemory/reports/.gitignoreu   
=== 에러 케이스 ===u
   빈 경로 r   u   존재하지 않는 파일z(memory/reports/nonexistent-task-99999.mdr   
z(========================================u   결과: z PASS / z FAIL / z TOTALr   )printr)   r,   listglobr;   r3   join)rC   	tasks_dir
task_filesrelreports_dirreport_files	specs_dir
spec_filesr@   rA   rB   s           @@@r   test_allrU   7   s   GFF6  

$% (72I)..01
!*Q-"4"4!56C-/DS/I4P(*Y6KK,,V45#LO$8$8#9:C/1Fs1KTR(72I)..01
!*Q-"4"4!56C.0Ec0JDQ 

67	
#%:;_%`bgilm	
4_EucR	
"$9:a$bdikno 

:;	
-/DE[/\^cehi	
')>{)KUTWX	
!#89L#MuVYZ	
(*?@Y*Z\acfg	
%'<=Y'Z\acfg 

12	-./HI5RUV	,-.FGPST	
*,ABW,XZ_ade 

56	
 56K LeUXY	
45PQSXZ]^ 

&'	,-b15#>	
&(=>h(ikpruv 
$))G
	Bvh-	HVHHVHHVf_4EV
LMQ;r4   __main__r   )__doc__r%   sysurllib.parser!   pathlibr   r)   r+   dictr3   rU   __name__successexit r4   r   <module>r`      sg    3 	 
   *+(G (G (GVQf zjGCHH'Qq! r4   