
    (<i                     ,   U d 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
 dZeegef   dz  ed<   	 ddlmZ d	Z eddh      Zee   ed<    edh      Zee   ed<   e G d d             ZdedefdZdededz  fdZdedefdZy# e$ r d
ZY Ww xY w)u  사전 실행 보안 스캔 모듈.

명령어 실행 전 정적 패턴 기반 스캔을 수행.
approval.py와 통합하여 위험 레벨에 따라 즉시 차단 또는 경고.

통합 정책:
  - approval critical/high → 즉시 block (정적 패턴 스킵)
  - approval medium        → warn + 정적 패턴도 실행
  - approval 없으면        → 정적 패턴만 실행

Usage:
    from utils.pre_exec_scan import scan_command
    verdict = scan_command("rm -rf /")
    if verdict.action == "block":
        print(verdict.summary)
    N)Callable)	dataclassfield)TYPE_CHECKING)EXEC_THREAT_PATTERNS_approval_check_command)check_commandTFcriticalhigh_BLOCK_LEVELSmedium_WARN_LEVELSc                   Z    e Zd ZU dZeed<    ee      Zee	   ed<   dZ
eed<   dZeed<   y	)
ScanVerdictu#   사전 실행 스캔 판정 결과.action)default_factoryfindings summarystaticscannerN)__name__
__module____qualname____doc__str__annotations__r   listr   dictr   r        D/home/jay/workspace/.worktrees/task-2057-dev2/utils/pre_exec_scan.pyr   r   -   s1    -K 6Hd4j6GSGSr!   r   commandreturnc                   
 | st        dg dd      S g }t        D ]U  \  }}}t        j                  || t        j                        }|s/|j                  |||j                  d      dd d       W |st        dg d	d      S d

t        
fd|D              }|rdnd}dj                  d |D              }d| }	t        |||	d      S )u   정적 패턴 기반 스캔.allow   명령어 없음r   r   r   r   r   r   N   	threat_iddescriptionmatchedu   위협 없음)zDEST-zENV-zTERM-zHOMO-c              3   F   K   | ]  }|d    j                          ywr+   N)
startswith).0fblock_prefixess     r"   	<genexpr>z_scan_static.<locals>.<genexpr>S   s      SQq~00@Ss   !blockwarnz, c              3   &   K   | ]	  }|d      ywr/   r    )r1   r2   s     r"   r4   z_scan_static.<locals>.<genexpr>V   s     <a1[><s   u   위협 탐지: )	r   r   research
IGNORECASEappendgroupanyjoin)r#   r   patternr+   r,   mshould_blockr   
threat_idsr   r3   s             @r"   _scan_staticrC   <   s    'B@R\deeH+? 	'KIIgw6OO!*#. wwqz$3/	 'BYabb 9NS(SSL$W&F<8<<J
|,GfxRZ[[r!   c                 d    t         rt        yt        |       }|j                  ry|j                  S )u~   기존 approval.py와 통합.

    Returns:
        approval의 risk_level 문자열, 또는 approval 미사용 시 None.
    Nsafe)_APPROVAL_AVAILABLEr   is_safe
risk_level)r#   results     r"   _integrate_approvalrJ   \   s0     "9"A$W-F~~r!   c                    | st        dg dd      S t        |       }|t        v rt        ddd| | dd	 d
gd| d      S t        |       }|t        v r+|j
                  dk(  rt        d|j                  d| d      S |S )u}   명령어 사전 실행 보안 스캔.

    approval 통합 → 정적 패턴 순서로 스캔하여 ScanVerdict 반환.
    r&   r'   r   r(   r5   APPROVALu   approval 판정: Nr)   r*   u   approval 차단: r6   u   approval 경고: )r   rJ   r   rC   r   r   r   )r#   approval_levelstatic_verdicts      r"   scan_commandrO   p   s    
 'B@R\dee )1N&(;L^L\9]jqrvsvjwx ('78
 	
 "'*N %.*?*?7*J#,,''78	
 	
 r!   )r   r8   collections.abcr   dataclassesr   r   typingr   utils.pre_exec_patternsr   r   r   objectr   utils.approvalr	   rF   ImportError	frozensetr   r   r   rC   rJ   rO   r    r!   r"   <module>rX      s   " 
 $ (   8 ;? 3%-047 > G
 !*:v*> ?y~ ?((4in 4   \# \+ \@ t (!# !+ !c    s   B	 	BB