From 688d78df9272845ee042ce9b434dadf0f0025f11 Mon Sep 17 00:00:00 2001 From: Martin Dimitrov Date: Tue, 27 Feb 2024 18:53:27 -0800 Subject: [PATCH] store fingerprint data on auth --- bun.lockb | Bin 195578 -> 202567 bytes package.json | 3 +++ packages/server/src/routers/DoorRouter.ts | 7 +++++- packages/server/src/server.ts | 25 ++++++++++------------ 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/bun.lockb b/bun.lockb index 25f0a21d06bb7e965e06567a86b0427091703253..2c8eb1f8924f5adc1b1fe899b2671ee83f7e223d 100755 GIT binary patch delta 42642 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 b<3ypc7uZFe8^xUf87#HAul+)s81D05WMqG3 delta 38418 zcmeIbd3a9O_y2w0hnw7pc?e>jQY13SAd#C8HN-r{Ohh6f^MJ&Vm|EHzPua96I?0QCBR?n2f5P}!bhpD%tXpycvLbo~3@afc(JLU^A}b@SlAXlcd|qy1 zW=3-A#Li_LjvDacNXf4OvL4bKSrwU=>z|QXG$F}h7f_Hvj$Ef*4o6K4jv=L>38~4+ z!tX_w0uyp3it2dHicd()%#ozepi9OpE%|^Yr&w}0vH|hK@TM;E6tbv3fj0@%LC&Qn z;%PRrI*I^R>)&I*t@~_9Mxs zsCX9vs#N@f6;Y6omWF$dHng(v^^wwW>n*$NoWx89f}?=0m5l4qJ!1E&kLkz+ba9{{ zC?Z4ZU(t&HlX$V)&bShXe>Y^Tqj((w=}{diHT%&rynv+4;-g5Z`5Q>-q2$zz3I6$6 zjtItw*!wroBg?fcTGr4k_d}%64d@i9Xc|(=%gUHIN&KBcHWHtP6yBIh@cSE^>1#JJ z8`8^?Ni;`RUTR{Orsha&hpa)mmPn~5{hSgoDOW#Gu3FQb5|vUg|SG zH7h8*J$zDPN=Wb>Ig|{gPZM$rG7?EQiHeCMKejdNKg!>%=q{v`Gc_}3!ql9igshh= zVgOP+vuEjFXJgW|tem9WT*s7zoC0wyJM-a_DG)F8Sr= zCFJGjCgqOBURq=jQXI`q%9!97O-9`BoC4&h` zSrdd$#;p`&QeJ|wz+G==7JRv#-pkptDBH>=JIqY>0aE;U2kDK>4mZtHkkT-F;6+AL zoYW_mZV-KvCELME`t+o{l*|dajvDAPC;p&VaVtL~D>Vy;Por0r9!|{6oSX`A#4^~0 ztbyTHq%=@Y!c_n9nG*`Kqs#*TKuSjA3-V-Dacsa&98E|}Ov=j3b^OrLv|HQQbZi+? z>~FEr$Vk6p$?^HQ<1-72U_7S5Cqzg_3&>Ooeg~Zu;da6;mi`1%YPhqr>1c}>)4m2$ z3V0D-T4V{bF>**3Gv2oAf-V)DNqluFe^gg9!ypK8po+uPkHwlb*^QJ0Q&RJcp3cck zOJh}WWM#58Gvos9H`6soN|$6LWMrn&_er_q^Hb9%IKJp%I(7mn`RqZm_7*>nEE12E zMa;7da*)E0vG^Xy+UV^qy#Z3z!SWXWQ+G4tPmz-GF{Gp~vGk{ql71Od9GHQW^)jWq zqmz+fpk?4eN(Sa;pEy}2TTaq6$MduRgQd7(e^b^(N=@AZ^a>Rk7JWa!RBu5`&n+Bi z_COI*%)$nlW3Vn#w(6vuoXi~mq-kvioAzE-d}2yM+GJ_`A!Y}#VEQMgB}^>EPTcyN z1-qztCkEo5SG-y9mqQ&67Tw}Wx&8$S>1hr&psa)(W;qVYSe!o0lo?3rarbaDoxLM1 zr6SUR^Q{WyCZ$hF%3;;Y&CCeJ!HG#3#ya-XNU_L|T_l$8kSP_fYBc(;=BgOu(Wj_JE3Hn%csn{fZmu1sF>#W{!csn?~)(SjNQO0<&hZg=V^TNa?~BNa=#c(@p6&!*uL1q%nvy z%^l6&nwXxMQ)%6zj#W)h5@wniCd=$jNK6?x%dCmLXMKe(eL0F2^Ff|OmzwlIm!_Ua zLDICZ7n?2UgHG1P^Jbe46tc&D~ z&cvX}A2#!S7g>SUE6yPx8MYS!*&Hb~x5t9rw-b`G^AngtWr=T0{O9a_vH*=ymzhiNd1O8KINeNecDdfV zYRe)Gd-3nv#b!gCK}zz2NNIrGNTVJr&FogAH-(>S$)3vOUqKpUKG$3s2NB;KyB5f1 z$nmLbazDS+bpG@!6OS&a{%zAI-(6Mk#H9CMd9Q}sxx7XXpK6bNQ^)6%4=2`oy6s!v zes=sr*H+=EjcM}L-p{5)ukFzHLp`g`dav3$2X1Nl z{F#<|RiFO)!KzF3an*Y0FI5ZFuT|Uh$~d0|F1@&h&nuT3^e?0Jap;j9JlYzEUWhpE z&`S`toq8!E(Wys9&eB?FdSMHXwp!CmBR%eun!^!6Ma%26TZFp@m2o)wqG`IbX}Eg> zS|nN-iPO%O(MzK|?x3;`M~qFno4Op1aI^|~Oq+1`Ei}ojroOLTxI3(z!_n5T+}AwZ zJsz#Up^>%rayh*)+T;EXG7z$?9@8q^)v&z75v%WM9_1cSD8S&Ic(oL*Bbt{!yIHvV zBwC1}#RP}Dy}TR_51LbVwhY(q_tHySdR+4$JLxw=qqMiZ^pZ{%~4q|ZQ*f6RHg;>n{A`qS%l1rN#pM#I>zH}RfQV?qqfppi_j!5>fREdx!X1WIGH(N%zdJ^hlH0KIJ?M*|ff2gV++12B6GEZXln@ywK-3SE}ZS;aRwVGbq z)#E+|DSfHwF@E9h%1kcN%IGn8)33T-66H)BCKJ#klk&!J+=?cdV7SyUl*Tp3Z78d@ z>7En!(rf7@-94`FA-m}_{iEFNS$d){cIx{A!(EwZ;nK#gX9#uB_XJ02pVZb%dwAU8 zb?iD&BQ3p-Uf9#)+5*`_-?O1(SppsOna!fy5k9vYG&bBl8!d$FtLU?-Ycm#DnIP45 zd~v0tbu`j!CL|ua^nIlH9L*g0(poj@IUJpdGw0nPODn6-4heU^i6)Iu&S(TzeN%H8 zS`6Ay;*1&UR%p_a%o9pJiPl-4*&@nS%h%x;C?WSmLT1ZLuWUoR-zasqf4KWsv@o=? zMjv%$HJ7~bfxew>X*50Bn`qM7rsc0_k`CXQo&F8Yv1In`SW7EsqHGY{T_f2JM##i1eiX)sY^vEF|cgbyzwZi=+T1UfEnFUQ-+JjAo*L*aoZ&_Ui&YNiF#1hLgt?a23 z(>z>@X{DEhd0bP4G`u|2N-rJiao>WF9GKZGx-ouI=RNB?dJ&M(P)2tS4tHHaGgc;d z;C*HhtTN5QwY>ZE!eJiwCP?W#W7&0oi6)&#%QC-)wk9K4D&1=cMVVH3{t=p#O95;y z)!LX7!0fjeG@19taMSYJ=!GLZ?w2gmSVLT2h-QpuA6k!4M3mOMtzJ0Nqdm}8FOBeM zJJCqy@^?6T8{WvWnCGuYj`C>7{Pn_79=DraMaF>B7?3e&W=l|IZF+znIhwA3l$q%z zgGT!%Krb2XaW!ve)G4l$KBGxTZCapS(!}H1gqcUbd0$6opdQ)OqXh@)g^0``y#(=0 zkY3u<i2fmZ31UHrUW#}% zM2}>%{(?AmhX9(WvoTUL2n9-GXzSYRg)Q0Y+v_C=N2qLonkQ6`Y~^uH3zcyz19WSs zUIOtcL|Y?Sr7%6x&!feL=_P(1_e{pRtUu;1dXc#MJg%1EGQ6XkM`<&{jcv6A!k8Y~ zPvMfk77(GAw)SWM!9w^LN96KakcMYOdY1#BtpFm=U*kn%EUVQ z6Cvq#qdPReNWHYJN6U)TBmF(vQ;~Wh;)_VV1Q8simm;P|>5%~*?Ug9KFu>#XVv?B4 zrp%fiXtG?ekv9o<6`~otpZ0o3y|A4}`=g^?($3?Kh&IP$MPmfyqDc;JNu#|It(T1P zxMXDa)^CPHxq1^~GiMEbgivQ=2{=N?9MrR0hP%smGP{=}Pei!86WSoMGuON2XfhCu z?Mu7RNiP{k*L2oP5$|@^BNIICKz0gR)tVC%(Ym1-GgEsZMlVh9XrILBk>eRNUG&27 z9@i@7S-3uPM3nnILftW@&pL!_wY%z(i5_iISG^FisjFU+ILm#Sr9sva7Gs>NN!ESQ zShm@K($UNfh-zp%yXmD9JlfT6dSsHv6~#J0&vS;ENl0=qJLtgudTEkJE7x6*O!l~b z=^^`TbaIp{swb`(p*e(l8liUynXy&baZGMFA=7R>Av5;U?bv`ghog^?b~+(5#eWF( z(`QcXSeAw)aivzMaD5@g2hLX&i+cEd_%3;=iNKy#60KaUP~FGrKd^K$62HRKJ}BeOj2gOH|U`^JU4eTSF}y-SbbI4};) zbW;u!tI+xzXQ|7Cm;pE}8MPd$mt=d~DMRgH;^f@))KEP#$K$RRf0x5rT)bWaxffFE z%OLC#AsL_qH_7M%V8TKbe{unf~)*P?2rK9wce2?oWWN%}4sXLn7^_zK7u3|zacZAR| zJvt}K)qISs1H`&NCnV0ZkPHfU1&*Z!3_gue20XLAOSty&SiN+rM++OLM^5v&7LT)1 zyN(e`()Z*5lI~Ug_ zG@73yZj&_5b$6`Lq?4#2WBL^|864($FgV>DQ^sU-<)KB%2-jXr*Gp!5+_mULS?8-8 zGb{-$#MWG^&=>_A?JiqZ^w6|$SF=nSRNpf@N}G_WN6uvv%hU_!dR#vE9jt;DI79Tn zCSLAdsBApkFv#ubqgi_7JPxvuGQ^n~G+@bhAVU(**9=8WFDqQJ=GKAC4=INymc(jK3dgOy1 zcVWIg9%SOal&_aO=+S=2*GnJt=n?ZO>9GsiyR+#?X~X)uYiqhG5aXjK(%5bz^$B zEwKAjZbT-a^(D^R=-m&|WH0y9o#YZJaXpgw`G-W8reGlQ`qR`zaxrYb;YZTaS?( zfyUVI3)e=^(n}Y4+>b+ACfr$+qS2Mjqg;7K#uCGxdxQ`h8ktZ>mrt>=@oJ6TF`Iy#Rm*T!cQlWY*L*^z%QAF+N9%Rlwc+#42SQXcB;2(b zt(VadKN8|e3r!OAfYGjjQSMwqrcc~pxVNCm9zwryBlkJlVB>*D_=B{!+!weq3B?-Q z)hmSV$JW?iT{qA;#qorx!vedTWhAUb8*0=`hSd$UE`}xz9kq~-F||bzUMMn(89-F@ z6q>mVw|Yn~Q6Be{hs?q1tvlO?Yb6iqk*hpz&%XnXqsb^WG}lQq)-CRpsy$*B zYVLP~(4-d`g^cATXx2K-vzX&(GC$1xv_+;R9x>!RXx6}N6|Uth(n}umXdf=pOA!T2 z^parC&P(*d$33q4OXX-J_Xgva>ZOl+-1{KR$tw%^pJ?L@2guencA0g%;a);Wrd$Qx z*)!bTZn@o~Oiry}xn8)|Kfm|XbkCviv{gbRl ze7IqCTNeG5_`j-4g;=%S%L2q7)NFg32brDPBdq;=>j;}YrAXFge{r=;p` zlJ}Gn-_wd0SqAjB^t+`~_kOjGVaSLyE|F3;o1t-ul%9w;RYOWV^VzuWmQFqTsX8pZ z#_%w58A({IM_F>TCC4D;5-Glp15(puAode2nPSOQOLAN>>cUCGxb7i~j0`e}mcfw& zDgt&DqaedO!v7?tvE~4AWG;~Fe=n_^C4tn8rP#PcN`?OqHhN>lJ)?}U@wqsukrK0r4+OuNC5{dc?c=#j#%|CF@9#0}(!$U&AIEDD!M2@bJzkrEtg$#|p`FdQikjYdj~jYGq-10$mX!7?E0LCz zU^#x2(fe$vlOW4^bu`JPh9zqvrMv1{dOf6EA|#s8z!ukJA$sX5kCN()Q2 zv}7ww`dRWmOSZOT8>Cz!CFpPIBE_2^OTSwR9||vCMriCHQg8Og*s&MBBi{; z22cMVv52Dv!5PbvCy=sKd~C&^MM?n|toTona*31-FIu`tX}K?vlKy+7L|x~H*!>`i zE#G3pYoRUlH;dbGB4y3SsDCazIp!pdu6Nqzc&!Cxc+iC{$IM(NCtt_ z@V{@G|64a&1{=BTd*=ockPM=MG*4F`m&ku_o@IR9C!Kv zMeMJnUZ3fVbvqrms@!7ame-ek8Lwa7@2&s*Wt`Kk$9xs9uX@K@fBLI9XGQ%wT8{(X z`jE?UPH%m~<#_!!G}qU0&MNwVujBPi2fg*}Xw`J*H}U$gL*9DQH*wAy`ZhGL!`^zW zZ{wV`^n`EY^_^(@(dy{cuEgsp?|SR`SK^#?^?hhQN4)hGSL2-Z_3W$h`a!glXbtox z-^J_Gj(Y3!zl-Bd{}X6_$Gr8>@8g_J^x5CX>!;B!p*7Qku2IqVy!Afk;+!q?)#s?_ zac})5S}VQhdFqF@<$Rp;KK%yTsuSM&=nHYqHu~lZ)bD+7-TRX`r@!t#O#RT3(Aw$S zKB0ae(0JG4oI(0UN*MN`x8Ch~94}`ryH5R1dh1u;i*ttR9gb5!w4aF!*JFO5ey3=` zAL5)H^y_FoAJKw8#yO+(4L?#pG}ljY&S-tWPt@-;Er`}hcm7QM&QSW#an2Zh8`^2K zTEE0OyXpzQP`{69L9}jqwO^^9b3z-vwF_ZGay1JN5g7+WsEr9Hd`F^ZJz9{t@RKqA&Y{ z`l0=d7O%(Lq<$Bv-_1DZaQ!-(&u7%{R-ALBzTp=2Lv#HZ=NzpM_>=m5PW{lvu5gmp z?+fo0NzOQD!isHZr@!!4wVbGlDnViwT=G`?MNd-IH1vosE2%uq+1oi$?Gyd-m)@#H z8RAn_b{X_lUwNyOqEFTjeMUtud+Yw6$2rsWg3qbwWpCwQmdH$1P!{7&Uwf)tB868eK`m*|(T(~U>toD2187peLW-l~B&u@9?MZ(@7==&g>5zDU)r zjQ$(?%*yCX)FII~{X}b2L0_f{s-O@1nbr_pSNBy#_xgp_sEWQqoe_N}dUQ2(r5090 zPx+PB5Ph}kP#xXpH(H}Q`s3UZK-3}X?yiS~-#^FX}v za-wcI5a-;k-$30d>ga=U&K>&ZgYhawL-jrs=iH?aKNPQg%AoE+-K{4aj#mdo-G4aF zxks<|ZoHaS7B&CfIOm)CK2$#!YKtRr&V73Jk$81l)RU-h>rIZvs|Dpy&(oFr_4|&+ ztBCTbi;l%P59nu5FN+$@x^hTg_+GqP<%PQTc%1WH{p;iLs)rl3&xttaQGNA^c=em8 zH&Nfyd%hp9HdR2~@_wB2gnk2cSVh#)AH+F7&^LcTeJi1Qe;DUHsSp2<`ii;-^&{PV zlKOh1rk{*+p3!%q`cy`3a4ODuR!==eeMLQrdS0*l5%sNtI`gAA=O-$mj*|*kbux9O zgD$FSJ`ksc$oGNxTA^Xox;txgEBss==8 zeP^8ZtwYVJ?;NUn)P%Vt%vFa9_J#RPm=(S--#gT2!fdJq)2#u_b%$Es0A^Tin4g9D z(V@CDgz>5a^K?U)pB?H4VRqJWnj2#Udt?07p*A)mCdCI^S7U5%IMl$#Fg|r*whQyS zLupN54hoah1m>ngy)4YMdN8$`!u;t_M(q<(R@H5e zaH(t&<Rc|i11cHtq_&fLJ?KeMG;k12R}qL zwM;~H^|go^D&{^!O|@D?Ep=T)ZPl|iqK?`i!bjZ@QCAIUgQ%xAi>R-hZ4tg|xQGU7 zn}~+W?T=`r5=1msyF@fm)dCPrRjP<)YM+Sas%|?(3zaRRr8*>{m1+`*@KXgM?o%g3 zv{v^8A=;?f2-TxCb-NVAknmSQ!4SU*u_73vow_K*rZy1WLLh?FvJi-2Z6SUZB1FZs zhw$=;c)C4AsJbr1P9cVbLWHXgp%5tn5UwzY4r)Lcgikw&?LtH;XE?+`A(Fx&qSZDb zrUgROih$^(5+We{f*|$_5u>VgfH*Bgeg}xIYM&4bf+1Q&LUdEvkq{9f5GRG`u9`$a zToz(}6hu#TLWouEAwoMs#HraGA$o*DToR&>3W|pKO^6lI5dG9eAvT3Ubn`$AP|G|J z!@?nc7GjW!=>*{w!9aPYle3p|h`KJs&Il}qbjBiHZRpI8lnxNC7>MC&Kn#RWB*b+Ih!s5` zGSx*PHpM`6>j{yqmi2@f)&=5cA#znrF9@%$5Ks4l$XC~e*eS#i+MJz#gEUG?EQG5! zM1dO68^Wg>#C9R3D`y{wgF+@$13bCoTtm7Bsv}I1c-e;_hePkj3OwIuv1{3eqmjr7ElVFAV zT8N!O^ce!7)aoG+Dg7XB3b9)C917vnA7aZ;h{x3pAr1;LIv!%J+8hrtZ2*M#Fo-AA z@L>>s10nVZu|c_qL!1^OeK^FEYL^fT20=6!0r9j-9RU$B7~-f9&#Jm3AubCsb0oxO zbx4R+Lm>P|K|HStMnUu#3UOYDE$Y6}5WfkrXf(u&>WmPZWbKR|1F=ml90M_o6N0)b z#4D=9SO~A-5NpRmY*$|ku~UdX;~;jZ)#D&iMnK#YVwdWf0O2zdVoL(VZgoS5gF=iR z53xsW9uF~X6ohvo#G7h(B81;)h&@8=Q|<{6r-ewL0P(ikCB%X;5Dnz$ykDgzK}3v& zI4Z;eRW}*pvJf+qAr7fSLaZ7G;Xe`LT~#m@XvwxRu$wx^hkp^520Oks@A#e z+P?|2C>Q2?r}|i!P3bVvc`(Y+TCVHq%2h56B`BJ-Uu8}E7V$eQWQa=MQ2D{8m= z|D7lK|2t*1xtdyB#L^ry-TAE$>Rgf2%e9qXRaX?Fi3ZoU81CV!{GE~=@*jURgUp%( z8Ngdk2HD*pcRVuBdCs}KiJw^PNPED!9;K!z4edW?m+Wu;Jr{YfkUudkHMw9??pyvl z0v0%*a~i2Wo#Gr-RxN$N`KqW*>_0I!zMJ{yRwSMM=f*a}RS`EkiK+5^*y&Yw*Zp_$ zxBuMO?{F2x_1#7h>W@coy<e_!#Dlsk9`14AVjq$go)UqOH_Z@-D zolhBFxr{&4belZxls5Q}WZ`Z9S)x9LR%_4IB;9eR`BM!4Fv>r-mhyj5Scy*~cPu^O zZ0VGr*Zk$@*>+;8SG@e4JP_oSqo18>ic^bjaO+R=5>nnqGowXAS0|iWjiQqlEx))H z$aTu%+LISyxxPY*uQh-!1lQLVSCeqMRgrJ4 zw6)+8EbfZDFvvgS{Sm3XTvsiw4&hHMPI^{?^7dh}#mRet608dnE$$jp@~#Iu6E;Tb@#UoEaNVf($y z-z=^P+&hG&HRPp5aj+@Kmv`~xvR_ziM!1R9G&ilp&Ee`;oIEzrW?U^}V*OpC09l*EBxmc@BnTo7Eb#Z|Vr zV7NIJSH-rHL$o&gylB?(&X|gszi4N@@kzld1ItF9RrS8oQyHyy2$vGm-5=7 zG)3~yc#%n7*pqH(ZgH`M<)uF926QBYm4hnc&kKm zwM9z7J-~CqN&ov>hCK-{BrN^a&fCp4qO4!hrt%to3M0=bYY0a^&z~G zu)N~c-s1Wa-cDGY3Pr{Ngi2#Xs4Cogx3Q}*k##j-$frQC9= zv0hpWsgRKYcE*Mx@4-(7X&@bBfJ~4DvOx~W1$iJJOaaqC0Vo91fovS|TBB@6vgXSg zFKfE2Zn9*{iY5yfi&Hyem64t27d-eC{044-Qt&(Y1Kb3+z@M7RaBD4#+-!aF?&MeC zGWZ&N1HJ`Uz*X=a_za8$vN;U{!@&p;3%Y^(L3hvtNUMc`Xy5_TebQaURA@Gs1LgvL z!{5d6EP+ixUU--ZW&zplWOo}0WJi-7>>3rj4t@YXf}g<8;1_kXl2)haCc#_aPawVE z1R5v<$^sWC2g(E4zxZX0gXd0;il7qk29<&Q?~0{lu?#E+I(QUt1d;!D=vWOhKqkln z*Sy3Z`<$=7z z*$&9>x9WlVz!%6%r&T~D@G0#oude<8egxlxYaktDf?SXQ#)Hv7wp!U*KLv7dkb}bK zK+XZO?|?tB_qd!L@*kR z0sTOK-~nAgEa(n;f)>CJGz0BHC}<5D7V)DB7zE@numkJ_yTE3!1v~~G2WvnM$OU;I zA4~yL!8A|+IO95|1355E0+T@+kPW6E=nn>ffnX3Q8qAL&K$a|78fDdyrB5~sS<+-D zX$qPFIV8wVChz%n08K$7uo!L<0&j!=fKS0z@Df-Do&f8?M(`w92p$4+!92i#aTJ3H&_UFZ1crlQK=udOQDq11 z3}QeRuml{$p(&bqu#rQH98zY0nLy4V^8W>j!E7)G$oXPEcmT+`q8z9PWapNhx&b&L z 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 IxREJN14Xciq+HA8q#W;rmNS+ z(+;mqSKo*{GF>%HBv1R>?agYwvG$3NPFyh@FjCrIa}VoX*e2kK?*oXDHsv1o>U5Px z+S~W_WoD@Ll9&A<`VXGjFt~q+y6Z08Z-(*iS@EzJM*YwvZ6Id`<75^T;+Qu>eJ6QY z)m059XyLw(Va^*I#e)(npK7ya%nqwnSR$<3ecyXFg>lwOn5p`wlA-xPfZGtBo5(%u z-#$7}6_U8ix6HMHvsC9KlAoNVUPwm%CA+`t16t*)S?1~f+KvTFS9@KGFq}5dm_3Tr zImz=cd1*YTXq`-7j4D!Nq%5n6VfDF)^~Vl^HVip)XhZ{$j-NJcM7N&QZ5W>-!@X(g*8TR|spg>yhs*3r@ynf7Ws_ zh98@uJdrVQCC+%QCFneA6Q5*7K#OK6|8vl^0%* zBCQW;H&$M?D}T{$wlKpLDnVDTBlobsv7oj7e!|(+V8;J_HS7uSf6B&3J2OvZOrkxl zY+cNQzci`cw3f-=i~^(e{+iO#|8Cse?pYsg(RB69WNzXZ3qMU}3n}7(hnzWwKC^vk zhjJ@kv)Yc9xk8LLF>MC!dZK^J!k$(Py7`oajXze6<7rFS%WM?#E9=^~ns$5h#Sa!^ z86MC<7TdB9^DLT}*csg?-}kOtZb(@4ZBVKCV&GXiP?sB6b4_>fn z|FHT)p5?SFRJAkM40EuQI`8l=^K_N>-sTr9h9&+KJ*;MB;K#dI$S+jWD(%jHvB&Yl zSXev6KW};&EG)fZS7wq$i^axUy~RDYHUHUn+?b#{SqvhkIhk)Awtr^rMSU2^Jzy%r zOkJ${O4`-vP0?FDRJUEb_(uxwq}@%7xZYv*?gcZxdre~GS74md4lY(}Nb7qBi|SZ> z_tWf$zJ2K?kJ{)KV>o@gSREG&ZHZYqE%bxcZ4YksHFD=pFi;-Qm(Ak0G?kX9v@EL9 zaEV%&KmnZd!g8DcZ}USI&k@)Q4g@dWrJN=DeAVWeqI<`n;^F(~kLN zi5iNf$Gz0_^PXKEDo;*c!$Ml+kwNiKt$K0wo0Mvu1?+Pp=gQOBl+N&}lw%IKmO1#( zz+0RHe}0+zG#CEYW$K*7*IllD$zcGTU2eR6T^zVz>w-<;2Rw2bHeL;ISSi$$Tn2rd zu9oLAi|lO3wltUQ&n#Bs^Wb+cRxjl-^4hO7n`h^tb|Z#WIVN{R^1Bhn6PCBI5C?sV18C?dH3VQq}2HqO$*RFlQp$Q|FT(Z)H|)EQcRwRw(KqhfM?Mq*xSW`_Ux zRJC`n)3et@n@};TDDZ%wPWiG+Lm%< za}$!2RK*9iX6oH7#60qfmZG*6YaZ2W2}KsI(#r4n{T0p2rDiPCf_IeJrM;}F{=2mD z>d+e+f4rwaE7>u*Pzx=)z19d+kwv92B4cWb-rRLafI%F4{i z%k@vpOjAMS$~06(Yc;POkA9#%Sw+oQpf%qy@N?~O4fWCzt&UM|HEXTrR%MrJxhlY` NOtl^UziRaw|36abLD&EQ diff --git a/package.json b/package.json index 9c2e5bf..7fd2300 100644 --- a/package.json +++ b/package.json @@ -8,5 +8,8 @@ }, "peerDependencies": { "typescript": "^5.0.0" + }, + "dependencies": { + "express-fingerprint": "^1.2.2" } } diff --git a/packages/server/src/routers/DoorRouter.ts b/packages/server/src/routers/DoorRouter.ts index 0e33489..a4241be 100644 --- a/packages/server/src/routers/DoorRouter.ts +++ b/packages/server/src/routers/DoorRouter.ts @@ -17,10 +17,15 @@ router.get('/:id/status', async(req, res) => { res.status(401).json({ status: 'closed' }); }); +router.delete('/:id/status', async(req, res) => { + await client.remove(doorStatusKey(req.params.id)); + res.status(200).json({ msg: 'Cleared status' }); +}); + router.all('/:id/auth', ValidQueryParamAuth, async(req, res) => { const statusKey = doorStatusKey(req.params.id); - await client.put(statusKey, 'true'); + await client.put(statusKey, JSON.stringify((req as any).fingerprint)); await client.getClient().expire(statusKey, Bun.env.DOOR_OPEN_TIMEOUT); res.status(200).json({ msg: `Opened the door "${req.params.id}" for ${Bun.env.DOOR_OPEN_TIMEOUT}s` }); }); diff --git a/packages/server/src/server.ts b/packages/server/src/server.ts index a39f684..92121ed 100644 --- a/packages/server/src/server.ts +++ b/packages/server/src/server.ts @@ -1,27 +1,24 @@ import express from "express"; -import fileUpload from "express-fileupload"; -import { challengeLimiter, uploadDownloadLimiter } from "./util/RateLimits"; -import LnurlRouter from "./routers/LnurlRouter"; -import ActionRouter from "./routers/ActionRouter"; import DoorRouter from "./routers/DoorRouter"; +const Fingerprint = require('express-fingerprint'); + const app = express(); app.set('trust proxy', 1); -app.use('/api/actions/download', uploadDownloadLimiter); -app.use('/api/actions/upload', uploadDownloadLimiter); -app.use('/api/lnurl/login', challengeLimiter); + +Fingerprint.default + +app.use(Fingerprint({ + parameters: [ + Fingerprint.useragent, + Fingerprint.geoip + ] +})); app.use(express.json()); -app.use(fileUpload({ - limits: { fileSize: 5 * 1024 * 1024 } -})); app.use(express.static("dist")); - -// use routers -// app.use('/api/lnurl', LnurlRouter); -// app.use('/api/actions', ActionRouter); app.use('/api/door', DoorRouter); app.listen(5000, async () => {