From a08345e67697631adac3a1cc905a69be03a44e7b Mon Sep 17 00:00:00 2001 From: Kobe Date: Fri, 30 May 2025 20:43:14 +0200 Subject: [PATCH] added a lot of logging --- __pycache__/forms.cpython-313.pyc | Bin 6574 -> 6574 bytes routes/__pycache__/main.cpython-313.pyc | Bin 47563 -> 47597 bytes routes/__pycache__/room_files.cpython-313.pyc | Bin 42402 -> 45408 bytes .../__pycache__/room_members.cpython-313.pyc | Bin 6798 -> 8397 bytes routes/__pycache__/rooms.cpython-313.pyc | Bin 15036 -> 16429 bytes routes/__pycache__/trash.cpython-313.pyc | Bin 7391 -> 8901 bytes routes/main.py | 1 + routes/room_files.py | 106 ++++++++++++++++++ routes/room_members.py | 49 +++++++- routes/rooms.py | 50 +++++++++ routes/trash.py | 43 ++++++- 11 files changed, 247 insertions(+), 2 deletions(-) diff --git a/__pycache__/forms.cpython-313.pyc b/__pycache__/forms.cpython-313.pyc index 4f89d08fd62010afd035bd1314ef64549654727a..9df81d225980a3731505c49df45eda601d21a31c 100644 GIT binary patch delta 19 ZcmZ2yyv~^GGcPX}0}x#Lxshv$Bmg|{1}6Xj delta 19 ZcmZ2yyv~^GGcPX}0}!PC*vPd+5&$|~1-SqK diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index 88f675823406e12795576de9cc1e3c5c1f3c608b..ed33182ea22dffb5e3278b26f126db85e791037f 100644 GIT binary patch delta 3135 zcma)84Nz3q72dml>;j88L4%;UXn-!FAmK+EgVh?Fprcl*AR$>F>=PFD&-)gL35I5D zLP?vp_NWktnwTb;NXIs^V~qCCb|#s2(wWktY4f5cCap2)G?R`^X5zH9=evvi*tF9( zJKx@W-uZjyocq1^+EwdcuUb7eqTglKTk2ES7uFTYBCn-6 zf6Hciq%|vt7h9k@^Qup4&Zm#&W;qvGnip-^Mwgz?Ni7xi=`}W(lIY0F<~vI(MbbV(H9Om`^S=GVLRNIY@TYITa+=#uL}kweYyL1ziuNgsXczD+Eo zywp5VlDIRq^>d;oaishSA?m2K;xSQ3FI7~Fd+5W8RicKLRp$COv6-3H6$?eRfFAI- z?3OFxXf?!+pb?42OZK8Wjx>5M(-s)wdAn|y0_5wll z{jZ!BLy7yhJ|)%;Lum-`J-}hWQ-G%dhZuY=`7GA|U6WQfWIG>*&Jg(<&WKX-Hui}7 zXsB^PCOnwdsA1Y;TD)C$&?}9VHGN7KkO3$J1OP<yrooUx-gcMs2rk;%fZTK?{`WG)_w^ZeR`#%y~Jw9vAm}`wJNgQc8pR(Xd#3_Y$TU=`~ovqPOR2tF>@j5!x zQM??jLO02h# zA<;?ey@kHfnI`&Zurt3^HM1Re&H>a|I@Q9U9{I1wyhcj7NI@GnqnG8;^bv;)$ z&MtgbIhoE;yYg?ky9}cj;$q@@ z&v{$gKUkb}P)e5{s^w%0dP_b3Vky^nvgg?=|95IC4Hev)?8zB+U|h%C(lPb*ebt+ji)slj%ktIe&%VW65*HESu8DrO8ajWAJB&WvK;v_ zG}EEs?}`O@kOES0H>HjC^_TEN{H(u)E1v)Lq76vgOrP#k{ssQP8S)t5hky>ij{q+M zz(evfgK5Y7$^`Z*cAtv<|McbrY*b}b*Kg`lO0xNAka{IW{opUt!vwFMJjrB9W>e3p znC*;(>B_+Da3^tbH|q!LnC%Y_>~@RGlucfq?iy+mkJ5h9d3}xU7JKQ7`E$)Q5^b`r#bAjA?i>g17X7sGKnWj(hYr{TJMBA|$BqskY!Kh1PY#B7 z-8#5YJWiv7Wyx3O>vU!CuvnMqAKGo(s-E_KL_waWOX@pyDf#zVGmg5OsS`c)YjOD= z4BZUAwB#sVgy1dOIvn7*r-xUF?!?vM%?{3P?K3IPrsP3|&eWOzBeo9%-TNL=zP|4rkVsZdH)Q4Tca1pt(N z?rEp+ZAjHoyvfg`p>OfTVS}a%-~c!&)@$!mRPiV56;)s?j!9nD**K#p5$3GrCsOG7Jh3?H7)|RPXIQHrF?>fKBIj;&$Oyf75qGH8p&CUbjO@nbgG(W zY8!ueM5Vu?tYTVuYM^B21H>V1(H#(yGgo^ta=S3REJKaZPv7i0+KaFi$p8n4oT2 zF`6&z)HJ$?XL`?Qt<_>n{B-n~=$lDMrjx_B_5>6$nXa(bsRx46@Xa<;!dfumZ;8ob zIK^1YZvlP@copz#z;6J*1$+u{aLUpJmZQVw~ delta 3159 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 C9Y^s1 diff --git a/routes/__pycache__/room_members.cpython-313.pyc b/routes/__pycache__/room_members.cpython-313.pyc index 7e6e59160df0ba07869db9dece3900661d830b38..84896b23c491759d8b3fca8f0c5f4503d8ddbc67 100644 GIT binary patch delta 2742 zcmaJ@O>7fK6yCMHcI+f}{2%{jlR9<`#BpMq6q*9zCv6BM;Kijak&MCH;wp}#S%;QX zs!xa;YP5%zUVsy#Cr3ewR8{JsQpKgxS{!U`k)VgF>Mbcqty-z-yjdJ?+@vGvd&x6 zgR8d_jGZ)oNH7l4_$R?Qp&=fm6SPbGi2kHsBiok+9%ZlPgzOTJiUmO^lon;!_wD1%(Ml69z5Dx!#3)EDWI^`G={x)XM%#lIKd=*0b&$@PmJUui2TY#@cRW~dCE zKG^KH>WntSq+f6Kn=LcN*|6tuv)`)CR6=`cqS@c;TZpJAL3<67(Q)>eUNzK_=Af;b za~#sL)Fo@v!Z|rpoKDe7KSV`cv&!)}um!mRLKtL*N2nx5y8IO<*z6cCAP>eVgcf9g5+~4YG!Z zTG_;3AI22OmTxTavLVlxbA<(gtWq`z%U7@Rf)Hg9Tpbz&2#cR}9dJgVxeuTVU8 ze%Ixu2`MTqQpozNrDCyAMrIr%>tGQoGIhX*z_+M@Yz6HnQTbdsr#dMeYzGZvmtera zDh0(L7Iv6b9SxeoRs$?m_>~rav&PqNcAuduy6%QO^xPe6cmj7lcRYO20_7peQ=HD6rvj#jOYChCdlT4GunJ1zCjG<@N$ZiChIvWKz; zzObxXes^{<`j=j+%l`TFmu1NwdeS*4=>}08PrnixnJ6rl50kZtk8B>X)8aI3YvA$v zKFc3;1#@1LW^s61$a3!R09h`9ou}x}X1Bqpu>L#*?FP5(J2o(M*D~Y1fLP$7zxPp3w)VJ$H4-`L?-}P0FvZ@ zmlp^z)k#gEB%B921wa_d;1(gI!bh7j_YO+V;gEOnPp|{dW3|ATM9oSASE#MM?XCz*6yT(j7HV{IrHvwM1v5mXU-jDhFq74I1xnzUD`{7{Lk(;;4Vx^&n*0EWtL8sU0k z2AtBZF@tKJU0xQ>Mwq{?4$jUwb}-+mWIC=dhr0wR0wCKBw`~;=ZY?rXpn_$DJ|qx54s>*7Wt3W21Pih6y*f=Rt``Y z!OMn@0<_6S2e$UK-V#&0h=?*+_-0#4N`_Y+E0u;$LJ&DTA|w#8IVeT(V06pU!J0R1 z6uW<`uLlctpefXd0}J)Qu0oxSy2Y*D_ch2YzU>Lmj==d$0YCyluyo$tP42<1=df2{rzVii_WRE;>i(@Cz-a=>a%FZ|ZP= j^NKj+^}B*94~IRtzj=%n-}44~52#%8^p+0y$twN@^1Mv< delta 1251 zcmZ{jO=uHA6vub6$tEUEviayH_A4Jv+QxoR+lE%Fl~yR0N(-h`kwA#emIk^_olQlG z;>klVVwp?vEQrOEIe6&Blk_4~Dkwq0gC`M8EmH90d$U!OS_k%@_h#n3nfIHQ*P{=T zu6?J|F2LBG9a?znU3Ue^*n0c45*E@VDx@rFchZE*f`s0Y`Jv2W=M4w?Y zKZ%I`L;Es`kb1U6ZY!khThUdTS;*>{WtD1qUC$SmN>U777}TvpbSTx=UZAUgEI8 zya?a^cac@((bBx_k=X5l2|iMul)aZEiQ&bBgm;QIfkS;L3QCmysEZH#(Zr)?_}Sw$ zh!ZDK8c-TR%2s`4Zcf$pL<2>dv=t@BUOBr4<7jrE)S@f~xV_OK`Ni2V;bQ|X(0K<=e1HK?R&RGd#Aq?}2})y2aM zb)rZp4ir4NEKyY}+)|IDL6dw#PF+-sDjmcS{>Br=BO5g%19}F9myB2C6&nS6jqEiw zUw|!>@aZoE_SL_s{8KZmt@g5Ka*TBdr*fL*8@n8}ZR?vhSSkN!g(cB`lmV0@ZG%LPG)iz7dx_KI)Dn`>F1(95uOVFL z7vs?INq)Bp+iMEh$6z80pFYF3TqC7x&2|zv4%1XZVW&dZ*;=S|pc`{yKT!lsF~w7X z_Mpvs&vs5Lj2DF^_+(!n;u%|WGVB~A9s;PadO0{9F9y8r+H diff --git a/routes/__pycache__/rooms.cpython-313.pyc b/routes/__pycache__/rooms.cpython-313.pyc index 9066e79833d1b09e681a48da3dc26b5d5ef9b0e7..2d9fe1d8514027a5c232e41226492113a06cac4b 100644 GIT binary patch delta 4365 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 O?PEM$9cb3$3I78dVW>C& delta 2975 zcmbtVU2GIp6rMXf`~TPNZoAuUyPe&3TNf6({aN}$DXnc0L<%xiiY+V)JJ1bnx4E+g zWdpDrD06G;Lub#nhl8>~<#MEoY^v8;5Oh)hTvt zMN9iBDyQ>uiso`tbb!s^_LUzP%ySPdoWpmidw%eq*?!j?x@`{KHH)`_xPUleu`K}q zxZETTc6W?d2`q1mz+!hDYzaEx7vFD?EqgCG>Kz>#Ju_mF99*?%dUZ$y&uQHOZmDe2;*lf(I?-G|$ ztyv{CB~P7{>62Gftjt<0J`~xd+CC9_*sJ`+L9h3Q;l4cxJ-&JpFP!lG#g`4C;U0wN z5V|1c?;~Nj?5`tj@RdI?rzO;W)M;l~+B4XP3u?98u0~0V*pAX} zgg%5_2)zjX3{=akB2!GR*t44n&{=CoD`7^aQws9Ao&sAslPTuJF{Vowa&@m0Q=Ewx zx5C-R=ts3-L)}yOfS!h&7CL=}{TK86ulQS;3t9?THD%;UnWZ&G8Z)k5IW*A{5)YY< zGf?U=U9`ybvvpD#Z&@+66HGf_I1mjGmaL~6ZwO^tisF9t^BjW2R{scAtS8@%i@rmQ z$E>1cbJL1AJHyJ8oY_vbgRj~gxSr+k{?@>pmf?8ls&F!wo1~kL`RNO|MFQv-0Ct9ZyetMhJwPD+tff zCr*~8$D&08$vhfnjlh770LEIHOsj?C_ZHEFl+tbBYON{POFbLMysMQ1dRhbP%1Ig8 z?nFS>6l;{;GfIi1k*2Y(nx^FZL@uM348yvTfy*e!LWw}DoXO_(j&hpKe})D>GhiLX z#KB7IFpRXd8tz-LiHtHTJKCFIvC7KNAd8%H)S$x_Ce=bE)$;=vQ~36f(h47D9Q1?TX^C>(DI`1BhgV)0V87fbD%9sTgA zBSbpE-+9#HSw~ajTGd5zRO1ZIPUqL9Q;N;fe)z6a?A7WS-YnIs)kdvl5n0)oR(5>{ zIxjh9{VjWyzd49>?IRADWaxyIu4#Y&mI0BwDcS~;hMQaZ$za0pO~N>sEL`Z$les;( ztbX21is|i?m8o=oBIbDfO~OC4;%7z)xzZbi8zsD9s^fH)D#Z>N)9;AZ8RZl@)~bdo zuudt9n}V{Q%gX0dsG+mW)2|#{>dBe05Dv%cf$Vw*KHOD(*o!L-AZYamdj`e2Nlzf) z1*4cK6j{;yT;VAC(C?$AXDXMOos@g&JewozRXpJ86``f~=>96wM^+3RUxiSH(7t5C z$)z0}Z+j#3TIg1p_#+A5Bkp@7u*|zizhR?&WXXh+OCsFqeK6o7`!s)=E9OPOiKTeS jSJU;z>w)>uEz-?AF7uTnURrqPlE8*b3E=yh1l<0AkOy2L diff --git a/routes/__pycache__/trash.cpython-313.pyc b/routes/__pycache__/trash.cpython-313.pyc index af2d83212033100c586cd7d5875725e064610f4f..56e026cb033aff4d4f450af79046952025ce1247 100644 GIT binary patch delta 3116 zcma)8TWlN06`fgf`F@C`C_c1&DYWHPY+1G*j#SBxYACTJ%d$wbjzP5yEv;gr6sgWq zDJ-B>S~Pv3NGeZ@IOrq!YxB{`bSgFIsq=W5A}UaD~{;h7tMde!ppk53)U|QLP~eb)u~UR zlmK6vwRK%c_dzU|#PO!p`Z{2{ha&o0Jx$Aj26ZW2qLXgfymZ6nu_cXTFCdh)A(Yb5 zN4n0Ng&mXP`N{^-Y>bby1WaY@x8| z$6tR0-E8|{lPD-nzm_fCATieNVd^P_HW7(4lb@e$C6`w+L{UpcqL6Op4}p@6nu+xk zva1T8O*4~XaW%u+?4UJkW6W~q`c2KuXDQuWQyQk4+fd%oX%>Eq8Qx)BR!Z4iUe(SU z*HwjNa?6@gU0+&KRP~A+BS@|$FMw+Z zerkrn=%Y=&z2=EM^2e)wx#E{=zHluNdMof|pcay=p)-}xnFry%YIv{`9xR83?o7U$ zuZ~=-j9e@a&y~9`)dEMVfxb$huhu_S?LSxPKX-3rr+@mk1l~Ud`tFzZoF?;Wq|0fBx% zphpB`bIVKLvw4KHMDOV(1E5$0^Anq7YQVLJ!8OJp(k4km3%!XrjT*e0@WuhYrnJ-y zO)x06Ndvxe(+%)7eg?kQ27H&5yi!s)e97k_TJv%+)!msj1>SZ6sGx<-%`1TLDTu72 z;yGsVw||UT7nqs`rP;okRWrFlhF>$8Vg5^?WbgljH8TsJXKI0|1XCPjQ8WuCU#|^s ztw+{Ep1z)Ak_~5|BUeDF43u@4QIk7lU4-U~%r7uxEz%#jdpNrK{wul|%uZKAr_0jd zom1~FR)=RR!?Wd~i{;?l|3p_!itf400I<#`zyfvvSoi>7WWR3T?bbK#ZrZ?= zKlKFcjKH|0&@iSyvq|(LkJ+wop9^>MrNef!gIze2tRKOW^y{J|^`Ml#$&pbs2l>o> z2O%p0Chch@ZUz=l8b^f$Pu@{5qzsV!Gc5UZ{2hS zNt5#)>!EVOj)H#D72aed#U*Km(t{I_f4ihlH$4f)I&A_E*m5X>L90#JyH1ZbohhMt zC`oI-e)G`KCp}#ouRNb?4o=#WhQm)chSK3?pAluDb```lLqC@!tA0<|5TvY6*YEfm z1g6AhMv&>DD~kX%6~syLc|7+o)Ua3Z3YySG&?db|agugdB}!+gCj} z697kRv(6_)Cp-ENqLZ#6K^2;L#{VNn*}V~;TBYCjJ%#=B*S@h$R*f|%e~jmrWvm%F z!9o4A)(eudx>mZ$`Au%{1>-a*p5V_xeS!k(VMEkRV~)&HaUB@(fYLU)rU)sLD4!@- zcqz)~9g99E3qW}QA5BzPKyDuc|3%vQk5|~^up~Lj))k5>IZx;OaU7+@Kk!A)W}F3E zq}bxa&yt{~gZ~V?=xQcX%;&FXm%c0;>m<>S0gk>2Yg48RomG7j% z+$HFJ1%7H&V8*UV7ANror|0#J?`>3_@rpD4_SGHdiSO#~o(jk~ZF1Fo@kiY~wNUJ> zYj0kA5Ia$gjZ|VI<>;9^UwKcej?Py`=gZGrE{7K$^!EL7VyAa>&n$W!`!?i_y)nNv z|EbGtw(NJI4&QC_+e2mFu^p#eHp&0kAEx=>DLg`d9-Lo*B7nX*>6~_>-?}HyUGNIO zb4}@>b>C~5c8d2S@o9^=tuumW+aiKz+sS&j-Ikdl-L^DopE;@fK*rGc;G_sz?xy42 zij`Lw1*Rr0`it(!0{iRA|9B8qBM3W*cMv(t>~T<Dk2cO21_+Zqtcu&t9Je7X~H>!k~ delta 1862 zcmah}OH5lw6rCBrXFqIgz{X%3{QL~&<3bQ5P(hRMDM^6P6v2x{B_oK7jc{u)nr9+~ z4Ww#R^|J__R*KX`yKR&O6`Srz8#QF z_!Wd`tAVdRZ-a2pm7LtsN>K8kSj?V>A5srh-GLaS4se3g?iY1r5%UZ_e#=w0aQFM zV~eeo2RG9t&oFs|Y~HX?N)N`|7WHFX!XA_2TJ?y6ZSsLc>0tW{NGlxJ_VUqc{ z?6 zPT0n;h}|y#smkWOJ900Rb%mbV8nRLYy$H6IdNxif+20i*8-LgYdv6W18@6Yx#&u^^ zmyZ?Bd{DS}B9+J_MB(TFT%m&i*Tbd%TM2M2;r^F6T;VXpLF6pui$Ba2JY711>_DE| z@)@#+Zoh2|#0l8O`#h;BcB!ha;#6YnkE$-q2XOOaq_VrD%dF!bJYiuK-Wo5CU>6#` zgU}*TQB;9YVog}tuF1t3Vf$RFsuNz?sO!LrBB=2FM94%X1ah%gJc`|PG61e-Ul13& z<|=VCAKZ<>Hx*UbU#42A4n<6C%TtY2hJAjvLEMUN)-63G&&@7JWZ>4#xka@Dmr7`x z{z^An^Gdh@9`>vnu;X&aq$3rQ3KepobH%fU0x(q;r2%OOU%QVE&U1JUT{H#I z96s^VYvQF7gxO7>x_bD!^*`Puh4+tTX8Sj9y|k_9t=l_^K?*EGrx=DEE1}B^?33Dh z_;0srU-I!0k+bAmARfj!3-3nWql0YHA86&RkdqUXrfKpyA1a>w7!dQJ1&p+fdyuq2 zUuF;dAsk@e`rG@&{1Y8<*dWE;$SE|PO1&PNeKTy%PX_zZQDD$oHm#~>%@CNkN?{z> z5(`V2TQkCy&VrF|;}MWrLpzFJ9>ANA)G&6IRoyH3tTS8P{Io2bRl zKHO`1(v3lQ(klaoeast7m?IFAma}(*flfZQ#iXLVvjxk~kr+++k)~W&NXM5`iC&rl zJ5Wc)kL-t_7k9Az;AF;!8~03zlyexzI}*q{-H2G/files/', methods=['GET']) @@ -262,6 +287,18 @@ def download_room_file(room_id, filename): file_path = os.path.join(room_dir, rel_path, filename) if rel_path else os.path.join(room_dir, filename) if not os.path.exists(file_path): return jsonify({'error': 'File not found'}), 404 + + log_event( + event_type='file_download', + details={ + 'downloaded_by': f"{current_user.username} {current_user.last_name}", + 'filename': filename, + 'room_id': room_id, + 'path': rel_path, + 'size': rf.size if rf else None + }, + user_id=current_user.id + ) return send_from_directory(os.path.dirname(file_path), filename, as_attachment=True) @room_files_bp.route('//files/', methods=['DELETE']) @@ -294,6 +331,19 @@ def delete_file(room_id, filename): rf.deleted_at = datetime.utcnow() db.session.commit() + log_event( + event_type='file_delete', + details={ + 'deleted_by': f"{current_user.username} {current_user.last_name}", + 'filename': filename, + 'room_id': room_id, + 'path': rel_path, + 'type': rf.type, + 'size': rf.size if rf.type == 'file' else None + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @room_files_bp.route('//folders', methods=['POST']) @@ -429,6 +479,22 @@ def rename_room_file(room_id): item.path = item.path.replace(old_folder_path, new_folder_path, 1) db.session.commit() + + log_event( + event_type='file_rename', + details={ + 'renamed_by': f"{current_user.username} {current_user.last_name}", + 'old_name': old_name, + 'new_name': new_name, + 'room_id': room_id, + 'path': rel_path, + 'type': rf.type, + 'size': rf.size if rf.type == 'file' else None, + 'is_folder': os.path.isdir(new_path) + }, + user_id=current_user.id + ) + return jsonify({'success': True, 'old_name': old_name, 'new_name': new_name}) @room_files_bp.route('//download-zip', methods=['POST']) @@ -554,6 +620,20 @@ def move_room_file(room_id): rf.modified = os.path.getmtime(target_file_path) db.session.commit() + log_event( + event_type='file_move', + details={ + 'moved_by': f"{current_user.username} {current_user.last_name}", + 'filename': filename, + 'room_id': room_id, + 'source_path': source_path, + 'target_path': target_path, + 'type': rf.type, + 'size': rf.size if rf.type == 'file' else None + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @room_files_bp.route('//folders', methods=['GET']) @@ -822,6 +902,19 @@ def restore_file(room_id): rf.deleted = False db.session.commit() + log_event( + event_type='file_restore', + details={ + 'restored_by': f"{current_user.username} {current_user.last_name}", + 'filename': filename, + 'room_id': room_id, + 'path': rel_path, + 'type': rf.type, + 'size': rf.size if rf.type == 'file' else None + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @room_files_bp.route('//delete-permanent', methods=['POST']) @@ -880,6 +973,19 @@ def delete_permanent(room_id): for item in contained_items: db.session.delete(item) + + log_event( + event_type='file_delete_permanent', + details={ + 'deleted_by': f"{current_user.username} {current_user.last_name}", + 'filename': rf.name, + 'room_id': room_id, + 'path': rf.path, + 'type': rf.type, + 'size': rf.size if rf.type == 'file' else None + }, + user_id=current_user.id + ) except Exception as e: print(f"Error deleting {rf.type} from storage: {e}") diff --git a/routes/room_members.py b/routes/room_members.py index 0cf2585..91eec30 100644 --- a/routes/room_members.py +++ b/routes/room_members.py @@ -1,7 +1,7 @@ from flask import Blueprint, jsonify, request, abort from flask_login import login_required, current_user from models import db, Room, User, RoomMemberPermission -from utils import user_has_permission +from utils import user_has_permission, log_event room_members_bp = Blueprint('room_members', __name__) @@ -70,6 +70,19 @@ def add_room_member(room_id): db.session.commit() + log_event( + event_type='room_member_add', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'added_user_id': user_id, + 'added_user_name': f"{user.username} {user.last_name}", + 'added_by': f"{current_user.username} {current_user.last_name}", + 'permissions': permissions + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @room_members_bp.route('//members/', methods=['DELETE']) @@ -92,6 +105,18 @@ def remove_room_member(room_id, user_id): db.session.commit() + log_event( + event_type='room_member_remove', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'removed_user_id': user_id, + 'removed_user_name': f"{user.username} {user.last_name}", + 'removed_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @room_members_bp.route('//members//permissions', methods=['PUT']) @@ -118,4 +143,26 @@ def update_member_permissions(room_id, user_id): db.session.commit() + log_event( + event_type='room_member_permissions_update', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'user_id': user_id, + 'user_name': f"{permission.user.username} {permission.user.last_name}", + 'updated_by': f"{current_user.username} {current_user.last_name}", + 'old_permissions': { + 'can_view': permission.can_view, + 'can_download': permission.can_download, + 'can_upload': permission.can_upload, + 'can_delete': permission.can_delete, + 'can_rename': permission.can_rename, + 'can_move': permission.can_move, + 'can_share': permission.can_share + }, + 'new_permissions': permissions + }, + user_id=current_user.id + ) + return jsonify({'success': True}) \ No newline at end of file diff --git a/routes/rooms.py b/routes/rooms.py index ed8f6ed..b0abf7a 100644 --- a/routes/rooms.py +++ b/routes/rooms.py @@ -4,6 +4,7 @@ from models import db, Room, User, RoomMemberPermission, RoomFile from forms import RoomForm from routes.room_files import user_has_permission from routes.auth import require_password_change +from utils import log_event rooms_bp = Blueprint('rooms', __name__, url_prefix='/rooms') @@ -53,6 +54,17 @@ def create_room(): db.session.add(creator_permission) db.session.commit() + log_event( + event_type='room_create', + details={ + 'room_id': room.id, + 'room_name': room.name, + 'description': room.description, + 'created_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + flash('Room created successfully!', 'success') return redirect(url_for('rooms.rooms')) return render_template('rooms/create_room.html', form=form) @@ -74,6 +86,17 @@ def room(room_id): can_rename = user_has_permission(room, 'can_rename') can_move = user_has_permission(room, 'can_move') can_share = user_has_permission(room, 'can_share') + + log_event( + event_type='room_open', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'accessed_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + return render_template('rooms/room.html', room=room, can_download=can_download, can_upload=can_upload, can_delete=can_delete, can_rename=can_rename, can_move=can_move, can_share=can_share) @rooms_bp.route('//members') @@ -183,9 +206,26 @@ def edit_room(room_id): form = RoomForm() if form.validate_on_submit(): + old_name = room.name + old_description = room.description + room.name = form.name.data room.description = form.description.data db.session.commit() + + log_event( + event_type='room_update', + details={ + 'room_id': room.id, + 'old_name': old_name, + 'new_name': room.name, + 'old_description': old_description, + 'new_description': room.description, + 'updated_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + flash('Room updated successfully!', 'success') return redirect(url_for('rooms.rooms')) @@ -214,6 +254,16 @@ def delete_room(room_id): db.session.commit() print("Room deleted successfully") + log_event( + event_type='room_delete', + details={ + 'room_id': room_id, + 'room_name': room_name, + 'deleted_by': f"{current_user.username} {current_user.last_name}" + }, + user_id=current_user.id + ) + flash(f'Room "{room_name}" has been deleted.', 'success') except Exception as e: db.session.rollback() diff --git a/routes/trash.py b/routes/trash.py index 3148252..9acaa0b 100644 --- a/routes/trash.py +++ b/routes/trash.py @@ -1,7 +1,7 @@ from flask import Blueprint, jsonify, request, abort from flask_login import login_required, current_user from models import db, Room, RoomFile, TrashedFile, UserStarredFile -from utils import user_has_permission, clean_path +from utils import user_has_permission, clean_path, log_event import os from datetime import datetime @@ -77,6 +77,20 @@ def restore_file(room_id, trash_id): db.session.delete(trashed_file) db.session.commit() + log_event( + event_type='file_restore', + details={ + 'filename': trashed_file.name, + 'room_id': room_id, + 'room_name': room.name, + 'original_path': trashed_file.original_path, + 'restored_by': f"{current_user.username} {current_user.last_name}", + 'file_type': trashed_file.type, + 'file_size': trashed_file.size if trashed_file.type == 'file' else None + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @trash_bp.route('//trash/', methods=['DELETE']) @@ -94,6 +108,21 @@ def permanently_delete_file(room_id, trash_id): db.session.delete(trashed_file) db.session.commit() + log_event( + event_type='file_delete_permanent', + details={ + 'filename': trashed_file.name, + 'room_id': room_id, + 'room_name': room.name, + 'original_path': trashed_file.original_path, + 'deleted_by': f"{current_user.username} {current_user.last_name}", + 'file_type': trashed_file.type, + 'file_size': trashed_file.size if trashed_file.type == 'file' else None, + 'was_in_trash': True + }, + user_id=current_user.id + ) + return jsonify({'success': True}) @trash_bp.route('//trash/empty', methods=['POST']) @@ -101,6 +130,7 @@ def permanently_delete_file(room_id, trash_id): def empty_trash(room_id): """Empty the trash for a specific room.""" try: + room = Room.query.get_or_404(room_id) # Get all trashed files trashed_files = TrashedFile.query.filter_by(room_id=room_id).all() @@ -125,6 +155,17 @@ def empty_trash(room_id): db.session.commit() + log_event( + event_type='trash_empty', + details={ + 'room_id': room_id, + 'room_name': room.name, + 'emptied_by': f"{current_user.username} {current_user.last_name}", + 'files_deleted_count': len(trashed_files) + }, + user_id=current_user.id + ) + return jsonify({'success': True}) except Exception as e: db.session.rollback()