
    %<i"              	       f   d Z ddlZddlZddlZddlZddlmZ ddlmZm	Z	m
Z
 	 ddlmZ ddlmZmZmZ ddlmZ  G d d	e      Zd
 Zedk(  r e        yy# e$ rU ej(                  j+                  d e ee      j0                  j0                               ddlmZ ddlmZmZmZ ddlmZ Y uw xY w)um   
Code Reviewer - 코드 보안 검사

기존 red-team-auto-review.py의 기능을 모듈화하여 재구현
    N)Path)AnyDictList)ReviewerInterface)	log_errorlog_executionsetup_logging)VULNERABILITY_PATTERNSc                        e Zd ZdZ fdZdedeeef   fdZdededz  fdZ	d	ede
e   fd
ZdedefdZd	ede
e   fdZdedefdZdedefdZ xZS )CodeRevieweru   코드 검토자c                 n    t         |           t        d      | _        t	        | j                  d       y)u	   초기화zred_team.code_reviewerzCodeReviewer initializedN)super__init__r
   loggerr	   )self	__class__s    N/home/jay/workspace/.worktrees/task-2057-dev2/memory/red_team/code_reviewer.pyr   zCodeReviewer.__init__   s*    #$<=dkk#=>    docreturnc           	         	 |}t        | j                  dd|i       | j                  |      }|s,d| }t        | j                  t	        |      d|i       |ddS | j                  |      }| j                  |      }| j                  |      }||z   }| j                  |      }	|j                  dd      dkD  r|	dk(  rd	}	|	d
v }
|	|t        |      |j                  dd      || j                  |	      |
d}t        | j                  d||	t        |      d       |S # t        $ r2}t        | j                  |d|i       t        |      dddcY d}~S d}~ww xY w)u   
        코드 파일 검토

        Args:
            doc: 파일 경로 (인터페이스 통일을 위해 doc 사용)

        Returns:
            검토 결과
        zStarting code reviewfilezFailed to load file: unknown)error
risk_levelvulnerable_depsr   lowmedium)r   r   )r   vulnerabilitiesvulnerability_countdependency_issuesarchitecture_issuesrecommendationpassedzCode review completed)r   r   r!   criticalF)r   r   r%   N)r	   r   
_load_filer   FileNotFoundError_scan_vulnerabilities_check_dependencies_assess_architecture_risks_assess_riskgetlen_get_recommendation	Exceptionstr)r   r   	file_pathcontent	error_msgr    dependenciesarch_issues
all_issuesr   r%   resultes                r   reviewzCodeReviewer.review$   s   7	PI$++'=	?RS ooi0G3I;?	$++'8'CfiEXY!*)DD #88AO  33I>L 99'BK );6J**:6J  1159&!)J
  #44F )#2'*?';%1%5%56G%K'2"&":"::"F F '"*UXYhUij M 	Pdkk1vsm4 V:OO	Ps%   AD C D 	E&'EEEr2   Nc                     	 t        |      }|j                         syt        |dd      5 }|j                         cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)u   파일 로드Nrzutf-8)encoding)r   existsopenreadr0   )r   r2   pathfs       r   r'   zCodeReviewer._load_fileg   sY    		?D;;=dC'2  avvx      		s2   A A A	A AA A 	AAr3   c                    g }t        j                         D ]  \  }}|dk(  r|D ]  }t        j                  ||t        j                  t        j
                  z        }|D ]Y  }|j                  ||d|j                          j                  d      dz   | j                  |      |j                         |d       [   |S )u.   취약점 스캔 (security_patterns.py 사용)Insecure DependenciesN
   )typelineseveritysnippetpattern)r   itemsrefinditer
IGNORECASE	MULTILINEappendstartcount_get_severitygroup)r   r3   r    	vuln_typepatternsrK   matchesmatchs           r   r)   z"CodeReviewer._scan_vulnerabilitiess   s    #9#?#?#A 	Ix33# ++gw8TU$ 	E#**$-$+Oekkm$<$B$B4$H1$L(,(:(:9(E',{{}'.			" r   c                 z   dg dd}|j                  d      rt        |      j                  dz  }|j                         rk| j	                  d      rZ	 t        j                  ddt        |      gddd	
      }|j                  dk7  r#|j                  j                  d      |d<   d|d<   |S |S # t        $ r Y |S w xY w)u   의존성 검사r   N)r   r5   	tool_usedz.pyzrequirements.txtz	pip-auditz-rT   )capture_outputtexttimeoutVulnr   r[   )endswithr   parentr>   _check_tool_available
subprocessrunr1   
returncodestdoutrS   r0   )r   r2   resultsreq_filer8   s        r   r*   z CodeReviewer._check_dependencies   s    &'$O e$I--0BBH --k:!+($H>tZ^hj" ",,19?9L9LV9TG$563>GK0 w % s   AB- -	B:9B:c                 
   g }|j                  d      dz   }|dkD  r|j                  dd| dddd	       t        t        j                  d
|t        j
                              }|dkD  r|j                  dd| dddd	       |S )u   아키텍처 리스크 평가rE   rF      z
Large Fileu
   파일이 u;   줄로 200줄을 초과 (AI 친화적 크기 원칙 위반)r   u   모듈로 분리 권장)rG   descriptionrI   r$   z^class\s+\w+   zMultiple Classesu
   파일에 u<   개 클래스 존재 (단일 책임 원칙 위반 가능성)r   u/   각 클래스를 별도 파일로 분리 검토)rS   rQ   r.   rM   findallrP   )r   r3   issueslinesclass_counts        r   r+   z'CodeReviewer._assess_architecture_risks   s     d#a'3;MM(%/w6q#r (&?	 "**_gr||LM?MM.%/}<x#y %&W	 r   rV   c                 :    dddddddd}|j                  |d      S )u   취약점 심각도 반환highr   r&   )zSQL InjectionzXSS (Cross-Site Scripting)zHardcoded SecretzCode InjectionzPath TraversalzCommand InjectionrD   r   )r-   )r   rV   severity_maps      r   rT   zCodeReviewer._get_severity   s5     $*2 &(&!+%-
 	511r   toolc                 t    	 t        j                  d|gdd      }|j                  dk(  S # t        $ r Y yw xY w)u)   외부 도구 사용 가능 여부 확인whichT   )r]   r_   r   F)rd   re   rf   r0   )r   ru   r8   s      r   rc   z"CodeReviewer._check_tool_available   sA    	^^WdODRSTF$$)) 		s   (+ 	77)__name__
__module____qualname____doc__r   r1   r   r   r:   r'   r   r)   r*   r+   rT   boolrc   __classcell__)r   s   @r   r   r      s    ?AP# AP$sCx. APF
C 
C$J 
S T$Z .S T ,# $t* <2s 2s 2# $ r   r   c                     t        t        j                        dk  r8t        t	        j
                  dddgd             t        j                  d       t        j                  d   } | dk(  r%t        t	        j
                  ddd	d
d             y| dk(  rt        t        j                        dk  r6t        t	        j
                  dd	d             t        j                  d       t        j                  d   }t               }|j                  |      }t        t	        j
                  |dd             yt        t	        j
                  d|  ddgd             t        j                  d       y)u   CLI 인터페이스   z0Usage: python3 code_reviewer.py <command> [file]testscan)r   commandsrF   loadedr   z$python3 code_reviewer.py scan <file>)statusreviewerusage)indentrm   zscan command requires file path)r   r   F)r   ensure_asciizUnknown command: N)	r.   sysargvprintjsondumpsexitr   r:   )commandr2   r   r8   s       r   mainr      s   
388}qdjj#UdjlrcstuvhhqkG&JJ#Jpq	
 
F	sxx=1

?Jpq
 HHQKHHQK	>+djj>? 	djj%6wi#@vW]N^_`ar   __main__)r|   r   rM   rd   r   pathlibr   typingr   r   r   base_reviewerr   logging_configr   r	   r
   security_patternsr   ImportErrorrA   insertr1   __file__rb   r   r   ry    r   r   <module>r      s     	  
  " "9/FF8v$ vr"J zF K  9HHOOAs4>007789/FF8	9s   A AB0/B0