o
    "“i{  ã                   @   sd   d dl mZ d dlmZ d dlZd dl Z d dlZdZdZdZdZ	G dd	„ d	ƒZ
G d
d„ dejƒZdS )é    )Ú	b64decode)ÚOptionalNz1.2.840.113549.1.7.2é   i§  i©  c                   @   s8   e Zd Zdedee fdd„Zdedee fdd„ZdS )	ÚReceiptUtilityÚapp_receiptÚreturnc                 C   sª  t ƒ }| t|dd¡ | ¡ }|jtjjks|jtj	j
kr!tƒ ‚| ¡  | ¡ \}}|jtjjks=|jtj	jks=|tkr@tƒ ‚| ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡  | ¡ \}}|jtjjkr|jtj	jkrt ¡ }| |¡ | ¡ \}}|jtjjks|jtj	jkrtƒ ‚t ¡ }| |¡ | ¡ }|jtjjks«|jtj	jkr®tƒ ‚| ¡  | ¡ sS| ¡  | ¡ \}}|jtjjkrK|jtj	jkrK|tkrK| ¡  | ¡ \}}|jtjjksî|jtj	jkrñtƒ ‚t ¡ }| |¡ | ¡  | ¡ sK| ¡  | ¡ \}}|jtjjkrB|jtj	jkrB|tks'|tkrB| ¡  | ¡ \}}t ¡ }| |¡ | ¡ \}}|S | ¡  | ¡ r| ¡  | ¡ r·dS )a±  
        Extracts a transaction id from an encoded App Receipt. Throws if the receipt does not match the expected format.
        *NO validation* is performed on the receipt, and any data returned should only be used to call the App Store Server API.

        :param appReceipt: The unmodified app receipt
        :return: A transaction id from the array of in-app purchases, null if the receipt contains no in-app purchases
        T)ÚvalidateN)ÚIndefiniteFormAwareDecoderÚstartr   ÚpeekÚtypÚasn1ÚTypesÚConstructedÚnrÚNumbersÚSequenceÚ
ValueErrorÚenterÚreadÚ	PrimitiveÚObjectIdentifierÚ	PKCS7_OIDÚOctetStringÚDecoderÚSetÚeofÚIntegerÚIN_APP_ARRAYÚTRANSACTION_IDENTIFIERÚORIGINAL_TRANSACTION_IDENTIFIERÚleave)Úselfr   ÚdecoderÚtagÚvalueÚinner_decoderÚinapp_decoderÚsingleton_decoder© r)   úe/var/www/html/premium_crap/venv/lib/python3.10/site-packages/appstoreserverlibrary/receipt_utility.pyÚ'extract_transaction_id_from_app_receipt   sr   $


*



òåz6ReceiptUtility.extract_transaction_id_from_app_receiptÚtransaction_receiptc                 C   sT   t  |¡ d¡}t d|¡}|r(t  | d¡¡ d¡}t d|¡}|r(| d¡S dS )a©  
        Extracts a transaction id from an encoded transactional receipt. Throws if the receipt does not match the expected format.
        *NO validation* is performed on the receipt, and any data returned should only be used to call the App Store Server API.
        :param transactionReceipt: The unmodified transactionReceipt
        :return: A transaction id, or null if no transactionId is found in the receipt
        zutf-8z*"purchase-info"\s+=\s+"([a-zA-Z0-9+/=]+)";é   z+"transaction-id"\s+=\s+"([a-zA-Z0-9+/=]+)";N)Úbase64r   ÚdecodeÚreÚsearchÚgroup)r"   r,   Údecoded_top_levelÚmatching_resultÚdecoded_inner_levelÚinner_matching_resultr)   r)   r*   Ú/extract_transaction_id_from_transaction_receiptW   s   
z>ReceiptUtility.extract_transaction_id_from_transaction_receiptN)Ú__name__Ú
__module__Ú__qualname__Ústrr   r+   r7   r)   r)   r)   r*   r      s    Gr   c                       s"   e Zd Zdef‡ fdd„Z‡  ZS )r	   r   c                    sh   | j d \}}z|| }W n ty   t d¡‚w |dkr/|  ¡  | j d \}}t|ƒ| S tƒ  ¡ S )NéÿÿÿÿzPremature end of input.é€   )Úm_stackÚ
IndexErrorr   ÚErrorÚ
_read_byteÚlenÚsuperÚ_read_length)r"   ÚindexÚ
input_dataÚbyte©Ú	__class__r)   r*   rD   h   s   
ÿ
z'IndefiniteFormAwareDecoder._read_length)r8   r9   r:   ÚintrD   Ú__classcell__r)   r)   rH   r*   r	   g   s    r	   )r.   r   Útypingr   r   r0   r   r   r   r    r   r   r	   r)   r)   r)   r*   Ú<module>   s   X