
    Ƃj9                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZ ddlmZ ddlmZmZ ddlmZmZ  ee      j/                         j0                  Zedz  Zed	z  Zed
z  ZdZdZdZh dZ dZ!dZ" G d de#      Z$d"dZ%d#dZ&ejN                  fd$dZ(d%dZ)d&d'dZ*d(dZ+d)dZ,d)dZ-d*dZ.d+dZ/ddd,dZ0d-dZ1d.d/d Z2e3d!k(  r e4 e2             y)0z6One-use, local-only customer-surface evidence capture.    )annotationsN)datetimetimezone)Path)AnyCallable)ImageUnidentifiedImageErrorzcapture-contract.jsonvaultzcapture-receipt.redacted.jsoni  @i @  i >   1LPLARGBRGBAGI_ATTEST_EXACTLY_ONE_VISIBLE_MESSAGE_MATCHES_THE_DURABLE_DELIVERED_TEXTs   PNG

c                      e Zd Zy)CaptureErrorN)__name__
__module____qualname__     /home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-strict-rerun-customer-surface-capture-st_01a00ed6/capture.pyr   r      s    r   r   c                V    t        j                  | ddd      dz   j                         S )NT),:)ensure_ascii	sort_keys
separators
)jsondumpsencode)values    r   	canonicalr&   "   s&    JJu44JWZ^^ffhhr   c                H    t        j                  |       j                         S N)hashlibsha256	hexdigest)datas    r   digestr-   %   s    >>$))++r   c                t    t        |      }|r+ || t        |            }|dk  rt        d      ||d  }|r*y y )Nr   zincomplete write)
memoryviewbytesr   )fdr,   writeviewwrittens        r   
_write_allr5   (   sB    dD
E$K(a<122GH~	 r   c                   t        j                  | t         j                  t         j                  z  t         j                  z        }	 t        j
                  |       t        j                  |       y # t        j                  |       w xY wr(   )osopenO_RDONLYO_DIRECTORY	O_CLOEXECfsyncclose)pathr1   s     r   _fsync_directoryr?   0   sO    	r{{R^^3bllB	CB

s   A3 3B
c                t   | j                   j                  ddd       t        j                  | j                   d       t	        j
                  d| j                   d| j                         \  }}t        |      }	 t        j                  ||       t        ||       t        j                  |       t        j                  |       d}| j                         s| j                         rt        d| j                         t        j                  || d	       |j!                          t#        | j                          |d
k\  rt        j                  |       	 |j!                          y # t$        $ r Y y w xY w# |d
k\  rt        j                  |       	 |j!                          w # t$        $ r Y w w xY wxY w)N  T)modeparentsexist_ok.)prefixdirzone-use output already exists: F)follow_symlinksr   )parentmkdirr7   chmodtempfilemkstempnamer   fchmodr5   r<   r=   exists
is_symlinkr   linkunlinkr?   FileNotFoundError)r>   r,   rB   r1   tmp_nametmps         r   atomic_writerX   7   sK   KK5$>HHT[[% ##Qtyyk+;MLB
x.C
		"d2t

;;=DOO-!@LMM 	T51

%7HHRL	JJL  			 7HHRL	JJL  		sC   =CE; E, ,	E87E8;F7F('F7(	F41F73F44F7c                 ,   t         j                  t         j                  z  t         j                  z  } t        j                  t
        |       }	 t        j                  |      }t        j                  |j                        r"t        j                  |j                        dk7  rt        d      d}	 t        j                  |d      }|sn||z  }	 t        j                  |       t        j                  |      }h d}t!        |j#                  di             |k7  s|j#                  d      dk7  rt        d	      |d   j%                         D ]%  \  }}t'        |t(              r|rt        d
|        ||fS # t        j                  |       w xY w)N  z)contract must be a mode-0600 regular filer   i   >   	candidateconfig_sha256core_candidatecustomer_chat_iddelivery_row_keylifecycle_run_iddurable_text_sha256hermes_wheel_sha256lifecycle_session_idprofile_wheel_sha256delivery_idempotency_keyexpected_provider_timestampexpected_provider_message_idbindingschemaz+task26-customer-surface-capture-contract-v1z(capture contract schema/binding mismatchzinvalid contract binding: )r7   r9   r;   
O_NOFOLLOWr8   CONTRACTfstatstatS_ISREGst_modeS_IMODEr   readr=   r"   loadssetgetitems
isinstancestr)	flagsr1   strawchunkr%   requiredkeyitems	            r   load_contractr   Q   sN   KK",,&6E	5	!BXXb\||BJJ'4<<

+Cu+LJKKGGB&E5LC	   	JJsOEH 599Y#$0EIIh4GKx4xEFF9%++-	T$$D!;C5ABB . #: 	s   BE< <Fc                   | j                  t              st        d      ddt               ddf\  }}}}}dx}}|dz   t	        |       k  rt        j                  d| ||dz          d   }| |dz   |dz    }	|dz   |z   }
|
t	        |       kD  rt        d      | |dz   |dz   |z    }t        j                  d| |dz   |z   |
       d   }t        j                  |	|z         d	z  |k7  rt        d
      |dz  }|dk(  rQ|	dk7  s|dk7  rt        d      t        j                  d|      \  }}}}}}}|dvs|dvs|s|s|dvrt        d      d}n|	dk(  rt        d      |	dk(  rd}|j                  |       n|r|	dvrd}|	dk(  r|s|
t	        |       k7  rt        d      |r|st        d      	 t        j                         }|j                  t        |      t        dz         |j                  r|j                  rt        d      	 ||fS |
}|dz   t	        |       k  rt        d      # t        j                   $ r}t        d      |d }~ww xY w)Nzinvalid PNG signature   r   F   z>I   ztruncated PNG chunkl    zPNG CRC mismatch   s   IHDR   zPNG IHDR missingz>IIBBBBB>   r      r   r      >   r   r      r      >   r   r   zunsupported PNG headerTzduplicate PNG IHDR   IDAT>   r      IENDr   zPNG has trailing/polyglot byteszPNG image data missing@   zinvalid PNG compressed streamzPNG IEND missing)
startswithPNG_SIGr   	bytearraylenstructunpackzlibcrc32extenddecompressobj
decompressr0   	MAX_BYTESeofunused_dataerror)r,   poschunksidatwidthheight	seen_ihdr	seen_idatlengthkindendpayloadexpected_crcdepthcolorcompression	filtering	interlacedecompressorexcs                       r   _strict_pngr   n   s   ??7#233'(!Y[!Q'>$Cuf!!I	
(c$i
tT#cAg%67:C!GC!G$BhT?455sQwsQw/0}}T4a&0@+EFqI::dWn%
2lB122!Q;w&B,"#566MS]][egnMoJE65%i,,_0LP[_hlu  ~D  mD"#;<<IW_3447?IKK 4'99I7?D	)"#DEED"#;<<M#113''dY^D#''<+C+C&'FGG ,D &= O (c$i
P )
**	 :: M"#BCLMs   ,AH* *I=I		Ic                r   t        |       dk  s| d d dk7  rt        d      d\  }}}h d}|t        |       k  r|r| j                  d|      }|dk  r	 t        d      |}|t        |       k  r$| |   d	k(  r|d
z  }|t        |       k  r	| |   d	k(  r|t        |       k\  r	 t        d      | |   }|d
z  }|dk(  sd|cxk  rdk  rn nd}ni| |   d	k7  rt        d      |t        |       k  r$| |   d	k(  r|d
z  }|t        |       k  r	| |   d	k(  r|t        |       k\  r	 t        d      | |   }|d
z  }|dk(  r|t        |       k7  s|t        d      |S |dv sd|cxk  rdk  rn nB|dz   t        |       kD  rt        d      t        j                  d| ||dz          d   }|dk  s||z   t        |       kD  rt        d      | |dz   ||z    }||v r9t        |      dk  rt        d      t        j                  d|d
d       \  }	}
|
|	f}||z  }|dk(  rd}|t        |       k  rt        d      )Nr   r      zinvalid JPEG signature)r   NF>                                             r      r         Fzinvalid JPEG marker stream   z1JPEG has trailing/polyglot bytes or no dimensions>   r      ztruncated JPEG segmentz>Hzinvalid JPEG segment lengthr   ztruncated JPEG SOFz>HH      TzJPEG EOI missing)r   r   findr   r   )r,   r   
dimensionsin_scansofmarkercoder   r   r   r   s              r   _strict_jpegr      s   
4y1}RaK/344-CW
XC
D	/YYw,FzP )
**O CD	/d3i4&7q D	/d3i4&7c$iF )
**E 9D1HCt|tt3t3GCyD "#?@@D	/d3i4&7q D	/d3i4&7c$i. )
**- 9D1HC4<c$i:#5"#VWW<44#74#77SY788tT#cAg%67:A:vD	1<==sQwsV|,3;7|a"#788"MM%1>MFEJv4<GW D	/X )
**r   c                B   | rt        |       t        kD  rt        dt         d      | j                  t              rdt        |       }}n*| j                  d      rdt        |       }}nt        d      t        t        _	        	 ddl
m} t        j                   ||             5 }|j                          |j                  |j                  f}|j                   }|j"                  }d d d        |\  }	}
|k7  s|k7  rt        d
      |	dk  s#|
dk  s|	t*        kD  s|
t*        kD  s|	|
z  t        kD  rt        d      t,        vrt        d|       ||	|
|t        |       t/        |       dS # 1 sw Y   xY w# t$        t&        t(        f$ r}t        d	      |d }~ww xY w)Nimage size must be 1.. bytesPNGr   JPEGz'only real PNG or JPEG input is acceptedr   )BytesIOzimage decoder rejected inputzimage format/dimension mismatchr   zimage dimensions exceed policyzimage mode is not allowed: )formatr   r   rB   r0   r*   )r   r   r   r   r   r   r   
MAX_PIXELSr	   MAX_IMAGE_PIXELSior   r8   loadr   r   rB   r   r
   OSError
ValueErrorMAX_DIMENSIONALLOWED_MODESr-   )r,   fmtr   r   imagedecodedrB   decoded_formatr   r   r   s              r   validate_imager      s   3t9y(3I;fEFFwT!2Z		% ,t"4ZDEE'EDZZ&%JJL{{ELL1G::D"\\N	 ' ME6: 5<==qyFQJ%-"76M;QUZ]cUcfpUp;<<= 8?@@EVTTWX\T]ioptiuvv '&
 #GZ8 D9:CDs1   !E9 &AE-'E9 -E62E9 9FFFc                   | j                         st        d      t        j                  t        j                  z  t        j
                  z  }	 t        j                  | |      }	 t        j                  |      }t        j                  |j                        }t        j                  |j                        r|j                  dk7  rt        d      |dz  s|dz  rt        d      |j                  dk  s|j                  t         kD  rt        dt          d	      g t         dz   }}|rEt        j"                  |t%        d
|            }|sn"|j'                  |       |t)        |      z  }|rEdj+                  |      }	t        j                  |      }
|j,                  |j.                  |j                  |j0                  f|
j,                  |
j.                  |
j                  |
j0                  fk7  rt        d      t)        |	      |j                  k7  rt        d      |	|ft        j2                  |       S # t        $ r}t        d|j                         |d }~ww xY w# t        j2                  |       w xY w)N4image path must be an absolute Linux filesystem pathzcannot securely open image: r   z(image must be a single-link regular fileI      z;image source must not be executable or group/world-writabler   r   i   r   zimage changed while being readzincomplete image read)is_absoluter   r7   r9   r;   rj   r8   r   strerrorrl   rm   rp   ro   rn   st_nlinkst_sizer   rq   minappendr   joinst_devst_inost_mtime_nsr=   )r>   rx   r1   r   beforerB   parts	remainingr{   r,   afters              r   read_sourcer      s   QRRKK",,&6ESWWT5!"||FNN+||FNN+v!/CIJJ%<4%<\]]>>A)!;!7	{&IJJy1}yGGBK ;<ELLU#I  xxMM6==&..&:L:LMRWR^R^`e`l`lnsn{n{  ~C  ~O  ~O  RP  P?@@t9&677Tz
5  S9#,,HIsRS4 	s,   H9 &DI# /B4I# 9	I II #I:)nowc               *   |t         k7  rt        d      | j                         st        d      t               \  }}t        j                         s<t        j                         s(t        j                         st        j                         rt        d      t        |       \  }}t        |      }|d   dk(  rdnd}t        j                  d	       t        j                  t        d       t        d
| z  }	t        |	|       t        j                  |	j                         j                         dk7  s|	j#                         |k7  r|	j%                  d       t        d      |xs# t'        j(                  t*        j,                        j/                  t*        j,                        j1                         j3                  dd      }
dd|d   t5        |      |
|d   |d   |d   |d   |d   |d   |ddt7        |	j9                  t:                    d
ddt         dddddddd}	 t        t        t=        |             t?        t:               |S # t@        $ r8 |	j%                  d       	 t        jC                           # tD        $ r Y  w xY ww xY w) Nz&exact operator attestation is requiredr   z0capture is one-use and has already been consumedr   r   z.pngz.jpgrA   )rB   zcustomer-surfacerZ   T)
missing_okzvault copy verification failedz+00:00Zz*task26-customer-surface-capture-receipt-v1PASS_CAPTURED_ONCErh   r0   r   rB   r*   r   04o0600)
captured_at_utcimage_bytesimage_formatimage_height
image_modeimage_sha256image_widthsource_mode
vault_mode
vault_path)exactly_one_visible_messagematches_durable_delivered_texttokenF)&chat_attachment_is_filesystem_evidencecustomer_answers_in_jsonimage_is_protected_evidenceocr_performedraw_delivered_text_in_json)ri   statusrh   contract_sha256captureoperator_attestationprivacy)#ATTESTATIONr   r   r   RECEIPTrQ   rR   VAULTr   r   rK   r7   rL   rX   rm   rp   ro   
read_bytesrT   r   r   r   utc
astimezone	isoformatreplacer-   rw   relative_toROOTr&   r?   	Exceptionrmdirr   )r>   attestationr   contractcontract_rawr,   r  r   	extensiontargetcapturedreceipts               r   r  r    sU   k!CDDQRR*_Hl~~7--/5<<>UEUEUEWMNN#D)D+4 E/U2I	KKUKHHUE'	{33F||FKKM))*e3v7H7H7Jd7R&;<<1x||HLL1==hllKUUW__`hjmnH>&I&!,/' >!(O!(O-!(O >)#. f0067
 ,0.2 !
 7<(-+/"*/
-G<	Wi01 N  &	KKM 	  			s0   '(I J-JJ	JJJJc            
         t               \  } }ddt        |      | d   d   dddt        j                         t        j                         d	S )Nz*task26-customer-surface-capture-dry-run-v1PASS_AWAITING_FINAL_RUN_IMAGErh   r[   r   )	ri   r  r  r[   live_actionsnetwork_actionsocr_actionsvault_presentreceipt_present)r   r-   r  rQ   r  )r   rz   s     r   dry_runr-  K  sM    !OMHc>1!#;i(5">>+
 
r   c                   t        j                  t              }|j                  ddt        d       |j                  dd       |j                  d	d
       |j                  |       }	 |j                  r.|j                  |j                  t        d      t               }n;|j                  t        d      t        |j                  |j                  xs d      }t        j                  j                  j                  t        |             y# t        t         t"        j$                  f$ r-}t        j&                  j                  d| d       Y d }~yd }~ww xY w)N)descriptionr   ?z#absolute Linux path to one PNG/JPEG)nargstypehelpz--attestzexact attestation token)r3  z	--dry-run
store_true)actionz'dry-run accepts no image or attestationzone image path is required r   zcapture rejected: r!   r   )argparseArgumentParser__doc__add_argumentr   
parse_argsr-  r   attestr   r  sysstdoutbufferr2   r&   r   r"   JSONDecodeErrorstderr)argvparserargsresultr   s        r   mainrF  Y  s   $$9F
s<ab

)BC
L9T"D<<zz%)@"#LMMYFzz!"#?@@TZZ):;F

	& 12'4#7#78 

-cU"56s   ,B'D E2#EE__main__)r%   r   returnr0   )r,   r0   rH  rw   )r1   intr,   r0   r2   zCallable[[int, bytes], int]rH  None)r>   r   rH  rJ  )rZ   )r>   r   r,   r0   rB   rI  rH  rJ  )rH  ztuple[dict[str, Any], bytes])r,   r0   rH  ztuple[int, int])r,   r0   rH  dict[str, Any])r>   r   rH  ztuple[bytes, int])r>   r   r  rw   r   zdatetime | NonerH  rK  )rH  rK  r(   )rB  zlist[str] | NonerH  rI  )5r9  
__future__r   r7  r)   r"   r7   rm   r   r=  rM   r   r   r   pathlibr   typingr   r   PILr	   r
   __file__resolverJ   r  rk   r  r  r   r   r   r   r  r   RuntimeErrorr   r&   r-   r2   r5   r?   rX   r   r   r   r   r   r  r-  rF  r   
SystemExitr   r   r   <module>rT     s   < "    	   
   '    -H~&&))w
0
0	
4W
	< 	i, KM(( 4:-+^1+fw8 D EI ;z* z
TV
 r   