U
    wÚdm'  ã                "   @   s¨  d Z ddlmZmZmZ ddlmZ ddlZdZdZ	dZ
dZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"d Z#d!Z$d"Z%d#Z&d$Z'd%Z(d&Z)d'Z*d(Z+d)Z,d*Z-d+Z.d,Z/d-Z0d.Z1d/Z2d0Z3d1Z4d2Z5d3Z6d4Z7d5Z8ed6ed7ed8ed9ed:ed;e d<ed=e$d>e'd?e+d@e*dAe.dBe/dCe1dDe2dEe3dFiZ9edGedHedIe1dJe2dKiZ:dLZ;dMZ<dNZ=dOZ>dPZ?G dQdR„ dRe@ƒZAG dSdT„ dTeBƒZCdUdV„ ZDdWdX„ ZEdYdZ„ ZFd[d\„ ZGdS )]zL
Implements a DAVError class that is used to signal WebDAV and HTTP errors.
é    )Ú__version__ÚcompatÚ	xml_tools)ÚetreeNÚreStructuredTextéd   ée   éf   éÈ   éÉ   éÊ   éË   éÌ   éÍ   éÎ   éÏ   éâ   i,  i-  i.  i/  i0  i1  i3  i  i’  i“  i”  i•  i–  i—  i˜  i™  iš  i›  iœ  i  iž  iŸ  i   i¡  i¦  i§  i¨  iª  iô  iõ  iö  i÷  iø  iù  iû  iþ  z200 OKz201 Createdz204 No Contentz304 Not Modifiedz400 Bad Requestz403 Forbiddenz405 Method Not Allowedz404 Not Foundz409 Conflictz412 Precondition Failedz416 Range Not Satisfiablez415 Media Type Not Supportedz
423 Lockedz424 Failed Dependencyz500 Internal Server Errorz501 Not Implementedz502 Bad Gatewayz An invalid request was specifiedz$The specified resource was not foundz'Access denied to the specified resourcez!An internal server error occurredzNot implementedz&{DAV:}cannot-modify-protected-propertyz{DAV:}lock-token-submittedz${DAV:}lock-token-matches-request-uriz{DAV:}no-conflicting-lockz{DAV:}propfind-finite-depthc                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚDAVErrorConditionz–May be embedded in :class:`DAVError` instances to store additional data.

    Args:
        condition_code (str): Should be PRECONDITION_CODE_...
    c                 C   s   || _ g | _d S ©N)Úcondition_codeÚhrefs)Úselfr   © r   ú!/opt/wsgidav/wsgidav/dav_error.pyÚ__init__‰   s    zDAVErrorCondition.__init__c                 C   s   d  | j| j¡S )Nz{}({}))Úformatr   r   ©r   r   r   r   Ú__str__   s    zDAVErrorCondition.__str__c                 C   s:   |  d¡st‚| jttfks t‚|| jkr6| j |¡ d S )Nú/)Ú
startswithÚAssertionErrorr   ÚPRECONDITION_CODE_LockConflictÚ"PRECONDITION_CODE_MissingLockTokenr   Úappend)r   Úhrefr   r   r   Úadd_href   s    þ

zDAVErrorCondition.add_hrefc                 C   sV   | j tkr t| jƒdks tdƒ‚t d¡}t || j ¡}| jD ]}|t |d¡_q>|S )Nr   z/lock-token-submitted requires at least one hrefz{DAV:}errorz
{DAV:}href)	r   r"   Úlenr   r    r   ÚElementÚ
SubElementÚtext)r   Zerror_elZcond_elr$   r   r   r   Úas_xml™   s    
ÿþ

zDAVErrorCondition.as_xmlc                 C   s   t  t |  ¡ d¡¡S )NT)r   Ú	to_nativer   Úxml_to_bytesr*   r   r   r   r   Ú	as_string¤   s    zDAVErrorCondition.as_stringN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r%   r*   r-   r   r   r   r   r   ‚   s   	r   c                   @   s:   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚDAVErrorzBGeneral error class that is used to signal HTTP and WEBDAV errors.Nc                 C   sP   t |ƒ| _|| _|| _|| _t |¡r0t|ƒ| _| jd ksLt| jƒtksLt	‚d S r   )
ÚintÚvalueÚcontext_infoÚsrc_exceptionÚerr_conditionr   Ú	is_nativer   Útyper    )r   Zstatus_coder5   r6   r7   r   r   r   r   ¸   s    


ÿÿzDAVError.__init__c                 C   s   d  |  ¡ ¡S )NzDAVError({}))r   Úget_user_infor   r   r   r   Ú__repr__Ç   s    zDAVError.__repr__c                 C   s   |   ¡ S r   )r;   r   r   r   r   r   Ê   s    zDAVError.__str__c                 C   sŽ   | j tkrd t| j  ¡}nd | j ¡}| jr@|d | j¡7 }n| j tkr^|d t| j  ¡7 }| jrt|d | j¡7 }| jrŠ|d | j¡7 }|S )zReturn readable string.ú{}z: {}z
    Source exception: '{}'z
    Error condition: '{}')r4   ÚERROR_DESCRIPTIONSr   r5   ÚERROR_RESPONSESr6   r7   )r   Úsr   r   r   r:   Í   s    

zDAVError.get_user_infoc              
   C   sØ   | j rdt | j  ¡ ¡fS t| ƒ}g }| d¡ | d¡ | d¡ | d |¡¡ | d¡ | d |¡¡ | d t |  ¡ ¡¡¡ | d	¡ | d
 t	t t
tj ¡ ƒd¡¡¡ | d¡ d |¡}dt |¡fS )z-Return a tuple (content-type, response page).zapplication/xmlzZ<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01//EN' 'http://www.w3.org/TR/html4/strict.dtd'>z<html><head>zE  <meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>z  <title>{}</title>z</head><body>z  <h1>{}</h1>z  <p>{}</p>z<hr/>z?<a href='https://github.com/mar10/wsgidav/'>WsgiDAV/{}</a> - {}zutf-8z</body></html>Ú
z	text/html)r7   r   Úto_bytesr-   Úget_http_status_stringr#   r   Úhtml_escaper:   r   ÚstrÚdatetimeÚnowÚjoin)r   ÚstatusÚhtmlr   r   r   Úget_response_pageà   s2    ÿ
ÿ

 ÿÿ

zDAVError.get_response_page)NNN)	r.   r/   r0   r1   r   r;   r   r:   rJ   r   r   r   r   r2   °   s        ÿ
r2   c                 C   s    t | dƒrt| jƒS t| ƒS dS )z/Return HTTP response code as integer, e.g. 204.r4   N)Úhasattrr3   r4   ©Úvr   r   r   Úget_http_status_code   s    

rN   c                 C   s6   t | ƒ}z
t| W S  tk
r0   d |¡ Y S X dS )z¶Return HTTP response string, e.g. 204 -> ('204 No Content').
    The return string always includes descriptive text, to satisfy Apache mod_dav.

    `v`: status code or DAVError
    z	{} StatusN)rN   r=   ÚKeyErrorr   )rM   Úcoder   r   r   rB     s
    
rB   c                 C   s   t | ƒ} |  ¡ S r   )Úas_DAVErrorrJ   rL   r   r   r   rJ     s    rJ   c                 C   s8   t | tƒr| S t | tƒr$tt| dS ttd | ¡ƒS dS )z:Convert any non-DAVError exception to HTTP_INTERNAL_ERROR.)r6   r<   N)Ú
isinstancer2   Ú	ExceptionÚHTTP_INTERNAL_ERRORr   )Úer   r   r   rQ     s
    

rQ   )Hr1   Úwsgidavr   r   r   Úwsgidav.xml_toolsr   rE   Ú__docformat__ZHTTP_CONTINUEZHTTP_SWITCHING_PROTOCOLSZHTTP_PROCESSINGÚHTTP_OKÚHTTP_CREATEDZHTTP_ACCEPTEDZHTTP_NON_AUTHORITATIVE_INFOÚHTTP_NO_CONTENTZHTTP_RESET_CONTENTZHTTP_PARTIAL_CONTENTZHTTP_MULTI_STATUSZHTTP_IM_USEDZHTTP_MULTIPLE_CHOICESZ
HTTP_MOVEDZ
HTTP_FOUNDZHTTP_SEE_OTHERÚHTTP_NOT_MODIFIEDZHTTP_USE_PROXYZHTTP_TEMP_REDIRECTÚHTTP_BAD_REQUESTZHTTP_PAYMENT_REQUIREDZHTTP_FORBIDDENZHTTP_NOT_FOUNDZHTTP_METHOD_NOT_ALLOWEDZHTTP_NOT_ACCEPTABLEZHTTP_PROXY_AUTH_REQUIREDZHTTP_REQUEST_TIMEOUTZHTTP_CONFLICTZ	HTTP_GONEZHTTP_LENGTH_REQUIREDÚHTTP_PRECONDITION_FAILEDZHTTP_REQUEST_ENTITY_TOO_LARGEZHTTP_REQUEST_URI_TOO_LONGZHTTP_MEDIATYPE_NOT_SUPPORTEDZHTTP_RANGE_NOT_SATISFIABLEZHTTP_EXPECTATION_FAILEDZHTTP_UNPROCESSABLE_ENTITYZHTTP_LOCKEDZHTTP_FAILED_DEPENDENCYZHTTP_UPGRADE_REQUIREDrT   ZHTTP_NOT_IMPLEMENTEDZHTTP_BAD_GATEWAYZHTTP_SERVICE_UNAVAILABLEZHTTP_GATEWAY_TIMEOUTZHTTP_VERSION_NOT_SUPPORTEDZHTTP_INSUFFICIENT_STORAGEZHTTP_NOT_EXTENDEDr=   r>   Z#PRECONDITION_CODE_ProtectedPropertyr"   Z#PRECONDITION_CODE_LockTokenMismatchr!   Z%PRECONDITION_CODE_PropfindFiniteDepthÚobjectr   rS   r2   rN   rB   rJ   rQ   r   r   r   r   Ú<module>   sÚ                    ï     û.P