From 7d55d293624c0d7cdb0594c248e814e1643bcb97 Mon Sep 17 00:00:00 2001 From: Koncept Kit <63216427+konceptkit@users.noreply.github.com> Date: Thu, 11 Dec 2025 22:18:58 +0700 Subject: [PATCH] Stripe fix and email verification fix --- __pycache__/server.cpython-312.pyc | Bin 138922 -> 139088 bytes server.py | 11 +++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/__pycache__/server.cpython-312.pyc b/__pycache__/server.cpython-312.pyc index 615b9a91b9632a08b407172d6ce6d69c0ce47d47..4c1f9bd042ba4c0defb3e7527e44fb437ab4cb78 100644 GIT binary patch delta 8947 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�#1s^P$_?yW2=J=u}|xrXYiTF)=toebQXF zOJ#ruv)5?cO)iOyu2rH*Zl{DLu%$%1gy0YS^T9EQ6T0otN?D1Nk!sX-2-X_p#Y=9G z6{5#ZJmt=d;++r|>psX7mn!a9mG`lwR3IlRtC7`6^{bt*TiaQ>SJtpp>oZr>U<(Vt zv(({vOA-fnL+8=2A_sg2mj0IaEtkK^nBKH@clGvv6uK1Z6i9BHJR+wRTTj}#$31PP zr4U;WKydt8BD|OJ-yeYcl(&#_gPQy){6}NBN(^MgyeT>!f^>u1!t3%u?T*-y%D7`k zuJBs1{t%XZ8R^rK0pv=Dy$FRM}y;sC__27+sK> z<|X>Pi7=pH7h^p6xPr~i!R;g>Wvj%RqmWoFV=tn~CHT*bJ(5Fv-l;F2WVMvpn0v>| zM*|IriF+U*G1yaA_ku}X>v#H$V-OyHkHsR9w*+qVRQ(q8sK%hy9fK6H*U;V-)$-loPfd@TNl}?6yNBc$XM^6TF4bX$VxdqM-h2)M?1n8szhdjQ@AV*l+MscwWr=#v@}& z#oSRZ9d(N?RB?)mtX>qqegl>8SC#z}a_jG}v&4~$(AUt3Osc=cMt=tbAWB%jgSjwP zT=@>#7`D^!4uYK`q89o=e=(*O>-Rp?)mMC63+)@)Ki9(J@Ua+t2_A+~V)-R_HC`4| zRGP793Y9hlS@ihMA?nfq z`8fT@u@ZZk&2G&rXGLs(1Ak{=sbrT|h=Xj3rHCD-p#wClh5{F+`2V90U|Kw0oN?-Ei1Y3R?`?(x|U1K{qk{I&^AyV|ea5EQAB1 z^$mzdLFqRjb(rKKJ=&S*+mk--GFCoCwWU5OA)Z?IdV=`i26XKt@3{2mN_K+SdRXl; zm8vuMw9I;BBwqCK#1-NF1k5zX^67go;|wRN^~_O{1aHUuZO| zVx$Q@h+9vBEP_QOK_1DUi4j^&0>;*Kt>)wEmZVn%fr%gGuobEi->2p_0(#wNrwHi1 z+Et*@J2RulU-kR8)!~dvRYs*4qaun?eZlCQWppkw%HNFA z4x@y@Xd5tEHfM`Mdwx;5)s~0Pm$;9dVwa+64P%5;(M02G+OLYHLKE8ohQs3gIxqTN zRq>X4DXu9xcTt63fL|KuWV ANB{r; delta 8914 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 d8`UFqEBzswtQH-%T2i&we0BAq{|7|GU4Z}q diff --git a/server.py b/server.py index b51cfb1..fb5a69d 100644 --- a/server.py +++ b/server.py @@ -455,7 +455,8 @@ async def verify_email(token: str, db: Session = Depends(get_db)): user.status = UserStatus.pending_approval user.email_verified = True - user.email_verification_token = None + # Don't clear token immediately - keeps endpoint idempotent for React StrictMode double-calls + # Token will be cleared on first successful login db.commit() db.refresh(user) @@ -498,7 +499,12 @@ async def login(request: LoginRequest, db: Session = Depends(get_db)): ) access_token = create_access_token(data={"sub": str(user.id)}) - + + # Clear verification token on first successful login after verification + if user.email_verified and user.email_verification_token: + user.email_verification_token = None + db.commit() + return { "access_token": access_token, "token_type": "bearer", @@ -509,6 +515,7 @@ async def login(request: LoginRequest, db: Session = Depends(get_db)): "last_name": user.last_name, "status": user.status.value, "role": user.role.value, + "email_verified": user.email_verified, "force_password_change": user.force_password_change } }