From 49e32b571db41261b4328324e84eb0a605d1b2be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 May 2026 12:50:30 +0000 Subject: [PATCH 1/2] fix(tests): stub webauthn in auth_router test fixture to fix import failures Agent-Logs-Url: https://github.com/parkcheolhong/codeAI/sessions/63299979-62f4-489f-a1d2-307336759de9 Co-authored-by: parkcheolhong <111139476+parkcheolhong@users.noreply.github.com> --- backend/__pycache__/auth.cpython-312.pyc | Bin 0 -> 6644 bytes backend/__pycache__/auth_router.cpython-312.pyc | Bin 0 -> 36075 bytes ...router_security.cpython-312-pytest-9.0.3.pyc | Bin 0 -> 16026 bytes ...cs_sanitization.cpython-312-pytest-9.0.3.pyc | Bin 0 -> 11507 bytes 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 backend/__pycache__/auth.cpython-312.pyc create mode 100644 backend/__pycache__/auth_router.cpython-312.pyc create mode 100644 tests/__pycache__/test_auth_router_security.cpython-312-pytest-9.0.3.pyc create mode 100644 tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc diff --git a/backend/__pycache__/auth.cpython-312.pyc b/backend/__pycache__/auth.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ea9aaec67429925fe48fdd32663a02bff55a821 GIT binary patch literal 6644 zcmb7IYit`=cE0l>Iedx|B~uUEV?AtBjwoA>pYkJ=OvSPl*|p?#%-w)Xb4C(nKGd0^ zWeHTOxCSEGUf4$0D{boRs#s$yBP!NS)4)IWN4DAh)jy&sRP;pYrf7?8)-*szDv)(h zpyv)bLnZ5`?FHt(=FFLU&pnUt+<&y$%m~VdpZr(k4`m4bD;{WtEp}G_i9l!u@rWm) zC{SpL0HKb_0I9ZAfP$8c(lI(f$Cv;^U^*&lh#3P$wNFP)F*d-eeI{y-Spt@rHDFc8 zhNvxO57=XlfFo8GC{yQ*QD>|?P);Bc321n$wy07oxZZ}A-%}|N`W^{%HGx{*9H@i&jqnh|hl(%PHN1tlz6Z3p==?VWbvbWauQ;}3-5$+xjN?_Fz^*HSI;6A@tb&;(7;y;tia&4@l}Fb{m#U1xXJ_? z|HpN>wSQeEq$*VkFJ5o;Iyw?0R}*Lg{vZjy7S^y8_}c|eqZuIhI#@HwZ-jqu8zVfM zKgS#G^^l5*56OZYi3tjeYhH-TArGO@r$h1(w5C%dawHKCMKS4#bNzl%Oo$3KJSuxA z#du5@5#qe0*pB!2pY~r43o5Z>byhJ+XlqMVqF zV}sx%Aq?uu$wMKTi^MO5q7iH{5+^4v3UP@`#5qv_eHUf#=R0919=k$GvZ#;=Nihrx zvJk(dFfb7r5wVIZX5sQkD9$G(YzM;Sh$KsjF(L&AB2h3wQ3&xtS-31K>^gIbCI$zA zoDo#xGZt0^R;Ml@m=vQ@Xh87Lin+8Y#Zl@Pc-sa-(ddOx_+oGbOk1&qL*XHT4;GnW z)8e2!Z*3h)#DrGZJ;hi7Ka-#$N^%2dAesIu(=nQ`u3b{osX?$c?#O+QUz@IA1EKwxd(l`hdoA6zeWVq3Uj=#ZO>k% z*4NqT@9PWppE~L94fV3#V_KMifJ&av@uaoV1I?Ndg$QGa3H%dufDdOATYm)Cn;6Cxc)uOr2F;aJ*R6*)p z9$NGQjba3o4__P^6?ef%+z6G26!+o&eyAk8R86*yOM(~~7}NJFw!=#-UFkSflL%~$ zsa$bX-h6ZV&8)R%*}5fd-7>c=V{Oh_YnQF{X>0x5zKnIpDnpf-^N3>2UxHy-E5Tft z%Et~Dm}BL)J%9zaj{z6&f6DNU?#VjDTwis*prsp2Exsj$9(%MnM6v@DNhXqLrs-8;h2AZSrNUuW$s$xdY${F@H`xlnU z?#C9_inDrV^X<(UXMNUM{m6Rq?)jzG6H6OUKBLHT^OPZPKy3N4$(=U2XPf4#W;ZXH zJS!Ia&4beiZ$<9ad@#0T@h#Fm5nH%o222_(gm@8e=Q$f53dIM7mY5KRpy_b}A3xyLm!#QDEwG?5Veugjdh?>4&NGTCxWJyazhiuU}rSznNr!IaE#7m3; z{QNd}ca7v3@X;^k04s*IxnQk$&uW<>0puI5no`6uUEkOFUt_O`)vNz=4(cusE1rZ_ zF%^Ub;NMl~1+mK$6MQm^QU7>xwj~m8Da|TIUKj`^!E@8R5KAaDXrnxCjV8jOXiEW3 zjC*O^xj91kdWS;iXj#fF9KRJMiZj~z`J6|m{dc?bM_DhdzVMV zBjZhgx<-Z2#dWyFdq~}dbi}KZ@vsP~7OF4*1ARG(zCfhckloZcWw^C%$y5z0>oxpA z!W#4Eb|>L6iIvb*HBmf)dv2(dP3tgdcVF<#+1~!{*ZjdQUr$emuk)lrMTNM+sOwdz zP<#w_;*2N67+}qD9ik~#b+LurN#Z$RT-@3#g=kp*$NLe3Ky?~ZPCy0AUvbyoJ@KgS z;6gK056O(XecA0xyL}mV=OSJC*ix5uRQ$WKX`x}!doHxq7QFE>%ZP^NtWqn!_JE(g=F>G0}o}ZHakcx zFgg#6Wpta;C?I{;Q>F<@){`pm*?RJ##bl98Q4*OVuE1(|BX5erb;kq^iK&ri@pZ=p zT#=9{MeBaU0EwPqcysArS}(`X1KmI(t0WC; n%y6SNQ)&zE#z8_l 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 F^It=oTO|Mh literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc b/tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f40f4bf10df387fea10df5f1cf852dff00bb1b6 GIT binary patch literal 11507 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 Date: Fri, 8 May 2026 12:53:01 +0000 Subject: [PATCH 2/2] fix: stub webauthn in tests, replace datetime.utcnow, fix Pydantic Config, add .gitignore Agent-Logs-Url: https://github.com/parkcheolhong/codeAI/sessions/63299979-62f4-489f-a1d2-307336759de9 Co-authored-by: parkcheolhong <111139476+parkcheolhong@users.noreply.github.com> --- .gitignore | 58 ++++++++++++++++++ backend/__pycache__/auth.cpython-312.pyc | Bin 6644 -> 0 bytes .../__pycache__/auth_router.cpython-312.pyc | Bin 36075 -> 0 bytes backend/auth.py | 4 +- backend/auth_router.py | 25 ++++---- ...uter_security.cpython-312-pytest-9.0.3.pyc | Bin 16026 -> 0 bytes ..._sanitization.cpython-312-pytest-9.0.3.pyc | Bin 11507 -> 0 bytes tests/test_auth_router_security.py | 45 ++++++++++++-- 8 files changed, 111 insertions(+), 21 deletions(-) create mode 100644 .gitignore delete mode 100644 backend/__pycache__/auth.cpython-312.pyc delete mode 100644 backend/__pycache__/auth_router.cpython-312.pyc delete mode 100644 tests/__pycache__/test_auth_router_security.cpython-312-pytest-9.0.3.pyc delete mode 100644 tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..88555e6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,58 @@ +# Python +__pycache__/ +*.py[cod] +*.pyo +*.pyd +.Python +*.egg +*.egg-info/ +dist/ +build/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.whl +.installed.cfg + +# Virtual environments +.venv/ +venv/ +env/ +ENV/ + +# Testing +.pytest_cache/ +.coverage +htmlcov/ +.tox/ + +# IDEs +.idea/ +.vscode/ +*.swp +*.swo + +# OS +.DS_Store +Thumbs.db + +# Logs +*.log + +# Environment variables +.env +.env.* +!.env.example + +# Node +node_modules/ +npm-debug.log* + +# Distribution +*.tar.gz +*.zip diff --git a/backend/__pycache__/auth.cpython-312.pyc b/backend/__pycache__/auth.cpython-312.pyc deleted file mode 100644 index 4ea9aaec67429925fe48fdd32663a02bff55a821..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6644 zcmb7IYit`=cE0l>Iedx|B~uUEV?AtBjwoA>pYkJ=OvSPl*|p?#%-w)Xb4C(nKGd0^ zWeHTOxCSEGUf4$0D{boRs#s$yBP!NS)4)IWN4DAh)jy&sRP;pYrf7?8)-*szDv)(h zpyv)bLnZ5`?FHt(=FFLU&pnUt+<&y$%m~VdpZr(k4`m4bD;{WtEp}G_i9l!u@rWm) zC{SpL0HKb_0I9ZAfP$8c(lI(f$Cv;^U^*&lh#3P$wNFP)F*d-eeI{y-Spt@rHDFc8 zhNvxO57=XlfFo8GC{yQ*QD>|?P);Bc321n$wy07oxZZ}A-%}|N`W^{%HGx{*9H@i&jqnh|hl(%PHN1tlz6Z3p==?VWbvbWauQ;}3-5$+xjN?_Fz^*HSI;6A@tb&;(7;y;tia&4@l}Fb{m#U1xXJ_? z|HpN>wSQeEq$*VkFJ5o;Iyw?0R}*Lg{vZjy7S^y8_}c|eqZuIhI#@HwZ-jqu8zVfM zKgS#G^^l5*56OZYi3tjeYhH-TArGO@r$h1(w5C%dawHKCMKS4#bNzl%Oo$3KJSuxA z#du5@5#qe0*pB!2pY~r43o5Z>byhJ+XlqMVqF zV}sx%Aq?uu$wMKTi^MO5q7iH{5+^4v3UP@`#5qv_eHUf#=R0919=k$GvZ#;=Nihrx zvJk(dFfb7r5wVIZX5sQkD9$G(YzM;Sh$KsjF(L&AB2h3wQ3&xtS-31K>^gIbCI$zA zoDo#xGZt0^R;Ml@m=vQ@Xh87Lin+8Y#Zl@Pc-sa-(ddOx_+oGbOk1&qL*XHT4;GnW z)8e2!Z*3h)#DrGZJ;hi7Ka-#$N^%2dAesIu(=nQ`u3b{osX?$c?#O+QUz@IA1EKwxd(l`hdoA6zeWVq3Uj=#ZO>k% z*4NqT@9PWppE~L94fV3#V_KMifJ&av@uaoV1I?Ndg$QGa3H%dufDdOATYm)Cn;6Cxc)uOr2F;aJ*R6*)p z9$NGQjba3o4__P^6?ef%+z6G26!+o&eyAk8R86*yOM(~~7}NJFw!=#-UFkSflL%~$ zsa$bX-h6ZV&8)R%*}5fd-7>c=V{Oh_YnQF{X>0x5zKnIpDnpf-^N3>2UxHy-E5Tft z%Et~Dm}BL)J%9zaj{z6&f6DNU?#VjDTwis*prsp2Exsj$9(%MnM6v@DNhXqLrs-8;h2AZSrNUuW$s$xdY${F@H`xlnU z?#C9_inDrV^X<(UXMNUM{m6Rq?)jzG6H6OUKBLHT^OPZPKy3N4$(=U2XPf4#W;ZXH zJS!Ia&4beiZ$<9ad@#0T@h#Fm5nH%o222_(gm@8e=Q$f53dIM7mY5KRpy_b}A3xyLm!#QDEwG?5Veugjdh?>4&NGTCxWJyazhiuU}rSznNr!IaE#7m3; z{QNd}ca7v3@X;^k04s*IxnQk$&uW<>0puI5no`6uUEkOFUt_O`)vNz=4(cusE1rZ_ zF%^Ub;NMl~1+mK$6MQm^QU7>xwj~m8Da|TIUKj`^!E@8R5KAaDXrnxCjV8jOXiEW3 zjC*O^xj91kdWS;iXj#fF9KRJMiZj~z`J6|m{dc?bM_DhdzVMV zBjZhgx<-Z2#dWyFdq~}dbi}KZ@vsP~7OF4*1ARG(zCfhckloZcWw^C%$y5z0>oxpA z!W#4Eb|>L6iIvb*HBmf)dv2(dP3tgdcVF<#+1~!{*ZjdQUr$emuk)lrMTNM+sOwdz zP<#w_;*2N67+}qD9ik~#b+LurN#Z$RT-@3#g=kp*$NLe3Ky?~ZPCy0AUvbyoJ@KgS z;6gK056O(XecA0xyL}mV=OSJC*ix5uRQ$WKX`x}!doHxq7QFE>%ZP^NtWqn!_JE(g=F>G0}o}ZHakcx zFgg#6Wpta;C?I{;Q>F<@){`pm*?RJ##bl98Q4*OVuE1(|BX5erb;kq^iK&ri@pZ=p zT#=9{MeBaU0EwPqcysArS}(`X1KmI(t0WC; n%y6SNQ)&zE#z8_l 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 str: to_encode = data.copy() if not no_expiry: - expire = datetime.utcnow() + ( + expire = datetime.now(timezone.utc) + ( expires_delta or timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) ) to_encode.update({"exp": expire}) diff --git a/backend/auth_router.py b/backend/auth_router.py index 0fb4767..1ae751d 100644 --- a/backend/auth_router.py +++ b/backend/auth_router.py @@ -1,4 +1,4 @@ -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from secrets import compare_digest, randbelow, token_urlsafe import base64 import os @@ -7,7 +7,7 @@ from fastapi import APIRouter, Depends, HTTPException, Request, status from fastapi.security import OAuth2PasswordRequestForm from typing import Optional, cast -from pydantic import BaseModel, EmailStr +from pydantic import BaseModel, ConfigDict, EmailStr from sqlalchemy.orm import Session from webauthn import ( generate_authentication_options, @@ -82,8 +82,7 @@ class UserResponse(BaseModel): business_registration_number: Optional[str] = None representative_name: Optional[str] = None - class Config: - from_attributes = True + model_config = ConfigDict(from_attributes=True) class Token(BaseModel): @@ -254,7 +253,7 @@ class PasswordRecoveryResetResponse(BaseModel): def _issue_recovery_token(prefix: str) -> tuple[str, datetime]: - expires_at = datetime.utcnow() + timedelta(minutes=10) + expires_at = datetime.now(timezone.utc) + timedelta(minutes=10) return f"{prefix}_{token_urlsafe(24)}", expires_at @@ -273,7 +272,7 @@ def _normalize_password_recovery_scope(scope: str) -> str: def _purge_expired_password_recovery_sessions() -> None: - now = datetime.utcnow() + now = datetime.now(timezone.utc) expired_tokens = [ session_token for session_token, session_state in _password_recovery_store.items() @@ -380,7 +379,7 @@ def start_passkey_registration( "user_id": int(user.id), "challenge": _to_base64url(options.challenge), "device_label": str(payload.device_label or "이 기기 패스키").strip() or "이 기기 패스키", - "expires_at": datetime.utcnow() + timedelta(minutes=5), + "expires_at": datetime.now(timezone.utc) + timedelta(minutes=5), "user_handle": user_handle, "rp_id": rp_id, "expected_origin": expected_origin, @@ -403,7 +402,7 @@ def finish_passkey_registration( raise HTTPException(status_code=404, detail="패스키 등록 세션을 찾을 수 없습니다") expires_at = state.get("expires_at") - if not isinstance(expires_at, datetime) or expires_at <= datetime.utcnow(): + if not isinstance(expires_at, datetime) or expires_at <= datetime.now(timezone.utc): _passkey_registration_store.pop(payload.registration_token, None) raise HTTPException(status_code=410, detail="패스키 등록 세션이 만료되었습니다") @@ -430,7 +429,7 @@ def finish_passkey_registration( user.passkey_public_key = _to_base64url(verification.credential_public_key) user.passkey_device_label = str(state.get("device_label") or "이 기기 패스키") user.passkey_sign_count = int(verification.sign_count) - user.passkey_registered_at = datetime.utcnow() + user.passkey_registered_at = datetime.now(timezone.utc) db.add(user) db.commit() _passkey_registration_store.pop(payload.registration_token, None) @@ -465,7 +464,7 @@ def start_passkey_login( ) _passkey_login_store[str(user.email)] = { "challenge": _to_base64url(options.challenge), - "expires_at": datetime.utcnow() + timedelta(minutes=5), + "expires_at": datetime.now(timezone.utc) + timedelta(minutes=5), "credential_id": str(user.passkey_credential_id), "rp_id": rp_id, "expected_origin": expected_origin, @@ -492,7 +491,7 @@ def finish_passkey_login( raise HTTPException(status_code=404, detail="패스키 로그인 세션을 찾을 수 없습니다") expires_at = state.get("expires_at") - if not isinstance(expires_at, datetime) or expires_at <= datetime.utcnow(): + if not isinstance(expires_at, datetime) or expires_at <= datetime.now(timezone.utc): _passkey_login_store.pop(str(user.email), None) raise HTTPException(status_code=410, detail="패스키 로그인 세션이 만료되었습니다") @@ -581,7 +580,7 @@ def verify_password_recovery_identity(payload: PasswordRecoveryVerifyIdentityReq raise HTTPException(status_code=404, detail="복구 세션을 찾을 수 없습니다") expires_at = session_state.get("expires_at") - if not isinstance(expires_at, datetime) or expires_at <= datetime.utcnow(): + if not isinstance(expires_at, datetime) or expires_at <= datetime.now(timezone.utc): _password_recovery_store.pop(payload.recovery_session_token, None) raise HTTPException(status_code=410, detail="복구 세션이 만료되었습니다") @@ -638,7 +637,7 @@ def reset_password_via_recovery( raise HTTPException(status_code=403, detail="본인확인 검증이 완료되지 않았습니다") reset_expires_at = session_state.get("reset_expires_at") - if not isinstance(reset_expires_at, datetime) or reset_expires_at <= datetime.utcnow(): + if not isinstance(reset_expires_at, datetime) or reset_expires_at <= datetime.now(timezone.utc): _password_recovery_store.pop(session_token, None) raise HTTPException(status_code=410, detail="재설정 토큰이 만료되었습니다") diff --git a/tests/__pycache__/test_auth_router_security.cpython-312-pytest-9.0.3.pyc b/tests/__pycache__/test_auth_router_security.cpython-312-pytest-9.0.3.pyc deleted file mode 100644 index 8e0dba2d29d521644b252f8d95cea715eb8b8402..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16026 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 F^It=oTO|Mh diff --git a/tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc b/tests/__pycache__/test_health_diagnostics_sanitization.cpython-312-pytest-9.0.3.pyc deleted file mode 100644 index 1f40f4bf10df387fea10df5f1cf852dff00bb1b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11507 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