
    i              	       $   d dl mZmZmZmZmZ d dlmZm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mZmZ d dl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Zd dlZ ed	e      Zi Zi Z d
 Z! ejD                  d       ejD                  d       ejD                  dd      dddd ejD                  d       ejD                  d       ejD                  dd      dddd ejD                  d       ejD                  d       ejD                  dd      ddd dd!Z#d" Z$ e$        ejK                  d#d$g%      d&        Z& e'       Z(ejK                  d'd(g%      d)        Z)d* Z*d+ Z+d, Z,d- Z-d. Z.ejK                  d/d(g%      d0        Z/ejK                  d1d(g%      d2        Z0ejK                  d3d(g%      d4        Z1ejK                  d5d$g%      d6        Z2ejK                  d7d$g%      d8        Z3ejK                  d9d(g%      d:        Z4ejK                  d;d(g%      d<        Z5ejK                  d=d(g%      d>        Z6d? Z7d@ Z8ejK                  dAd(g%      dB        Z9ejK                  dCd(g%      dD        Z:ejK                  dEd(g%      dF        Z;y)G    )	Blueprintrequestjsonifysessioncurrent_app)dbUser)UserProfileOAuthAccountOAuthProviderN)datetime	timedelta)MIMEText)MIMEMultipart)generate_password_hashauthc                    	 t        j                  dt        j                  dd      | d      }|j	                         }t        d|        |j                  dd      S # t        $ r!}t        d	t        |              Y d
}~yd
}~ww xY w)u   hCaptcha 토큰 검증zhttps://hcaptcha.com/siteverifyHCAPTCHA_SECRET_KEY*0x0000000000000000000000000000000000000000)secretresponse)datau   hCaptcha 검증 결과: successFu   hCaptcha 검증 오류: N)	requestspostosgetenvjsonprintget	Exceptionstr)tokenr   resultes       D/home/kdj-ubuntu1/mlink_AI_Server/mlink-backend/./src/routes/auth.pyverify_hcaptchar'      s    ==!Bii 57cdJ
 
 (12zz)U++ (Q12s   AA   	B
)BB
KAKAO_CLIENT_IDKAKAO_CLIENT_SECRETKAKAO_REDIRECT_URIz/http://localhost:3001/auth/oauth/kakao/callbackz'https://kauth.kakao.com/oauth/authorizez#https://kauth.kakao.com/oauth/tokenz!https://kapi.kakao.com/v2/user/me)	client_idclient_secretredirect_uriauth_url	token_urluser_info_urlNAVER_CLIENT_IDNAVER_CLIENT_SECRETNAVER_REDIRECT_URIz/http://localhost:3001/auth/oauth/naver/callbackz(https://nid.naver.com/oauth2.0/authorizez$https://nid.naver.com/oauth2.0/tokenz#https://openapi.naver.com/v1/nid/meGOOGLE_CLIENT_IDGOOGLE_CLIENT_SECRETGOOGLE_REDIRECT_URIz0http://localhost:3001/auth/oauth/google/callbackz,https://accounts.google.com/o/oauth2/v2/authz#https://oauth2.googleapis.com/tokenz-https://www.googleapis.com/oauth2/v2/userinfo)kakaonavergooglec                  J   g } t         j                         D ]T  \  }}|d   s"| j                  |j                          d       |d   r3| j                  |j                          d       V | r)t	        ddj                  |               t	        d       yt	        d	       y
)u   OAuth 설정 검증r+   
_CLIENT_IDr,   _CLIENT_SECRETu<   ⚠️  OAuth 환경변수가 설정되지 않았습니다: z, uN   📝 .env 파일을 생성하고 필요한 환경변수를 설정해주세요.Fu7   ✅ OAuth 환경변수가 모두 설정되었습니다.T)OAUTH_CONFIGitemsappendupperr   join)missing_varsproviderconfigs      r&   validate_oauth_configrE   G   s    L(..0&k"8>>#3"4J ?@o&8>>#3"4N CD	 1 LTYYWcMdLefg^_	
CD    z /api/auth/oauth/<provider>/loginGET)methodsc                     | t         vrt        ddi      dfS t         |    }|d    d|d    d|d    d	}| d
k(  r|dz  }n
| dk(  r|dz  }t        d|i      S )u   OAuth 로그인 URL 생성error-   지원하지 않는 OAuth 제공자입니다.  r.   z?client_id=r+   z&redirect_uri=r-   z&response_type=coder9   z(&scope=email profile&access_type=offliner8   z&state=random_state_string)r=   r   )rC   rD   r.   s      r&   oauth_loginrM   \   s     |#!PQRTWWW(#F$%[1D0E^TZ[iTjSkk~H8>>	W	00J)**rF   z#/api/auth/oauth/<provider>/callbackPOSTc           	         t        d|  d       t        dt        t        j                                t        dt        j                                 | t
        vrt        d|         t        ddi      dfS t        j                         }|j                  d	      }|st        d
       t        dd
i      dfS |t        v r!t        d|dd  d       t        ddi      dfS t        j                  |       	 t        d|         t        d|dd  d       t        d       t        | |      }|s2t        d|         t        j                  |       t        ddi      dfS t        d|         t        d|        t        d       t        | |d         }|s2t        d|         t        j                  |       t        ddi      dfS t        d|         t        d|        t        d       t        | ||      }|j                  t        d<   |j                   t        d<   t        d |  d!|j                          t        d"t        j                  d       d#t        j                  d              t        j                  |       t        d$|j#                         d%      d&fS # t$        $ r}t        d'|  d(t'        |              d)dl}t        d*|j+                                 d+t'        |      v rd,t'        |      v rd-}nd't'        |       }t        j                  |       t        d|i      d.fcY d}~S d}~ww xY w)/u   OAuth 콜백 처리u   === OAuth 콜백 시작: z ===u   요청 헤더: u   요청 데이터: u%   지원하지 않는 OAuth 제공자: rJ   rK   rL   codeu   인증 코드가 없습니다.u"   이미 처리된 코드입니다: N   z...u(   이미 처리된 인증 코드입니다.u   OAuth 콜백 처리 시작: u   인증 코드: u   === 토큰 획득 시작 ===u   토큰 획득 실패: u$   토큰 획득에 실패했습니다.u   토큰 획득 성공: u   토큰 데이터: u&   === 사용자 정보 획득 시작 ===access_tokenu    사용자 정보 획득 실패: u.   사용자 정보 획득에 실패했습니다.u    사용자 정보 획득 성공: u   사용자 정보: u)   === 사용자 생성/로그인 시작 ===user_idusernameu   OAuth 로그인 성공: z, user_id: u   세션 정보: user_id=z, username=u   OAuth 로그인 성공messageuser   u   OAuth 로그인 실패: z	, error: r   u   에러 상세: Duplicate entry
user.emailuZ   이미 가입된 이메일 주소입니다. 다른 로그인 방법을 사용해주세요.  )r   dictr   headersget_jsonr=   r   r    processed_codesaddget_oauth_tokendiscardget_oauth_user_infocreate_or_login_oauth_useridr   rT   to_dictr!   r"   	traceback
format_exc)	rC   r   rP   
token_data	user_inforW   r%   rg   error_messages	            r&   oauth_callbackrl   o   s[    
%hZt
45	OD12
34	w//12
34|#5hZ@A!PQRTWWWD88FD./!ABCSHH 249+SAB!KLMsRR <6,XJ78Sb	{#./ 	,-$Xt4
*8*56##D)G%KLMsRR&xj12":,/0 	67'*^2LM	4XJ?@##D)G%UVWY\\\0
;<"9+./ 	9:)(IzJ "WW	"mm
(
+dggYGH'I(>'?{7;;WaKbJcde 	%/LLN
   	
  6(
)CF8DE	 4 4 6789 A&<3q6+AxM6s1vh?M 	%/0#556s.   :A*J. %A)J. CJ. .	M
7BM?M
M
c                 |   t         |    }|d   |d   |dd}| dk(  r	|d   |d<   n| dk(  rd|d	<   n| d
k(  r|d   |d<   ddi}t        d|        t        d|d           t        j                  |d   ||      }t        d|j                          t        d|j
                          |j                  dk(  r|j                         S |j                  dk(  r?|j                         }|j                  d      dk(  rt        d       yt        d|        yt        d|j                   d|j
                          y)u   OAuth 액세스 토큰 획득r+   r,   authorization_code)r+   r,   rP   
grant_typer7   r-   r8   random_state_stringstater9   zContent-Typez!application/x-www-form-urlencodedu   토큰 요청 데이터: u   토큰 URL: r/   )r   r]   u   토큰 응답 상태: u   토큰 응답 내용: rX   rL   rJ   invalid_grantu@   OAuth 코드가 이미 사용되었거나 만료되었습니다.Nu   OAuth 토큰 요청 실패: u   토큰 요청 실패:  - )r=   r   r   r   status_codetextr   r    )rC   rP   rD   ri   r]   r   
error_datas          r&   ra   ra      sl   (#F K(0*	J 7%+N%;
>"	W	3
7	X	%+N%;
>" 	;G 
%j\
23	L,-
./}}VK0z7SH	"8#7#7"8
9:	"8==/
23s"}}				$]]_
>>'"o5TU0=>&x';';&<COPrF   c                    t         |    }i }| dk(  r	d| |d<   n| dk(  r	d| |d<   n| dk(  rd| |d<   t        d|d           t        d|        t        j                  |d   |	      }t        d
|j                          t        d|j
                          |j                  dk(  r|j                         S t        d|j                   d|j
                          y)u   OAuth 사용자 정보 획득r7   zBearer Authorizationr8   r9   u   사용자 정보 요청 URL: r0   u    사용자 정보 요청 헤더: )r]   u    사용자 정보 응답 상태: u    사용자 정보 응답 내용: rX   u    사용자 정보 요청 실패: rs   N)r=   r   r   r    rt   ru   r   )rC   rR   rD   r]   r   s        r&   rc   rc      s    (#FG7%,\N#; 	W	%,\N#; 	X	%,\N#; 	)&*A)B
CD	,WI
67||F?3WEH	,X-A-A,B
CD	,X]]O
<=s"}}01E1E0Fc(--YZrF   c           	      
   t        |       }| dk(  rUt        |d         }|j                  di       j                  d      }|j                  di       j                  dd|       }n^| dk(  r5|d	   d   }|d	   j                  d      }|d	   j                  dd
|       }n$| dk(  r|d   }|d   }|j                  dd|       }t        j                  j                  |      j                         }|r|j                  j                  }|d   |_	        |j                  d      |_
        d|v rD|j                  dd      }	t        j                         t        t        |d               z   |_        t        j                         |_        t"        j$                  j'                          |S r`t(        j                  j                  |      j                         }
|
r/t+        d| d|
j,                          |
j.                  }|sSt1        |
j,                        }t"        j$                  j3                  |       t"        j$                  j5                          t        |j,                  |||d   |j                  d            }d|v rD|j                  dd      }	t        j                         t        t        |d               z   |_        t"        j$                  j3                  |       t"        j$                  j'                          |
S t)        |d      }|j7                  dt        t        j                         j9                               z          t"        j$                  j3                  |       t"        j$                  j5                          t1        |j,                        }t"        j$                  j3                  |       t"        j$                  j5                          t        |j,                  |||d   |j                  d            }d|v rD|j                  dd      }	t        j                         t        t        |d               z   |_        t"        j$                  j3                  |       	 t"        j$                  j'                          |S # t:        $ r}t"        j$                  j=                          t+        dt        |              dt        |      v rRdt        |      v rEt(        j                  j                  |      j                         }
|
rt+        d|        |
cY d }~S |d }~ww xY w)!u'   OAuth 사용자 생성 또는 로그인r7   re   kakao_accountemail
propertiesnicknamekakao_r8   r   naver_r9   namegoogle_)rC   provider_user_idrR   refresh_token
expires_inr   )secondsr{   u#   기존 이메일 사용자 발견: u   , 기존 사용자 ID: )rS   )user_profile_idrC   r   rR   r   T)rT   r{   	is_activeoauth_temp_password_u*   OAuth 사용자 생성 중 오류 발생: rY   rZ   uB   중복 이메일로 인한 오류, 기존 사용자로 로그인: N)r   r"   r    r   query	filter_byfirstuser_profilerW   rR   r   r   nowr   int
expires_at
updated_atr   r   commitr	   r   re   profiler
   r`   flushset_password	timestampr!   rollback)rC   rj   ri   provider_enumr   r{   rT   oauth_accountrW   r   existing_userr   r%   s                r&   rd   rd     ss   !(+M 7y/or266w?==r266zVL\K]C^_	W	$Z06*%))'2Z(,,Z6BRAS9TU	X	$T?'"==73C2D)EF !&&00) 1  eg 
 ))..%/%?"&0nn_&E#:%#a8J'/||~	#jYeNfJg8h'hM$#+<<> 


 

,,5,9??A7w>UVcVfVfUghi $++G%m.>.>?

w'

  " ) '

&!1'7(nn_=M z)'^^L!<
+3<<>IcR\]iRjNk<l+l(JJNN=)JJ   D 	,s8<<>3K3K3M/NNOJJNN4JJ $''*GJJNN7JJ !

)/ nn_5M z!^^L!4
#+<<>Ic*UaJbFc4d#d JJNN=!


 K  



:3q6(CDA&<3q6+A JJ00u0=CCEMZ[`Zabc$$
s%   >R 	U'BT=5U;T==Uc                 6    d}t        j                  ||       d uS )Nz0^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$)rematch)r{   patterns     r&   validate_emailr     s    AG88GU#4//rF   c                 ~    t        |       dk  ryt        j                  d|       syt        j                  d|       syy)N   Fz[A-Za-z]z\dT)lenr   search)passwords    r&   validate_passwordr     s6    
8}q99[(+99UH%rF   z/api/auth/registerc                  x   	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }| j                  dd      j	                         }| j                  dd      }|r|r|st        ddi      dfS t        |      d	k  rt        dd
i      dfS t        |      st        ddi      dfS t        |      st        ddi      dfS t        j                  j                  |      j                         }|rt        ddi      dfS t        j                  j                  |      j                         }|rt        ddi      dfS t        ||      }|j                  |       t        j                  j                  |       t        j                  j!                          t        d|j#                         d      dfS # t$        $ rZ}t        j                  j'                          t)        dt+        |              t        ddt+        |       i      dfcY d }~S d }~ww xY w)NrJ      데이터가 필요합니다.rL   rT    r{   r   u$   모든 필드를 입력해주세요.   u/   사용자명은 3자 이상이어야 합니다.+   올바른 이메일 형식이 아닙니다.uP   비밀번호는 8자 이상이며 영문자와 숫자를 포함해야 합니다.rT   +   이미 사용 중인 사용자명입니다.r   u(   이미 사용 중인 이메일입니다.)rT   r{   &   회원가입이 완료되었습니다.rU      u   회원가입 오류: u%   서버 오류가 발생했습니다: r[   )r   r^   r   r    stripr   r   r   r	   r   r   r   r   r   r   r`   r   rf   r!   r   r   r"   )r   rT   r{   r   r   existing_emailrW   r%   s           r&   registerr     s%   /Y!G%DEFKK88J+113"%++-88J+ uHG%KLMsRRx=1G%VWXZ]]]e$G%RSTVYYY *G%wxy{~~~ 

,,h,?EEGG%RSTVYYY--E-:@@BG%OPQSVVV XU3(#


t


?LLN
   	
  Y


%c!fX./#HQ!QRSUXXXYsI   $G A&G G +G G >G >G A8G 	H9AH4.H94H9z/api/auth/loginc                     	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }| j                  dd      }| j                  dd      }|r|st        ddi      dfS |st        dd	i      dfS t        |      st        dd
i      dfS t        j                  j                  |      j                         }|st        ddi      dfS |j                  |      st        ddi      dfS |j                  t        d<   |j                  t        d<   t        d|j                         d      dfS # t        $ r0}t!        dt#        |              t        ddi      dfcY d }~S d }~ww xY w)NrJ   r   rL   r{   r   r   hcaptcha_tokenu0   이메일과 비밀번호를 입력해주세요.u#   hCaptcha 인증이 필요합니다.&   hCaptcha 인증에 실패했습니다.r   u;   이메일 또는 비밀번호가 올바르지 않습니다.  rS   rT   u   로그인 성공rU   rX   u   로그인 오류: $   서버 오류가 발생했습니다.r[   )r   r^   r   r    r   r'   r	   r   r   r   check_passwordre   r   rT   rf   r!   r   r"   )r   r{   r   r   rW   r%   s         r&   loginr     s   )O!G%DEFKK"%++-88J+"2B7HG%WXY[^^^ G%JKLcQQ~.G%MNOQTTT zz##%#0668G%bcdfiii ""8,G%bcdfiii "WW	"mm
)LLN
   	
  O"3q6(+,!GHI3NNOsB   $E AE >E E )>E (E AE 	F%F :F Fz/api/auth/logoutc                      	 t        j                          t        ddi      dfS # t        $ r} t        ddi      dfcY d } ~ S d } ~ ww xY w)NrV   u   로그아웃 되었습니다.rX   rJ   r   r[   )r   clearr   r!   )r%   s    r&   logoutr     sO    O	#BCDcII O!GHI3NNOs   "% 	AAAAz/api/auth/mec                  \   	 t        j                  d      } | st        ddi      dfS t        j                  j                  |       }|s#t        j
                          t        ddi      dfS t        d|j                         i      dfS # t        $ r}t        dd	i      d
fcY d }~S d }~ww xY w)NrS   rJ   u   로그인이 필요합니다.r   u%   사용자를 찾을 수 없습니다.  rW   rX   r   r[   )r   r    r   r	   r   r   rf   r!   rS   rW   r%   s      r&   get_current_userr     s    O++i(G%DEFKKzz~~g&MMOG%LMNPSSS/0#55 O!GHI3NNOs)   %B	 AB	 ,B	 		B+B& B+&B+z/api/auth/checkc                     	 t        j                  d      } | r?t        j                  j                  |       }|rt	        d|j                         d      dfS t	        ddi      dfS # t        $ r}t	        ddi      d	fcY d }~S d }~ww xY w)
NrS   T)authenticatedrW   rX   r   FrJ   r   r[   )r   r    r	   r   r   rf   r!   r   s      r&   
check_authr     s    
O++i(::>>'*Dt||~NOQTTT/0#55 O!GHI3NNOs$   AA' A' '	B	0B>B	B	z/api/auth/find-usernamec                     	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }|st        ddi      dfS t        |      st        ddi      dfS t        j                  j                  |      j                         }|st        dd	i      d
fS t        |j                        dkD  r+|j                  dd dt        |j                        dz
  z  z   n|j                  }t        d|j                  |d      dfS # t        $ r0}t        dt        |              t        ddi      dfcY d}~S d}~ww xY w)u'   이메일을 통한 사용자명 찾기rJ   r   rL   r{   r       이메일을 입력해주세요.r   r   u@   해당 이메일로 가입된 계정을 찾을 수 없습니다.r      N*u    사용자명을 찾았습니다.)rV   rT   masked_usernamerX   u   아이디 찾기 오류: r   r[   )r   r^   r   r    r   r   r	   r   r   r   r   rT   r!   r   r"   )r   r{   rW   r   r%   s        r&   find_usernamer     sn   O!G%DEFKK"%++- G%GHI3NNe$G%RSTVYYY zz##%#0668G%ghiknnn QTTXTaTaPbefPf$--+cS5G!5K.LLlplyly9.
  	 	  O)#a&23!GHI3NNOs5   $D 0D D 2>D 1A)D 	E$%E	EEz/api/auth/reset-passwordc            
         	 t        j                         } | j                  d      }| j                  d      }|st        ddi      dfS t        j
                  j                  |      j                         }|st        ddi      dfS d	j                  t        d
      D cg c]   }t        t        j                  d            " c}      }|t        j                         t        d      z   ddt         |<   	 t#        ||       t        ddi      dfS c c}w # t$        $ r'}t'        d|        t        ddi      dfcY d}~S d}~ww xY w# t$        $ r'}t'        d|        t        ddi      dfcY d}~S d}~ww xY w)u$   비밀번호 재설정 코드 전송r{   r   rJ   u   이메일이 필요합니다.rL   r   @   해당 이메일로 등록된 계정을 찾을 수 없습니다.r   r      
   minutesr   )rP   r   attemptsrV   4   인증 코드가 이메일로 전송되었습니다.rX      이메일 전송 실패: uM   이메일 전송에 실패했습니다. 잠시 후 다시 시도해주세요.r[   Nu   비밀번호 재설정 오류: u?   비밀번호 재설정 처리 중 오류가 발생했습니다.)r   r^   r    r   r	   r   r   r   rA   ranger"   secrets	randbelowr   r   r   password_reset_codessend_reset_emailr!   r   )r   r{   r   rW   _verification_coder%   s          r&   reset_passwordr   @  s   'j!!"23G%DEFKK zz##%#0668G%ghiknnn GGq$RAS):):2)>%?$RS &",,.9R+@@'
U#	|U$56I']^_addd %S  	|-aS12G%tuvx{{{	|  j/s34!bcdfiiijsf   AE 	>E E  %D3E 9D E 	E	"E>E	?E E		E 	E<E71E<7E<z /api/auth/reset-password/confirmc                     	 t        j                         } | j                  d      }| j                  d      }| j                  d      }| j                  d      }t        |||g      st	        ddi      dfS t
        j                  j                  |      j                         }|st	        dd	i      d
fS t        j                  |      }|st	        ddi      dfS t        j                         |d   kD  rt        |= t	        ddi      dfS |d   dk\  rt        |= t	        ddi      dfS |d   |k7  r|dxx   dz  cc<   t	        ddi      dfS t        |      |_        t        j                  j!                          t        |= t	        ddi      dfS # t"        $ r'}t%        d|        t	        ddi      dfcY d}~S d}~ww xY w)u5   비밀번호 재설정 확인 및 비밀번호 변경r{   r   new_passwordr   rJ   u>   이메일, 인증 코드, 새 비밀번호가 필요합니다.rL   r   r   r   >   인증 코드가 만료되었거나 존재하지 않습니다.r   '   인증 코드가 만료되었습니다.r      ua   인증 코드 시도 횟수를 초과했습니다. 새로운 인증 코드를 요청해주세요.rP      +   인증 코드가 올바르지 않습니다.rV   u6   비밀번호가 성공적으로 변경되었습니다.rX   u&   비밀번호 재설정 확인 오류: u<   비밀번호 변경 처리 중 오류가 발생했습니다.r[   N)r   r^   r    allr   r	   r   r   r   r   r   r   r   password_hashr   r   r   r!   r   )r   r{   r   r   r   rW   
reset_datar%   s           r&   confirm_reset_passwordr   l  s   4g!! HH%89xx/"23E,l;<G%efgilll zz##%#0668G%ghiknnn *--e4
G%efgilll <<>J|44$U+G%NOPRUUU j!Q&$U+G  &I  J  K  MP  P  P f!22z"a'"G%RSTVYYY 4LA


 !'	#[\]_bbb g6qc:;!_`acfffgsC   A4F 7>F 6%F /F F *#F AF 	GF=7G=Gc                 ~   t        j                  dd      }t        t        j                  dd            }t        j                  d      }t        j                  d      }t        ||g      st	        d       yd	}d
| d}t               }||d<   | |d<   ||d<   |j                  t        |dd             	 t        j                  ||      }	|	j                          |	j                  ||       |	j                  |       |	j                          t	        d|         y# t        $ r}
t	        d|
         d}
~
ww xY w)u'   비밀번호 재설정 이메일 전송SMTP_SERVERsmtp.gmail.com	SMTP_PORT587SMTP_USERNAMESMTP_PASSWORDP   SMTP 설정이 완료되지 않았습니다. 환경변수를 확인해주세요.Nu   M-Link 비밀번호 재설정uo   
    안녕하세요,
    
    M-Link 비밀번호 재설정을 요청하셨습니다.
    
    인증 코드: u   
    
    이 코드는 10분 후에 만료됩니다.
    본인이 요청하지 않았다면 이 이메일을 무시하세요.
    
    감사합니다.
    M-Link 팀
    FromToSubjectplainutf-8u0   비밀번호 재설정 이메일 전송 완료: r   r   r   r   r   r   r   attachr   smtplibSMTPstarttlsr   send_messagequitr!   r{   r   smtp_server	smtp_portsmtp_usernamesmtp_passwordsubjectbodymsgserverr%   s              r&   r   r     s/    ))M+;<KBIIk512IIIo.MIIo.M}-.`a .G
 && 'D /CCKCIC	NJJxgw/0	k95]M2C @HI )!-.s   7A'D 	D<(D77D<c                    t        j                  dd      }t        t        j                  dd            }t        j                  d      }t        j                  d      }t        ||g      st	        d       yd	}d
| d}t               }||d<   | |d<   ||d<   |j                  t        |dd             	 t        j                  ||      }	|	j                          |	j                  ||       |	j                  |       |	j                          t	        d|         y# t        $ r}
t	        d|
        Y d}
~
yd}
~
ww xY w)   이메일 인증 코드 전송r   r   r   r   r   r   r   Fu   M-Link 이메일 인증uw   
    안녕하세요,
    
    M-Link 회원가입을 위한 이메일 인증 코드입니다.
    
    인증 코드: ub   
    
    이 코드는 5분 후에 만료됩니다.
    
    감사합니다.
    M-Link 팀
    r   r   r   r   r   u'   이메일 인증 코드 전송 완료: Tr   Nr   r   s              r&   send_verification_emailr    s2    ))M+;<KBIIk512IIIo.MIIo.M}-.`a (G
 && 'D /CCKCIC	NJJxgw/0
k95]M2C 7w?@ )!-.s   7A'D 	E (D;;E z/api/auth/send-verificationc            
      &   	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }| j                  dd      j	                         }| j                  dd      j	                         }| j                  dd      j	                         }|st        dd	i      dfS t        |      st        dd
i      dfS |st        ddi      dfS |st        ddi      dfS t        |      st        ddi      dfS |st        ddi      dfS t        |      st        ddi      dfS t        j                  j                  |      j                         }|rt        ddi      dfS t        j                  j                  |      j                         }|rt        ddi      dfS dj                  t        d      D cg c]   }t        t        j                   d            " c}      }|||t#        j$                         t'        d      z   dt(        |<   t+        ||      rt        ddi      dfS t        ddi      dfS c c}w # t,        $ r0}	t/        dt        |	              t        ddi      dfcY d }	~	S d }	~	ww xY w)!r  rJ   r   rL   r{   r   rT   r   r   r   r   u#   사용자명을 입력해주세요.u#   비밀번호를 입력해주세요.ub   비밀번호는 최소 8자 이상이어야 하며, 영문자와 숫자를 포함해야 합니다.u&   hCaptcha 인증을 완료해주세요.r   r   u+   이미 가입된 이메일 주소입니다.r   r   r   r   r   r   )rP   rT   r   r   rV   r   rX   u+   인증 코드 전송에 실패했습니다.r[   u   인증 코드 전송 오류: r   N)r   r^   r   r    r   r   r   r'   r	   r   r   r   rA   r   r"   r   r   r   r   r   email_verification_codesr  r!   r   )
r   r{   rT   r   r   r   existing_usernamer   r   r%   s
             r&   send_verificationr    s   =O!G%DEFKK"%++-88J+11388J+113"2B7==? G%GHI3NNe$G%RSTVYYYG%JKLcQQG%JKLcQQ *G  &J  K  L  NQ  Q  QG%MNOQTTT~.G%MNOQTTT 

,,5,9??AG%RSTVYYY JJ00(0CIIKG%RSTVYYY GGq$RAS):):2)>%?$RS &  ",,.9Q+??	+
 ' #5*;<I']^_adddG%RSTVYYY %S   O-c!fX67!GHI3NNOsr   $I BI 8I I #I 4I I I 9>I 8>I 7I %I4AI I I 	J %JJJz/api/auth/verify-emailc                     	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }| j                  dd      j	                         }|st        ddi      dfS |st        ddi      dfS |t
        vrt        dd	i      dfS t
        |   }t        j                         |d
   kD  rt
        |= t        ddi      dfS |d   |k7  rt        ddi      dfS t        |d   |t        |d               }t        j                  j                  |       t        j                  j                          t
        |= |j                  t        d<   |j                  t        d<   t        d|j!                         d      dfS # t"        $ r0}t%        dt'        |              t        ddi      dfcY d}~S d}~ww xY w)u6   이메일 인증 코드 확인 및 회원가입 완료rJ   r   rL   r{   r   r   r   u$   인증 코드를 입력해주세요.r   r   r   rP   r   rT   r   )rT   r{   r   rS   r   rU   rX   u   이메일 인증 오류: r   r[   N)r   r^   r   r    r   r  r   r   r	   r   r   r   r`   r   re   rT   rf   r!   r   r"   )r   r{   r   stored_datarW   r%   s         r&   verify_emailr  G  s   7O!G%DEFKK"%++- HH%8"=CCE G%GHI3NN G%KLMsRR 00G%efgilll.u5 <<>K55(/G%NOPRUUU v"33G%RSTVYYY  ,0Z1HI
 	

t


 %U+ "WW	"mm
?LLN
   	
  O)#a&23!GHI3NNOsB   $F AF 8F 	F  8F F 0B$F 	G%G	G	Gz/api/auth/verify-userc                     	 t        j                         } | st        ddi      dfS | j                  dd      j	                         }|st        ddi      dfS d}t        |      r/t        j                  j                  |      j                         }n.t        j                  j                  |	      j                         }|st        dd
i      dfS t        d|j                  |j                  dd dt        |j                  j                  d      d         dz
  z  z   dz   |j                  j                  d      d   z   d      dfS # t        $ r0}t        dt!        |              t        ddi      dfcY d}~S d}~ww xY w)u   사용자 존재 여부 확인rJ   r   rL   
identifierr   u4   사용자명 또는 이메일을 입력해주세요.Nr   r   u=   해당 정보로 가입된 계정을 찾을 수 없습니다.r   u   사용자를 찾았습니다.r   r   @r   r   )rV   rT   r{   rX   u   사용자 확인 오류: r   r[   )r   r^   r   r    r   r   r	   r   r   r   rT   r{   r   splitr!   r   r"   )r   r  rW   r%   s       r&   verify_userr    s   O!G%DEFKKXXlB/557
 G%[\]_bbb *%::''j'9??AD::'''<BBDDG%defhkkk6ZZ^cS1A1A#1Fq1I-JQ-N&OORUUX\XbXbXhXhilXmnoXpp
  	 	  O)#a&23!GHI3NNOs0   $E 0E A:E A7E 	F%E?9F?F)<flaskr   r   r   r   r   src.models.userr   r	   src.models.subscriptionr
   r   r   r   r   r   r   r   r   r   r   email.mime.textr   email.mime.multipartr   werkzeug.securityr   hashlibbase64__name__auth_bpr   r  r'   r   r=   rE   routerM   setr_   rl   ra   rc   rd   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   rF   r&   <module>r     sQ   C C $ L L   	 ( 	   $ . 4  
FH
%    ( RYY01"#89!		"68ij=:< RYY01"#89!		"68ij>;> RYY12"#9:!		"79klB:H#8&  1E7C+ D+  %4vhGU6 HU6n,\4sj0
 	#fX60Y 70Yd 	 6(3*O 4*OX 	!F84O 5O 	~w/O 0O  	 5'2O 3O 	(6(;!O <!OF 	)F8<)j =)jV 	1F8D6g E6gp.`.` 	,vh??O @?OB 	'&:9O ;9Ov 	&9 O : OrF   