From b60e830372256f6ce8a09e4a09df743b2ba63f12 Mon Sep 17 00:00:00 2001 From: nilsteampassnet Date: Sun, 16 Apr 2023 18:15:20 +0200 Subject: [PATCH] 3.0.6 Fix for #3662, #3660 Updated documentation Small code review fixes --- docs/README.md | 4 +- docs/_media/tp3_keys_1.png | Bin 0 -> 38622 bytes docs/_media/tp3_keys_2.png | Bin 0 -> 29236 bytes docs/_media/tp3_keys_3.png | Bin 0 -> 9002 bytes docs/_sidebar.md | 1 + docs/features/keys.md | 32 +++++++++++++++ docs/features/roles.md | 2 +- docs/install/encryption.md | 6 +-- pages/items.js.php | 2 +- pages/search.js.php | 4 +- pages/search.php | 2 +- sources/find.queries.php | 31 +++++++++++---- sources/items.queries.php | 77 +++++++++++-------------------------- sources/main.functions.php | 17 ++++---- sources/main.queries.php | 2 +- 15 files changed, 100 insertions(+), 80 deletions(-) create mode 100644 docs/_media/tp3_keys_1.png create mode 100644 docs/_media/tp3_keys_2.png create mode 100644 docs/_media/tp3_keys_3.png create mode 100644 docs/features/keys.md diff --git a/docs/README.md b/docs/README.md index 29c68cc7e..324801e77 100755 --- a/docs/README.md +++ b/docs/README.md @@ -12,7 +12,9 @@ [![Build Status](https://scrutinizer-ci.com/g/nilsteampassnet/TeamPass/badges/build.png?b=master)](https://scrutinizer-ci.com/g/nilsteampassnet/TeamPass/build-status/master) [![Code Intelligence Status](https://scrutinizer-ci.com/g/nilsteampassnet/TeamPass/badges/code-intelligence.svg?b=master)](https://scrutinizer-ci.com/code-intelligence) -> 💪 Work in progress - 📡 [Old documentation](https://teampass.readthedocs.io/en/latest/) is still available. +> 💪 Work in progress +> +> 📡 Old documentation is still available at [teampass.readthedocs.io](https://teampass.readthedocs.io/en/latest/). ## Features diff --git a/docs/_media/tp3_keys_1.png b/docs/_media/tp3_keys_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ae79571a798c21df5426e3451633ce65a68f370b GIT binary patch literal 38622 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

iT@)g2$DW& zsLaj~n9*6TCSzjqsX|rB?K&zla;V%4f&3f6$&vx@C@Vq9eKY+Des&2C!oRGl$B3fY>zM!kN#~Be?dk6ypouMb>XmL&aSE{eiF=k=c{AtSfe*#fBawx34X!v+n?sr5-BOiDX zK+3;7*v~`__)bRQf0scHr4SC(XH3hm5XuszfAR*RiJ9omm^M7y@3QFS&6DY`01Rk} z_tO;nW1?u#&C4LErqkk^BOp(%r~A=_bM{BSL6_EbuyljMaDk3r<5xKHY)FFGQNqEQ zEYyIUN6He$&hIwi{GAz8?^lBRMj!2qIf@?a0Sh3UN>c~2%Q%#`9`0n!HgrbUc-$Ok`3h|Ni@ zy2sW31RJh$#b_*MXgbN8K@m6j{3#f1Pg&hNDXmm*^xVv(LJbwC{7CdczUQEhzLSvh zeHZb+Muy)1u?GDS`*O;d;oelcPV~@FVD5fcWc*Xu0uf$Vq;;8410iX-z&7*b%ecl~J9R z48eGnke;YjJXT|V7S+0gI%qM+g21Ucn3J-b1v=zn#BW=HUr{Idp(ni{NnhBHHoO|{3CCo?@`@p6+r#i2_!Sic+|ID$(M!WKsOp$p7HpjrrHCoqmxtls z7vfU;s?5eO`&8af`il~Yne5Bxo#uKWf;0s1aL+w#vi}7+EEt}0>=(=~B?GjI;_(G7 zy1Z(AYz;Rw4ef{D4L@qQVM?eQsw1_+g5S%1G#cy=rXQc@@-;ZSQ=Vq&H`jc~I6~V7 zvV>Y6loKASA#}iDGD|IObG6JU0pjIjF6H?D3LFGV_;42DncrnhK9v}TkBKf}<}&Vf z@7_WDBCuY#WTTtQR^C6FZ?9a$IEy3LD3oL0dOdPC)Z@nP8$f6w*3<-6kF|YHR?fA> zuXpA@(=7QAsf}N(%9w35KA4(~(DkLfD6u|!L&G}zfJy?`YVt6U_>^FoX6foy&xbnE zAdK)!jjD072*m2U=@fqNOfRlHHGVb~uxi)iE|ve!W+>K8=~w~q|0~cCY(7~=lpNXV zo&M^aGHr6~Qeu9oag4iWypp+=DBCa!8spoHBa~bOA1jhbT820N)>XrEU?GXK{V){E znv#WKg&nuAQ^y4}m;-D$YIkNMg`h3~A*neY*;Rb)P(A4bA@#I(5Y9>IluxhG*M{nG zH|=0rggQq@U^;PdPNO{yBO?)nJSu9#TN7K3HX!yd%E=tmelMFeQT?e^3qcMf+D@56 z`2CS%bRRLPxxBA8uhs@QnaH<8w+>B z;c!DlLiOk~lQ#sH6}H7MeYiY|@Na9Q;?CiHZ&snU8Zs>XHbRi(k$<2OQ>u=v5$zyC zfcPbn5te$X!P;X1eSzT?C~Oxsvs^u~HJr8oYAU1>ydh67 z@x3^kXLr;lBgD1&^a4r4e3#K*sDM3orzM7C^XIuub>uJJNTv208Dq7JO0Q7&-%*!! zW{(eOqv+sW8+w7Dv*@Bp^P-54>Ctw^2%m#b@#Kp*8;aBhzm5m-LMyiHvz`L`yVB)` z=@jfpPZLmSTb#(g*gj6Hr;OageE#G{$0$>-Wg5ZT6mkB>D1-R6*{XW{h*+FdW>-#~ zIBi}rU6?EMTg=oxPMkl<8W6$M=R`F~iwJ}`G9v7|*gMSwKMIM>%j>&S2!LBp2_WWE zO#91!5rx;7QaLx3u@Hu9WX(s?N7unGJ#iTwjRzh;`iM|NluD~Q^+A69|Tlc)IeS1v!jIp6vo<`86tkxUOBj29Km!!a(ithkyTh%Jly`Ij2c*wcK zxrX_yw5+jlZcG$W(i0Af4bJq03P@g!=#{N=b?)3gvhYLg}A!2dH zrPg(b55F&jcbycjl4@UJbf!oOk2Mu4k3^OC2!pJUu?{#zk>&iOs&dCdYijJ&vpAM0 z=!_6(mV*EwW@jqi)c*MRk;iq}#G&pC%cXX8(lxJI($&_E168wjfh*V4Spux3KEAJB#f zGH4(ma1f;=L{$jU?e0d1FTsAGgT0)zxpG2TB+z(q!y@R)K$;=W1XCxfkx5Hq}_;q{V6mA zu|vYtIAMKs5F6;}9yq54%0R49P7kC)u_pav#Ik9EI047=m>`uV$88)40OXQ$hL7cZ zd+@dC$m(&7dOLUi^Vol`*f%mY$I{ln5F?P5^pGl?uiOxX0bvz_ufNA~YA`KAzjSXa zKIKEf!{>CtT(8YT{YXTaE~BmC4uX+iH(BNiv{~{*G+$?a_|!U$Ea;Iw5Xy8plDne) zAKbi)0n_;sOR5%AluyNBsZC3NgR(i9tHXgTm`lDh1s@xdoU2%y?m3S}ju21M{gI5osGJ9A!@9&Qn)vO=p?703@N<(At~r6TRtI=xtag7aKh52` zWZsKy^p5ypo2;^JE=!BWYocX!7~@0dK`>ZgXOjvd}h#862iP%CFPu7&Ou9 z?pUfB20+yuW+xuNUl;;~Naq_q1ab*8z)U@Ecz*%#^u?R^xp{Mq5wh@a^I1rnC9}ni zw7#~lleK??9$||!|7y%K9V&7o_M4HNPEskg`0fd+t7g|#7D+F8yy88JTTgUorv0&1 z3>?X53Mu8%H{UA7{?(u_3>pld@~D^dQ*7&c!<^*2w3Qtb#JtW1z@qRUeUG<)M{Mwh zwnQr@YE)^Kp4^NdO28IuhR7VIW+>#07#?pvg{JS#SAZOx>ek{U{kxmHuFG_)6M+E& zRNUO5f#+>;+|1;X9<%e-kGA(DKqFYT|9DQWd*!_4+)R|MwjXP~_dpfu;Y|%o=i3#B zIBaMC2zb=+czk)Zq|+z_0qWHk1wfPaN3y?6tnYj5p9bpaA=+l0X%^9!{x?G zXw})Bq_`+YOGVTQt%(pwRo@oB6(LD>k{X7uMW0Qx6bl2Bqs%Kl_XRdlwTiU)zTk;g zFr^w3uxue53#Sb|!O0gscgmldXrdXW1i|Mbkf8BYCY)yL5HCE zOodBkQ)(>cbt}18_z4`ZXQT)U$zEgD@?X_!XozGcy>C%!wu^O-lJAaU|Ks>{gDXRc zn$!TkU%tBhQwQHqFIRmigRzyzwv}8VN?|;h&$mZ*EAYssV=JC6$4h->ZpE|kJh?!T zwXhS|B8w@XG0-w9^jB~7m(Q$pB9iWyJWW13OL{26D)mH*)!yz1HZC@3JDk-BLy|Tw z0&d$;;*aLGy5OYwo$1>La&$+9L-6UUw~MlCL)YawpQUoWZNL=Dx7@_!kl#k$_Dm~E zpMTCP(Xl_|J#@9gOzv8nb%{!(UJ*DDK}nLRlklrZM$#T=82m|W49N|z!!1xRsK<#M zvGPcjV9Vv(f151)Lry0}YfJZBJEuv*7q|XMtjQ)M@Z9LHDA8)mu;Q8+T<3xTae{5* zVMu?CLV)kEZXm0FZZMrJHe?09P92utVr`&YvL$G$@r6$HF5(~~==yirlT+<|j?Ngc zn_+ZyPf{?ne`j$1<-dgSRz}XM35~j|>%*&NhmB*t?zMs<+i8B@(GLs=VAiF!eRGI- zSR@3VOFx9$$}Z6n2e_H0~!TuM~rG zq=HUl+Z;-yWkNQi1w#VRW!-VlpjLKarYo?gjeD}Bv>(+_@wn%KaW9F(LAeKeSLK` zyz=%<^}y69;|`B@AgodRm)(|dLvUCk?wD?SU7LFU{q!uR@=8{ZU&dYVd%^r^E&dTY z#QaUVH~M>M*)(VSK(?P}d*(`XM!?oK8Kr;Ja^^~)^hI&vHvME}GXHC}&#v~%UPRHu z-Ld=L8BaRYZ4$fdcD`#pCmcZzC6JtXw3t;&y(rOCFMi1Bx^Fa3B6 zb*{W;{Eu<{8_$>y4v|gkdt@4vpZX;I6Mhx^Sj709W`uf@5Kl{Io2jc^EWh5l8Demg z0Q?%=K`|Y&HrL9tr(DFVr6qmeEAjs9p}wzcuwkb!PQZyfSPp#SHzv>VsCbW2))PAFu`nH#TVqlrB*6?aKE;A37Q zX}9DU{?n;~=C@O~#LYwBoWD29NtwXBuuxcR52ddl#72c%-w2fG+x9+#i;K zg5cJ{k?coFyQWPqJ>9BsfL#NM@r5fMEP1$F&i7G&6GGqI3=R&SD2#zuEg$sCy6XPK zPKrNX!=vsnAHM1H)`wfBam%eaT{H`=_w#-| z+v{mu5Kqfv)F!*2p>)aDP(}cbHK$xzz4zSRTMrr%+w*Q27AQk~+Q$ND(g%&URy_?1^dSg$4B|ZcZ zP4b+y-g39R`0dAA`M*nd82l%|v8{_#`iov zVWza>T7{HAAnCYqxj#>ps(h%6%J#CuL=6|>uuQjDFOS1=pgf^wTPZZ zYe58k+U9I>)sD}6AJE|M2yh_878Zz~FDn~v*?klmXBG6YX)JI>4C3L`JRhWS;l2BX1}1!Bkr+YvGPWRVhFxX`{e%6c{kz#~;-h25@+4 z%AhAT%M~${-y!rTm?hB#U`PE>sC2J%<}og*SqrhS;Jy{fkdU(c{y$ZgTmb_-qa;%j-uTde1;ha`EFzAbXJ$f3aPc~8h{lWqk4Z`OU-VQWd7-w zYulaZGlOLTmfX$7^DU8sF(0%dqIxYx$;~L!9SGKZpoIQodv#as)g|2Pcx85>1J^{c8Nr}>PbnV~If+AosjZ3Fx6azCWGjWU_Fi zK5fOZil=kK!#{kPp@Z2?>N}-n;bo!LNs^9z3;%xo)6`1CL|8)r zzlp|EhrU9oHIvtZQb=RPh^Hl&O76L=x&M9Vtj1&P8QxyN_C!{}KNB#Qy5RgeMSo6& z(~z%a)x#ib1z&yz=&eBoU*M*gW1LVkoS)r5hD7)H4ex_XUK}z+XzRkw*x|aBmh3d_ zy1IASs~E3nq0y88m!ws_vP~BPC1FU_Bv}t8wy*Y*KJ{>Af9tH_khOi>D^lgXka(-X zV>KoYP0ngghMI`N>Q4CQqynNWMZ~JJ1LcFCaQIv{>G*S!P~faKG&EFOaTpz`nyY9{ z5{zUugKG{z=n2qz8D*uj1i{~W5ifXP<$UJYt~(Zw#VbWF6jEN?<8 zIdez?X-S`TmN{VwF*!MW1&c05DiSQD`idgH&8-02euj#v*7OPYo~2%Daf`1+lQtGx zE8D@>m97B|Vz)VNbZ=KO>l!T$`sHrjw}5r%;@>Yey-?h>I+c87!u+i$R>;>A&JWOY zjz+=NYn^jIaPpf`dRuqom!AzjQk=8*k)qYX6Vz&A!*jRC!Rb@(JYCyRx@s2Q89Xan z$?)d^=BC1#Da%yzO-Gpe~nq9MWT+9g}$zE!fW0ffXmepMQ~oP;LHG*F2SpYc zpJ)=5y^EI1#y^9&9?-{Av^0UyGO{+d{Yym^Zd%#a;Pf#^{?F&PQ3@C(S+6W;s+hd< zWnY)|0&o2bwwzLg*%zF2VmZdl@Vl^~0#W-jP~haf8G02vWTM&Kkr|qAG=`Rw3;s(F zl*v99*&oCj{C?mnCilK1e}t{|?Y@nM9?5n133~leClCSguHTq)9W(VJgm%)be4OkZ z7`^#rW2dU-Z_k#yv`Y0TKi9oH0&!e1IIAhrWS+SdcF)Bi9F-^Vq(@m}H<0wclX>lE1T?sEfm zE}RrIGipJW%AngDQv16Y6k@b!UT8gtpVm9L^QvaWQvW?$w!^3O?Y^DWDzq133xt(3 zL0dk*Z_&{*#g>m*e%hj#OKabbq3(T%tj8c1)PF8o_#>F(n2mCZJ?9-)PWF9U=2qz# z#f4*W>>2Z?aR-`bBL%i4Fc0lcIKJe4O4lgId7=_W?8W zdl017DXSRZTAG=>OWEx3m(b?>OH;yoT2hG z@|jtzg+&10J|Z$Qa6+ucJvtOD+IQ?Ec-@21#3*3KV7tT%@g)U`^t6fD_)A&CEA*3A4I+%re29#qr91-E?j?SMZHLU;07p z`wWK>Ld(RRTIHE5KxyX0g&~Fx zwIXosZSm}HiBBA4Gg@fUuq9gtVx_(6w5ww_8pzI+hzn(*-ng{AgBG(|fV(>ou+z>~>JN{ZSqT-%6h9YpAm5Fna#T>g?>xim0lfCs#1w zXVheF+~BjsUz3z1W?H|{9#jC%4*X7|;xD^bjU1f)F8Xt&tYI5W!k9KPU&@iU6Pmd|k2zd)@ z2KR1$mUvB+V^Bomu|yfA@w&C0u4M71lhy4mwaelR&iC$6 z1OzjTU9Qqt#0CoR*QG3=T#)vMVE>7i@#lzOE>?^7$e}L-wv-|2+9OMpy)EmuHx)u7 zh*6B!)V-(~AD4_lN{OsC&+X57tC3fC-oR&Dn-;g3G|_S1!bh46r@zu?tDr(r;V z3f}r^S<~-tPJ_*oFV% zHqW-Y6)MLF`J6GE#ozApJC)0h!}NwYyHS$8RG$@=wmkXwq^)^cx;`byZa()N{_C&N z1Fi4qJ&WFh;$7_jJTJ%%SM!h2ht(?k@%i5?y!b<=;*3BNr)Y$uV+S@PeT9J1ChW0N zE55{I=tLi_V(OQVr-ii73sMq2x)5z~2ha0X4U%R?-vvMa<8lOWZvw7;1299bKRV-J z<{Oe^)Z{GAeETkY*|Yxny$bS(^&)*~YS(WwfxNm`Ps9kAqo@$J5?9^Q}d0v#~+ z?=MEL0xXOm#Rcg_xU9AYIA~+4TI}@$91H_orp9(&0qO_JA!W!BP>O^+4T4)!)x3!Z z{$gbufJ_0aM=xVb`GmGrr|)%UxLSP?3{F!r<;B4J>bWlRrvn{l8b#SI2iAen|9oA!K3MbtBOFc-jx=5M zopF^7xfWN}@^byYYV z1_Hs;7v7$lvInB%0>u0?k1ES{2K@44M`F@6g7vt;4A!yJ_{N5Z*&asi4gC>#q%}bp Vs8`>)jHduDeO+Un50J;<{{e;F6p{b{ literal 0 HcmV?d00001 diff --git a/docs/_media/tp3_keys_2.png b/docs/_media/tp3_keys_2.png new file mode 100644 index 0000000000000000000000000000000000000000..747ecd6821e311cc6ef63b5eb0f230134eea21f6 GIT binary patch literal 29236 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 VLBS;lkI60o<+ti@%H=FR{2zXRuG;_r literal 0 HcmV?d00001 diff --git a/docs/_sidebar.md b/docs/_sidebar.md index aa15b0890..9e1395777 100755 --- a/docs/_sidebar.md +++ b/docs/_sidebar.md @@ -8,6 +8,7 @@ - [Extra](install/extra-settings.md) - **Features** - [Authentication](features/authentication.md) +- [Keys](features/keys.md) - [Roles](features/roles.md) - **Manage** - [Settings](manage/settings.md) diff --git a/docs/features/keys.md b/docs/features/keys.md new file mode 100644 index 000000000..e851532c3 --- /dev/null +++ b/docs/features/keys.md @@ -0,0 +1,32 @@ + + +> 🚧 Under construction + +## Generalities + +In Teampass, all encrypted elements (such as passwords and encrypted fields) have a unique key for each user. +This key is encrypted with his/hers login password. +Such a process ensures a high level of security for all data stored in the database through Teampass. + +💡 [Read more](../install/encryption.md) about this encryption process. + +## Regenerate your keys (as a User) + +For any reason, if you notice that while browsing Teampass's objects, all related passwords are empty then it might be a corruption of your private key is corrupted. +Could be after several login password changes. + +For regenerated all your keys, just follow the next instructions. + +1. Select entry `Generate new keys` in personal menu + ![1](../_media/tp3_keys_1.png) + +2. Ensure that the form contains your login password + ![1](../_media/tp3_keys_2.png) + +3. Click `Confirm` button + +4. Once started, the process will run in background during several minutes. You can still use Teampass but all the passwords will be blank. +On top of screen, an orange box will show you the process progress. Once finished, you will have your passwords back. + ![1](../_media/tp3_keys_3.png) + +> 💡 During this process, you can change page and even leave Teampass. \ No newline at end of file diff --git a/docs/features/roles.md b/docs/features/roles.md index 2e32818ae..cee2bc345 100644 --- a/docs/features/roles.md +++ b/docs/features/roles.md @@ -1,7 +1,7 @@ -> STILL UNDER CONSTRUCTION +> 🚧 Under construction ## Generalities diff --git a/docs/install/encryption.md b/docs/install/encryption.md index 5c25851cd..22dd2118c 100755 --- a/docs/install/encryption.md +++ b/docs/install/encryption.md @@ -16,10 +16,10 @@ User credentails are stored encrypted in the database. The encryption is perform Teampass encrypts sensitive data and especially password part of any defined item. The encryption relies on public and private keys each user has. When a user is added, his keys are generated following the next process. -![Generating user keys](./_media/tp3_encrypt_user.png) +![Generating user keys](../_media/tp3_encrypt_user.png) Each encrypted element (password, custom fields) has one shared key by user. This key can only be decrypted with one user Password and Private key. -![Element encryption](./_media/tp3_encrypt_item.png) +![Element encryption](../_media/tp3_encrypt_item.png) When a user has to visualize an encrypted element, his password and private key is mandatory -![encryption model](./_media/tp3_decrypt_item.png) \ No newline at end of file +![encryption model](../_media/tp3_decrypt_item.png) \ No newline at end of file diff --git a/pages/items.js.php b/pages/items.js.php index bfde54d72..9f9a2de49 100755 --- a/pages/items.js.php +++ b/pages/items.js.php @@ -4582,7 +4582,7 @@ function(teampassItem) { $('#card-item-field-' + field.id) .removeClass('hidden') .children(".card-item-field-value") - .text(field.value); + .html(field.value); } // Item edit form $('#form-item-field-' + field.id) diff --git a/pages/search.js.php b/pages/search.js.php index f4c1beb32..e68ed1748 100755 --- a/pages/search.js.php +++ b/pages/search.js.php @@ -26,7 +26,7 @@ * @see https://www.teampass.net */ - $var = []; +$var = []; $var['hidden_asterisk'] = ''; ?> @@ -74,7 +74,7 @@ "url": "/includes/language/datatables..txt" }, "columns": [{ - "width": "10%", + "width": "70px", class: "details-control", defaultContent: "" }, diff --git a/pages/search.php b/pages/search.php index 76e51a171..50fb88563 100755 --- a/pages/search.php +++ b/pages/search.php @@ -100,7 +100,7 @@

- +
diff --git a/sources/find.queries.php b/sources/find.queries.php index 4b6215f86..b9e5b56ed 100755 --- a/sources/find.queries.php +++ b/sources/find.queries.php @@ -78,11 +78,11 @@ DB::$ssl = DB_SSL; DB::$connect_options = DB_CONNECT_OPTIONS; //Columns name -$aColumns = ['id', 'label', 'login', 'description', 'tags', 'id_tree', 'folder', 'login', 'url']; +$aColumns = ['c.id', 'c.label', 'c.login', 'c.description', 'c.tags', 'c.id_tree', 'c.folder', 'c.login', 'c.url', 'ci.data'];// $aSortTypes = ['ASC', 'DESC']; //init SQL variables $sOrder = $sLimit = $sWhere = ''; -$sWhere = 'id_tree IN %ls_idtree'; +$sWhere = 'c.id_tree IN %ls_idtree'; //limit search to the visible folders if (isset($_GET['limited']) === false @@ -190,6 +190,7 @@ '6' => $search_criteria, '7' => $search_criteria, '8' => $search_criteria, + '9' => $search_criteria, 'pf' => $arrayPf, ]; } @@ -207,6 +208,7 @@ '6' => $search_criteria, '7' => $search_criteria, '8' => $search_criteria, + '9' => $search_criteria, 'pf' => $arrayPf, ]; } @@ -216,27 +218,42 @@ if (empty($sWhere) === false) { $sWhere .= ' AND '; } - $sWhere = 'WHERE ' . $sWhere . 'id_tree NOT IN %ls_pf '; + $sWhere = 'WHERE ' . $sWhere . 'c.id_tree NOT IN %ls_pf '; } else { $sWhere = 'WHERE ' . $sWhere; } +// Do queries DB::query( - 'SELECT id FROM ' . prefixTable('cache') . " + "SELECT c.id + FROM " . prefixTable('cache') . " AS c + LEFT JOIN " . prefixTable('categories_items') . " AS ci ON (ci.item_id = c.id) ${sWhere} ${sOrder}", $crit ); $iTotal = DB::count(); $rows = DB::query( - 'SELECT id, label, description, tags, id_tree, perso, restricted_to, login, folder, author, renewal_period, url, timestamp - FROM ' . prefixTable('cache') . " + "SELECT c.*, ci.data + FROM " . prefixTable('cache') . " AS c + LEFT JOIN " . prefixTable('categories_items') . " AS ci ON (ci.item_id = c.id) ${sWhere} ${sOrder} ${sLimit}", $crit ); +/* +// Search in fields +$rows_fields = DB::query( + 'SELECT item_id, data + FROM ' . prefixTable('categories_items') . " + WHERE encryption_type = 'not_set' AND data LIKE %ss_search + ${sOrder} + ${sLimit}", + $search_criteria +);*/ + /* * Output */ @@ -388,7 +405,7 @@ } elseif (isset($_GET['type']) && ($_GET['type'] === 'search_for_items' || $_GET['type'] === 'search_for_items_with_tags')) { include_once 'main.functions.php'; include_once $SETTINGS['cpassman_dir'] . '/includes/language/' . $_SESSION['user']['user_language'] . '.php'; - + $arr_data = []; foreach ($rows as $record) { $displayItem = false; diff --git a/sources/items.queries.php b/sources/items.queries.php index 8d086acb0..8fbe1b245 100755 --- a/sources/items.queries.php +++ b/sources/items.queries.php @@ -212,11 +212,10 @@ FILTER_SANITIZE_FULL_SPECIAL_CHARS ); $post_email = filter_var(htmlspecialchars_decode($dataReceived['email']), FILTER_SANITIZE_EMAIL); - $post_fields = filter_var( + $post_fields = filter_var_array( $dataReceived['fields'], FILTER_SANITIZE_FULL_SPECIAL_CHARS ); - $post_fields = $post_fields !== false ? json_decode($post_fields) : ''; $inputData['folderId'] = filter_var($dataReceived['folder'], FILTER_SANITIZE_NUMBER_INT); $post_folder_is_personal = filter_var($dataReceived['folder_is_personal'], FILTER_SANITIZE_NUMBER_INT); $inputData['label'] = filter_var($dataReceived['label'], FILTER_SANITIZE_FULL_SPECIAL_CHARS); @@ -465,89 +464,56 @@ $SETTINGS ); - /* - // Prepare shareKey for users - if ((int) $post_folder_is_personal === 1 && isset($post_folder_is_personal) === true) { - // If this is a personal object - DB::insert( - prefixTable('sharekeys_items'), - array( - 'object_id' => $newID, - 'user_id' => $_SESSION['user_id'], - 'share_key' => encryptUserObjectKey($cryptedStuff['objectKey'], $_SESSION['user']['public_key']), - ) - ); - } else { - // This is a public object - $users = DB::query( - 'SELECT id, public_key - FROM '.prefixTable('users').' - WHERE id NOT IN ("'.OTV_USER_ID.'","'.SSH_USER_ID.'","'.API_USER_ID.'") - AND public_key != ""' - ); - foreach ($users as $user) { - // Insert in DB the new object key for this item by user - DB::insert( - prefixTable('sharekeys_items'), - array( - 'object_id' => $newID, - 'user_id' => (int) $user['id'], - 'share_key' => encryptUserObjectKey($cryptedStuff['objectKey'], $user['public_key']), - ) - ); - } - } - */ - // update fields if ( isset($SETTINGS['item_extra_fields']) === true && (int) $SETTINGS['item_extra_fields'] === 1 ) { - foreach (explode('_|_', $post_fields) as $field) { - $field_data = explode('~~', $field); - if (count($field_data) > 1 && empty($field_data[1]) === false) { + foreach ($post_fields as $field) { + if (empty($field['value']) === false) { // should we encrypt the data $dataTmp = DB::queryFirstRow( 'SELECT encrypted_data FROM ' . prefixTable('categories') . ' WHERE id = %i', - $field_data[0] + $field['id'] ); // Should we encrypt the data if ((int) $dataTmp['encrypted_data'] === 1) { - $cryptedStuff = doDataEncryption($field_data[1]); - // Create sharekeys for users - storeUsersShareKey( - prefixTable('sharekeys_fields'), - (int) $post_folder_is_personal, - (int) $inputData['folderId'], - (int) $newId, - $cryptedStuff['objectKey'], - $SETTINGS - ); + $cryptedStuff = doDataEncryption($field['value']); - // update value + // Store value DB::insert( prefixTable('categories_items'), array( 'item_id' => $newID, - 'field_id' => $field_data[0], + 'field_id' => $field['id'], 'data' => $cryptedStuff['encrypted'], 'data_iv' => '', 'encryption_type' => TP_ENCRYPTION_NAME, ) ); + $newBojectId = DB::insertId(); + + // Store key + storeUsersShareKey( + prefixTable('sharekeys_fields'), + (int) $post_folder_is_personal, + (int) $inputData['folderId'], + (int) $newBojectId, + $cryptedStuff['objectKey'], + $SETTINGS + ); } else { // update value DB::insert( prefixTable('categories_items'), array( 'item_id' => $newID, - 'field_id' => $field_data[0], - 'data' => $field_data[1], + 'field_id' => $field['id'], + 'data' => $field['value'], 'data_iv' => '', 'encryption_type' => 'not_set', ) @@ -2706,7 +2672,8 @@ WHERE user_id = %i AND object_id = %i', $_SESSION['user_id'], $row['id'] - );//db::debugmode(false); + ); + //db::debugmode(false); $fieldText = []; if (DB::count() === 0) { // Not encrypted diff --git a/sources/main.functions.php b/sources/main.functions.php index 0e98f0583..9ce3e5eea 100755 --- a/sources/main.functions.php +++ b/sources/main.functions.php @@ -3914,7 +3914,8 @@ function handleUserKeys( string $encryptionKey = '', bool $deleteExistingKeys = false, bool $sendEmailToUser = true, - bool $encryptWithUserPassword = false + bool $encryptWithUserPassword = false, + int $nbItemsToTreat ): string { @@ -3968,7 +3969,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step0', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -3981,7 +3982,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step1', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -3994,7 +3995,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step2', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -4007,7 +4008,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step3', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -4020,7 +4021,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step4', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -4033,7 +4034,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step5', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); @@ -4046,7 +4047,7 @@ function handleUserKeys( 'task' => json_encode([ 'step' => 'step6', 'index' => 0, - 'nb' => empty($nbItemsToTreat) === false ? $nbItemsToTreat : NUMBER_ITEMS_IN_BATCH, + 'nb' => $nbItemsToTreat, ]), ) ); diff --git a/sources/main.queries.php b/sources/main.queries.php index aec9f7d43..3b4444114 100755 --- a/sources/main.queries.php +++ b/sources/main.queries.php @@ -516,7 +516,7 @@ function keyHandler(string $post_type, /*php8 array|null|string */$dataReceived, (bool) filter_var($dataReceived['delete_existing_keys'], FILTER_VALIDATE_BOOLEAN), (bool) filter_var($dataReceived['send_email_to_user'], FILTER_VALIDATE_BOOLEAN), (bool) filter_var($dataReceived['encrypt_with_user_pwd'], FILTER_VALIDATE_BOOLEAN), - (int) isset($SETTINGS['maximum_number_of_items_to_treat']) === true ? $SETTINGS['maximum_number_of_items_to_treat'] : '', + (int) isset($SETTINGS['maximum_number_of_items_to_treat']) === true ? $SETTINGS['maximum_number_of_items_to_treat'] : NUMBER_ITEMS_IN_BATCH, ); /*