From b2e08058809322d7a5124d2d2750843bc8835202 Mon Sep 17 00:00:00 2001 From: CPABONG Date: Sun, 24 Aug 2025 18:37:15 +0900 Subject: [PATCH] =?UTF-8?q?=EC=84=B1=EB=8A=A5=EA=B0=9C=EC=84=A0=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=9D=B8=EC=A6=9D=EC=98=A4=EB=A5=98=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=ED=85=94=EB=A0=88=EA=B7=B8=EB=9E=A8=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=ED=8F=AC=ED=95=A8=20=EB=93=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- A_core/__pycache__/settings.cpython-38.pyc | Bin 5001 -> 5007 bytes .../__pycache__/telegram_utils.cpython-38.pyc | Bin 7307 -> 7313 bytes A_core/telegram_utils.py | 16 ++++- B_main/__pycache__/forms.cpython-38.pyc | Bin 8183 -> 8189 bytes B_main/__pycache__/urls.cpython-38.pyc | Bin 836 -> 842 bytes B_main/__pycache__/views.cpython-38.pyc | Bin 9432 -> 9438 bytes C_accounts/__pycache__/views.cpython-38.pyc | Bin 8864 -> 9282 bytes C_accounts/views.py | 57 ++++++++++++++++-- db.sqlite3 | Bin 614400 -> 618496 bytes 9 files changed, 66 insertions(+), 7 deletions(-) diff --git a/A_core/__pycache__/settings.cpython-38.pyc b/A_core/__pycache__/settings.cpython-38.pyc index fa057f36ec5d7f4ae06a395a13615e67a5bac1c4..79c2e8f995219f13a1e263d88c7d04b5bce46cbb 100644 GIT binary patch delta 147 zcmeBF?^ovv<>lpK0D}3qH*)21Gv1n9$z8{IYx56oJyroRpm>ouh>!pgl9SB@i`e8r zOvTCT1j~H=Kui$v%U8cFKc_S|)lferKRG+KNI#&mBqKjhKPf*iy*RTZH9jRPF)uw| kzc@1|C(+S2AU-)iuOu-2^Z)<= delta 141 zcmeBI?^Nds<>lpK0D@~bH*)21Ge%9W신라AMP 비밀번호 찾기 알림 📱 전화번호: {phone} +{status_icon} 상태: {status_text} ⏰ 요청시간: {current_time} 🌐 접속 정보: @@ -248,7 +260,7 @@ def send_password_reset_notification(phone, request): • 기기: {device_info} • 브라우저: {browser_info} -💡 비밀번호 찾기 요청이 있습니다! +💡 {action_text} """.strip() # 비동기로 전송 (사용자 대기시간 없음) diff --git a/B_main/__pycache__/forms.cpython-38.pyc b/B_main/__pycache__/forms.cpython-38.pyc index 9aa304e778685693c60dcac3d74b4445d6d69621..0efde0a77c84636b8e5e6593d63f985ba9418fb3 100644 GIT binary patch delta 91 zcmexv|JR-~l$V!_0SH7lavouH_R=rQ&neAKHPlbZPtHy)(hsOC$;i*sPs-0rFU~AU tjZeu+%uCPLFV4)#Np$oLh)>SXD@jZ)i4QZ$9UPMY diff --git a/B_main/__pycache__/views.cpython-38.pyc b/B_main/__pycache__/views.cpython-38.pyc index dbd928a8556224c80cca2b10b1e4b7217e796263..0c89020e4d6ab46951817c23d1b30ad13ddbdc95 100644 GIT binary patch delta 92 zcmccNdC!w8l$V!_0SM;b-pI9_#o0^0EI+3-H`P!-B|kYkwMajpvLquvPd_O?FTFUk uBsD%ID={xUU%xmrCnwR-Hy}PaKd&S)xg#nvUtDkddAIXkr|CZMt;BR?-DDL*g0II|=*J|!zL oFFik|I5Q_F(a|>`J~=WQ=Bf%aR=O<5 z7QERBD?uVqCy}Xxh$OV+sE9H;f=19`WGbew?k8aqX#lk4F#~Xtry^Kh>Lt-QFZ&1T zfmRTah7m^rkG&93%3Wr#9&DfrZiiySh{P?KBrE~y?B;cn9n=FIN%tr=u~w`WAv>X5 z7wG}O`{HPW15F~T<Y(x(^&^O4k_13e|C@?X#!pnLibgNH84Q)l z1J9tNA*-w1L6~+Cu_0jS^lcE-_9Nl8AKbW2IC4XfqW-fPf*F@yfCk#q6ZP9P0MgqF zJOyW8+b%uosz+$B0g3_-N7_C18V6>o|xQ9JZE2;Q|*OM>>7OP^R4q|npaP@ z&aFZ&`z4err|`IkqhxaLO&O+98iil<2FShk+7~}+o;uk)_2r=2TKv?$Q2q0pIf&V{ zd9}HG-L3=DrTNy`k6R1h+Fx9^=U45;GlR1|cm0FBl{Jiai#o}$8(|NAi4{Uc=>Q95(mrV=&WS{fJ_{0~f#$UgA(^t&+(QNRlBf}x0BtOydsWGtZd@t@*gN-To?E6La+0zS6#dg4a` Z8!JOQzZ3D|N>jazJ#hiML-6(s_S(^Kr0RusX_rMjS>h-0|gn3<7a-@&KlN( z5YeoncGaqvNRb9{Nh+b>a{bKnQEzQ-x6=RF_%m&#vFZ$d-5)i1+YTFF3DRVcYOzfg zxEO0Og>;XGNs$B-vou)Yy2?j1Oo>#S=n>3SM5<|k<&jY5NuG++kb!KEAt%jEp^J3H zLQ|NK^A!7{{3kiNZt+Z<>5+(HH3Iqb1nkg&p^)(`3=4gWKtZIp$gg@tDFFvY+PT$y zXi*|8tVkk8iSL3NCXhdhwTm7>Hul844qlk>e@D$@11A%oXlCnyJrF&PqBBYY8r9Kg zb}!C@(_>+dAIJ>zA}?}90uwDAO}v56u*ICni0q(+2}1)TNig3ozg)Xa_C!uYeZJa~sR4 zW!u6YEL#iC3LBR_jdL4byT%Jmr%BPsu?-p)L?Ip#!#!L9My~v$aOBo#TtvTR)tY;7 zJfhdh6443%H`X%I#u-Y~3n#+F4dS!!iSO)L|7bw|*hkabJCpOyc-n)L5nUqXQ}Us+ zDd*g_d^U0{5nRGsE$>)k^0`}(f4iKmmE_fNM}F;E=dR;fu%O_wf-4AREoiE^rJ$|g zI|a)KWxAVs+-(GYZM7kP8htOfij(xVd{R8*<`jo1s3Pp@%Sa2R2lpt8&7drbYRUH*M@-f@t!Ge2JPe&W|P>EkiT?x87Ms=llPT?=V{Hzbn1e=r8?^ PsTb5rGHN>b9cA=CnQ97! diff --git a/C_accounts/views.py b/C_accounts/views.py index 3f0c76e..019535c 100644 --- a/C_accounts/views.py +++ b/C_accounts/views.py @@ -197,8 +197,37 @@ def password_change(request): # 모드1: 비밀번호 찾기 (로그인하지 않은 상태) def password_reset(request): """비밀번호 찾기 뷰""" - # 세션 초기화 - if 'password_reset_step' not in request.session: + + # GET 요청 시 세션 상태에 따른 처리 + if request.method == 'GET': + # 강제 리셋 파라미터 확인 + force_reset = request.GET.get('reset', '').lower() == 'true' + + current_step = request.session.get('password_reset_step', 1) + current_verified = request.session.get('password_reset_verified', False) + + # 강제 리셋이거나, 2단계 인증된 상태가 아닌 경우 세션 초기화 + if force_reset or not (current_step == 2 and current_verified): + # 기존 비밀번호 찾기 세션 모두 제거 + for key in ['password_reset_step', 'password_reset_code', 'password_reset_phone', + 'password_reset_verified', 'password_reset_code_sent_at']: + request.session.pop(key, None) + + # 새로운 세션 시작 + request.session['password_reset_step'] = 1 + request.session['password_reset_code'] = None + request.session['password_reset_phone'] = None + request.session['password_reset_verified'] = False + + if force_reset: + print("[DEBUG] 비밀번호 찾기 세션 강제 초기화됨 (reset=true)") + else: + print("[DEBUG] 비밀번호 찾기 세션 초기화됨 (GET 요청)") + else: + print("[DEBUG] 비밀번호 찾기 2단계 인증된 상태 - 세션 유지") + + # 세션 초기화 (POST 요청 시에도 세션이 없으면 초기화) + elif 'password_reset_step' not in request.session: request.session['password_reset_step'] = 1 request.session['password_reset_code'] = None request.session['password_reset_phone'] = None @@ -219,7 +248,25 @@ def password_reset(request): form1 = PasswordResetStep1Form(request.POST) if form1.is_valid(): phone = form1.cleaned_data['phone'] - # 인증번호 생성 및 실제 SMS 발송 + + # 먼저 해당 전화번호로 가입된 사용자가 있는지 확인 + try: + user = User.objects.get(username=phone) + print(f"[DEBUG] 비밀번호 찾기: 등록된 사용자 확인됨 - {phone}") + except User.DoesNotExist: + print(f"[DEBUG] 비밀번호 찾기: 등록되지 않은 전화번호 - {phone}") + + # 미등록 사용자 시도에 대한 텔레그램 알림 전송 + from A_core.telegram_utils import send_password_reset_notification + send_password_reset_notification(phone, request, user_exists=False) + + error = '등록되지 않은 전화번호입니다. 회원가입을 먼저 진행해주세요.' + form1 = PasswordResetStep1Form(request.POST) + return render(request, 'C_accounts/password_reset.html', { + 'step': 1, 'form1': form1, 'code_sent': False, 'error': error, 'message': None + }) + + # 등록된 사용자인 경우에만 인증번호 생성 및 SMS 발송 verification_code = str(random.randint(100000, 999999)) # 실제 SMS 발송 @@ -234,9 +281,9 @@ def password_reset(request): code_sent = True print(f"[DEBUG] 비밀번호 찾기 SMS 발송 성공: {phone} - {verification_code}") - # 텔레그램 알림 전송 (비동기) + # 텔레그램 알림 전송 (비동기) - 등록된 사용자 from A_core.telegram_utils import send_password_reset_notification - send_password_reset_notification(phone, request) + send_password_reset_notification(phone, request, user_exists=True) else: error = '인증번호 발송에 실패했습니다. 잠시 후 다시 시도해주세요.' print(f"[DEBUG] 비밀번호 찾기 SMS 발송 실패: {sms_result['error']}") diff --git a/db.sqlite3 b/db.sqlite3 index c0ca4c7d715bb3781260aeda7be82dc0cf4906bc..f0798e562aa646e0d65903e278384a5d99eafcfa 100644 GIT binary patch delta 1309 zcmah}O=u%!7@kR*X0mHCxUQ92Xv0ExSz*HbCX*c2%_KAVoiu+<(tyOtB$NNlOeT|` zg0$Hp3Lf0Gi_wc)58h-|dI$)jCl`c5VRiAcP`#+&L3{9^h)#PdWub?M@B7~GeP3Rl z=lQ(d-<)sW6*%ffZ4#D0gHk8+1|0W@^sk?90PXAMnT`stPfc{n^(~ zAl7E~TECiFkDwbSV|5)tQG=s^^_7zria_Y{K=L+5N=Fc?L(wgbb&aU%!-^)C=_>Hv zN!IjX$mX0`e}(>jX~nbzTml!t=XNeXx#WjFg%SG))+Ni^=7&ab5#S89ZeD+E;qM^+ zi+WE#{$%d;sOllRK6jT?$rk3$73s*7(xA~GbCgfajq;@ei=k4V?wLw^Hhk0d<&61v6rFCw+Gp4(9W%7cB z-y!@L3GS*!$6QlmW5cn3E0s=q+nbvmS)~djKaOICC%93$(2rEJQhrF+QD)@sMqA-B zR<2d}LDJo8XPHd3n=B);lF6l+c$H_~E~cE>(bUBH5eh9o~pNtZX6GKa>-0!!-wgrhl=?ElD3J99gLtO zI#=K~68U(l(MJfhrez{*D(CkX5q}C#_8R;-Ue3I$$s3a^1~0Z}`eo~^84Y4a{bq}e z)dK!hx=N4Tqq0zp#R{z0N!QxUNMXupLg@GV1!6Fi=rG44G&NGhs8H_c9LvN!8qp;p zH7(>{C)H+6rgafT);KOw3r1SK&1P0mGuTkBMKGi&^(rD;9V=^FVXMutY6ZwDhf8+ni|AzlL|0Djp z{5SY710|d$8!9MlcAC)2&la5TT3#8^e0Ki!v-26v1DFe$oTjsXU_8Z~1Z2!>;1Fm0 zwAoO>j8RUW*^$Y}z{phBz(Uu^M8Uw)%GAut)IiU~!raKnV!Fd8Mnh4cpfOO~RL{)P z#Kh8oVFF0gG?wD-EEqm9@TPH^avYn?w?IaW zQG)9u|81`2yjR)wv+J{X^DFV#v8YbATA(~V^#X?|6Zfj^RTntcGf#iv!l}T-Fk!p* z6%IB=#=_}#;j9YVi>`90GftklOl|xAYaFhe%ogmAr?WrcP@it_fWwQ4qZ;TPXLc4< zW?!c1^~-#(3ftLVaQqUN1%?|pqa-6wGxs$vM~*f8y1X;krCB?e*D*;m zN&Y6xPR2ife`c@bknivLW6;u>d