Ë
    OK¸i£  ã                   óæ   — d dl Z d dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ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mZmZmZmZ  e j<                  e«      Z  G d„ de«      Z!y)é    N)ÚPattern)ÚquoteÚ	urlencode)ÚBACKEND_SESSION_KEY)ÚHttpResponseRedirectÚJsonResponse)Úreverse)Úget_random_string)ÚMiddlewareMixin)Úcached_property)Úimport_string)ÚOIDCAuthenticationBackend)Ú
absolutifyÚ+add_state_and_verifier_and_nonce_to_sessionÚgenerate_code_challengeÚimport_from_settingsc                   ó^   ‡ — e Zd ZdZˆ fd„Zed„ «       Zed„ «       Zed„ «       Z	d„ Z
d„ Zˆ xZS )ÚSessionRefreshzÊRefreshes the session with the OIDC RP after expiry seconds

    For users authenticated with the OIDC RP, verify tokens are still valid and
    if not, force the user to re-authenticate silently.

    c                 ó˜  •— t         t        | �  |«       | j                  dg «      | _        | j                  d«      | _        | j                  d«      | _        | j                  dd«      | _        | j                  dd«      | _        | j                  dd	«      | _	        | j                  d
d«      | _
        | j                  dd«      | _        y )NÚOIDC_EXEMPT_URLSÚOIDC_OP_AUTHORIZATION_ENDPOINTÚOIDC_RP_CLIENT_IDÚOIDC_STATE_SIZEé    Ú OIDC_AUTHENTICATION_CALLBACK_URLÚoidc_authentication_callbackÚOIDC_RP_SCOPESzopenid emailÚOIDC_USE_NONCETÚOIDC_NONCE_SIZE)Úsuperr   Ú__init__Úget_settingsr   r   r   r   r   r   r   r   )ÚselfÚget_responseÚ	__class__s     €úU/var/www/aura-ras/venv/lib/python3.12/site-packages/mozilla_django_oidc/middleware.pyr!   zSessionRefresh.__init__!   sÇ   ø€ ÜŒn˜dÑ,¨\Ô:Ø $× 1Ñ 1Ð2DÀbÓ IˆÔØ.2×.?Ñ.?Ø,ó/
ˆÔ+ð "&×!2Ñ!2Ð3FÓ!GˆÔØ#×0Ñ0Ð1BÀBÓGˆÔØ04×0AÑ0AØ.Ø*ó1
ˆÔ-ð #×/Ñ/Ð0@À.ÓQˆÔØ"×/Ñ/Ð0@À$ÓGˆÔØ#×0Ñ0Ð1BÀBÓGˆÕó    c                 ó   — t        | g|¢­Ž S ©N)r   )ÚattrÚargss     r&   r"   zSessionRefresh.get_settings1   s   € ä# DÐ0¨4Ò0Ð0r'   c                 ó  — g }| j                   D ]$  }t        |t        «      rŒ|j                  |«       Œ& |j	                  g d¢«       t        |D �cg c]   }|j                  d«      r|n
t        |«      ‘Œ" c}«      S c c}w )aN  Generate and return a set of url paths to exempt from SessionRefresh

        This takes the value of ``settings.OIDC_EXEMPT_URLS`` and appends three
        urls that mozilla-django-oidc uses. These values can be view names or
        absolute url paths.

        :returns: list of url paths (for example "/oidc/callback/")

        )Úoidc_authentication_initr   Úoidc_logoutú/)r   Ú
isinstanceÚ
re_PatternÚappendÚextendÚsetÚ
startswithr	   )r#   Úexempt_urlsÚurls      r&   r6   zSessionRefresh.exempt_urls5   s   € ð ˆØ×(Ñ(ò 	(ˆCÜ˜c¤:Õ.Ø×"Ñ" 3Õ'ð	(ð 	×Ñòô	
ô ØEPÖQ¸c�C—N‘N 3Ô'‰S¬W°S«\Ñ9ÒQó
ð 	
ùÚQs   Á%A>c                 ó€   — t        «       }| j                  D ]$  }t        |t        «      sŒ|j	                  |«       Œ& |S )aF  Generate and return a set of url patterns to exempt from SessionRefresh

        This takes the value of ``settings.OIDC_EXEMPT_URLS`` and returns the
        values that are compiled regular expression patterns.

        :returns: list of url patterns (for example,
            ``re.compile(r"/user/[0-9]+/image")``)
        )r4   r   r0   r1   Úadd)r#   Úexempt_patternsÚurl_patterns      r&   Úexempt_url_patternsz"SessionRefresh.exempt_url_patternsP   s@   € ô ›%ˆØ×0Ñ0ò 	1ˆKÜ˜+¤zÕ2Ø×#Ñ# KÕ0ð	1ð Ðr'   c                 óL  ‡— ‰j                   j                  t        «      }d}|rt        |«      }t	        |t
        «      }‰j                  dk(  xrU ‰j                  j                  xr= |xr9 ‰j                  | j                  vxr t        ˆfd„| j                  D «       «       S )z�Takes a request and returns whether it triggers a refresh examination

        :arg HttpRequest request:

        :returns: boolean

        TÚGETc              3   óT   •K  — | ]  }|j                  ‰j                  «      –— Œ! y ­wr)   )ÚmatchÚpath)Ú.0ÚpatÚrequests     €r&   ú	<genexpr>z4SessionRefresh.is_refreshable_url.<locals>.<genexpr>t   s   øè ø€ ÒT°C˜Ÿ	™	 '§,¡,×/ÑTùs   ƒ%()ÚsessionÚgetr   r   Ú
issubclassr   ÚmethodÚuserÚis_authenticatedrA   r6   Úanyr<   )r#   rD   Úbackend_sessionÚis_oidc_enabledÚauth_backends    `   r&   Úis_refreshable_urlz!SessionRefresh.is_refreshable_url`   s¡   ø€ ð "Ÿ/™/×-Ñ-Ô.AÓBˆØˆÙÜ(¨Ó9ˆLÜ(¨Ô7PÓQˆOð �N‰N˜eÑ#ò UØ—‘×-Ñ-òUàòUð —‘ D×$4Ñ$4Ð4òUô ÓT¸4×;SÑ;SÔTÓTÐTð	
r'   c                 ó   — | j                  |«      st        j                  d«       y |j                  j	                  dd«      }t        j
                  «       }||kD  rt        j                  d||«       y t        j                  d«       | j                  }| j                  }t        | j                  «      }d|t        |t        | j                  «      «      || j                  ddœ}|j                  | j                  d	i «      «       | j                   r(t        | j"                  «      }|j                  d
|i«       | j                  dd«      rr| j                  dd«      }	d|	cxk  rdk  st%        d«      ‚ t%        d«      ‚t        |	«      }
| j                  dd«      }t'        |
|«      }|j                  ||dœ«       nd }
t)        ||||
«       |j+                  «       |j                  d<   t-        |t.        ¬«      }dj1                  ||¬«      }|j2                  j	                  d«      dk(  rt5        d|id¬«      }||d<   |S t7        |«      S )Nzrequest is not refreshableÚoidc_id_token_expirationr   z!id token is still valid (%s > %s)zid token has expiredÚcodeÚnone)Úresponse_typeÚ	client_idÚredirect_uriÚstateÚscopeÚpromptÚOIDC_AUTH_REQUEST_EXTRA_PARAMSÚnonceÚOIDC_USE_PKCEFÚOIDC_PKCE_CODE_VERIFIER_SIZEé@   é+   é€   z/code_verifier_length must be between 43 and 128ÚOIDC_PKCE_CODE_CHALLENGE_METHODÚS256)Úcode_challengeÚcode_challenge_methodÚoidc_login_next)Ú	quote_viaz{url}?{query})r7   Úqueryzx-requested-withÚXMLHttpRequestÚrefresh_urli“  )Ústatus)rP   ÚLOGGERÚdebugrF   rG   Útimer   r   r
   r   r   r	   r   r   Úupdater"   r   r   Ú
ValueErrorr   r   Úget_full_pathr   r   ÚformatÚheadersr   r   )r#   rD   Ú
expirationÚnowÚauth_urlrV   rX   Úparamsr\   Úcode_verifier_lengthÚcode_verifierre   rd   rh   Úredirect_urlÚresponses                   r&   Úprocess_requestzSessionRefresh.process_requestw   sH  € Ø×&Ñ& wÔ/Ü�L‰LÐ5Ô6Øà—_‘_×(Ñ(Ð)CÀQÓGˆ
Ü�i‰i‹kˆØ˜Òä�L‰LÐ<¸jÈ#ÔNØä�‰Ð+Ô,à×6Ñ6ˆØ×*Ñ*ˆ	Ü! $×"6Ñ"6Ó7ˆð
 $Ø"Ü&Øœ ×!FÑ!FÓGóð Ø×(Ñ(Øñ	
ˆð 	�‰�d×'Ñ'Ð(HÈ"ÓMÔNà×ÒÜ% d×&:Ñ&:Ó;ˆEØ�M‰M˜7 EÐ*Ô+à×Ñ˜_¨eÔ4Ø#'×#4Ñ#4Ð5SÐUWÓ#XÐ ð Ð.Ô5°#Ò5Ü Ð!RÓSÐSð 6Ü Ð!RÓSÐSô .Ð.BÓCˆMØ$(×$5Ñ$5Ø1°6ó%Ð!ô 5ØÐ4óˆNð
 �M‰Mà&4Ø-Bñõð !ˆMä3Ø�U˜F Mô	
ð .5×-BÑ-BÓ-Dˆ�‰Ð)Ñ*ä˜&¬EÔ2ˆØ&×-Ñ-°(À%Ð-ÓHˆØ�?‰?×ÑÐ1Ó2Ð6FÒFô $ ]°LÐ$AÈ#ÔNˆHØ&2ˆH�]Ñ#ØˆOÜ# LÓ1Ð1r'   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r!   Ústaticmethodr"   r   r6   r<   rP   r|   Ú__classcell__)r%   s   @r&   r   r      sU   ø„ ñôHð  ñ1ó ð1ð ñ
ó ð
ð4 ñó ðò
ö.S2r'   r   )"Úloggingrn   Úrer   r1   Úurllib.parser   r   Údjango.contrib.authr   Údjango.httpr   r   Údjango.urlsr	   Údjango.utils.cryptor
   Údjango.utils.deprecationr   Údjango.utils.functionalr   Údjango.utils.module_loadingr   Úmozilla_django_oidc.authr   Úmozilla_django_oidc.utilsr   r   r   r   Ú	getLoggerr}   rl   r   © r'   r&   ú<module>r‘      sU   ðÛ Û Ý $ß )å 3ß :Ý Ý 1Ý 4Ý 3Ý 5å >÷ó ð 
ˆ×	Ñ	˜8Ó	$€ôq2�_õ q2r'   