§
    >Ä³g�$  ã                   ób  — d 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
mZ ddlmZ ddlmZ erdd	lmZ 	 dd
lmZ ddlmZmZ ddlmZ ddlmZ n# e$ r  ej        d¦  «        d‚w xY w	 ddlmZmZ n# e$ r  ej        d¦  «        d‚w xY wddlmZ dZ dZ!dZ"dZ#dZ$ G d„ de¦  «        Z%dS )zOCI Authentication Plugin.é    N)Ú	b64encode)ÚPath)ÚTYPE_CHECKINGÚAnyÚDictÚOptionalé   )Úerrors)Úlogger)ÚMySQLSocket)ÚUnsupportedAlgorithm)ÚhashesÚserialization)Úpadding)ÚPRIVATE_KEY_TYPESz'Package 'cryptography' is not installed)ÚconfigÚ
exceptionszGPackage 'oci' (Oracle Cloud Infrastructure Python SDK) is not installedé   )ÚMySQLAuthPluginÚMySQLOCIAuthPlugini (  z0Ephemeral security token is too large (10KB max)zGEphemeral security token file ('security_token_file') could not be readzKOCI configuration file does not contain a 'fingerprint' or 'key_file' entryc                   ó(  — e Zd ZU dZdZeed<   dZeed<   e	j
        Zeed<   ededeeef         d	efd
„¦   «         Zeded	efd„¦   «         Zd	eeef         fd„Zed	efd„¦   «         Zed	efd„¦   «         Zdeded	ee         fd„Zdddeded	efd„ZdS )r   z2Implement the MySQL OCI IAM authentication plugin.NÚcontextÚDEFAULTÚoci_config_profileÚoci_config_fileÚ	signatureÚ
oci_configÚreturnc                 óì  — t          | ¦  «        }|d         |                     ¦   «         dœ}|                     d¦  «        rž	 t          |d         ¦  «        }|                     ¦   «         j        t          k    rt          j        t          ¦  «        ‚| 
                    d¬¦  «        |d<   n3# t          t          f$ r}t          j        t          ¦  «        |‚d}~ww xY wt          j        |d¬	¦  «        S )
a=  Prepare client's authentication response

        Prepares client's authentication response in JSON format
        Args:
            signature (bytes):  server's nonce to be signed by client.
            oci_config (dict): OCI configuration object.

        Returns:
            str: JSON string with the following format:
                 {"fingerprint": str, "signature": str, "token": base64.base64.base64}

        Raises:
            ProgrammingError: If the ephemeral security token file can't be open or the
                              token is too large.
        Úfingerprint)r    r   Úsecurity_token_filezutf-8)ÚencodingÚtokenN)ú,ú:)Ú
separators)r   ÚdecodeÚgetr   ÚstatÚst_sizeÚOCI_SECURITY_TOKEN_MAX_SIZEr
   ÚProgrammingErrorÚOCI_SECURITY_TOKEN_TOO_LARGEÚ	read_textÚOSErrorÚUnicodeErrorÚ%OCI_SECURITY_TOKEN_FILE_NOT_AVAILABLEÚjsonÚdumps)r   r   Úsignature_64Úauth_responser!   Úerrs         úo/var/www/html/mpstechhub/venv/lib/python3.11/site-packages/mysql/connector/plugins/authentication_oci_client.pyÚ_prepare_auth_responsez)MySQLOCIAuthPlugin._prepare_auth_responseQ   s  € õ" ! Ñ+Ô+ˆà% mÔ4Ø%×,Ò,Ñ.Ô.ð
ð 
ˆð �>Š>Ð/Ñ0Ô0ð 
	ð	Ý&*¨:Ð6KÔ+LÑ&MÔ&MÐ#à&×+Ò+Ñ-Ô-Ô5Õ8SÒSÐSÝ Ô1Õ2NÑOÔOÐOØ)<×)FÒ)FÐPWÐ)FÑ)XÔ)X�˜gÑ&Ð&øÝ�\Ð*ð ð ð ÝÔ-Ý9ñô àðøøøøðøøøõ Œz˜-°JÐ?Ñ?Ô?Ð?s   ÁA)B- Â-CÂ>CÃCÚkey_pathc                 ób  — 	 t          t          j                             | ¦  «        d¦  «        5 }t	          j        |                     ¦   «         d¬¦  «        }ddd¦  «         n# 1 swxY w Y   n?# t          t          t          t          f$ r}t          j        d| › d|› �¦  «        ‚d}~ww xY w|S )z+Get the private_key form the given locationÚrbN)Úpasswordz2An error occurred while reading the API_KEY from "z": )ÚopenÚosÚpathÚ
expanduserr   Úload_pem_private_keyÚreadÚ	TypeErrorr/   Ú
ValueErrorr   r
   r,   )r9   Úkey_fileÚprivate_keyr6   s       r7   Ú_get_private_keyz#MySQLOCIAuthPlugin._get_private_keyy   s  € ð
	Ý•b”g×(Ò(¨Ñ2Ô2°DÑ9Ô9ð ¸XÝ+Ô@Ø—M’M‘O”OØ!ðñ ô �ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð øøõ
 �7¥JÕ0DÐEð 	ð 	ð 	ÝÔ)ð'Øð'ð 'Ø!$ð'ð 'ñô ð øøøøð	øøøð Ðs:   ‚-A0 ¯)A$ÁA0 Á$A(Á(A0 Á+A(Á,A0 Á0B,ÂB'Â'B,c                 ó|  — g }d„ d„ dœ}i }	 t          j        | j        pt           j        | j        pd¦  «        }|                     ¦   «         D ]`\  }}	 ||         r* |||         ¦  «        s|                     d|› d�¦  «         Œ9# t          $ r |                     d|› �¦  «         Y Œ]w xY wnk# t          j	        t          j
        t          j        t          j        t          j        f$ r,}|                     t          |¦  «        ¦  «         Y d}~nd}~ww xY w|rt          j        d	| j        › d
|› �¦  «        ‚|S )z=Get a valid OCI config from the given configuration file pathc                 ó(   — t          | ¦  «        dk    S )Né    )Úlen©Úxs    r7   ú<lambda>z:MySQLOCIAuthPlugin._get_valid_oci_config.<locals>.<lambda>Ž   s   € ¥c¨!¡f¤f¨r¢k€ ó    c                 óz   — t           j                             t           j                             | ¦  «        ¦  «        S )N)r>   r?   Úexistsr@   rL   s    r7   rN   z:MySQLOCIAuthPlugin._get_valid_oci_config.<locals>.<lambda>�   s$   € ¥2¤7§>¢>µ"´'×2DÒ2DÀQÑ2GÔ2GÑ#HÔ#H€ rO   )r    rE   r   zParameter "z" is invalidzDoes not contain parameter NzInvalid oci-config-file: z. Errors found: )r   Ú	from_filer   ÚDEFAULT_LOCATIONr   ÚitemsÚappendÚKeyErrorr   ÚConfigFileNotFoundÚInvalidConfigÚInvalidKeyFilePathÚInvalidPrivateKeyÚProfileNotFoundÚstrr
   r,   )ÚselfÚ
error_listÚreq_keysr   Úreq_keyÚ	req_valuer6   s          r7   Ú_get_valid_oci_configz(MySQLOCIAuthPlugin._get_valid_oci_configŠ   sÀ  € àˆ
à1Ð1ØHÐHð
ð 
ˆð
 &(ˆ
ð	(åÔ)ØÔ$Ð?­Ô(?ØÔ'Ð4¨9ñô ˆJð '/§n¢nÑ&6Ô&6ð Oð OÑ"�˜ðOà! 'Ô*ð O°9°9¸ZÈÔ=PÑ3QÔ3Qð OØ"×)Ò)Ð*M¸Ð*MÐ*MÐ*MÑNÔNÐNøøÝð Oð Oð OØ×%Ò%Ð&MÀGÐ&MÐ&MÑNÔNÐNÐNÐNðOøøøðOøõ Ô)ÝÔ$ÝÔ)ÝÔ(ÝÔ&ð
ð 	(ð 	(ð 	(ð ×Ò�c #™hœhÑ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'øøøøð	(øøøð ð 	ÝÔ)ð.¨DÔ,@ð .ð .Ø!+ð.ð .ñô ð ð
 Ðs<   �AB0 Á2BÂB0 Â"B,Â)B0 Â+B,Â,B0 Â0<DÃ,"DÄDc                 ó   — dS )zPlugin official name.Úauthentication_oci_client© ©r]   s    r7   ÚnamezMySQLOCIAuthPlugin.name²   s
   € ð +Ð*rO   c                 ó   — dS )z'Signals whether or not SSL is required.Fre   rf   s    r7   Úrequires_sslzMySQLOCIAuthPlugin.requires_ssl·   s	   € ð ˆurO   Ú	auth_dataÚkwargsc                 ó–  — t          j        d|t          |¦  «        ¦  «         |                      ¦   «         }|                      |d         ¦  «        }|                     |t          j        ¦   «         t          j	        ¦   «         ¦  «        }|  
                    ||¦  «        }t          j        d|¦  «         |                     ¦   «         S )z-Prepare authentication string for the server.zserver nonce: %s, len %drE   zauthentication response: %s)r   ÚdebugrK   rb   rG   Úsignr   ÚPKCS1v15r   ÚSHA256r8   Úencode)r]   rj   rk   r   rF   r   r5   s          r7   r5   z MySQLOCIAuthPlugin.auth_response¼   s¦   € åŒÐ/°½CÀ	¹N¼NÑKÔKÐKà×/Ò/Ñ1Ô1ˆ
à×+Ò+¨J°zÔ,BÑCÔCˆØ×$Ò$ YµÔ0@Ñ0BÔ0BÅFÄMÁOÄOÑTÔTˆ	à×3Ò3°I¸zÑJÔJˆÝŒÐ2°MÑBÔBÐBØ×#Ò#Ñ%Ô%Ð%rO   Úsockr   c                 óÞ  — |                      dd¦  «        | _        |                      dt          j        ¦  «        | _        t          j        d| j        ¦  «          | j        |fi |¤Ž}|€t          j	        d¦  «        ‚t          j        d|t          |¦  «        ¦  «         |                     |¦  «         |                     ¦   «         }t          j        d|¦  «         t          |¦  «        S )	aS  Handles server's `auth switch request` response.

        Args:
            sock: Pointer to the socket connection.
            auth_data: Plugin provided data (extracted from a packet
                       representing an `auth switch request` response).
            kwargs: Custom configuration to be passed to the auth plugin
                    when invoked. The parameters defined here will override the ones
                    defined in the auth plugin itself.

        Returns:
            packet: Last server's response after back-and-forth
                    communication.
        r   r   r   z!# oci configuration file path: %sNzGot a NULL auth responsez# request: %s size: %sz# server response packet: %s)r(   r   r   rS   r   r   rm   r5   r
   ÚInterfaceErrorrK   ÚsendÚrecvÚbytes)r]   rr   rj   rk   ÚresponseÚpackets         r7   Úauth_switch_responsez'MySQLOCIAuthPlugin.auth_switch_responseÉ   sÜ   € ð"  &ŸzšzÐ*;¸YÑGÔGˆÔØ"(§*¢*Ø ¥&Ô"9ñ#
ô #
ˆÔõ 	ŒÐ8¸$Ô:NÑOÔOÐOà%�4Ô% iÐ:Ð:°6Ð:Ð:ˆØÐÝÔ'Ð(BÑCÔCÐCåŒÐ-¨x½¸X¹¼ÑGÔGÐGØ�	Š	�(ÑÔÐà—’‘”ˆÝŒÐ3°VÑ<Ô<Ð<å�V‰}Œ}ÐrO   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   Ú__annotations__r   r\   r   rS   r   Ústaticmethodrw   r   r8   r   rG   rb   Úpropertyrg   Úboolri   r   r5   rz   re   rO   r7   r   r   J   s–  € € € € € € Ø<Ð<à€GˆSÐÐÑØ'Ð˜Ð'Ð'Ñ'Ø!Ô2€O�SÐ2Ð2Ñ2àð%@¨%ð %@¸TÀ#ÀsÀ(¼^ð %@ÐPSð %@ð %@ð %@ñ „\ð%@ðN ð 3ð Ð+<ð ð ð ñ „\ðð & t¨C°¨H¤~ð &ð &ð &ð &ðP ð+�cð +ð +ð +ñ „Xð+ð ð˜dð ð ð ñ „Xðð& uð &¸ð &ÀÈÄð &ð &ð &ð &ð!Ø!ð!Ø.3ð!Ø?Bð!à	ð!ð !ð !ð !ð !ð !rO   )&r~   r2   r>   Úbase64r   Úpathlibr   Útypingr   r   r   r   Ú r
   r   Únetworkr   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr   r   Ú)cryptography.hazmat.primitives.asymmetricr   Ú/cryptography.hazmat.primitives.asymmetric.typesr   ÚImportErrorr,   Úocir   r   r   ÚAUTHENTICATION_PLUGIN_CLASSr+   r-   r1   ÚOCI_PROFILE_MISSING_PROPERTIESr   re   rO   r7   ú<module>r�      s  ðð> !Ð  à €€€Ø 	€	€	€	à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5Ð 5à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð àð &Ø%Ð%Ð%Ð%Ð%Ð%ðWØ<Ð<Ð<Ð<Ð<Ð<ØDÐDÐDÐDÐDÐDÐDÐDØAÐAÐAÐAÐAÐAØQÐQÐQÐQÐQÐQÐQøØð Wð Wð WØ
!ˆ&Ô
!Ð"KÑ
LÔ
LÐRVÐVðWøøøðØ&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&øØð ð ð Ø
!ˆ&Ô
!ØQñô àððøøøð
 Ð Ð Ð Ð Ð à2Ð Ø'Ð ØQÐ àMð &ð Rð ð
`ð `ð `ð `ð `˜ñ `ô `ð `ð `ð `s   ¸A ÁA*Á.A7 Á7B