o
    ›¨Êhj  ã                   @   sÆ   d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	 ddl
mZ dd	lmZ dd
lmZ ddlmZmZmZmZmZ ddlmZmZmZ G dd„ deƒZG dd„ deeƒZeZdS )é    N)Údatetime)Ú	b64encode)Úconstant_time_compare)Úutcé   )ÚAnymailBaseWebhookViewé   )ÚAnymailWebhookValidationFailure)ÚAnymailInboundMessage)ÚinboundÚtrackingÚAnymailInboundEventÚAnymailTrackingEventÚ	EventType)Úget_anymail_settingÚgetfirstÚget_request_uric                       s0   e Zd ZdZdZdZ‡ fdd„Zdd„ Z‡  ZS )ÚMandrillSignatureMixinz$Validates Mandrill webhook signatureNc                    sZ   | j }td|d |dd�}|d ur| d¡| _td|d |dd�| _tt| ƒjdi |¤Ž d S )NÚwebhook_keyT)Úesp_nameÚdefaultÚkwargsÚ
allow_bareÚasciiÚwebhook_url© )r   r   Úencoder   r   Úsuperr   Ú__init__)Úselfr   r   r   ©Ú	__class__r   úK/var/www/html/env/lib/python3.10/site-packages/anymail/webhooks/mandrill.pyr      s   ÿÿzMandrillSignatureMixin.__init__c                 C   sº   | j d u rtd| jdd� z|jd }W n ty   tdƒ‚w | jp&t|ƒ}|j 	¡ }|}t
| ¡ ƒD ]
}||||  7 }q4ttj| j | d¡tjd� ¡ ƒ}t||ƒs[td| ƒ‚d S )	Nr   T)r   r   ÚHTTP_X_MANDRILL_SIGNATUREz5X-Mandrill-Signature header missing from webhook POSTzutf-8)ÚkeyÚmsgÚ	digestmodz=Mandrill webhook called with incorrect signature (for url %r))r   r   r   ÚMETAÚKeyErrorr	   r   r   ÚPOSTÚdictÚsortedÚkeysr   ÚhmacÚnewr   ÚhashlibÚsha1Údigestr   )r   ÚrequestÚ	signatureÚurlÚparamsÚsigned_datar$   Úexpected_signaturer   r   r"   Úvalidate_request&   s,   
ÿ
ÿÿ
ÿÿz'MandrillSignatureMixin.validate_request)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r8   Ú__classcell__r   r   r    r"   r      s    r   c                   @   sr   e Zd ZdZdZdZdZdd„ Zdd„ Ze	j
e	je	je	je	je	je	je	je	je	je	je	jd	œZd
d„ Zdd„ ZdS )ÚMandrillCombinedWebhookViewz=Unified view class for Mandrill tracking and inbound webhooksÚMandrillFNc                    s"   t  |jd ¡}‡ fdd„|D ƒS )NÚmandrill_eventsc                    s   g | ]}ˆ   |¡‘qS r   )Úesp_to_anymail_event)Ú.0Ú	esp_event©r   r   r"   Ú
<listcomp>I   s    z<MandrillCombinedWebhookView.parse_events.<locals>.<listcomp>)ÚjsonÚloadsr)   )r   r2   Ú
esp_eventsr   rD   r"   Úparse_eventsG   s   z(MandrillCombinedWebhookView.parse_eventsc                 C   sT   t |ddgdƒ}|dkr| jtusJ ‚t| _|  |¡S | jtus"J ‚t| _|  |¡S )z/Route events to the inbound or tracking handlerÚeventÚtypeÚunknownr   )r   Úsignalr   r   Ú!mandrill_inbound_to_anymail_eventÚ"mandrill_tracking_to_anymail_event)r   rC   Úesp_typer   r   r"   rA   K   s   

z0MandrillCombinedWebhookView.esp_to_anymail_event)ÚsendÚdeferralÚhard_bounceÚsoft_bounceÚopenÚclickÚspamÚunsubÚrejectÚ	whitelistÚ	blacklistr   c           
      C   s|  t |ddgd ƒ}| j |tj¡}ztj|d td�}W n tt	fy(   d }Y nw z|d d }W n tyN   z|d d }W n tyK   d }Y nw Y nw z|d d }W n tyb   d }Y nw zt |d d	d
gƒ}W n tyy   d }Y nw z|d d }W n ty�   i }Y nw z|d d }	W n ty¡   g }	Y nw t
| dd ¡|||| dd ¡|||d |	|| dd ¡d�S )NrJ   rK   Úts©Útzr%   ÚemailrY   ÚdiagÚdetailÚreasonÚmetadataÚtagsr4   Ú_idÚ
user_agent)Ú	click_urlÚdescriptionrC   Ú
event_typeÚ
message_idrc   Úmta_responseÚ	recipientÚreject_reasonrd   Ú	timestamprf   )r   Úevent_typesÚgetr   ÚUNKNOWNr   Úfromtimestampr   r(   Ú
ValueErrorr   )
r   rC   rP   ri   rn   rl   rk   rh   rc   rd   r   r   r"   rO   n   sf   ÿÿ€ýÿÿÿÿ


ôz>MandrillCombinedWebhookView.mandrill_tracking_to_anymail_eventc              	   C   s�   t  |d d ¡}d |_|d  dd ¡|_d |_|d  di ¡ dd ¡|_ztj|d t	d�}W n t
tfy=   d }Y nw ttj|d ||d�S )	Nr%   Úraw_msgr_   Úspam_reportÚscorer\   r]   )ri   rn   Úevent_idrC   Úmessage)r
   Úparse_raw_mimeÚenvelope_senderrp   Úenvelope_recipientÚspam_detectedÚ
spam_scorer   rr   r   r(   rs   r   r   ÚINBOUND)r   rC   rx   rn   r   r   r"   rN   ¦   s"   ÿûz=MandrillCombinedWebhookView.mandrill_inbound_to_anymail_event)r9   r:   r;   r<   r   Úwarn_if_no_basic_authrM   rI   rA   r   ÚSENTÚDEFERREDÚBOUNCEDÚOPENEDÚCLICKEDÚ
COMPLAINEDÚUNSUBSCRIBEDÚREJECTEDrq   r~   ro   rO   rN   r   r   r   r"   r>   ?   s,    ñ8r>   )rF   r   r/   r-   Úbase64r   Údjango.utils.cryptor   Údjango.utils.timezoner   Úbaser   Ú
exceptionsr	   r   r
   Úsignalsr   r   r   r   Úutilsr   r   r   Úobjectr   r>   ÚMandrillTrackingWebhookViewr   r   r   r"   Ú<module>   s    .