U
    •uÄc»O  ã                   @   s¶  d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	m
Z
 d dlZd dlZ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 dZzJd dlZdZejdkrÒd	e jkrÒe j d	¡Ze ¡  d
Zerìee jd	< W n e k
�r   Y nX G dd„ de!ƒZ"G dd„ de!ƒZ#de jk�r>e jd Z$ndZ$dd„ Z%dd„ Z&G dd„ dej'ƒZ(d$dd„Z)G dd„ dej'ƒZ*dd„ Z+G dd„ dej'ƒZ,d%dd „Z-d!Z.d&d"d#„Z/dS )'é    N)ÚOptionalÚListÚDict)Útime_ns)Úhexstr_if_strÚto_hex)Ú	parse_url)Úpkm_from_argon2_secretFÚwin32ZTERMTc                   @   s¬   e Zd ZdZd
ee ee ee ee ee ee ee ee ee eej eej ee	j
 ee	j
 ee ee ee ee ee ee dœdd„Zdd„ Zedd	„ ƒZdS )ÚProfileaV  
    User profile, stored as named section in ``${HOME}/.xbrnetwork/config.ini``:

    .. code-block:: INI

        [default]
        # username used with this profile
        username=joedoe

        # user email used with the profile (e.g. for verification emails)
        email=joe.doe@example.com

        # XBR network node used as a directory server and gateway to XBR smart contracts
        network_url=ws://localhost:8090/ws

        # WAMP realm on network node, usually "xbrnetwork"
        network_realm=xbrnetwork

        # user private WAMP-cryptosign key (for client authentication)
        cskey=0xb18bbe88ca0e189689e99f87b19addfb179d46aab3d59ec5d93a15286b949eb6

        # user private Ethereum key (for signing transactions and e2e data encryption)
        ethkey=0xfbada363e724d4db2faa2eeaa7d7aca37637b1076dd8cf6fefde13983abaa2ef
    N)ÚpathÚnameÚ
member_adrÚethkeyÚcskeyÚusernameÚemailÚnetwork_urlÚnetwork_realmÚ
member_oidÚvaction_oidÚvaction_requestedÚvaction_verifiedÚdata_urlÚ
data_realmÚ
infura_urlÚinfura_networkÚ
infura_keyÚinfura_secretc                 C   sŠ   ddl m} |ƒ | _|| _|| _|| _|| _|| _|| _|| _	|| _
|	| _|
| _|| _|| _|| _|| _|| _|| _|| _|| _|| _dS )a  

        :param path:
        :param name:
        :param member_adr:
        :param ethkey:
        :param cskey:
        :param username:
        :param email:
        :param network_url:
        :param network_realm:
        :param member_oid:
        :param vaction_oid:
        :param vaction_requested:
        :param vaction_verified:
        :param data_url:
        :param data_realm:
        :param infura_url:
        :param infura_network:
        :param infura_key:
        :param infura_secret:
        r   ©Úmake_loggerN)Útxaior    Úlogr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )Úselfr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    © r$   úS/var/www/html/pearl/school/venv/lib/python3.8/site-packages/autobahn/xbr/_config.pyÚ__init__[   s*    *zProfile.__init__c                 C   sT  i }| j pd|d< | jr.d t | j¡ ¡ ¡nd|d< | jrRd t | j¡ ¡ ¡nd|d< | jpbd|d< | jppd|d< | j	p~d|d< | j
pŒd|d	< | jr¢t| jƒnd|d
< | jrºt| jƒnd|d< | jrÒt| jƒnd|d< | jrêt| jƒnd|d< | jpúd|d< | j�p
d|d< | j�pd|d< | j�p*d|d< | j�p:d|d< | j�pJd|d< |S )NÚ r   z0x{}r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   ÚformatÚbinasciiÚb2a_hexÚdecoder   r   r   r   r   r   Ústrr   r   r   r   r   r   r   r   r   )r#   Úobjr$   r$   r%   Úmarshal�   s&    $$zProfile.marshalc                 C   s~  d }d }d }d }d }d }d }	d }
d }d }d }d }d }d }d }d }d }|D �]\}}|dkrdt |ƒ}qH|dkrvt |ƒ}	qH|dkr¤t|ƒt krž|dkržt |¡}nd }qH|dkrÌt|ƒt krÆ|dkrÆ|}nd }qH|dk� rüt|ƒt krö|dkröt |¡}
nd }
qH|dk�r.t|ƒtk�r(|�r(t |d¡}n|}qH|d	k�rZt|ƒtk�rTt |d¡}n|}qH|d
k�rnt |ƒ}qH|dk�r‚t |ƒ}qH|dk�r t |dd … ¡}qH|dk�r¾t |dd … ¡}qH|dk�rÒt |ƒ}qH|dk�ræt |ƒ}qH|dk�rút |ƒ}qH|dk�rt |ƒ}qH|dk�r"t |ƒ}qH|dk�r6t |ƒ}qH|dk�rBqHt	d 
|¡ƒ qHt| ||||||||	|
|||||||||ƒS )Nr   r   r   r'   r   r   r   Únsr   r   r   r   é   r   r   r   r   r   r   r   )r   r   z!unprocessed config attribute "{}")r,   ÚtypeÚuuidÚUUIDÚintÚnpÚ
datetime64r)   Úa2b_hexÚprintr(   r   )r   r   Úitemsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ÚkÚvr$   r$   r%   Úparse²   s¨    























          ùzProfile.parse)NNNNNNNNNNNNNNNNNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r,   Úbytesr2   r3   r5   r6   r&   r.   Ústaticmethodr<   r$   r$   r$   r%   r   A   sX                      ííBr   c                   @   sp   e Zd ZdZdd„ Zeee dœdd„ƒZee	ee
f dœdd„ƒZdee d
œdd„Zdee dœdd„Zd	S )Ú
UserConfigzÆ
    Local user configuration file. The data is either a plain text (unencrypted)
    .ini file, or such a file encrypted with XSalsa20-Poly1305, and with a
    binary file header of 48 octets.
    c                 C   s,   ddl m} |ƒ | _tj |¡| _i | _dS )zH

        :param config_path: The user configuration file path.
        r   r   N)r!   r    r"   Úosr   ÚabspathÚ_config_pathÚ	_profiles)r#   Úconfig_pathr    r$   r$   r%   r&     s    zUserConfig.__init__)Úreturnc                 C   s   | j S )z‚
        Return the path to the user configuration file exposed by this object.,

        :return: Local filesystem path.
        )rF   ©r#   r$   r$   r%   rH     s    zUserConfig.config_pathc                 C   s   | j S )zv
        Access to a map of user profiles in this user configuration.

        :return: Map of user profiles.
        )rG   rJ   r$   r$   r%   Úprofiles   s    zUserConfig.profilesN)Úpasswordc              	   C   sJ  d}t  ¡ }| j ¡ D ]N\}}|| ¡ kr<| |¡ |d7 }| ¡ }| ¡ D ]\}}| |||¡ qLqt 	¡ �}	| 
|	¡ |	 ¡  d¡}
W 5 Q R X |�rt d¡}d}td|||d�}tj |¡}| |
¡}dd	d
t dt|ƒ¡t dtƒ ¡d||g}d |¡}n|
}t| jdƒ�}| 
|¡ W 5 Q R X | jjd|t|ƒ| jd� t|ƒS )a;  
        Save this user configuration to the underlying configuration file. The user
        configuration file can be encrypted using Argon2id when a ``password`` is given.

        :param password: The optional Argon2id password.

        :return: Number of octets written to the user configuration file.
        r   é   Úutf8é   úxbrnetwork-configr'   ©r   rL   ÚcontextÚsalts   Þ­¾ïs     fs      ú>Lú>Qs           ó    ÚwbzUconfiguration with {sections} sections, {bytes_written} bytes written to {written_to})ÚsectionsZbytes_writtenZ
written_to)ÚconfigparserÚConfigParserrG   r9   rX   Úadd_sectionr.   ÚsetÚioÚStringIOÚwriteÚgetvalueÚencoderD   Úurandomr	   ÚnaclÚsecretÚ	SecretBoxZencryptÚstructÚpackÚlenr   ÚjoinÚopenrF   r"   Údebug)r#   rL   ZwrittenÚconfigÚprofile_nameÚprofileÚpdÚoptionÚvalueÚfp1Zconfig_datarS   rR   Úpriv_keyÚboxZconfig_data_ciphertextZdlÚdataÚfp2r$   r$   r%   Úsave)  sJ    	





ø
  ÿzUserConfig.savec              	   C   s®  t j | j¡rt j | j¡s,td | j¡ƒ‚t| jdƒ�}| ¡ }W 5 Q R X t	|ƒdk�r@|dd… dk�r@|dd… }|dd… }t
 d|dd… ¡d	 }t
 d|dd
… ¡d	 }t
 d|d
d… ¡d	 }|dksØt‚|t	|ƒksèt‚|tƒ k söt‚|dd… }	d}
|�r|ƒ }nd}td||
|	d�}tj |¡}| |¡}nd}|}t ¡ }| | d¡¡ i }| ¡ D ](}| |¡}t | j||¡}|||< �ql|| _t| j ¡ ƒ}|S )a%  
        Load this object from the underlying user configuration file. When the
        file is encrypted, call back into ``cb_get_password`` to get the user password.

        :param cb_get_password: Callback called when password is needed.

        :return: List of profiles loaded.
        z/config path "{}" cannot be loaded: so such fileÚrbé0   Né   s   Þ­¾ï  frT   é   r   rO   rU   é   )r   rM   é    rP   r'   rQ   rN   )rD   r   ÚexistsrF   ÚisfileÚRuntimeErrorr(   rj   Úreadrh   rf   ÚunpackÚAssertionErrorr   r	   rc   rd   re   ZdecryptrY   rZ   Úread_stringr+   rX   r9   r   r<   rG   ÚsortedrK   Úkeys)r#   Zcb_get_passwordÚfpru   ÚheaderÚbodyZalgoÚdata_lenÚcreatedrS   rR   rL   rs   rt   rl   rK   rm   Zcitemsrn   Zloaded_profilesr$   r$   r%   Úloade  sB    	 
zUserConfig.load)N)N)r=   r>   r?   r@   r&   Úpropertyr   r,   rH   r   ÚobjectrK   r   rw   rŒ   r$   r$   r$   r%   rC     s   
<rC   ZCROSSBAR_FABRIC_URLzwss://master.xbr.network/wsc                 C   s   t rtj| ddd�S | S d S )NZredT©ZfgZbold©Ú_HAS_COLOR_TERMÚclickÚstyle©Útextr$   r$   r%   Ústyle_error¤  s    r–   c                 C   s   t rtj| ddd�S | S d S )NZgreenTr�   r�   r”   r$   r$   r%   Ústyle_ok«  s    r—   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚWampUrlz'
    WAMP transport URL validator.
    zWAMP transport URLc                 C   s   t j | ¡ d S ©N©r’   Ú	ParamTyper&   rJ   r$   r$   r%   r&   ¹  s    zWampUrl.__init__c              
   C   sJ   zt |ƒ W n4 tk
r@ } z|  tt|ƒƒ¡ W 5 d }~X Y nX |S d S r™   )r   Ú	ExceptionÚfailr–   r,   )r#   rq   ÚparamÚctxÚer$   r$   r%   Úconvert¼  s
    $zWampUrl.convertN©r=   r>   r?   r@   r   r&   r¡   r$   r$   r$   r%   r˜   ²  s   r˜   c                 C   s   t j| tƒ |d�}|S )zP
    Prompt user for WAMP transport URL (eg "wss://planet.xbr.network/ws").
    ©r1   Údefault)r’   Úpromptr˜   )Úmsgr¤   rq   r$   r$   r%   Úprompt_for_wamp_urlÅ  s    r§   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )ÚEthereumAddressz%
    Ethereum address validator.
    zEthereum addressc                 C   s   t j | ¡ d S r™   rš   rJ   r$   r$   r%   r&   Ô  s    zEthereumAddress.__init__c              
   C   s~   z@t j |¡}t |dd … ¡}t|ƒdkr>td t|ƒ¡ƒ‚W n4 tk
rt } z|  	t
t|ƒƒ¡ W 5 d }~X Y nX |S d S )Nr0   é   z<Ethereum addres must be 20 bytes (160 bit), but was {} bytes)Úweb3ZWeb3ZtoChecksumAddressr)   r7   rh   Ú
ValueErrorr(   rœ   r�   r–   r,   )r#   rq   rž   rŸ   Zadrr    r$   r$   r%   r¡   ×  s    $zEthereumAddress.convertNr¢   r$   r$   r$   r%   r¨   Í  s   r¨   c                 C   s   t j| tƒ d�}|S )z7
    Prompt user for an Ethereum (public) address.
    )r1   )r’   r¥   r¨   )r¦   rq   r$   r$   r%   Úprompt_for_ethereum_addressã  s    r¬   c                   @   s$   e Zd ZdZdZdd„ Zdd„ ZdS )Ú
PrivateKeyz2
    Private key (32 bytes in HEX) validator.
    zPrivate keyc                 C   s   t j | ¡ || _d S r™   )r’   r›   r&   Ú_key_len)r#   Úkey_lenr$   r$   r%   r&   ò  s    zPrivateKey.__init__c              
   C   sž   z`t t|ƒ}|d d… dkr0t |dd … ¡}n
t |¡}t|ƒ| jkr^td | jt|ƒ¡ƒ‚W n4 tk
r” } z|  	t
t|ƒƒ¡ W 5 d }~X Y nX |S d S )Nr0   )Ú0xz\xz-key length must be {} bytes, but was {} bytes)r   r   r)   r7   rh   r®   r«   r(   rœ   r�   r–   r,   )r#   rq   rž   rŸ   Úkeyr    r$   r$   r%   r¡   ö  s    

$zPrivateKey.convertNr¢   r$   r$   r$   r%   r­   ë  s   r­   c                 C   s   t j| t|ƒ|d�}|S )z@
    Prompt user for a binary key of given length (in HEX).
    r£   )r’   r¥   r­   )r¦   r¯   r¤   rq   r$   r$   r%   Úprompt_for_key  s    r²   aý  [default]
# username used with this profile
username={username}

# user email used with the profile (e.g. for verification emails)
email={email}

# XBR network node used as a directory server and gateway to XBR smart contracts
network_url={network_url}

# WAMP realm on network node, usually "xbrnetwork"
network_realm={network_realm}

# user private WAMP-cryptosign key (for client authentication)
cskey={cskey}

# user private Ethereum key (for signing transactions and e2e data encryption)
ethkey={ethkey}
c                 C   s„  | pd} |pd}|pd}|pd}t j | ¡}t j |¡sVt  |¡ t d t|ƒ¡¡ t j 	|d¡}t j 
|¡�sLt d t|ƒ¡¡ t|dƒ�¶}td	|d
�}	tjdt|d�}
tdddt t  d¡¡ ¡  d
�}tdddt t  d¡¡ ¡  d
�}tjdt|d�}tjdt|d�}| tj|	|
||||d�¡ t d t|ƒ¡¡ W 5 Q R X t|ƒ}| ¡  |j |d ¡}|�s€t d |¡¡‚|S )Nz~/.xbrnetworkr¤   zwss://planet.xbr.network/wsZ
xbrnetworkz#created new local user directory {}z
config.inizcreating new user profile "{}"Úwz7enter the WAMP router URL of the network directory node)r¤   z:enter the WAMP realm to join on the network directory noder£   zyour private WAMP client keyr}   r°   zyour private Etherum keyz user email used for with profilez user name used with this profile)r   r   r   r   r   r   z'created new local user configuration {}zno such profile: "{}")rD   r   Ú
expanduserÚisdirÚmkdirr’   Zechor(   r—   ri   r   rj   r§   r¥   r,   r²   r)   r*   rb   r+   r_   Ú_DEFAULT_CONFIGrC   rŒ   rK   ÚgetZClickException)Zdotdirrn   Zdefault_urlZdefault_realmZdefault_emailZdefault_usernameZ
config_dirrH   Úfr   r   r   r   r   r   Z
config_objZprofile_objr$   r$   r%   Úload_or_create_profile,  s<    
""  ÿrº   )N)N)NNNNNN)0rD   r]   Úsysr2   rf   r)   rY   Útypingr   r   r   r’   rc   rª   Únumpyr5   Útimer   Zeth_utils.conversionsr   r   Zautobahn.websocket.utilr   Zautobahn.xbr._walletr	   r‘   ZcoloramaÚtermÚplatformÚenvironÚpopÚinitÚImportErrorrŽ   r   rC   Z_DEFAULT_CFC_URLr–   r—   r›   r˜   r§   r¨   r¬   r­   r²   r·   rº   r$   r$   r$   r%   Ú<module>   sX    G 

	