
    gh#                         d Z ddlZddlmZmZmZmZmZmZ ddl	m
Z
 ddlZddlZddl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 i Zd	 Zd
 Zd Zd Zd Zd Zd Zy)z*
Google OAuth authentication for SQLGenAI
    N)requestredirecturl_forcurrent_appsessionjsonify)
login_userdatetime	timedelta)db)UserSubscription)SUBSCRIPTION_PLANSc                    t        j                         t        d      z   }|t        | <   t        j	                         D cg c]  \  }}|t        j                         k  s|! }}}|D ]  }t        j                  |d        | S c c}}w )z+Store OAuth state with 10-minute expiration
   )minutesN)r   utcnowr   _oauth_statesitemspop)state
expirationsexpexpired_statess        %/var/www/html/app/auth/google_auth.pystore_oauth_stater      sz    "Yr%::J%M%&3&9&9&;WFAssX__EV?VaWNW #!T"#L Xs   B"Bc                     | syt         j                  |       }|r|t        j                         k  ryt         j	                  | d       y)z)Verify OAuth state and remove it if validFNT)r   getr   r   r   )r   r   s     r   verify_oauth_stater!      s?    ""5)Jhoo&77eT"    c                  j    t        j                  t        j                  d         j	                         S )z-Get Google's OAuth 2.0 provider configurationGOOGLE_DISCOVERY_URL)requestsr    r   configjson r"   r   get_google_provider_cfgr)   '   s&    <<**+ABCHHJJr"   c                  l   t               } | d   }t        j                  d      }t        |       |t        d<   dt        _        t        j                  j                  d|        t        j                  j                  d      xs t        dd      }| d	t        j                  d
    d| d| d|dS )z%Generate the Google authorization URLauthorization_endpoint   google_oauth_stateTzGenerated OAuth state: GOOGLE_REDIRECT_URIgoogle_auth.google_callback	_externalz?response_type=code&client_id=GOOGLE_CLIENT_IDz&redirect_uri=z&scope=email%20profile&state=z&prompt=consent)urlr   )r)   secrets	token_hexr   r   modifiedr   loggerinfor&   r    r   )google_provider_cfgr+   r   redirect_uris       r   get_google_auth_urlr;   +   s     2301IJ b!E e %*G !G 5eW=> %%))*?@zGLiuyDzL )))GHZHZ[mHnGoo}  K  ~L  Li  jo  ip  p  @ r"   c                 	   t         j                  j                  d|        t        |      }|sat	        j
                  d      }t         j                  j                  d|        |r(||k(  r#d}t	        j                  dd       dt        _        |sdddd	fS t               }|d
   }t         j                  j                  d      xs t        dd      }t        |t        j                  ||       \  }}}	t        j                  |||	t         j                  d   t         j                  d   f      }
|
j!                         }d|v rdd|d    dd	fS |d   }t        j
                  |dd|d    i      }|j!                         }|j                  d      sdddd	fS |d   }|j                  dd      j#                  dd      }t%        |      d kD  r|d    nd}t%        |      dkD  r|d   nd}|j                  d!d      }t&        j(                  j+                  |"      j-                         }|s|j#                  d#      d    }|}d}t&        j(                  j+                  |$      j-                         r:| | }|dz  }t&        j(                  j+                  |$      j-                         r:t'        ||||d%      }|j/                  t1        j2                  d&             t1        j2                  d'      |_        t6        j                  j9                  |       t6        j                  j;                          t=        |       nQt1        j2                  d'      |_        t?        j@                         |_!        t6        j                  j;                          tE        |       tF        j(                  j+                  |jH                  (      j-                         }dd)|j4                  |jH                  |jJ                  |jL                  |jN                  xs d|jP                  xs d|jR                  xs d|jT                  xs d|jV                  |r|jX                  nd|r|jZ                  nd|r|j\                  ndd*d+	d,S )-z Handle the Google OAuth callbackzReceived state: r-   zStored session state: TNFzInvalid state parameter)successmessagei  token_endpointr.   r/   r0   )authorization_responseredirect_urlcoder2   GOOGLE_CLIENT_SECRET)headersdataautherrorzToken error: userinfo_endpointAuthorizationzBearer access_token)rD   email_verifiedz#User email not verified with Googleemailname     r   picture)rL   @)username)rL   rS   
first_name	last_name	is_activer,       )user_idzLogin successful)plan_idstatus	is_annual)	idrL   rS   rT   rU   company	job_titleis_adminsubscription)r=   r>   tokenuser)/r   r7   r8   r!   r   r    r   r6   r)   r&   r   prepare_token_requestr   r3   r%   postr'   splitlenr   query	filter_byfirstset_passwordr4   r5   
auth_tokenr   addcommitcreate_free_subscriptionr   r   
last_loginr	   r   r\   rL   rS   rT   rU   r]   r^   r_   rY   rZ   r[   )rB   r   is_valid_statestored_stater9   r?   rA   	token_urlrD   bodytoken_response
token_datarH   userinfo_responseuserinforL   
name_partsrT   rU   rQ   rb   rS   base_usernamecounterr`   s                            r   handle_google_callbackr{   G   s7    .ug67 (.N {{#78"8 GHE\1!NKK,d3#G -FGLL 23()9:N %%))*?@zGLiuyDzL4&{{!	 Iw ]]  !34k6H6HI_6`a	N  $$&J* }Z=P<Q-RSUXXX ,,?@  GJ~,F+G"HI !%%'H <<() -RSUXXX WEfb)//Q7J"%j/A"5A2J!$Z1!4
1"Ill9b)G ::e,224D;;s#A&  jj""H"5;;='	2HqLG jj""H"5;;=
 !
 	'++B/0 "++B/ 	

t


 	!& "++B/"//+


 t  %%///@FFHL %''ZZ///R-2||)r-23?<//T1=,--47C\33
	 r"   c                 `    | ddid||t         j                  d   t         j                  d   dfS )z$Prepare the token request parameterszContent-Typez!application/x-www-form-urlencodedauthorization_coder2   rC   )
grant_typerB   r:   	client_idclient_secret)r   r&   )r?   r@   rA   rB   s       r   rc   rc      sJ     	?	
 /($++,>?(//0FG	
 r"   c                    ddl m }m} ddlm} t	        j
                  di       }|j                  di       }|j                  dd      }|j                  j                  d      j                         }|j                  rd|j                  vr3||_	        t        j                  j                          t        d	|        t        | j                  dd
 |j                           |j                           |d      z   ddt#        j$                  d             }t        j                  j'                  |       t        j                  j                          |S )z)Create a free subscription for a new userr   r
   )SubscriptionPlanfreefeaturesquery_limitr   )rY   z-Updated free plan features with query_limit: activeim  )daysFfree_   )rX   rY   rZ   
start_dateend_dater[   subscription_id)r   r   app.auth.modelsr   r   r    rg   rh   ri   r   r   r   rm   printr   r\   r   r4   r5   rl   )	rb   r   r   r   free_plan_configfree_plan_featuresr   	free_planr`   s	            r   rn   rn      s$   ,0 *--fb9)--j"= %((;K !&&000@FFHI i6H6H!H/	


=k]KL  "8??$ "YC%88 1 1! 456L JJNN< JJr"   )__doc__osflaskr   r   r   r   r   r   flask_loginr	   r%   r'   r4   r   r   app.extensionsr   r   r   r   app.subscription_configr   r   r   r!   r)   r;   r{   rc   rn   r(   r"   r   <module>r      sZ    
 K K "    (  . 6 	K8JX #r"   