
    Djs                        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mZ ddlmZmZ  ej        e          Z G d de          Zd dZd!dZd!dZd"dZd#dZd$dZd%dZd&dZd'dZd(dZdS ))z0Pure protocol helpers for the Reminders service.    )annotationsN)urlparse   )reminders_pb2versioned_document_pb2c                      e Zd ZdZdS )CRDTDecodeErrorz7Raised when a Reminders CRDT payload cannot be decoded.N)__name__
__module____qualname____doc__     `/home/thesage/.hermes/venv/lib/python3.11/site-packages/pyicloud/services/reminders/_protocol.pyr	   r	      s        AAAAr   r	   keystrreturnc                    |                      |          }|r(|j        r!t          |j        d          r|j        j        S dS )z8Extract recordName from a REFERENCE field, or return ''.
recordName )	get_fieldvaluehasattrr   )fieldsr   fields      r   	_ref_namer      sI    S!!E & &l!C!C &{%%2r   r   prefixc                l    | s| S t          |           } | d}|                     |          r| S | |  S )zDReturn a record name with the expected prefix (e.g. ``Alarm/UUID``)./)r   
startswithr   r   tokens      r   _as_record_namer#      sQ     JJELLLE Ur   c                    | s| S t          |           } | d}|                     |          r| t          |          d         S | S )z5Return a raw UUID/id token without the record prefix.r   N)r   r    lenr!   s      r   
_as_raw_idr&   *   sU     JJELLLE #SZZ\\""Lr   boolc                    | sdS t          |           }|j        sdS |j        dv rt          |j                  S t          |j        p|j                  S )z4Return True for values that already look like a URL.F>   httphttps)r   schemer'   netlocpath)r   parseds     r   _looks_like_urlr/   5   s^     ue__F= u})))FM""",---r   c                .   | sdS t          |           r| S ddt          |           dz  z
  dz  z  }	 t          j        |  | d                              d          }n$# t
          j        t          t          f$ r | cY S w xY wt          |          r|S | S )z=Decode a URL attachment value, falling back to the raw value.r   =   T)validateutf-8)	r/   r%   base64	b64decodedecodebinasciiErrorUnicodeDecodeError
ValueError)r   paddingdecodeds      r   _decode_attachment_urlr>   B   s     ru a#e**q.(A-.G"g
 
 
 &// 	 N.
;    w Ls   -A   B Bdict[str, str]c                    t          j        | pd                    d                                        d          }d|dS )z?Encode text for CloudKit fields that store UTF-8 payload bytes.r   r4   asciiENCRYPTED_BYTES)typer   )r5   	b64encodeencoder7   )r   encodeds     r   _encode_cloudkit_text_fieldrG   W   s@    33G<<==DDWMMG%888r   objectc                    | dS t          | t                    r| S t          | t                    r|                     d          S t          |           S )z6Decode a CloudKit text field value into plain ``str``.Nr   r4   )
isinstancer   bytesr7   )r   s    r   _decode_cloudkit_text_valuerL   ]   sS    }r% % %||G$$$u::r   encrypted_valuestr | bytesc           	     p   | }t          |t                    rgdt          |          dz  z
  }|dk    r|d|z  z  }	 t          j        |          }n.# t
          j        t          f$ r}t          d          |d}~ww xY w	 t          j
        |          }nk# t          j        $ rY 	 ddl}|
                    |          }n;# t          $ r.}t                              d||dd                    Y d}~nd}~ww xY wY nw xY w	 t!          j                    }|                    |           |j        rC|j        d         j        }t+          j                    }|                    |           |j        pdS n2# t0          $ r%}t                              d	|           Y d}~nd}~ww xY w	 t!          j                    }|                    |           |j        r6t+          j                    }|                    |j                   |j        pdS n2# t0          $ r%}t                              d
|           Y d}~nd}~ww xY w	 t+          j                    }|                    |           |j        r|j        S n2# t0          $ r%}t                              d|           Y d}~nd}~ww xY wt          d          )z8Decode a CRDT document (TitleDocument or NotesDocument).r2   r1   z$Invalid base64-encoded CRDT documentNr   z CRDT decompress skipped: %s (%s)
   r   z,versioned_document.Document parse failed: %sz+versioned_document.Version parse failed: %szbare String parse failed: %szUnable to decode CRDT document)rJ   r   r%   r5   r6   r8   r9   r;   r	   zlib
decompresserrorgzipOSErrorLOGGERdebugr   DocumentParseFromStringversiondatar   Stringstring	ExceptionVersion)	rM   r[   r<   exc_gzipdocumentstring_bytesr   rZ   s	            r   _decode_crdt_documentrd   h   sM   D$ Ss4yy1}%a<<C'M!D	S#D))DD
+ 	S 	S 	S!"HIIsR	SMt$$: M M M	M    ##D))DD 	M 	M 	MLL;S$ss)LLLLLLLL	MM	J)244  &&& 	&#+A.3L!(**E!!,///<%2%		&
  J J JCSIIIIIIIIJI(022%%%< 	&!(**E!!',///<%2%	&  I I IBCHHHHHHHHI:$&&d###< 	 <	  : : :3S99999999: :
;
;;s   A A<'A77A< B C=%B?>C=?
C7	$C2-C=2C77C=<C=A1E4 4
F#>FF#'A$H 
H<H77H< 5I7 7
J&J!!J&textc                |   | rt          |           nd}t                              d          }d}t          j                    }| |_        |j                                        }d|j        _	        d|j        _
        d|_        d|j        _	        d|j        _
        |j                            d           |dk    rj|j                                        }d|j        _	        d|j        _
        ||_        d|j        _	        d|j        _
        |j                            d           |j                                        }d|j        _	        ||j        _
        d|_        d|j        _	        ||j        _
        |j        j
                                        }||_        |j                                        }	||	_
        |j                                        }
d|
_
        |dk    r |j                                        }||_        |                                }t'          j                    }d|_        d|_        ||_        t'          j                    }d|_        |j                            |           |                                }t5          j        |          }t9          j        |                              d          S )z?Encode a string into an Apple versioned topotext CRDT document.r    d46bcae41b8766c18d75efe35c9145c3l    r      r4   )r%   rK   fromhexr   r\   r]   	substringaddcharID	replicaIDclocklength	timestampchildappendreplicaUUIDreplicaClockattributeRunSerializeToStringr   r_   serializationVersionminimumSupportedVersionr[   rX   rZ   rQ   compressr5   rD   r7   )re   text_lengthreplica_uuid	clock_maxr   sentinelcontentterminaltimestamp_clockcontent_clocksentinel_clockattribute_runrc   rZ   rb   	doc_bytes
compresseds                    r   _encode_crdt_documentr      s`   #*#d)))K==!CDDLI ""EEL""$$H !HOHOHO#$H  HN!Q/%%''#$  $&'#"#Q""$$H !HO%HOHO#$H (Ho+//11O".O#04466M%M$15577NNQ*..00***,,L$,..G#$G &'G#GL%.00H$%H!G$$$**,,Iy))JJ''..w777r   fields_modified	list[str]c                    t          j                     dz
  }i }| D ];}d|t          t          j                                                              d||<   <t          j        d|id          S )z;Generate a ResolutionTokenMap for a set of modified fields.g   @'Ar   )countermodificationTimerm   map),:)
separators)timer   uuiduuid4upper_jsondumps)r   apple_epochtokens
field_names       r   _generate_resolution_token_mapr      sx    )+++KF% 
 

 +TZ\\**0022
 
z
 ;v:>>>>r   )r   r   r   r   )r   r   r   r   r   r   )r   r   r   r'   )r   r   r   r   )r   r   r   r?   )r   rH   r   r   )rM   rN   r   r   )re   r   r   r   )r   r   r   r   )r   
__future__r   r5   r8   jsonr   loggingr   r   rQ   urllib.parser   protobufr   r   	getLoggerr
   rV   r;   r	   r   r#   r&   r/   r>   rG   rL   rd   r   r   r   r   r   <module>r      s   6 6 " " " " " "           ! ! ! ! ! ! ; ; ; ; ; ; ; ;		8	$	$B B B B Bj B B B         
. 
. 
. 
.   *9 9 9 9   3< 3< 3< 3<l98 98 98 98x
? 
? 
? 
? 
? 
?r   