a
    !fg                     @   s  d dl Z d dl mZ d dlmZ zd dlmZmZ W n   d dlmZmZ Y n0 d dlZd dl	Z	d dl
mZ d dlZd dlmZ ddlmZ d dlZd dl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Zd dlm Z  d dl!Z!dd Z"G dd dZ#G dd dZ$G dd dZ%G dd dZ&dd Z'dd Z(dd Z)G dd  d Z*G d!d" d"Z+G d#d$ d$eZ,G d%d& d&eZ-G d'd( d(Z.dS ))    N)Session)	HTTPError)	urlencodequote	randrange)OrderedDict   )	SSEClient)ServiceAccountCredentials)storage)is_appengine_sandbox)	appengine)uuid4)RSAc                 C   s   t | S N)Firebase)config r   R/var/www/html/python-backend/venv/lib/python3.9/site-packages/pyrebase/pyrebase.pyinitialize_app   s    r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )r   z Firebase Interface c                 C   s   |d | _ |d | _|d | _|d | _d | _t | _|drg d}t|d }|t	u rpt
|d || _|tu rt
|d || _t rtjdd}ntjjdd}d	D ]}| j|| qd S )
NZapiKeyZ
authDomainZdatabaseURLZstorageBucketZserviceAccount)z1https://www.googleapis.com/auth/firebase.databasez.https://www.googleapis.com/auth/userinfo.emailz.https://www.googleapis.com/auth/cloud-platform   )max_retries)zhttp://zhttps://)api_keyZauth_domaindatabase_urlstorage_bucketcredentialsrequestsr   gettypestrr   Zfrom_json_keyfile_namedictZfrom_json_keyfile_dictr   r   ZAppEngineAdapteradaptersHTTPAdaptermount)selfr   ZscopesZservice_account_typeadapterschemer   r   r   __init__"   s$    





zFirebase.__init__c                 C   s   t | j| j| jS r   )Authr   r   r   r%   r   r   r   auth?   s    zFirebase.authc                 C   s   t | j| j| j| jS r   )Databaser   r   r   r   r*   r   r   r   databaseB   s    zFirebase.databasec                 C   s   t | j| j| jS r   )Storager   r   r   r*   r   r   r   r   E   s    zFirebase.storageN)__name__
__module____qualname____doc__r(   r+   r-   r   r   r   r   r   r       s
   r   c                   @   s|   e Zd ZdZdd Zdd Zdd Zdd
dZdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdddZdS ) r)   z Authentication Service c                 C   s   || _ d | _|| _|| _d S r   )r   current_userr   r   )r%   r   r   r   r   r   r   r(   K   s    zAuth.__init__c                 C   sP   d | j}ddi}t||dd}tj|||d}t| | | _| S )NzQhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyPassword?key={0}content-typeapplication/json; charset=UTF-8TemailpasswordreturnSecureTokenheadersdataformatr   jsondumpsr   postraise_detailed_errorr3   r%   r7   r8   request_refr;   r<   request_objectr   r   r   sign_in_with_email_and_passwordQ   s    
z$Auth.sign_in_with_email_and_passwordc                 C   sL   d | j}ddi}tddi}tj|||d}t| | | _| S )NPhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/signupNewUser?key={0}r4   r5   r9   Tr:   r=   )r%   rD   r;   r<   rE   r   r   r   sign_in_anonymousZ   s    
zAuth.sign_in_anonymousN<   c                 C   sL   | j j}t| j j}||d|d}|r0||d< tj|d}t||d|S )NzYhttps://identitytoolkit.googleapis.com/google.identity.identitytoolkit.v1.IdentityToolkit)ZisssubZauduidZclaims)minutesZRS256)	r   service_account_emailr   Z	importKeyZ_private_key_pkcs8_pemdatetime	timedeltajwtZgenerate_jwt)r%   rK   Zadditional_claimsZexpiry_minutesrM   Zprivate_keypayloadexpr   r   r   create_custom_tokenc   s    zAuth.create_custom_tokenc                 C   sD   d | j}ddi}td|d}tj|||d}t| | S )NzThttps://www.googleapis.com/identitytoolkit/v3/relyingparty/verifyCustomToken?key={0}r4   r5   T)r9   tokenr:   r>   r   r?   r@   r   rA   rB   )r%   rT   rD   r;   r<   rE   r   r   r   sign_in_with_custom_tokenq   s    zAuth.sign_in_with_custom_tokenc                 C   s`   d | j}ddi}td|d}tj|||d}t| | }|d |d |d d	}|S )
Nz3https://securetoken.googleapis.com/v1/token?key={0}r4   r5   refresh_token)Z	grantTyperefreshTokenr:   Zuser_idid_token)ZuserIdidTokenrX   rU   )r%   rW   rD   r;   r<   rE   Zrequest_object_jsonuserr   r   r   refreshy   s    zAuth.refreshc                 C   sB   d | j}ddi}td|i}tj|||d}t| | S )NzQhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo?key={0}r4   r5   rZ   r:   rU   r%   rY   rD   r;   r<   rE   r   r   r   get_account_info   s    zAuth.get_account_infoc                 C   sD   d | j}ddi}td|d}tj|||d}t| | S )NYhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/getOobConfirmationCode?key={0}r4   r5   ZVERIFY_EMAIL)requestTyperZ   r:   rU   r]   r   r   r   send_email_verification   s    zAuth.send_email_verificationc                 C   sD   d | j}ddi}td|d}tj|||d}t| | S )Nr_   r4   r5   ZPASSWORD_RESET)r`   r7   r:   rU   )r%   r7   rD   r;   r<   rE   r   r   r   send_password_reset_email   s    zAuth.send_password_reset_emailc                 C   sD   d | j}ddi}t||d}tj|||d}t| | S )NzPhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/resetPassword?key={0}r4   r5   )ZoobCodeZnewPasswordr:   rU   )r%   Z
reset_codeZnew_passwordrD   r;   r<   rE   r   r   r   verify_password_reset_code   s    zAuth.verify_password_reset_codec                 C   sF   d | j}ddi}t||dd}tj|||d}t| | S )NrG   r4   r5   Tr6   r:   rU   rC   r   r   r   #create_user_with_email_and_password   s    z(Auth.create_user_with_email_and_passwordc                 C   sB   d | j}ddi}td|i}tj|||d}t| | S )NzPhttps://www.googleapis.com/identitytoolkit/v3/relyingparty/deleteAccount?key={0}r4   r5   rZ   r:   rU   r]   r   r   r   delete_user_account   s    zAuth.delete_user_accountc           	      C   sJ   d | j}ddi}t||||dd}tj|||d}t| | S )z]
        https://firebase.google.com/docs/reference/rest/auth#section-update-profile
        zAhttps://identitytoolkit.googleapis.com/v1/accounts:update?key={0}r4   r5   T)rZ   ZdisplayNameZphotoURLZdeleteAttributer9   r:   rU   )	r%   rY   Zdisplay_nameZ	photo_urlZdelete_attributerD   r;   r<   rE   r   r   r   update_profile   s    zAuth.update_profile)NrI   )NNN)r/   r0   r1   r2   r(   rF   rH   rS   rV   r\   r^   ra   rb   rc   rd   re   rf   r   r   r   r   r)   I   s   		
r)   c                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zd7ddZdi fddZdi fdd Zdi fd!d"Zdi fd#d$Zd8d%d&Zd9d(d)Zd*d+ Zd,d- Zd:d/d0Zdi fd1d2Zdi fd3d4Zd;d5d6ZdS )<r,   z Database Service c                 C   sR   | dsd|dg}n|}|| _|| _|| _|| _d| _i | _d| _g | _	d S )N/ r   )
endswithjoinr   r   r   r   pathbuild_querylast_push_timelast_rand_chars)r%   r   r   r   r   urlr   r   r   r(      s    
zDatabase.__init__c                 C   s   d| j d< | S )N$keyorderByrl   r*   r   r   r   order_by_key   s    
zDatabase.order_by_keyc                 C   s   d| j d< | S )N$valuerq   rr   r*   r   r   r   order_by_value   s    
zDatabase.order_by_valuec                 C   s   || j d< | S )Nrq   rr   )r%   orderr   r   r   order_by_child   s    
zDatabase.order_by_childc                 C   s   || j d< | S )NZstartAtrr   )r%   startr   r   r   start_at   s    
zDatabase.start_atc                 C   s   || j d< | S )NZendAtrr   )r%   endr   r   r   end_at   s    
zDatabase.end_atc                 C   s   || j d< | S )NZequalTorr   )r%   equalr   r   r   equal_to   s    
zDatabase.equal_toc                 C   s   || j d< | S )NZlimitToFirstrr   )r%   Zlimit_firstr   r   r   limit_to_first   s    
zDatabase.limit_to_firstc                 C   s   || j d< | S )NZlimitToLastrr   )r%   Z
limit_lastr   r   r   limit_to_last   s    
zDatabase.limit_to_lastc                 C   s   d| j d< | S )NTshallowrr   r*   r   r   r   r      s    
zDatabase.shallowc                 G   sP   d dd |D }| jr0|  jd|7  _n|drF|dd  }|| _| S )Nrg   c                 S   s   g | ]}t |qS r   )r    ).0argr   r   r   
<listcomp>       z"Database.child.<locals>.<listcomp>/{}r	   rj   rk   r>   
startswithr%   argsnew_pathr   r   r   child   s    
zDatabase.childc                 C   s   i }|r||d< t | jD ]f}t| j| tu rHd| j|  d ||< qt| j| tu rr| j| rhdnd||< q| j| ||< qd| j| jt|}d| _i | _|S )Nr+   "truefalsez{0}{1}.json?{2}rh   )	listrl   r   r    boolr>   r   rk   r   )r%   rT   
parametersparamrD   r   r   r   build_request_url  s    zDatabase.build_request_urlNc                 C   s.   ddi}|s*| j r*| j  j}d| |d< |S )Nr4   r5   zBearer Authorization)r   Zget_access_tokenaccess_token)r%   rT   r;   r   r   r   r   build_headers  s
    
zDatabase.build_headersc           	         s(  | j  | jdd }| |}| |}| jj||d}t| |jf i |}t	|t
rjtt||S t	|ts~t||S  stt| |S  drt| |S d } dr d dkrt| dd d	}n< d d
krt| dd d	}nt|  fddd	}tt||S )Nrg   r;   r   rq   rp   c                 S   s   | d S Nr   r   itemr   r   r   <lambda>6  r   zDatabase.get.<locals>.<lambda>)keyrt   c                 S   s   | d S Nr	   r   r   r   r   r   r   8  r   c                    s$    d | d v | d   d dfS )Nrq   r	   rh   )r   r   rr   r   r   r   :  r   )rl   rk   splitr   r   r   r   rB   r?   
isinstancer   PyreResponseconvert_list_to_pyrer!   convert_to_pyreitemskeyssorted)	r%   rT   json_kwargs	query_keyrD   r;   rE   Zrequest_dictZsorted_responser   rr   r   r     s.    





zDatabase.getc                 C   sX   |  | j| j|}d| _| |}| jj||tj|fi |dd}t	| | S Nrh   utf-8r:   )
check_tokenr   rk   r   r   rA   r?   r@   encoderB   r%   r<   rT   r   rD   r;   rE   r   r   r   push=  s    
&zDatabase.pushc                 C   sX   |  | j| j|}d| _| |}| jj||tj|fi |dd}t	| | S r   )
r   r   rk   r   r   putr?   r@   r   rB   r   r   r   r   setE  s    
&zDatabase.setc                 C   sX   |  | j| j|}d| _| |}| jj||tj|fi |dd}t	| | S r   )
r   r   rk   r   r   patchr?   r@   r   rB   r   r   r   r   updateM  s    
&zDatabase.updatec                 C   sB   |  | j| j|}d| _| |}| jj||d}t| | S )Nrh   r   )r   r   rk   r   r   deleterB   r?   )r%   rT   rD   r;   rE   r   r   r   removeU  s    
zDatabase.removeTc                 C   s   |  |}t||| j||S r   )r   Streamr   )r%   stream_handlerrT   	stream_idis_asyncrD   r   r   r   stream]  s    
zDatabase.streamc                 C   s"   |rd |||S d ||S d S )Nz{0}{1}.json?auth={2}z{0}{1}.json)r>   )r%   r   rk   rT   r   r   r   r   a  s    zDatabase.check_tokenc                 C   s   d}t t d }|| jk}|| _dgd }ttddD ]&}||d  ||< t t|d }q<d|}|sdd td	D | _n:tdd
D ].}| j| dkrd| j|< | j|  d7  < qtdd	D ]}||| j|  7 }q|S )Nz@-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyzi  r      @   rh   c                 S   s   g | ]}t d qS )r   r   )r   _r   r   r   r   r  r   z)Database.generate_key.<locals>.<listcomp>      ?   r	   )	inttimerm   reversedrangemathfloorrj   rn   )r%   Z
push_charsnowZduplicate_timeZtime_stamp_charsiZnew_idr   r   r   generate_keyg  s$    



zDatabase.generate_keyFc                    sR   |  }g }|D ]}||j qtt|  fdd|d}tt|| S )Nc                    s   | d   S r   r   r   by_keyr   r   r     r   zDatabase.sort.<locals>.<lambda>)r   reverse)	eachappendr   r   r!   r   r   r   r   )r%   originr   r   pyresZnew_listpyrer<   r   r   r   sort|  s    zDatabase.sortc                 C   sH   |  |}| |}d|d< | jj||d}t| |jd | dS )Nr   zX-Firebase-ETagr   ETagr   value)r   r   r   r   rB   r;   r?   )r%   rT   r   rD   r;   rE   r   r   r   get_etag  s    

zDatabase.get_etagc                 C   s~   |  | j| j|}d| _| |}||d< | jj||tj|fi |dd}|j	dkrn|j
d | dS t| | S )Nrh   if-matchr   r:     r   r   )r   r   rk   r   r   r   r?   r@   r   status_coder;   rB   )r%   r<   etagrT   r   rD   r;   rE   r   r   r   conditional_set  s    
&
zDatabase.conditional_setc                 C   sh   |  | j| j|}d| _| |}||d< | jj||d}|jdkrX|jd | dS t	| | S )Nrh   r   r   r   r   r   )
r   r   rk   r   r   r   r   r;   r?   rB   )r%   r   rT   rD   r;   rE   r   r   r   conditional_remove  s    

zDatabase.conditional_remove)N)N)NNT)F)N)r/   r0   r1   r2   r(   rs   ru   rw   ry   r{   r}   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,      s4   

 



r,   c                   @   sL   e Zd ZdZdd Zdd ZdddZd	d
 ZdddZdd Z	dd Z
dS )r.   z Storage Service c                 C   s>   d| | _ || _|| _d| _|r:tj||d}||| _d S )Nz,https://firebasestorage.googleapis.com/v0/b/rh   )r   project)r   r   r   rk   r   ZClientZ
get_bucketbucket)r%   r   r   r   clientr   r   r   r(     s    
zStorage.__init__c                 G   sF   d |}| jr&|  jd|7  _n|dr<|dd  }|| _| S )Nrg   r   r	   r   r   r   r   r   r     s    

zStorage.childNc           
      C   s   | j }d | _ t|tr"t|d}n|}| jd| }|rhdd| i}| jj|||d}t| |	 S | j
r| j|}	dtt i|	_t|tr|	j|dS |	| |r||	_|	  n | jj||d}t| |	 S d S )	Nrb/o?name={0}r   	Firebase r:   ZfirebaseStorageDownloadTokens)filename)r<   )rk   r   r    openr   r>   r   rA   rB   r?   r   r   blobr   metadataZupload_from_filenameZupload_from_stringcontent_typer   )
r%   filerT   r   rk   Zfile_objectrD   r;   rE   r   r   r   r   r     s.    



zStorage.putc                 C   s^   | j r| j| nF| jd| }|rFdd| i}| jj||d}n| j|}t| d S )Nr   r   r   r   )r   r   Zdelete_blobr   r>   r   r   rB   )r%   namerT   rD   r;   rE   r   r   r   r     s    zStorage.deletec           
      C   s  |  |}|dr |dd  }| jrF| j|}|d urD|| n|rdd| i}tj|d|d}|jdkrt	|d$}|D ]}	|
|	 qW d    n1 s0    Y  nXtj|dd	}|jdkrt	|d$}|D ]}	|
|	 qW d    n1 s0    Y  d S )
Nrg   r	   r   r   T)r   r;      wb)r   )get_urlr   r   r   Zget_blobZdownload_to_filenamer   r   r   r   write)
r%   rk   r   rT   ro   r   r;   rfchunkr   r   r   download  s&    


,zStorage.downloadc                 C   sT   | j }d | _ |dr"|dd  }|r>d| jt|dd|S d| jt|ddS )Nrg   r	   z{0}/o/{1}?alt=media&token={2}rh   )safez{0}/o/{1}?alt=media)rk   r   r>   r   r   )r%   rT   rk   r   r   r   r     s    
zStorage.get_urlc                 C   s
   | j  S r   )r   Z
list_blobsr*   r   r   r   
list_files  s    zStorage.list_files)NN)N)r/   r0   r1   r2   r(   r   r   r   r   r   r   r   r   r   r   r.     s   	

 
	r.   c              
   C   sB   z|    W n0 ty< } zt|| jW Y d }~n
d }~0 0 d S r   )raise_for_statusr   text)rE   er   r   r   rB     s    rB   c                 C   s    g }| D ]}| t| q|S r   )r   Pyrer   	pyre_listr   r   r   r   r   #  s    r   c                 C   s*   g }| D ]}| t| ||g q|S r   )r   r   indexr   r   r   r   r   *  s    r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   s   || _ || _d S r   )r   r   )r%   r   r   r   r   r   r(   2  s    zPyreResponse.__init__c                 C   s
   | j | S r   )r   )r%   r   r   r   r   __getitem__6  s    zPyreResponse.__getitem__c                 C   s|   t | jtrr| jrrg }t | jd  trH| jD ]}||  q0|S | jD ]}|| | f qNt|S | jS d S r   )r   r   r   r   r   r   valr   )r%   r   r   r   r   r   r   9  s    

zPyreResponse.valc                 C   s   | j S r   )r   r*   r   r   r   r   J  s    zPyreResponse.keyc                 C   s   t | jtr| jS d S r   )r   r   r   r*   r   r   r   r   M  s    zPyreResponse.eachN)r/   r0   r1   r(   r   r   r   r   r   r   r   r   r   1  s
   r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )r   c                 C   s
   || _ d S r   r   )r%   r   r   r   r   r(   S  s    zPyre.__init__c                 C   s
   | j d S r   r   r*   r   r   r   r   V  s    zPyre.valc                 C   s
   | j d S r   r   r*   r   r   r   r   Y  s    zPyre.keyN)r/   r0   r1   r(   r   r   r   r   r   r   r   R  s   r   c                   @   s   e Zd ZdZdd ZdS )KeepAuthSessionzR
    A session that doesn't drop Authentication on redirects between domains.
    c                 C   s   d S r   r   )r%   prepared_requestresponser   r   r   rebuild_authb  s    zKeepAuthSession.rebuild_authN)r/   r0   r1   r2   r   r   r   r   r   r   ]  s   r   c                       s0   e Zd Z fddZ fddZdd Z  ZS )ClosableSSEClientc                    s    d| _ tt| j|i | d S )NT)should_connectsuperr   r(   )r%   r   kwargs	__class__r   r   r(   g  s    zClosableSSEClient.__init__c                    s    | j rtt|   nt d S r   )r  r  r   _connectStopIterationr*   r  r   r   r  k  s    zClosableSSEClient._connectc                 C   s<   d| _ d| _| jjjjjjtj	 | jjjjjj
  d S )NFr   )r  retryrespraw_fpfp_sockshutdownsocket	SHUT_RDWRcloser*   r   r   r   r  q  s    zClosableSSEClient.close)r/   r0   r1   r(   r  r  __classcell__r   r   r  r   r   f  s   r   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   s>   || _ || _|| _|| _d | _d | _|r2|   n|   d S r   )r   ro   r   r   ssethreadrx   start_stream)r%   ro   r   r   r   r   r   r   r   r(   y  s    
zStream.__init__c                 C   s
   t  }|S )zW
        Return a custom session object to be passed to the ClosableSSEClient.
        )r   )r%   sessionr   r   r   make_session  s    zStream.make_sessionc                 C   s   t j| jd| _| j  | S )N)target)	threadingThreadr  r  rx   r*   r   r   r   rx     s    
zStream.startc                 C   s\   t | j|  | jd| _| jD ]8}|rt|j}|j|d< | j	rL| j	|d< | 
| qd S )N)r  r   eventr   )r   ro   r  r   r  r?   loadsr<   r  r   r   )r%   msgZmsg_datar   r   r   r    s    


zStream.start_streamc                 C   s>   | j st| j dstd q d| j _| j   | j  | S )Nr	  gMbP?F)r  hasattrr   sleeprunningr  r  rj   r*   r   r   r   r    s    

zStream.closeN)r/   r0   r1   r(   r  rx   r  r  r   r   r   r   r   x  s
   
r   )/r   r   Zrequests.exceptionsr   urllib.parser   r   urllibr?   r   randomr   r   collectionsr   Zpyre_sseclientr
   r  r  Zoauth2client.service_accountr   Zgcloudr   Z+requests.packages.urllib3.contrib.appenginer   Zrequests_toolbelt.adaptersr   uuidr   Z
python_jwtrP   ZCrypto.PublicKeyr   rN   r   r   r)   r,   r.   rB   r   r   r   r   r   r   r   r   r   r   r   <module>   sH   ){ re	!	