Ë
    ­mâi÷=  ã                   ó4   — d Z ddlmZ ddlmZ  G d„ d«      Zy)z
Permission checks module
é    )ÚLogger)Ú	HTTPUtilsc                   ód   — e Zd ZdZddedefd„Zdefd„Zd„ Z	de
fd„Zdefd	„Zdefd
„Zdefd„Zy)ÚPermissionChecksz3Check API permissions and role-based access controlÚloggerÚbase_urlc                 óÞ  — || _         t        ||«      | _        	 dddœ}| j                  j                  d|¬«      \  }}}|rL|dk(  rG| j                  j	                  |j                  d«      «       | j                   j                  dd	«       n"| j                   j                  dd
|› d|› �«       g d¢| _	        y # t        $ r)}| j                   j                  dd|› �«       Y d }~Œ7d }~ww xY w)NÚAsukariszAsukaris123!)ÚusernameÚpasswordz/api/auth/login)Ú	json_dataéÈ   Úaccess_tokenÚPERMISSIONSz"Successfully logged in as AsukariszFailed to login: status_code=z, response=zFailed to setup auth token: )zGET /api/healthzGET /api/streamszGET /api/streams/latestzGET /api/streams/popularzGET /api/streams/randomzGET /api/streams/searchzGET /api/streams/{stream_id}z"POST /api/streams/{stream_id}/playz%GET /api/streams/{stream_id}/commentsz.GET /api/streams/{stream_id}/download-progressz0GET /api/streams/{stream_id}/processing-progressz7GET /api/streams/{stream_id}/thumbnail/{segment_number}z!GET /api/streams/{stream_id}/chatz-GET /api/streams/{stream_id}/chat/proxy-imagezGET /api/auth/twitch/callbackzGET /zGET /api/eventszPOST /api/auth/registerzPOST /api/auth/loginzPOST /api/auth/refreshzPOST /api/auth/logout)
r   r   Ú
http_utilsÚpostÚset_auth_tokenÚgetÚinfoÚwarningÚ	ExceptionÚknown_public_endpoints)Úselfr   r   Ú
login_dataÚsuccessÚstatus_codeÚresponseÚes           ú>/home/factor_ks/STREAMA2026/tests/modules/permission_checks.pyÚ__init__zPermissionChecks.__init__   sî   € ØˆŒÜ# F¨HÓ5ˆŒð	Sð 'Ø*ñˆJð .2¯_©_×-AÑ-AÐBSÐ_iÐ-AÓ-jÑ*ˆG�[ (Ù˜;¨#Ò-Ø—‘×.Ñ.¨x¯|©|¸NÓ/KÔLØ—‘× Ñ  Ð0TÕUà—‘×#Ñ# MÐ5RÐS^ÐR_Ð_jÐksÐjtÐ3uÔvò
'
ˆÕ#øô	 ò 	SØ�K‰K×Ñ Ð1MÈaÈSÐ/Q×RÑRûð	Sús   šBB: Â:	C,ÃC'Ã'C,Úreturnc                 óP  — | j                   j                  d«       d}| j                  «       xr |}| j                  «       xr |}| j	                  «       xr |}| j                  «        |r| j                   j                  dd«       |S | j                   j                  dd«       |S )zRun all permission checkszPermission ChecksTr   zAll permission checks passedzSome permission checks failed)r   ÚheaderÚ"_check_authentication_requirementsÚ_check_role_based_accessÚ_check_admin_endpointsÚ_print_role_summaryr   Úerror)r   Úall_oks     r   Úrun_all_checkszPermissionChecks.run_all_checks8   s¢   € à�‰×ÑÐ.Ô/àˆð ×8Ñ8Ó:ÒE¸vˆð ×.Ñ.Ó0Ò;°Vˆð ×,Ñ,Ó.Ò9°6ˆð 	× Ñ Ô"áØ�K‰K×Ñ Ð/MÔNð ˆð �K‰K×Ñ˜mÐ-LÔMàˆó    c           	      óp  — | j                   j                  dd«       	 | j                  j                  d«      \  }}}|r|dk7  r| j                   j	                  dd«       y|}i }|D ]*  }|j                  dd«      }||vrd	||<   ||xx   d
z  cc<   Œ, t        |j                  «       «      D ](  \  }}| j                   j                  dd|› d|› d�«       Œ* t        |«      }	| j                   j                  dd|	› �«       y# t        $ r)}
| j                   j	                  dd|
› �«       Y d}
~
yd}
~
ww xY w)z"Print summary of endpoints by roler   zRole Summaryú/api/permissionsr   z&Failed to load permissions for summaryNÚcategoryÚuncategorizedr   é   z  z: z permissionszTotal permissions: z!Failed to generate role summary: )	r   r   r   r   r(   ÚsortedÚitemsÚlenr   )r   r   r   r   ÚpermissionsÚcategory_countÚpermr.   ÚcountÚtotal_permissionsr   s              r   r'   z$PermissionChecks._print_role_summaryQ   sM  € à�‰×Ñ˜¨Ô7ð	VØ-1¯_©_×-@Ñ-@ÐASÓ-TÑ*ˆG�[ (Ù˜k¨SÒ0Ø—‘×!Ñ! -Ð1YÔZØà"ˆKð  ˆNØ#ò .�ØŸ8™8 J°Ó@�Ø >Ñ1Ø/0�N 8Ñ,Ø˜xÓ(¨AÑ-Ô(ð	.ô $*¨.×*>Ñ*>Ó*@Ó#Aò V‘�˜%Ø—‘× Ñ  °"°X°J¸bÀÀÀ|Ð0TÕUðVô !$ KÓ 0ÐØ�K‰K×Ñ˜]Ð.AÐBSÐATÐ,UÕVøäò 	VØ�K‰K×Ñ˜mÐ/PÐQRÐPSÐ-T×UÑUûð	Vús   žAD Á!B!D Ä	D5ÄD0Ä0D5c                 óš  — 	 | j                   j                  d«      \  }}}|r|dk7  rddiS |}i }|D ]g  }|j                  dd«      }|j                  dd«      }||vrg ||<   ||   j                  |j                  d	d«      |j                  d
d«      |dœ«       Œi |t        |«      dœS # t        $ r}	dt        |	«      icY d}	~	S d}	~	ww xY w)z>Get detailed summary of all endpoints with roles for reportingr-   r   r(   zFailed to load permissionsr.   r/   Úendpoint_patternÚ ÚnameÚdescription)r<   r=   r:   )Ú
categoriesr8   N)r   r   Úappendr3   r   Ústr)
r   r   r   r   r4   Úcategory_endpointsr6   r.   r:   r   s
             r   Ú get_detailed_permissions_summaryz1PermissionChecks.get_detailed_permissions_summaryo   sú   € ð	%à-1¯_©_×-@Ñ-@ÐASÓ-TÑ*ˆG�[ (Ù˜k¨SÒ0ØÐ!=Ð>Ð>à"ˆKð "$ÐØ#ò 	�ØŸ8™8 J°Ó@�Ø#'§8¡8Ð,>ÀÓ#CÐ ØÐ#5Ñ5Ø35Ð& xÑ0Ø" 8Ñ,×3Ñ3Ø ŸH™H V¨RÓ0Ø#'§8¡8¨M¸2Ó#>Ø(8ñ5õ ð	ð 1Ü%(¨Ó%5ñð øô
 ò 	%ØœS ›VÐ$Õ$ûð	%ús#   ‚)B* ¬A=B* Â*	C
Â3CÂ?C
ÃC
c           
      óÚ  — | j                   j                  dd«       	 | j                  j                  d«      \  }}}|r|dk7  r| j                   j	                  dd«       y|}g }g }|D ]j  }|j                  dd«      }|sŒ|j                  d	d
«      }	t        |	«      dk(  sŒ9|	d   }
|	d
   }|j                  ||
|f«       |j                  ||
|f«       Œl |s| j                   j                  dd«       y	 d}|D �]  \  }}
}|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dd«      }|j                  dg «      }|j                  dg «      }|rdj                  |«      nd}|
› d	|› �}|| j                  v }| j                  j                  |
|d¬«      \  }}}|r,|dk(  r'| j                   j                  d|
› d	|› d |› d!�«       �Œ|r,|d"k(  r'| j                   j                  d|
› d	|› d#|› d!�«       �Œ@|r)|d$k(  r$| j                   j                  d|
› d	|› d%�«       �Œk|r)|d&k(  r$| j                   j                  d|
› d	|› d'�«       �Œ–|rR|r'| j                   j                  d|
› d	|› d(|› d)�«       �ŒÁ| j                   j	                  d|
› d	|› d*|› d)�«       d}�Œê| j                   j                  d|
› d	|› d+�«       �Œ |D ](  \  }}
}| j                   j                  d|
› d	|› d,�«       Œ* |S # t        $ r)}| j                   j	                  dd|› �«       Y d}~yd}~ww xY w)-z5Check that protected endpoints require authenticationr   z'Checking authentication requirements...r-   r   ú'Failed to load permissions from backendFr:   r;   Ú r0   é   r   z+No protected endpoints found in permissionsTúFailed to load permissions: Nz{stream_id}ú$00000000-0000-0000-0000-000000000000z{tag_id}ú	{user_id}z{comment_id}z{key}Útest_keyú
{filename}útest_file.jsonÚrequired_rolesÚaccessible_rolesz, Úall©Úauthenticatedé‘  z: requires auth (roles: õ   ) âœ“é“  z: protected (roles: é”  ú: not found (placeholder ID)é•  z&: method not allowed (endpoint exists)z.: Unregistered (known public endpoint, roles: ú)z": accessible without auth (roles: z: request failedz!: Unregistered (no auth required))r   r   r   r   r(   Úsplitr3   r?   r   r   ÚreplaceÚjoinr   Úrequestr   )r   r   r   r   r4   Úprotected_endpointsÚpublic_endpointsr6   r:   ÚpartsÚmethodÚendpointr   r)   Ú	perm_dataÚtest_endpointrM   rN   Ú	roles_strÚendpoint_keyÚis_known_publicÚ_s                         r   r$   z3PermissionChecks._check_authentication_requirementsŽ   sè  € à�‰×Ñ˜Ð(QÔRð	Ø-1¯_©_×-@Ñ-@ÐASÓ-TÑ*ˆG�[ (Ù˜k¨SÒ0Ø—‘×!Ñ! -Ð1ZÔ[Øà"ˆKà"$ÐØ!Ðà#ò J�à#'§8¡8Ð,>ÀÓ#CÐ Ú#à,×2Ñ2°3¸Ó:�EÜ˜5“z Q“Ø!& q¡˜Ø#(¨¡8˜à+×2Ñ2°H¸fÀdÐ3KÔLØ(×/Ñ/°¸6À4Ð0HÕIðJñ 'Ø—‘×#Ñ# MÐ3`Ôaàð 'ð ˆØ+>ó %	[Ñ'ˆH�f˜ià$×,Ñ,¨]Ð<bÓcˆMØ)×1Ñ1°*Ð>dÓeˆMØ)×1Ñ1°+Ð?eÓfˆMØ)×1Ñ1°.ÐBhÓiˆMØ)×1Ñ1°'¸:ÓFˆMØ)×1Ñ1°,Ð@PÓQˆMð 'Ÿ]™]Ð+;¸RÓ@ˆNØ(Ÿ}™}Ð-?ÀÓDÐÙ5C˜Ÿ	™	 .Ô1ÈˆIð %˜X Q x jÐ1ˆLØ*¨d×.IÑ.IÐIˆOð '+§o¡o×&=Ñ&=¸fÀmÐchÐ&=Ó&iÑ#ˆG�[ !á˜;¨#Ò-Ø—‘×#Ñ# M°f°X¸Q¸x¸jÐH`ÐajÐ`kÐkpÐ3qÖrÙ˜[¨CÒ/Ø—‘×#Ñ# M°f°X¸Q¸x¸jÐH\Ð]fÐ\gÐglÐ3mÖnÙ˜[¨CÒ/Ø—‘× Ñ  °6°(¸!¸H¸:ÐEaÐ0bÖcÙ˜[¨CÒ/à—‘× Ñ  °6°(¸!¸H¸:ÐEkÐ0lÖmÙÙ"Ø—K‘K×$Ñ$ ]°v°h¸aÀ¸zÐIwð  yBð  xCð  CDð  5Eö  Fà—K‘K×%Ñ% m¸°x¸qÀÀ
ÐJlÐmvÐlwÐwxÐ5yÔzØ"’Fà—‘×#Ñ# M°f°X¸Q¸x¸jÐHXÐ3YÖZðK%	[ðP ,<ò 	eÑ'ˆH�f˜iØ�K‰K×Ñ˜]¨v¨h°a¸°zÐAbÐ,cÕdð	eð ˆøôa ò 	Ø�K‰K×Ñ˜mÐ/KÈAÈ3Ð-OÔPÜûð	ús+   žAL8 Á!L8 Â L8 Â"AL8 Ì8	M*ÍM%Í%M*c           
      ót  — | j                   j                  dd«       	 | j                  j                  d«      \  }}}|r|dk7  r| j                   j	                  dd«       y|}g }|D ]V  }|j                  dd«      }|sŒ|j                  d	d
«      }t        |«      dk(  sŒ9|d   }	|d
   }
|j                  |
|	|f«       ŒX 	 |s| j                   j                  dd«       yd}|D �]  \  }
}	}|
j                  dd«      }|j                  dd«      }|j                  dd«      }|}|	› d	|
› �}|| j                  v }| j                  j                  |	|d¬«      \  }}}|r*|dv r&| j                   j                  d|	› d	|
› d|› d�«       Œ£|r(|dk(  r#| j                   j                  d|	› d	|
› d�«       ŒÍ|r&| j                   j                  d|	› d	|
› d|› d�«       Œõ| j                   j	                  d|	› d	|
› d|› d�«       d}�Œ |S # t        $ r)}| j                   j	                  dd|› �«       Y d}~yd}~ww xY w)z3Check that role-based access control is implementedr   z%Checking role-based access control...r-   r   rD   Fr:   r;   rE   r0   rF   r   rG   Nz,No role-based endpoints found in permissionsTrI   rH   rK   rL   r.   rP   ©rR   rT   ú: protected (category: rS   rU   z: not found (may be optional)z1: Unregistered (known public endpoint, category: rX   z%: accessible without role (category: )r   r   r   r   r(   rY   r3   r?   r   r   rZ   r   r\   r   )r   r   r   r   r4   Úrole_endpointsr6   r:   r_   r`   ra   r   r)   rb   rc   r.   rd   re   rf   rg   s                       r   r%   z)PermissionChecks._check_role_based_accessá   s’  € à�‰×Ñ˜Ð(OÔPð	Ø-1¯_©_×-@Ñ-@ÐASÓ-TÑ*ˆG�[ (Ù˜k¨SÒ0Ø—‘×!Ñ! -Ð1ZÔ[Øà"ˆKàˆNØ#ò H�Ø#'§8¡8Ð,>ÀÓ#CÐ Ú#à,×2Ñ2°3¸Ó:�EÜ˜5“z Q“Ø!& q¡˜Ø#(¨¡8˜Ø&×-Ñ-¨x¸ÀÐ.FÕGñHñ Ø�K‰K×Ñ Ð/]Ô^ØàˆØ+9ó 	#Ñ'ˆH�f˜ià$×,Ñ,¨[Ð:`ÓaˆMØ)×1Ñ1°,Ð@PÓQˆMð !—}‘} Z°Ó4ˆHØ ˆIð %˜X Q x jÐ1ˆLØ*¨d×.IÑ.IÐIˆOà&*§o¡o×&=Ñ&=¸fÀmÐchÐ&=Ó&iÑ#ˆG�[ !á˜;¨*Ñ4Ø—‘×#Ñ# M°f°X¸Q¸x¸jÐH_Ð`iÐ_jÐjoÐ3pÕqÙ˜[¨CÒ/Ø—‘× Ñ  °6°(¸!¸H¸:ÐEbÐ0cÕdá"Ø—K‘K×$Ñ$ ]°v°h¸aÀ¸zÐIzð  |Eð  {Fð  FGð  5Hõ  Ià—K‘K×%Ñ% m¸°x¸qÀÀ
ÐJoÐpyÐozÐz{Ð5|Ô}Ø"’Fð1	#ð4 ˆøôG ò 	Ø�K‰K×Ñ˜mÐ/KÈAÈ3Ð-OÔPÜûð	ús*   žAH Á!H Á? H Â  H È	H7ÈH2È2H7c                 ó†  — | j                   j                  dd«       	 | j                  j                  d«      \  }}}|r|dk7  r| j                   j	                  dd«       y|}g }|D ]n  }|j                  dd«      }|j                  d	d«      }|d
k(  sŒ-|sŒ0|j                  dd«      }	t        |	«      dk(  sŒQ|	d   }
|	d   }|j                  ||
|f«       Œp 	 |s| j                   j                  dd«       yd}|D �]  \  }}
}|j                  dd«      }|j                  dd«      }|j                  dd«      }|}| j                  j                  |
|d¬«      \  }}}|r+|dv r'| j                   j                  dd|
› d|› d|› d�«       Œ�|r)|dk(  r$| j                   j                  dd|
› d|› d�«       Œº|r)|dk(  r$| j                   j                  dd|
› d|› d�«       Œå| j                   j	                  dd|
› d|› d |› d!�«       d}�Œ |S # t        $ r)}| j                   j	                  dd|› �«       Y d}~yd}~ww xY w)"z,Check admin endpoints are properly protectedr   z&Checking admin endpoints protection...r-   r   rD   Fr.   r;   r:   z	api/adminrE   r0   rF   r   rG   Nz'No admin endpoints found in permissionsTrI   rH   rK   rL   rP   ri   zAdmin route rj   rS   rU   rV   rW   z: method not allowedz%: accessible without auth (category: rX   )r   r   r   r   r(   rY   r3   r?   r   r   rZ   r\   r   )r   r   r   r   r4   Úadmin_endpointsr6   r.   r:   r_   r`   ra   r   r)   rb   rc   rd   rg   s                     r   r&   z'PermissionChecks._check_admin_endpoints  sŽ  € à�‰×Ñ˜Ð(PÔQð	Ø-1¯_©_×-@Ñ-@ÐASÓ-TÑ*ˆG�[ (Ù˜k¨SÒ0Ø—‘×!Ñ! -Ð1ZÔ[Øà"ˆKà ˆOØ#ò 	I�ØŸ8™8 J°Ó3�Ø#'§8¡8Ð,>ÀÓ#CÐ Ø˜{Ó*Ò/?à,×2Ñ2°3¸Ó:�EÜ˜5“z Q“Ø!& q¡˜Ø#(¨¡8˜Ø'×.Ñ.°¸&À$Ð/GÕHñ	Iñ Ø�K‰K×Ñ Ð/XÔYØàˆØ+:ó 	Ñ'ˆH�f˜ià$×,Ñ,¨[Ð:`ÓaˆMØ)×1Ñ1°,Ð@PÓQˆMð !—}‘} Z°Ó4ˆHØ ˆIà&*§o¡o×&=Ñ&=¸fÀmÐchÐ&=Ó&iÑ#ˆG�[ !á˜;¨*Ñ4Ø—‘×#Ñ# M°\À&ÀÈÈ8È*ÐTkÐluÐkvÐv{Ð3|Õ}Ù˜[¨CÒ/à—‘× Ñ  °,¸v¸hÀaÈÀzÐQmÐ0nÕoÙ˜[¨CÒ/à—‘× Ñ  °,¸v¸hÀaÈÀzÐQeÐ0fÕgà—‘×!Ñ! -°<À¸xÀqÈÈ
ÐRwð  yBð  xCð  CDð  2Eô  FØ’ð+	ð. ˆøôA ò 	Ø�K‰K×Ñ˜mÐ/KÈAÈ3Ð-OÔPÜûð	ús0   žAH Á!2H ÂH Â H Â8 H È	I ÈH;È;I N)zhttp://localhost:8000)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r@   r    Úboolr*   r'   ÚdictrB   r$   r%   r&   © r+   r   r   r      s_   „ Ù=ñ+
˜vð +
°ó +
ðZ ó ò2Vð<%°$ó %ð>Q°Dó Qðf:¨$ó :ðx8¨ô 8r+   r   N)rq   Útests.utils.loggerr   Útests.utils.http_utilsr   r   rt   r+   r   ú<module>rw      s   ðñõ &Ý ,÷Mò Mr+   