
    i                        d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 	 ddl
Zddl
mZ n# e$ r	 ddlZdZY nw xY wddlmZ ddlmZmZ e G d	 d
                      ZddZdddZdddZdS )u   
JMAP session establishment (RFC 8620 §2).

Fetches the Session object from /.well-known/jmap and extracts the
information needed to make subsequent API calls.
    )annotations)	dataclassfield)urljoinurlparse
urlunparseN)AsyncSession)CALENDAR_CAPABILITY)JMAPAuthErrorJMAPCapabilityErrorc                      e Zd ZU dZded<   ded<   ded<    ee          Zded<    ee          Zded	<    ee          Z	ded
<   dS )Sessionu7  Parsed JMAP Session object (RFC 8620 §2).

    Attributes:
        api_url: URL to POST method calls to.
        account_id: The accountId to use for calendar method calls.
            Chosen from ``primaryAccounts`` if available, otherwise the first
            account advertising the calendars capability.
        state: Current session state string.
        account_capabilities: Capabilities dict for the chosen account.
        server_capabilities: Server-level capabilities dict.
        raw: The full parsed Session JSON for anything not captured above.
    strapi_url
account_idstate)default_factorydictaccount_capabilitiesserver_capabilitiesrawN)
__name__
__module____qualname____doc____annotations__r   r   r   r   r        N/root/projects/butler/venv/lib/python3.11/site-packages/caldav/jmap/session.pyr   r      s           LLLOOOJJJ!&t!<!<!<<<<< %d ; ; ;;;;;d+++C++++++r   r   urlr   datar   returnc           
        |                     d          }|st          | d          t          | |          }t          |           }t          |          }|j        |j        k    r8|j        |j        k    r(t          |                    |j                            }|                     dd          }|                     di           }|                     di           }d }i }	|                     d	i                                t                    }
|
r9|                     |
i           }|                     d
i           }t          |v r|
}|}	|?|
                                D ]*\  }}|                     d
i           }t          |v r|}|}	 n+|;t          | dt          dt          |                                                     t          ||||	||          S )NapiUrlz!Session response missing 'apiUrl'r    reason)netlocr    capabilitiesaccountsprimaryAccountsaccountCapabilitiesz!No account found with capability z. Available accounts: )r   r   r   r   r   r   )getr   r   r   hostnameportr   _replacer'   r
   itemslistkeysr   )r    r!   r   session_parsed
api_parsedr   r   r*   r   r   primary_acct_id	acct_datacapsacct_ids                 r   _parse_session_datar:   0   s%   hhx  G 
!6
 
 
 	
 c7##G c]]N'""Jn555*/^M`:`:`Z008M0NNOOHHWb!!E((>266xx
B''HJ!#hh0"5599:MNNO (LL"55	}}2B77$&&(J#' "*.."2"2 	 	GY==!6;;D"d**$
'+$ +
 !?4G ? ?'+HMMOO'<'<? ?
 
 
 	
 1/   r      timeoutintc                    t          j        | |ddi|          }|j        dv rt          | d|j         d          |                                 t          | |                                          S )a  Fetch and parse the JMAP Session object.

    Performs a GET request to ``url`` (expected to be ``/.well-known/jmap``
    or equivalent), authenticates with ``auth``, and returns a parsed
    :class:`Session`.

    Args:
        url: Full URL to the JMAP session endpoint.
        auth: A requests-compatible auth object (e.g. HTTPBasicAuth,
              HTTPBearerAuth).

    Returns:
        Parsed :class:`Session` with ``api_url`` and ``account_id`` set.

    Raises:
        JMAPAuthError: If the server returns HTTP 401 or 403.
        JMAPCapabilityError: If no account advertises the calendars capability.
        requests.HTTPError: For other non-2xx responses.
    Acceptapplication/jsonauthheadersr<   i  i  HTTP  from session endpointr%   )requestsr-   status_coder   raise_for_statusr:   json)r    rB   r<   responses       r   fetch_sessionrL   m   s}    ( |CdX?Q4R\cdddHz)),`H4H,`,`,`aaaasHMMOO444r   c                j  K   t                      4 d{V }|                    | |ddi|           d{V }ddd          d{V  n# 1 d{V swxY w Y   |j        dv rt          | d|j         d          |                                 t          | |                                          S )	a  Async variant of :func:`fetch_session` using niquests.AsyncSession.

    Args:
        url: Full URL to the JMAP session endpoint.
        auth: A niquests-compatible auth object.

    Returns:
        Parsed :class:`Session` with ``api_url`` and ``account_id`` set.

    Raises:
        JMAPAuthError: If the server returns HTTP 401 or 403.
        JMAPCapabilityError: If no account advertises the calendars capability.
    Nr?   r@   rA   rD   rE   rF   r%   )r	   r-   rH   r   rI   r:   rJ   )r    rB   r<   sessionrK   s        r   async_fetch_sessionrO      s_      ~~ 
 
 
 
 
 
 
 dX/A$BG % 
 
 
 
 
 
 
 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 z)),`H4H,`,`,`aaaasHMMOO444s   "A
AA)r    r   r!   r   r"   r   )r;   )r    r   r<   r=   r"   r   )r   
__future__r   dataclassesr   r   urllib.parser   r   r   niquestsrG   r	   ImportErrorcaldav.jmap.constantsr
   caldav.jmap.errorr   r   r   r:   rL   rO   r   r   r   <module>rW      s]    # " " " " " ( ( ( ( ( ( ( ( 6 6 6 6 6 6 6 6 6 6%%%%%%%   OOOLLL
 6 5 5 5 5 5 @ @ @ @ @ @ @ @ , , , , , , , ,,: : : :z5 5 5 5 565 5 5 5 5 5 5s   
' 55