
    =R4j_                     |    d Z ddlZ eg d      Z ed eD              Zd Zd Zd Zd Zed	fed
fedfedfgZ	d Z
y)u  
control_db_guard.py — ANU v2.13 control DB write guard (순수 함수, stdlib only)

chair/anu-control/independent_verifier 는 허용.
그 외 actor의 control 테이블 직접 쓰기는 CONTROL_DB_DIRECT_WRITE_BLOCKED.
코드는 검사만 수행하며 DB 접근 0건.
    N)chairzanu-controlanu_controlindependent_verifierc              #   <   K   | ]  }|j                           y w)N)lower).0as     0/home/jay/workspace/dispatch/control_db_guard.py	<genexpr>r      s     @a	@s   c                 N    d| vryt        j                  d|       }t        |      S )uk  sqlite + write/DDL 키워드. INSERT/UPDATE/DELETE 외에 REPLACE 및
    CREATE/ALTER/DROP/TRUNCATE(DDL) 를 대소문자 무관하게 탐지한다 (HIGH 4).
    'INSERT OR REPLACE' / 'DROP TABLE' 등 우회를 차단.

    haystack 는 check_db_write 에서 이미 소문자화되어 전달되므로 재소문자화하지
    않는다 (redundant lower 제거).sqliteFzC\b(insert|update|delete|write|replace|create|alter|drop|truncate)\b)researchbool)haystack	write_kwss     r
   _is_sqlite_writer      s1     x 		NI 	?    c                 L    t        t        j                  d|       xr d| v       S )Nzupdate\s+bots\bheartbeat_atr   r   r   r   s    r
   _is_heartbeat_updater   0   s+    
		$h/ 	'h& r   c                     d| v xr d| v S )N
promotionsapproved r   s    r
   _is_promotion_approvedr   8   s    8#>
h(>>r   c                     t        t        j                  d|             }t        t        j                  d|             }|xr |S )Nz=\b(insert|update|delete|replace|create|alter|drop|truncate)\bz\b(bots|promotions|ledger)\br   )r   	has_write	has_tables      r
   _is_control_table_writer"   <   sB     RYYH I RYY>IJI""r   zsqlite direct write detectedz#UPDATE bots + heartbeat_at detectedzpromotions + APPROVED detectedz.INSERT/UPDATE/DELETE on control table detectedc                     t        | xs d      j                         j                         }|t        v rddd| d| dS |xs dj                         }t        D ]  \  }} ||      sdd| d	| d
| dc S  ddd| dS )u   
    Parameters
    ----------
    actor : str   — bot id / actor name
    sql_or_op : str — SQL 문 또는 작업 설명

    Returns
    -------
    dict {"blocked": bool, "verdict": str | None, "reason": str, "actor": str}
     FNzactor=z( is a chair-class actor; write permitted)blockedverdictreasonactorTCONTROL_DB_DIRECT_WRITE_BLOCKEDz (actor=z is not chair-class)z#no control-db write pattern matched)strstripr   _CHAIR_ACTORS_LOWER
_DETECTORS)r(   	sql_or_opactor_lowerr   detectordescs         r
   check_db_writer2   R   s     ekr"((*002K ))y(PQ	
 	
 R&&(H$ $H<"V8E94HI 	  8	 r   )__doc__r   	frozensetCHAIR_ACTORSr,   r   r   r   r"   r-   r2   r   r   r
   <module>r6      sy    
     @<@@ $?# <=CD>?NO	
(r   