From 4b07853762a6d6c1258924192997b425d636c32e Mon Sep 17 00:00:00 2001 From: ebby Date: Fri, 25 Sep 2026 19:26:05 +0200 Subject: [PATCH] diverse stuff --- .../authentication.cpython-314.pyc | Bin 0 -> 3552 bytes .../src/backend/internal/authentication.py | 27 +++++++--- .../models/__pycache__/user.cpython-314.pyc | Bin 3587 -> 4022 bytes backend/src/backend/models/user.py | 5 ++ .../routers/__pycache__/users.cpython-314.pyc | Bin 2399 -> 5035 bytes backend/src/backend/routers/users.py | 49 +++++++++++++----- 6 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 backend/src/backend/internal/__pycache__/authentication.cpython-314.pyc diff --git a/backend/src/backend/internal/__pycache__/authentication.cpython-314.pyc b/backend/src/backend/internal/__pycache__/authentication.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..182548e76a00fd3ffe63e9ec0142c10482253a47 GIT binary patch literal 3552 zcma)8O-vlg6@Jy-^Z&yD!;b+QF#c=ffY(23)+R_8X5C{aFm70EOM^#EciFT(Oi!w7 z!jB?lwCjVjNn~&KuwKQ{I+3N=Qljj^imYfa`MKlzW4g$u`mEY@;86HGZX;$H+%3za+No4BY-m81Qn%0K@@c}T}TUx zNJXxTX;368aa~FaijVrZ?o0cX01a^6pAIS^8sd5&9j4)%pa#|uPT4)Q`8`41~NP}EYq=QN;ZS4lN zk+!K#v|Vkc`_v9K*#>G$8{`vtL_21sUO3}km3GdGy)fH(22~bLBek^+)Hc_)Yqq5q zX1lyy{*>^ZP77*#8>stS+x=>w59H2Q>>wFANo9IEb5XNReT-lO7pSS_Z5cViDXf=> zNtb2hgt-mY2qrRe{0i0#u7xwpm#L zZ{R%DR>C&c38vq~=Ep&2c5vQWz=L>hZh3G@pC{Oyqo%FT4;G1a2kX=xyqGWHMU7%Im$z;Y&T0Bx zTrdW0qE~gZKrtz3`9ZBj=UM7>jYV*vxa>r8IjvBzs77%vM>+tY4FK#ue&w%0LKo3% z{`=V2<^M0*}UFAe~HFK7u~b2E_f!dWLCT8ni-%XrmVC%uqm=W)pd zJ*_4la;MP+bktqG-N@3@4cUlimyLRw3g=vJPIyZIP!wl`Ohes*D=L~12a)%UZpbFQ zolKLb)ub0@gly7#&bE4*Dx6~=0)Re{MTT=jTeck$FBKUiwft?1m~?(YjyjTV6_*M7 ziX#@RMZ#|Eh$X6XWH{}kV`HhQsoeDBmDEHobv=_-Q@Qcc8&i(IRAexB#5;@B@#BJS z8Q2L=rN-3MbnZ&(h7%h7-la)3J*|9SmPiW#5ayo~qE^ne_Pdy5SvYc}r-$rg2F*Ib z3>liPW82PA>n<*keh(zqI7qe<$xlKbg+7jy)7!C@2iXs^kB@zJ;?ooBv7^tvyV-B7 z_8VWMH?HU#!^W2}Tz+>;ifu~CH7WTJKbm=%+mH@#N8%68e|Y|(`LyH3@nqoE>|RUy_5K|8%nr7MLafGH&|orCI=E-f1f0?}gp>Q2l#-kPUhEs-TLhbj~f?c_jPXNX>ETHa|uHD_!Zr54F5$ z^f1n_h`GWkqo=}6&jlx9Q;nAF9LJj9z*IByvd@X=weH~f>|)-ej+n;<$CtMjF(EO= zaROm3JHDbusBJSpj<|peG4ij#>>YqgMlM%i7H!*%_N_(xHly-dR9=tvms8t;@cpwN ztUSDW@5hhMK56{b&}So`j;wd~KU>=9Jh#=5e0cTeOZOYL!);H-R!>fBgeO;}$yydY zWHHEdWS#sL$g1ag&g^0(c0TU36Yv_BKn7TuG3xn$kUPvE$I{Cn7eR^F?B{9UF8ll2 zHU3m_crV9(z#7xf5Wqp`hB9s~N*!Zi9OHqEl`#wA;2PmfzOjFR?9%_>vn(wa<*Lkd*iub#t5Yma!v zQIw{oZ}8n$UkKAuAN17q3qKeQd%MZr`9!-R!%Xm zoGRdc3jkK)Y~txDShVMsRVo;Aj4(K`Vq!%_SVtqr*ot@?Q(ifQRlg(QC9D&cDZ++d z$G13-33fsy8s`fi!Trm~M*U`E5tC{Wav^Ok0iaef4|wHfy?vUiIw!HQ2W5rPXe z#|(%9P=V<00pJysVOQ|`QfRxW<&)#TIR5CprxfV+HUH8Hukb%qe)qfD!U>?_wNQF+WcVnC&Q2ZkLfR?o9)Nf+K>P4%pXRc zkG#CG*8lE$`=#}WvKg6Ji%hIXGUf5DK;-=&ZO1#GiK}PEH{z+)U}`JUP`>h?uObj_ z{R$9shi!j8xe*^<4UX@MZ0W!D0RVU(jY;U`RuALJJ- z1Lt{;oMv|<8{lj90FNwB+&*u|8_)*Wd^o4sn6T-Evj@++)3(>k0gLhSDH3OPYn$bJHhJB7^U)@J_pV!l_nn?Ua*W(9*+>!?YDLr0Cq)$& str: + parts = credentials.credentials.split() + if len(parts) == 2 and parts[0].lower() == "bearer": + return parts[1] + raise HTTPException(status_code=403, detail="Invalid authorization format") + +async def get_current_user(token: str = Depends(get_token), session: Session = Depends(get_session)): try: payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM]) - user_code: str = payload.get("sub") + user_code: str | None = payload.get("sub") if user_code is None: raise HTTPException(status_code=401, detail="Invalid token") - except JWTError: + except PyJWTError: raise HTTPException(status_code=401, detail="Invalid token") - user = session.exec(select(User).where(User.user_code == user_code)) + user = session.exec(select(User).where(User.user_code == user_code)).first() if user is None: raise HTTPException(status_code=401, detail="User not found") return user \ No newline at end of file diff --git a/backend/src/backend/models/__pycache__/user.cpython-314.pyc b/backend/src/backend/models/__pycache__/user.cpython-314.pyc index d6105d0daa350291830ce347ee156606f2b4a1df..85f78ead1e17e045a8536c8d78e3a74b11e9867b 100644 GIT binary patch delta 327 zcmZpc*(T4c&Bx2dz`(%3K66`E-$Y(X#%B}N&&!B1C^7^Ii!%g?#PXXkgX9?)N`!(~ zl^HZeH~#s+9h3|ag8(Kd{aJ^BfgzEhfgzTmgfWPrgelIZgjtLspCOFFm@$Y^oFRv! zge8cngf)zzge{0!nL(4~7Ds4tYLRDNTK?olHnGV|xxLsF85kIf6efS=)-t&z3X|1~ zk5A0Y%P&bRNsW)UVPIe=R%2jb_|eYL#Bh^~x6$(>GXo>zLvFrCugQ))azgAy{2)^V zK!hNO5SrY;3G5IP+8J6HibP;Cn!=Oc@yug%pWMMK%jM6&z`zKyEMoF{ bUN5mP4E&5-UzC^`#XBm#F)%ZVgS7zwQISTK delta 75 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 X=^4Of@*QadT@jZb`kN#Z%M1SvZzh?5 delta 1262 zcmZ{jO=w(I6vxkfU-M>O^5!Fx`RF9`(KM637BX=RO;NE%(sm}q5?@mgbvjHZ&zNR9 z6Ysl2s|yoXHd1K9brJknxD*TGCKTLQaG~HroubJ@5Tqd8O%-C?2^Ya8WhfCwN)nSYxR%OtNnwic<+57R zm?nIsEbqKLMglu;$2a6skOf6FP*zJJ781TumP=t4&Ojxc1AD+8oFtQAn|9C+6-a^D z;TZ)P09d3FS)Azkj}JR?@mqUnM(V{X!5mb~Y0_IgN$hAG?BO^xLK_V--9N{o|8rIB z(ZPz6gGamnbERa*<6tN7%ExXTwv%IE9lDP%SdtelEiElpr>CZ>&(F?P?b9z_IL+r} z9(+qHv|Wd~o+>8(n|wz0NP$l&BmBm|sU!C>4Nq@6SF5%4ZrBgruM9XeaJmBfH)o5I*)z_#GQDn?ip-J=+!czn> zaa3X(NG; z`jMqtZ!J4LHjO&0O`DeF$u6U!j259O#8rU9VdZ$2D+TMv-0`Nw98@9EBf_<{O^7yL7qQ38v2Dr>DdO-uI_=bBTe8oumD za`o!#4t3~J^yOC5=@lDGYRMuh5~4?t5GBax`*l_ut(Da#odSR?eteGq<3Ik&!Vkv6 z=G^Z_@E0?6cjSqVS^Qov9vBh9ea?z`A(z!?!(q&sbXkqHT_LP^(DS`kb6IVDm8wXi zyKgkEw3eMlkJiVx!%+o0gNMQ~4dH2ke;&>(8R!n6!FHu49@c29%^d0}>n)dwCJ>~b zf&l4tivG-%)^fYyJWHPf0My0(006o&A%vGBd2MJv5Wb$|?MUv0^SkxUREHcsIC<(T zqjPfMAvXP=GDu@x$xn*i7)biNsdrM>U+R$9K`Qg%i7!@euXRq$KST|2WBd str: user = User.model_validate(new_user) try: session.add(user) session.commit() + session.refresh(user) # TODO: send mail except IntegrityError as e: session.rollback() raise HTTPException(HTTP_400_BAD_REQUEST) + return user.user_code -@router.post("/login") # TODO: rate limit +@router.post("/login", status_code=201) # TODO: rate limit def login(user_code: str = Form(), session: Session = Depends(get_session)) -> str: - user = session.exec(select(User).where(User.user_code == user_code)).one + user = session.exec(select(User).where(User.user_code == user_code)).first() if not user: raise HTTPException(HTTP_401_UNAUTHORIZED) - return "token" + return create_access_token({"sub": user.user_code}) + +@router.post("users/forgot") # TODO: rate limit +def forgot_user_code(email: str = Form(), session: Session = Depends(get_session)): + user = session.exec(select(User).where(User.email == email)).first() + + if user is not None: + pass # TODO: send Mail + +@router.get("/me", status_code=201) +def get_current_user_info(current_user: User = Depends(get_current_user)) -> UserInfo: + return UserInfo.model_validate(current_user) -# Login Rate Limit! -> token for everything else -# Forgot Code <- email (rate limit) -# Delete User <- token +@router.delete("/me", status_code=201) +def delete(current_user: User = Depends(get_current_user), session: Session = Depends(get_session)) : + session.delete(current_user) + session.commit() + +@router.put("me/subscribe", status_code=201) +def change_subscription(subscription: bool = Form(), current_user: User = Depends(get_current_user), session: Session = Depends(get_session)): + current_user.subscription = subscription + session.add(current_user) + session.commit() + + +# TODO: # change mail <- token, new mail -# subscribe -# unsubscribe - # delete all deactivated users after 48h \ No newline at end of file