
    iv                        d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZ ddlmZ e	rddlmZmZmZ ddlmZmZ d	Zd	Zd	Z	 ddlZd
Z	 ddlZd
Zn# e$ r Y nw xY w G d dej                  Zn# e$ r Y nw xY wes	 ddlZddlmZ ddlm Z  d
Zn# e$ r Y nw xY weses ed          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. ddl/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z>  ej?        d          Z@ejA        dk     rddlBmCZC nddlmCZC  G d d e>          ZD G d! d"e$          ZEd-d#eFd$e
d%eEfd&Z%	 	 	 d.d'e
dz  d(e
dz  d)eFd$e
d%eGd*         f
d+ZHd$e
d%ed*         fd,ZIdS )/z
Async-first DAVClient implementation for the caldav library.

This module provides the core async CalDAV/WebDAV client functionality.
For sync usage, see the davclient.py wrapper.
    N)Mapping)TracebackType)TYPE_CHECKINGAnyOptional)unquote)CalendarObjectResourceEventTodo)Calendar	PrincipalFTc                   (    e Zd ZdZdeddfdZd ZdS )_HttpxBearerAuthz#httpx-compatible bearer token auth.passwordreturnNc                     || _         d S N)r   )selfr   s     Q/root/projects/butler/venv/lib/python3.11/site-packages/caldav/async_davclient.py__init__z_HttpxBearerAuth.__init__)   s    $DMMM    c              #   6   K   d| j          |j        d<   |V  d S )NzBearer Authorization)r   headers)r   requests     r   	auth_flowz_HttpxBearerAuth.auth_flow,   s)      /H/H/HGOO,MMMMMr   )__name__
__module____qualname____doc__strr   r    r   r   r   r   &   sK        11	%S 	%T 	% 	% 	% 	%	 	 	 	 	r   r   )AsyncSession)CaseInsensitiveDictz}Either httpx or niquests library is required for async_davclient. Install with: pip install httpx  (or: pip install niquests))__version__)BaseDAVClient)get_davclient)
FeatureSet)error)to_wire)URL)CalendarQueryResultPropfindResult)_build_calendar_multiget_body_build_calendar_query_body_build_propfind_body_build_sync_collection_body)_parse_calendar_query_response_parse_propfind_response_parse_sync_collection_response)HTTPBearerAuth)BaseDAVResponsecaldav)      )Selfc                   p    e Zd ZU dZdZeeez           dz  ed<   dZ	e
dz  ed<   d
deded         ddfd	ZdS )AsyncDAVResponsea  
    Response from an async DAV request.

    This class handles the parsing of DAV responses, including XML parsing.
    End users typically won't interact with this class directly.

    Response parsing methods are inherited from BaseDAVResponse.

    New protocol-based attributes:
        results: Parsed results from protocol layer (List[PropfindResult], etc.)
        sync_token: Sync token from sync-collection response
    Nresults
sync_tokenresponse	davclientAsyncDAVClientr   c                 2    |                      ||           dS )z4Initialize from httpx.Response or niquests.Response.N)_init_from_response)r   r?   r@   s      r   r   zAsyncDAVResponse.__init__w   s      955555r   r   )r   r   r   r    r=   listr-   r,   __annotations__r>   r!   r   r   r   r"   r   r   r<   r<   e   s           BFGT.#667$>EEE!Jd
!!!6 6 6:J1K 6W[ 6 6 6 6 6 6r   r<   c            %          e Zd ZU dZdZedz  ed<   dZeed<   dZ	e
ed<   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dWdedz  dedz  d	edz  d
edz  dedz  dedz  dedz  de
ez  deeeef         z  dz  deeef         dz  de
deez  ez  dz  de
de
dee
         dee         dee         ddf$dZdXdZdefdZdedz  dedz  dedz  ddfdZdXdZe	 	 dYd ed!edz  d"eeef         dz  deeef         fd#            Z	 	 	 	 dZded ed&edeeef         dz  d'edefd(Z	 	 	 d[ded ed&edeeef         dz  def
d)Z 	 	 	 	 	 d\dedz  d&ed!edeeef         dz  d*e!e         dz  defd+Z"	 	 	 	 d]dedz  d&ed!edz  deeef         dz  def
d,Z#	 	 dYdedz  deeef         dz  defd-Z$	 	 d^ded&edeeef         dz  defd.Z%	 	 d^ded&edeeef         dz  defd/Z&	 	 d^ded&edeeef         dz  defd0Z'	 d_ded&edeeef         dz  defd1Z(	 d_ded&edeeef         dz  defd2Z)	 d_dedeeef         dz  defd3Z*	 	 	 	 	 	 	 	 	 d`dedz  d5edz  d6edz  d7e
d8e
d9e
d:e
d!edeeef         dz  defd;Z+	 	 	 	 dadedz  d<e!e         dz  d!edeeef         dz  def
d=Z,	 	 	 	 	 dbdedz  d>edz  d*e!e         dz  d!edeeef         dz  defd?Z-d_d@e!e         dz  ddfdAZ.dcdCZ/d_dDedB         de!dE         fdFZ0	 	 	 	 	 	 	 dddGdEd7e
d8e
d9e
d5edz  d6edz  dHe
dz  d:e
dIede!dJ         fdKZ1d_dLedz  de!dB         fdMZ2d_dLedz  de!dB         fdNZ3dcdOZ4dIeddEfdPZ5dedz  fdQZ6de
fdRZ7de
fdSZ8dedz  fdTZ9de
fdUZ:de
fdVZ;dS )erA   a  
    Async WebDAV/CalDAV client.

    This is the core async implementation. For sync usage, see DAVClient
    in davclient.py which provides a thin wrapper around this class.

    The recommended way to create a client is via get_davclient():
        async with await get_davclient(url="...", username="...", password="...") as client:
            principal = await client.get_principal()
    NproxyurlF	huge_tree Tusernamer   auth	auth_typetimeoutssl_verify_certssl_certr   featuresenable_rfc6764require_tlsrate_limit_handlerate_limit_default_sleeprate_limit_max_sleepr   c           	      f   |
pi }
ddl m}  ||          }t          |t                    r|| _        nt          |          | _        || _        d| _        || _        | j        d| j        vrd| j        z   | _        || _        |	| _	        || _
        	 | j                            d          ot          pt          | _        n# t          t          f$ r
 d| _        Y nw xY w|                                  ddlm}  ||| j        |pd	||||
          \  }}|r|s|}t'          j        |          | _        d}d}| j        j        rt/          | j        j                  }| j        j        rt/          | j        j                  }||n|| _        ||n|| _        | j                                        | _        || _        || _        | j        s"| j        r|                     | j        g           | j        | _        | j
        | _        | j        | _        | j	        | _         ddtB           i| _"        | j"        #                    |
           | j                            dtH                    }|4|r0|%                    d          rd}d|v r|d         }d|v r|d         }nd}|| _&        || _'        || _(        dS )a]  
        Initialize an async DAV client.

        Args:
            url: CalDAV server URL, domain, or email address.
            proxy: Proxy server (scheme://hostname:port).
            username: Username for authentication.
            password: Password for authentication.
            auth: Custom auth object (httpx.Auth or niquests AuthBase).
            auth_type: Auth type ('bearer', 'digest', or 'basic').
            timeout: Request timeout in seconds.
            ssl_verify_cert: SSL certificate verification (bool or CA bundle path).
            ssl_cert: Client SSL certificate (path or (cert, key) tuple).
            headers: Additional headers for all requests.
            huge_tree: Enable XMLParser huge_tree for large events (security consideration).
            features: FeatureSet for server compatibility workarounds.
            enable_rfc6764: Enable RFC6764 DNS-based service discovery.
            require_tls: Require TLS for discovered services (security consideration).
            rate_limit_handle: When True, automatically sleep and retry on 429/503
                responses. When None (default), auto-detected from server features.
                When False, raise RateLimitError immediately.
            rate_limit_default_sleep: Fallback sleep seconds when the server's 429
                response omits a Retry-After header. None (default) means raise
                rather than sleeping when no Retry-After is provided.
            rate_limit_max_sleep: Cap on sleep duration in seconds regardless of
                server's Retry-After value. None (default) means no cap.
        r   )resolve_featuresNz://zhttp://http.multiplexingF)	_auto_url
   )rN   rO   rR   rK   rS   z
User-Agentzcaldav-async/z
rate-limitenableTdefault_sleep	max_sleep))caldav.configrX   
isinstancer(   rQ   rI   _http2_proxy_ssl_verify_cert	_ssl_cert_timeoutis_supported_H2_AVAILABLE_USE_NIQUESTS	TypeErrorAttributeError_create_sessioncaldav.davclientrZ   r+   	objectifyrH   rK   r   r   unauthrL   rM   build_auth_objectrG   rN   rO   rP   r%   r   updatedictgetrT   rU   rV   )r   rH   rG   rK   r   rL   rM   rN   rO   rP   r   rI   rQ   rR   rS   rT   rU   rV   rX   rZ   url_strdiscovered_usernameurl_usernameurl_password
rate_limits                            r   r   zAsyncDAVClient.__init__   s0   ^ -R222222##H--h
++ 	1$DMM&x00DM" ;"uDK'?'?#dk1DK /!	 -445HII . KK >* 	  	  	 DKKK	  	/.....'0yMMr+)#(
 (
 (
$$  	+x 	+*H =)) 8 	6"48#455L8 	6"48#455L %-$8l$,$8l8??$$ 	"y 	5T^ 	5""DN#3444 [
 }#4 7+77(
 	G$$$]//dCC
$ *jnnX66 *$(!"j00/9//J,*,,+5k+B($)!!2(@%$8!!!s   -B? ?CCc                    t           rDt          j        | j        pd| j        | j        | j        nd| j        | j                  | _        dS 	 t          | j        pd          | _        dS # t          $ r t                      | _        Y dS w xY w)z?Create or recreate the async HTTP client with current settings.FNT)http2rG   verifycertrN   )multiplexed)
_USE_HTTPXhttpxAsyncClientra   rb   rc   rd   re   sessionr#   ri   r   s    r   rk   zAsyncDAVClient._create_session!  s     	. ,k*Uk040E0Qt,,W[^  DLLL.+8LuMMM . . .+~~.s   A+ +BBc                 
   K   | S )zAsync context manager entry.r"   r   s    r   
__aenter__zAsyncDAVClient.__aenter__2  s      r   exc_typeexc_valexc_tbc                 >   K   |                                   d{V  dS )zAsync context manager exit.N)close)r   r   r   r   s       r   	__aexit__zAsyncDAVClient.__aexit__6  s.       jjllr   c                    K   t          | d          rIt          r!| j                                         d{V  dS | j                                         d{V  dS dS )zClose the async client.r   N)hasattrr}   r   acloser   r   s    r   r   zAsyncDAVClient.close?  s      4## 	+ +l))+++++++++++l((***********		+ 	+r   methoddepthextra_headersc                 r    i }|t          |          |d<   | dv rd|d<   |r|                    |           |S )a  
        Build headers for WebDAV methods.

        Args:
            method: HTTP method name.
            depth: Depth header value (for PROPFIND/REPORT).
            extra_headers: Additional headers to merge.

        Returns:
            Dictionary of headers.
        NDepth)REPORTPROPFIND	PROPPATCH
MKCALENDARMKCOLz application/xml; charset="utf-8"Content-Type)r!   rp   )r   r   r   r   s       r   _build_method_headersz$AsyncDAVClient._build_method_headersG  sZ    " #% "5zzGG OOO&HGN#  	*NN=)))r   GETr   bodyrate_limit_time_sleptc           	        K   	 |                      ||||           d{V S # t          j        $ r}| j        s t          j        |j        | j        | j                  }|r||dz  z  }|| j        || j        k    r t          j	        |           d{V  | 
                    ||||||z              d{V cY d}~S d}~ww xY w)a  
        Send an async HTTP request, with optional rate-limit sleep-and-retry.

        Catches RateLimitError from _async_request. When rate_limit_handle is
        True and a usable sleep duration is available, sleeps then retries with
        adaptive backoff (each retry adds half the already-slept time). Stops
        retrying when rate_limit_max_sleep is exceeded or no sleep duration is
        available. Otherwise re-raises immediately.
        N   )_async_requestr)   RateLimitErrorrT   compute_sleep_secondsretry_after_secondsrU   rV   asynciosleepr   )r   rH   r   r   r   r   esleep_secondss           r   r   zAsyncDAVClient.requesth  sE     "	,,S&$HHHHHHHHH# 	 	 	) !7%-) M
 % ;!6!::$)5)D,EEE-.........VT7,AM,Q             !	s   " CBB>8C>Cc           
      	  K   |                      ||||          \  }}t          r2|t          |          |rt          |          nd|| j        | j        d}nUd}| j        |j        | j        i}|t          |          |rt          |          nd|| j        | j        || j        | j	        d	}	  | j
        j        di | d{V }	t          r|	j        n|	j        }
t                              d|	j         d|
            |	j        dk    rd| j                            dd	          v r| j        sd
}|	j                            d          rWd |                     |	j        d                   D             }|r+|d                    d                    |                    z  }t                              |           t/          |	|           }n~# t0          $ rp | j        s| j        s t          r7| j
                            dt          |          || j                   d{V }	nZd}| j        |j        | j        i}| j
                            dt          |          || j        || j        | j	                   d{V }	t          r|	j        n|	j        }
t                              d|	j         d|
            |	j        dk    rq|	j                            d          rW|                     |	j        d                   }|                     |           | j        |d<    | j
        j        di | d{V }	t/          |	|           }Y nw xY wt7          j        |	j        t          |          |	j                            d                     |                     |	j        |	j                  r>|                     |	j        d                    |                     ||||           d{V S |	j        dk    rd|	j        v r| j        r| j         !                    dd          {| "                                 d{V  d| _#        | $                                 | j         %                    dd           |                     t          |          |||           d{V S |j&        dv r#| '                    t          |          |           |S )z
        Async HTTP request implementation with auth negotiation.

        Handles connection-abort workaround, 429/503 rate-limit detection,
        and 401 auth negotiation (including HTTP/2 fallback).
        N)r   rH   contentr   rL   rN   )	r   rH   datar   rL   rN   proxiesrz   r{   zserver responded with    z	text/htmlr   rJ   zNo authentication object was provided. HTML was returned when probing the server for supported authentication types. To avoid logging errors, consider passing the auth_type connection parameterzWWW-Authenticatec                     g | ]}|d v |	S ))basicdigestbearerr"   ).0ts     r   
<listcomp>z1AsyncDAVClient._async_request.<locals>.<listcomp>  s.     " " " === ===r   z#
Supported authentication types: {}z, r   )r   rH   r   rN   )r   rH   r   rN   r   rz   r{   z+auth type detection: server responded with rL   zRetry-AfterrY   F)return_defaults)r   i  r"   )(_prepare_requestr}   r!   r*   rL   rN   rG   schemerO   rP   r   r   reason_phrasereasonlogdebugstatus_coder   rr   extract_auth_typesformatjoinwarningr<   	Exceptionr   ro   r)   raise_if_rate_limited_should_negotiate_auth_build_auth_from_401r   rQ   rf   r   ra   rk   set_featurestatus_raise_authorization_error)r   rH   r   r   r   url_objcombined_headersrequest_kwargsr   rr   msg
auth_typesr?   s                 r   r   zAsyncDAVClient._async_request  s~      %)$9$9#vtW$U$U!!  	 7||,0:74===d+	<. .NN Gz%">4:6 7||)-74+	<".
. 
.N:	1*dl*<<^<<<<<<<<A(2@Q__FIIGq}GGvGGHHH$$4<#3#3NB#G#GGG	 Hc 
 9==!344 d" "!%!8!8CU9V!W!W" " "J
 " dELLTYYWaMbMbcccC   '400HH "	1 "	1 "	1 y   ,.. G, L	 /         :)&~tz:G,.. G, L#/ /         )3@Q__FII\AM\\TZ\\]]]}##	6H(I(I#!44QY?Q5RSS
&&z222)-v&.$,.@@@@@@@@@@'400HHHE"	1J 	#AM3w<<}A]A]^^^ &&q}ai@@ 	R%%ai0B&CDDD,,S&$HHHHHHHHH MS  "ai//	 0**+>PU*VV^ **,,DK  """M%%&95AAA,,S\\64QQQQQQQQQ ?j((++CLL(CCCs   -DG E8MMpropsc                   K   |$|s"t          |                              d          }|                     d||          }|                     |pt	          | j                  d||           d{V }|j        dv rb|j        r[t          |j        t                    r|j        n|j        
                    d          }t          ||j        |j                  |_        |S )a  
        Send a PROPFIND request.

        Args:
            url: Target URL (defaults to self.url).
            body: XML properties request (legacy, use props instead).
            depth: Maximum recursion depth.
            headers: Additional headers.
            props: List of property names to request (uses protocol layer).

        Returns:
            AsyncDAVResponse with results attribute containing parsed PropfindResult list.
        Nutf-8r         )r0   decoder   r   r!   rH   r   _rawr`   bytesencoder3   rI   r=   )	r   rH   r   r   r   r   final_headersr?   	raw_bytess	            r   propfindzAsyncDAVClient.propfind  s      , T'..55g>>D22:ugNNc&:S]]Jm\\\\\\\\ ?j((X](!+HM5!A!Adx}G[G[\cGdGd   88?H,>   H r   c                    K   |                      d||          }|                     |pt          | j                  d||           d{V S )a  
        Send a REPORT request.

        Args:
            url: Target URL (defaults to self.url).
            body: XML report request.
            depth: Maximum recursion depth. None means don't send Depth header
                (required for calendar-multiget per RFC 4791 section 7.9).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        r   N)r   r   r!   rH   )r   rH   r   r   r   r   s         r   reportzAsyncDAVClient.report<  sV      ( 228UGLL\\#"6TX$VVVVVVVVVr   c                 j   K   |                      |pt          | j                  dd|           d{V S )z
        Send an OPTIONS request.

        Args:
            url: Target URL (defaults to self.url).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        OPTIONSrJ   N)r   r!   rH   r   rH   r   s      r   optionszAsyncDAVClient.optionsS  s?       \\#"6TX	2wOOOOOOOOOr   c                 p   K   |                      d|          }|                     |d||           d{V S )z
        Send a PROPPATCH request.

        Args:
            url: Target URL (required).
            body: XML property update request.
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        r   r   Nr   r   r   rH   r   r   r   s        r   	proppatchzAsyncDAVClient.proppatchf  sJ      " 22;g2VV\\#{D-HHHHHHHHHr   c                 p   K   |                      d|          }|                     |d||           d{V S )a5  
        Send a MKCOL request.

        MKCOL creates a WebDAV collection. For CalDAV, use mkcalendar instead.

        Args:
            url: Target URL (required).
            body: XML request (usually empty).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        r   r   Nr   r   s        r   mkcolzAsyncDAVClient.mkcolz  sJ      & 227'2RR\\#wmDDDDDDDDDr   c                 p   K   |                      d|          }|                     |d||           d{V S )a  
        Send a MKCALENDAR request.

        Args:
            url: Target URL (required).
            body: XML request (usually contains calendar properties).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        r   r   Nr   r   s        r   
mkcalendarzAsyncDAVClient.mkcalendar  sJ      " 22<w2WW\\#|T=IIIIIIIIIr   c                 B   K   |                      |d||           d{V S )z
        Send a PUT request.

        Args:
            url: Target URL (required).
            body: Request body (e.g., iCalendar data).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        PUTNr   r   rH   r   r   s       r   putzAsyncDAVClient.put  s2      " \\#udG<<<<<<<<<r   c                 B   K   |                      |d||           d{V S )z
        Send a POST request.

        Args:
            url: Target URL (required).
            body: Request body.
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        POSTNr   r   s       r   postzAsyncDAVClient.post  s2      " \\#vtW=========r   c                 B   K   |                      |dd|           d{V S )z
        Send a DELETE request.

        Args:
            url: Target URL (required).
            headers: Additional headers.

        Returns:
            AsyncDAVResponse
        DELETErJ   Nr   r   s      r   deletezAsyncDAVClient.delete  s2       \\#xW=========r      startendeventtodojournalexpandc
                   K   t          ||||||          \  }
}|                     d||	          }|                     |pt          | j                  d|
                    d          |           d{V }|j        dv rb|j        r[t          |j        t                    r|j        n|j        
                    d          }t          ||j        |j                  |_        |S )aW  
        Execute a calendar-query REPORT to search for calendar objects.

        Args:
            url: Target calendar URL (defaults to self.url).
            start: Start of time range filter.
            end: End of time range filter.
            event: Include events (VEVENT).
            todo: Include todos (VTODO).
            journal: Include journals (VJOURNAL).
            expand: Expand recurring events.
            depth: Search depth.
            headers: Additional headers.

        Returns:
            AsyncDAVResponse with results containing List[CalendarQueryResult].
        )r   r   r   r   r   r   r   r   Nr   )r/   r   r   r!   rH   r   r   r   r`   r   r   r2   rI   r=   )r   rH   r   r   r   r   r   r   r   r   r   _r   r?   r   s                  r   calendar_queryzAsyncDAVClient.calendar_query  s     < -
 
 
a 228UGLL 3tx==(DKK,@,@-
 
 
 
 
 
 
 

 ?j((X](!+HM5!A!Adx}G[G[\cGdGd   >8?H,>   H r   hrefsc                   K   t          |pg           }|                     d||          }|                     |pt          | j                  d|                    d          |           d{V }|j        dv rb|j        r[t          |j        t                    r|j        n|j        
                    d          }t          ||j        |j                  |_        |S )a  
        Execute a calendar-multiget REPORT to fetch specific calendar objects.

        Args:
            url: Target calendar URL (defaults to self.url).
            hrefs: List of object URLs to retrieve.
            depth: Search depth.
            headers: Additional headers.

        Returns:
            AsyncDAVResponse with results containing List[CalendarQueryResult].
        r   r   Nr   )r.   r   r   r!   rH   r   r   r   r`   r   r   r2   rI   r=   )	r   rH   r   r   r   r   r   r?   r   s	            r   calendar_multigetz AsyncDAVClient.calendar_multiget  s      & -U[b99228UGLL 3tx==(DKK,@,@-
 
 
 
 
 
 
 

 ?j((X](!+HM5!A!Adx}G[G[\cGdGd   >8?H,>   H r   r>   c                   K   t          ||          }|                     d||          }|                     |pt          | j                  d|                    d          |           d{V }|j        dv ru|j        rnt          |j        t                    r|j        n|j        
                    d          }	t          |	|j        |j                  }
|
j        |_        |
j        |_        |S )a  
        Execute a sync-collection REPORT for efficient synchronization.

        Args:
            url: Target calendar URL (defaults to self.url).
            sync_token: Previous sync token (None for initial sync).
            props: Properties to include in response.
            depth: Search depth.
            headers: Additional headers.

        Returns:
            AsyncDAVResponse with results containing SyncCollectionResult.
        )r>   r   r   r   Nr   )r1   r   r   r!   rH   r   r   r   r`   r   r   r4   rI   changedr=   r>   )r   rH   r>   r   r   r   r   r   r?   r   sync_results              r   sync_collectionzAsyncDAVClient.sync_collection:  s     * +jNNN228UGLL 3tx==(DKK,@,@-
 
 
 
 
 
 
 

 ?j((X](!+HM5!A!Adx}G[G[\cGdGd  :8?H,> K  +2H"-"8Hr   r   c                 @   |                      |          }|dk    r=t          rt          | j                  | _        dS t          | j                  | _        dS |dk    rPt          r&t          j        | j        | j                  | _        dS ddl	m
}  || j        | j                  | _        dS |dk    rPt          r&t          j        | j        | j                  | _        dS ddl	m}  || j        | j                  | _        dS |rt          j        d|           dS )	a!  Build authentication object for the httpx/niquests library.

        Uses shared auth type selection logic from BaseDAVClient, then
        creates the appropriate auth object for this HTTP library.

        Args:
            auth_types: List of acceptable auth types from server.
        r   r   r   )HTTPDigestAuthr   )HTTPBasicAuthzUnsupported auth type: N)_select_auth_typer}   r   r   rL   r5   r~   
DigestAuthrK   niquests.authr  	BasicAuthr  r)   AuthorizationError)r   r   rM   r  r  s        r   ro   z AsyncDAVClient.build_auth_objecte  s>    **:66	    :,T];;			*4=99			("" I!,T]DMJJ			888888*N4=$-HH			'!! H!ODM4=II			777777)M$-GG			 	R*+PY+P+PQQQ	R 	Rr   r   c                 $  K   ddl m} |                     t          | j                  dgd           d{V }d}|j        r*|j        D ]"}|j                            d          }|r|} n#|st          | j                  } || |          }|S )a  Get the principal (user) for this CalDAV connection.

        This method fetches the current-user-principal from the server and returns
        a Principal object that can be used to access calendars and other resources.

        Returns:
            Principal object for the authenticated user.

        Example:
            async with await get_davclient(url="...", username="...", password="...") as client:
                principal = await client.get_principal()
                calendars = await client.get_calendars(principal)
        r   )r   z{DAV:}current-user-principalr   r   N)clientrH   )caldav.collectionr   r   r!   rH   r=   
propertiesrr   )r   r   r?   principal_urlresultcup	principals          r   get_principalzAsyncDAVClient.get_principal  s       	0/////
 MM12 ' 
 
 
 
 
 
 
 
  	"*  '++,JKK $'ME  	*MMM IT}===	r   r  r   c                    K   ddl m ddlm} ddlm} |                                  d{V }                     t          |j	                   j
        d           d{V } ||j                  }|sg S                      |          }                     | j        d           d{V } ||j                  } fd|D             S )	a'  Get all calendars for the given principal.

        This method fetches calendars from the principal's calendar-home-set
        and returns a list of Calendar objects.

        Args:
            principal: Principal object (if None, fetches principal first)

        Returns:
            List of Calendar objects.

        Example:
            principal = await client.get_principal()
            calendars = await client.get_calendars(principal)
            for cal in calendars:
                print(f"Calendar: {cal.get_display_name()}")
        r   r   )(_extract_calendars_from_propfind_results)'_extract_calendar_home_set_from_resultsNr  r   c                 L    g | ] } |j         |j        |j                   !S ))r  rH   nameid)rH   r  cal_id)r   infor   r   s     r   r   z0AsyncDAVClient.get_calendars.<locals>.<listcomp>  sB     
 
 
 HDdhTY4;OOO
 
 
r   )r  r   !caldav.operations.calendarset_opsr  caldav.operations.principal_opsr  r  r   r!   rH   CALENDAR_HOME_SET_PROPSr=   _make_absolute_urlCALENDAR_LIST_PROPS)r   r  extract_calendarsextract_home_setr?   calendar_home_urlcalendar_infosr   s   `      @r   get_calendarszAsyncDAVClient.get_calendars  s     $ 	/.....	
 	
 	
 	
 	
 	
	
 	
 	
 	
 	
 	
 "0022222222I 	. ' 
 
 
 
 
 
 
 

 -,X-=>>  	I !334EFF * ' 
 
 
 
 
 
 
 
 +*8+;<<
 
 
 
 
&
 
 
 	
r   calendarinclude_completedkwargsr	   c	                 r   K   ddl m}
  |
||||||          }|||_         |j        |fi |	 d{V }|S )a  Search a calendar for events, todos, or journals.

        This method provides a clean interface to calendar search using the
        operations layer for building queries and processing results.

        Args:
            calendar: Calendar to search
            event: Search for events (VEVENT)
            todo: Search for todos (VTODO)
            journal: Search for journals (VJOURNAL)
            start: Start of date range
            end: End of date range
            include_completed: Include completed todos (default: False for todos)
            expand: Expand recurring events
            **kwargs: Additional search parameters

        Returns:
            List of Event/Todo/Journal objects.

        Example:
            # Get all events in January 2024
            events = await client.search_calendar(
                calendar,
                event=True,
                start=datetime(2024, 1, 1),
                end=datetime(2024, 1, 31),
            )

            # Get pending todos
            todos = await client.search_calendar(
                calendar,
                todo=True,
                include_completed=False,
            )
        r   )CalDAVSearcher)r   r   r   r   r   r   N)caldav.searchr-  r*  async_search)r   r)  r   r   r   r   r   r*  r   r+  r-  searcherr=   s                r   search_calendarzAsyncDAVClient.search_calendar  s      ^ 	100000 ">
 
 
 ():H& .-hAA&AAAAAAAAr   r  c                 F  K   |                      |          }|                     t          | j                  |           d{V }|j        dk    r+t          j        |j         d|j         d|j                   | 	                    |
                                          S )a=  
        Search for principals on the server.

        Instead of returning the current logged-in principal, this method
        attempts to query for all principals (or principals matching a name).
        This may or may not work depending on the permissions and
        implementation of the calendar server.

        Args:
            name: Optional name filter to search for specific principals

        Returns:
            List of Principal objects found on the server

        Raises:
            ReportError: If the server doesn't support principal search
        Ni,  r   z - )_build_principal_search_queryr   r!   rH   r   r)   ReportErrorr   raw _parse_principal_search_response_find_objects_and_props)r   r  r   r?   s       r   search_principalsz AsyncDAVClient.search_principals0  s      $ 11$77S]]D99999999?c!!#x$[$[$[$[X\$[$[\\\44X5U5U5W5WXXXr   c                    K   ddl }|                    dt          d           |                     |           d{V S )z
        Deprecated. Use :meth:`search_principals` instead.

        This method searches for principals on the server.
        r   Nz;principals() is deprecated, use search_principals() insteadr   )
stacklevelr  )warningswarnDeprecationWarningr8  )r   r  r<  s      r   
principalszAsyncDAVClient.principalsH  s`       	I 	 	
 	
 	

 +++666666666r   c                 :   K   |                                   d{V S )z
        Legacy method. Use :meth:`get_principal` for new code.

        Returns the Principal object for the authenticated user.
        N)r  r   s    r   r  zAsyncDAVClient.principalW  s,       '')))))))))r   c                 "    ddl m}  |dd| i|S )aL  Returns a calendar object.

        Typically, a URL should be given as a named parameter (url)

        No network traffic will be initiated by this method.

        If you don't know the URL of the calendar, use
        ``await client.get_principal().get_calendars()`` instead, or
        ``await client.get_calendars()``
        r   r  r  r"   )r  r   )r   r+  r   s      r   r)  zAsyncDAVClient.calendar_  s1     	/.....x..t.v...r   c                    K   |                      t          | j                             d{V }|j                            d          S )z
        Check if the server supports DAV.

        Returns the DAV header from an OPTIONS request, or None if not supported.
        NDAV)r   r!   rH   r   rr   )r   r?   s     r   check_dav_supportz AsyncDAVClient.check_dav_supportn  sJ       c$(mm44444444##E***r   c                 J   K   |                                   d{V }|duod|v S )z
        Check if the server supports CalDAV.

        Returns True if the server indicates CalDAV support in DAV header.
        Nzcalendar-accessrD  r   
dav_headers     r   check_cdav_supportz!AsyncDAVClient.check_cdav_supportw  sA        1133333333
%I*;z*IIr   c                 J   K   |                                   d{V }|duod|v S )z
        Check if the server supports RFC6638 scheduling.

        Returns True if the server indicates scheduling support in DAV header.
        Nzcalendar-auto-schedulerF  rG  s     r   check_scheduling_supportz'AsyncDAVClient.check_scheduling_support  sA        1133333333
%P*Bj*PPr   c                 :   K   |                                   d{V S )zl
        Check if the server supports DAV.

        This is an alias for :meth:`check_dav_support`.
        NrF  r   s    r   supports_davzAsyncDAVClient.supports_dav  s,       ++---------r   c                 :   K   |                                   d{V S )zp
        Check if the server supports CalDAV.

        This is an alias for :meth:`check_cdav_support`.
        N)rI  r   s    r   supports_caldavzAsyncDAVClient.supports_caldav  s,       ,,.........r   c                 :   K   |                                   d{V S )z
        Check if the server supports RFC6638 scheduling.

        This is an alias for :meth:`check_scheduling_support`.
        N)rK  r   s    r   supports_schedulingz"AsyncDAVClient.supports_scheduling  s,       22444444444r   )rJ   NNNNNNTNNFNTTNNN)r   N)NN)r   rJ   Nr   )r   rJ   N)NrJ   r   NN)NrJ   r   N)rJ   Nr   )	NNNFFFFr   N)NNr   N)NNNr   N)r   r   )FFFNNNF)<r   r   r   r    rG   r!   rE   rH   r+   rI   boolr   inttupler   r(   rq   r   r   rk   r:   r   typeBaseExceptionr   r   r   staticmethodr   floatr<   r   r   rD   r   r   r   r   r   r   r   r   r   r   r   r  ro   r  r(  r1  r8  r?  r  r)  rD  rI  rK  rM  rO  rQ  r"   r   r   rA   rA   ~   s        	 	 E3:COOOIt  ## $"&*15,037# ,026.2%Q9 Q94ZQ9 TzQ9 *	Q9
 *Q9 DjQ9 :Q9 tQ9 Q9 c3h'$.Q9 c"T)Q9 Q9 t#c)D0Q9 Q9 Q9  $D>!Q9" #+3-#Q9$ 'sm%Q9& 
'Q9 Q9 Q9 Q9f. . . ."$    + % $	
 
   + + + +  !26 Tz sCx(4/ 
c3h	   \F ,0'(% %% % 	%
 c"T)%  %% 
% % % %T ,0A AA A 	A
 c"T)A 
A A A AP ,0"&% %4Z% % 	%
 c"T)% Cy4% 
% % % %R ,0W W4ZW W Tz	W
 c"T)W 
W W W W2 ,0P P4ZP c"T)P 
	P P P P, ,0	I II I c"T)	I
 
I I I I. ,0	E EE E c"T)	E
 
E E E E2 ,0	J JJ J c"T)	J
 
J J J J0 -1	= == = c"T)	=
 
= = = =. -1	> >> > c"T)	>
 
> > > >, -1> >> c"T)> 
	> > > >,  ,05 54Z5 Tz5 4Z	5
 5 5 5 5 5 c"T)5 
5 5 5 5r "&,0# #4Z# Cy4# 	#
 c"T)# 
# # # #N !%"&,0' '4Z' $J' Cy4	'
 ' c"T)' 
' ' ' 'V!R !RDI,< !R !R !R !R !RL' ' ' 'R8
 8
Xk-B 8
dS]N^ 8
 8
 8
 8
z  )-@ @@ @ 	@
 @ Tz@ 4Z@  $;@ @ @ 
&	'@ @ @ @DY YC$J Y${BS Y Y Y Y07 7S4Z 74;L 7 7 7 7* * * */ / / / / /+t + + + +J$ J J J JQ Q Q Q Q.C$J . . . ./t / / / /54 5 5 5 5 5 5r   rA   prober+  r   c                   K   t          t          fi |}|t          d          | r	 |                                 d{V }t                              d|j                    |j                            dd          }|st          	                    d           nt          
                    d|            nL# t          $ r?}|                                 d{V  t          j        d|j         d	|           |d}~ww xY w|S )
aB  
    Get an async DAV client instance with configuration from multiple sources.

    See :func:`caldav.base_client.get_davclient` for full documentation.

    Args:
        probe: Verify connectivity with OPTIONS request (default: True).
        **kwargs: All other arguments passed to base get_davclient.

    Returns:
        AsyncDAVClient instance.

    Raises:
        ValueError: If no configuration is found.

    Example::

        async with await get_davclient(url="...", username="...", password="...") as client:
            principal = await client.principal()
    NztNo configuration found. Provide connection parameters, set CALDAV_URL environment variable, or create a config file.zConnected to CalDAV server: rC  rJ   z:Server did not return DAV header - may not be a DAV serverzServer DAV capabilities: z&Failed to connect to CalDAV server at : )_base_get_davclientrA   
ValueErrorr   r   r  rH   r   rr   r   r   r   r   r)   DAVError)rY  r+  r  r?   rH  r   s         r   r'   r'     sO     * !::6::F~L
 
 	
  d	d#^^--------HHH@FJ@@AAA ")--eR88J DXYYYY		BjBBCCC 	d 	d 	d,,..       .![&*![![XY![![\\bcc	d Ms   BB; ;
D:C??Dcalendar_urlcalendar_nameraise_errorsr   c                 N  K   ddl m} fd}	 t          dddi| d{V }n9# t          $ r,}r t                              d|            g cY d}~S d}~ww xY w	 |                                 d{V }|s |dd           g S g }	 ||           }
 ||          }|
D ]}d	t          |          v r|                    |
          }n|                    |          }	 |	                                 d{V }||	
                    |           s# t          $ r-}t                              d| d|            r Y d}~d}~ww xY w|D ]p}	 |                    |           d{V }|r|	
                    |           7# t          $ r-}t                              d| d|            r Y d}~id}~ww xY w|	s[|
sY|sW	 |                                 d{V }|r|}	n7# t          $ r*}t                              d|            r Y d}~nd}~ww xY w|	S # w xY w)a  
    Get calendars from a CalDAV server asynchronously.

    This is the async version of :func:`caldav.get_calendars`.

    Args:
        calendar_url: URL(s) or ID(s) of specific calendars to fetch.
        calendar_name: Name(s) of specific calendars to fetch by display name.
        raise_errors: If True, raise exceptions on errors; if False, log and skip.
        **kwargs: Connection parameters (url, username, password, etc.)

    Returns:
        List of Calendar objects matching the criteria.

    Example::

        from caldav.async_davclient import get_calendars

        calendars = await get_calendars(url="...", username="...", password="...")
    r   )_normalize_to_listc                 h    | .t                               d|            rt          |          | S )z)Handle errors based on raise_errors flag.Nz(Problems fetching calendar information: )r   r)   r]  )coro_resulterrmsgra  s     r   _tryzget_calendars.<locals>._try  s@    IIIIIJJJ ) (((r   rY  TNzFailed to create async client: zgetting principal/)cal_url)r  zProblems fetching calendar r[  r;  z$Problems fetching calendar by name 'z': z!Problems fetching all calendars: r"   )caldav.base_clientrc  r'   r   r   r)   r  r!   r)  get_display_nameappendr(  )r_  r`  ra  r+  rc  rg  r  r   r  	calendarscalendar_urlscalendar_namesri  r)  display_namecal_nameall_calss     `              r   r(  r(    s     4 655555    $::4:6::::::::    			7A77888							4 ..00000000	 	D*+++` 	] 	**<88++M:: % 	 	Gc'll""$--g->>$--W-==%-%>%>%@%@@@@@@@+$$X...   		FFF1FFGGG      ' 	 	H!*!3!3!3!B!BBBBBBB /$$X...   		QQQaQQRRR       	 	~ 	!*!8!8!:!::::::: ) (I   		AaAABBB     
  	s   % 
A!AAA)H" 	AH" $1DH" 
E #EH" EH" 3F	H" 	
G #F;6H" ;G  	H" 
G) (H" )
H3 HH" HH" "H$c                  B   K   t          di |  d{V }|r|d         ndS )a  
    Get a single calendar from a CalDAV server asynchronously.

    This is a convenience function for the common case where only one
    calendar is needed. It returns the first matching calendar or None.

    Args:
        Same as :func:`get_calendars`.

    Returns:
        A single Calendar object, or None if no calendars found.

    Example::

        from caldav.async_davclient import get_calendar

        calendar = await get_calendar(calendar_name="Work", url="...", ...)
    Nr   r"   )r(  )r+  rm  s     r   get_calendarrt  9  s@      & $--f--------I$.9Q<<$.r   )T)NNF)Jr    r   loggingsyscollections.abcr   typesr   typingr   r   r   urllib.parser   caldav.calendarobjectresourcer	   r
   r   r  r   r   r}   rh   rg   r~   h2ImportErrorAuthr   niquestsr#   niquests.structuresr$   r7   r%   rj  r&   r'   r\  caldav.compatibility_hintsr(   
caldav.libr)   caldav.lib.python_utilitiesr*   caldav.lib.urlr+   caldav.protocol.typesr,   r-   caldav.protocol.xml_buildersr.   r/   r0   r1   caldav.protocol.xml_parsersr2   r3   r4   caldav.requestsr5   caldav.responser6   	getLoggerr   version_infotyping_extensionsr:   r<   rA   rR  rD   r(  rt  r"   r   r   <module>r     s      



 # # # # # #       / / / / / / / / / /             6QQQQQQQQQQ55555555 
	LLLJ			       5:      	 	 	D	  ))))));;;;;;     - 
+	F         , , , , , , C C C C C C 1 1 1 1 1 1       / / / / / /                                 
 + * * * * * + + + + + +g!!g&&&&&&&6 6 6 6 6 6 6 62a5 a5 a5 a5 a5] a5 a5 a5N!. .t .c .n . . . .d  $ $` `*`:` ` 	`
 
*` ` ` `F/ /*)= / / / / / /sH   A3 A A3 AA3 AA3 3A;:A;B BB