
    iC                     d    d dl Z d dlZd dlZd dlZdedededededefdZdd	eded
edz  defdZy)    Nactiontask_numpr_numexpirysecretreturnc                 8   |  d| d| d| }t        j                  |j                  d      |j                  d      t        j                        j                         }t        j                  |      j                  d      j                  d      dd }| d| S )u   callback_data 생성: '<action>:<task_num>:<pr_num>:<expiry>:<sig8>'

    action: 'a' (approve) | 'r' (reject) | 'd' (diff)
    sig8: base64url(HMAC-SHA256(secret, f'{action}:{task_num}:{pr_num}:{expiry}'))[:8]
    Telegram 64바이트 한도 고려.
    :utf-8ascii=N   )
hmacnewencodehashlibsha256digestbase64urlsafe_b64encodedecoderstrip)r   r   r   r   r   payloadmacsig8s           5/home/jay/workspace/scripts/anu_confirm_bot/signer.pysign_callbackr      s     (1VHAfX6G
((6==)7>>'+BGNN
S
Z
Z
\C##C(//8??DRaHDYav    callback_datanowc                    |t        t        j                               }| j                  d      }t        |      dk7  rdddS |\  }}}}}|dvrdddS 	 t        |      }	t        |      }
t        |      }| d|	 d|
 d| }t        j                  |j                  d	      |j                  d	      t        j                        j                         }t        j                  |      j                  d
      j                  d      dd }t        j                  ||      sdddS ||k  rdddS dd||	|
|dS # t        $ r dddcY S w xY w)uI  callback_data 검증.

    반환: {"ok": bool, "reason": str, "action": str, "task_num": int, "pr_num": int, "expiry": int}

    실패 사유:
    - "format" — 5필드 split 실패
    - "signature" — HMAC 불일치 (constant-time compare)
    - "expired" — expiry < now
    - "unknown_action" — action ∉ {a,r,d}
    Nr
      Fformat)okreason)ardunknown_actionr   r   r   r   	signatureexpiredT )r$   r%   r   r   r   r   )inttimesplitlen
ValueErrorr   r   r   r   r   r   r   r   r   r   compare_digest)r   r   r    partsr   task_strpr_str
expiry_strsigr   r   r   r   expected_macexpected_sigs                  r   verify_callbackr:      s`    {$))+$E
5zQx0005-FHfj#_$'7881x=VZ (1VHAfX6G88FMM'2GNN74KW^^\cceL++L9@@IPPQTUVXWXYLsL1{33|y11"HX^jpqq  1x001s   !D9 9E
	E
)N)	r   r   r   r.   strr-   r   dictr:    r   r   <module>r>      sm       
# 
 
c 
3 
PS 
X[ 
 r3  r  r#*  rPT  rr   