From 2836a05f90ad83ca41d91a7dad4d22b2e444d690 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sat, 22 Dec 2018 21:26:30 -0700 Subject: [PATCH] Add app icon to login flow --- api/actions/getloginkey.php | 7 ++++++- api/apisettings.php | 3 ++- database.mwb | Bin 22596 -> 22789 bytes database_upgrade/2.1_3.0.sql | 3 ++- index.php | 14 ++++++-------- lib/LoginKeys.lib.php | 4 ++-- login/index.php | 4 +++- login/parts/header.php | 15 +++++++++++++++ static/css/login.css | 14 +++++++++++++- 9 files changed, 49 insertions(+), 15 deletions(-) diff --git a/api/actions/getloginkey.php b/api/actions/getloginkey.php index 166b488..fba5caa 100644 --- a/api/actions/getloginkey.php +++ b/api/actions/getloginkey.php @@ -6,7 +6,12 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -$code = LoginKey::generate($VARS['appname']); +$appicon = null; +if (!empty($VARS['appicon'])) { + $appicon = $VARS['appicon']; +} + +$code = LoginKey::generate($VARS['appname'], $appicon); if (strpos($SETTINGS['url'], "http") === 0) { $url = $SETTINGS['url'] . "login/"; diff --git a/api/apisettings.php b/api/apisettings.php index 043b339..0b2767a 100644 --- a/api/apisettings.php +++ b/api/apisettings.php @@ -215,7 +215,8 @@ $APIS = [ "getloginkey" => [ "load" => "getloginkey.php", "vars" => [ - "appname" => "string" + "appname" => "string", + "appicon (optional)" => "string" ] ], "checkloginkey" => [ diff --git a/database.mwb b/database.mwb index 9479ae42bac1a54a9e948a502638eda7fce15ce4..069775189fc43dfef35b9143411564b9cc2694bd 100644 GIT binary patch delta 21782 zcmY&t^2j-5>YQ>Z)Dcr_WPe z`|P#W**#bb8d47mD9M6Dpo4&bz<~IcCClquTcue@gMgH4L4zQFM$NvNy4jmMxH8y# zm@s^|x4ZDw_1NG_zI=IwtH}&YV|6(I6N-gsXlMPJ)N13y<22v)S543}0K}@HAWAny z?`VZcsnC9{jtV(gEO5PRc~a$Io)X6H{A#1O`}MbAkK!=!)o{rtZl)OU3sszJ`0%-A z1mb=C68FXelM0-1I(WNe_sR-la9s3;D zDcJ&6(+m&;M~`OGn4>x*#dg9~N~4mC58sMFU6Jw8uB7~&RQCv1?{mr6^V5_BQ?~wL z;7`Shhc*HzED~G3=xEfyKrO{>th@c08JfAG17|Z2(~eHy zr|wyB%!c18ic=@Mwwrz(`)&ruuQtw2&(PiwVtuU)XIexpLg-83QNW14<>By$XQj>oGrSh(D&Du8^J}znG($4 zElTjM{vGM^{nkm~O{GMxXC~#U{AvQ)FXObYhiUFe@J$7#rqTVjPO-;y)HAtVDZ#^Q z2k@I(YI*R{vGV0UpSrp%w%rg?k<&vsIC>s2arvl{bbdK}?igzLx?(@l>__+DZdekh z67%4eT1OtAx)n2MM#sXR^{Vyi;`1zXh1*4cH9}lx=b($d%aW_?+Cf5__dvGZP0~Q# zXjtB{@}0HgnVzU(=eS{Msw<%5#l{p^LjDl~{bl$@d1f+Lvp}ozBQGHmj25`F(mov- z*o-;eRl&7rl2b_lC0eP1)f4~SZOY<+iU*R1cI-b-mAYkwK|`c`z^`n@>T zmART|VeRh-J-=4shYbsy96|IRn&LQ!2 zO@|kU(Q#^Xxu)jXk5x0Of2mA=D?Lw-dJ67IW$c-vnrJvH_UFV}rXf&f5#&iMqj$@V zCCmO%nvA7*ZD4vhv93L?ImFX5kKoIF{F8HV26OD!ki|YTBNdR);wAEQl4aYDh1)zO*s1VO!na0AZxL(!D%GPT2s<<}#vzBU@#xU~ccsn#?r~LzU zqw7yAOBvb3&Y3;!jWe*b9;sy|D3bQ-lTuKc^kyp1hEp+OX7pw*43XW1+#qevbrY%Up>LM1`D@b(rk=zVeOX<96V*0pgfFlXCR@&0POmLkhAXveP4z@Se! ztvl-Gru7F~uY$~F{c-eF=@%|_NNxD{EfD$#Cww==YDxeL^96K83#?V6fv81;9z@gQ z*LeQBzip;jL?Pe$!##v!mBK03Dt{~PsJ$E9b@0!N{Htj)?(?A_2^KI90PLf7h!M#jR^TzM?C3HeFYWUO`I$E) zeM%x)al``=>dqCqEYO#0`iT-m*z3xyjki%NmVm3mZ1xwKp2@=p)1LikG%&p>q-u+@ zLGN7qOmi7A^JSA0M0-<|+t_BOICD19!fQQn`-WnBN`7r``3*S^s#%U)d;SvpvuYqE z<;<9XSJBiMif;-j+oHVbrS+O^^!bd4S+?}&U}d`P^7rb1RBg0|d+s6qo$t*G6OblQ zgOwh~*5-sXnI+bA@ct#9UfC9~eK zj8;-F?99W2_X?^grqD^)KJS>XZBqx*6UiOy`$=$ zy>e`+x%0{W?u;jcp?*!V{rN~%v^YE{eX^0j%l(F(z;5$>Nh_>2I_9q+R3CtDUCOiO z2)+x{Bd*(i$N(ON$WuA?j=zVdT!$E*q++qZnD0&mFL2#{U0#~u{-U@O)2o55`~ki2 z)J@_ zF+V5NZHiu=O9cO3W@x=XCKLl<4NnSKCE146kUr=QcoibeN8RCRL?XyPB&Eop`1{Ve zn@q6smI!*<1nUXOC<{Qcj9&4>rYxssIhjvtYL9O1V>_ptcIAl0ka6ZfAR)sg3lgJx z|2!5K=`LKR_E(mOy`9^C1U+%vs5@103A2~czaGHSAd<cp|_CP?FD}J$)KTB}#{vUr_`64cGh`&gncl~jrL=c4}#JLi^ zH9iJ*n|`^usnUmV(DH!U9TIHbR^qL@>Uz!&m->ckN10)I%-8E&HV?P<-q-O*c`_o} zBXyT7q2a4tQuK`nx>GKZIkO;^Z*u^!btJ;R|8(Tj_Fd6@aKVdltCXjAB&+=M=BQjtRwElYqGv$o(ygBAK z^-bKH@AS98caN!@eK~{bM6t5PMkz(T1f6gJi<>=U5=ItJRa|O}66JmM0KVewBj(-y z34cDykDJuL{hoEB`oT9%cDK*&zc}YI?J~pQ-ZYa`e3=<$@eghW-q&D1gnk%v%S{1E3y!gh08n;fV z@}58yQ&7UW#(m^As*ZT9`BsnvtOx?EoYj`kV8lM}1xh$_0E~5q0R-Wm6oK!$gRaGe z^g2T@o=9t6*4Ksle1c%Sdx6bbf{GwVQ5eqPe^3b>hun_{jprbB0^2tOZjpzr_DeJv z4+td-jC2$gX@}?R9J}iwUY=!Gb{sk2{=$Y}9qWiwhO$e8?UQSqNzDj`C_1f{uXL*( zkWBK1*la`{Y6MRdM6Z=DGJ!l3Nbfbva$qB%yVZJvZ9+AAlRps*iqEskB&SM9GTG5D z2*a@n{!XC=_Wl$ONMnl*Aj34a4EOF80A%QFC`*F)!L0-Qg9I$-_cWKW_JwEq$nz&M2=dz?sa8t3Pm{^Yfr zsD$2TAW!B)gHY|E!byn;ORP*kL#Dz}VlkDms22{12c;OI5K^v;m}vh1DdJhmK?G_s-yF2cu7mqeISb0hJ< za`w$q@`_%HMyoC%ZrZ*J`#T}qs3kVMFD8>JHvdtfD?^nHclN9vz; z_E-@kRPngT$_+BVlrRQFRK^~i%r4=6OGd@os6&`BAX2$Vvsj_*nIFZQp|W_8xOn8I zbx`vd-f{Pnj(uon%1Jwmh7OA=Mh(Jl`d>nUT7 zqHmAa)~1ALWYa9da}69E2Ytpf1+`T-x*l<$f_wK3xgogrPnyX{&logDT?vwyz?FG`Rh1wmo9XL*Tct~l;1!%23Omhp-J#>qOqLrJuyWR?I6? zx=_iZN^`6rjqCY_a2o%>cv+v7+w*r;fiROomm3>uX$MqdB{hX??j^1g3$Kj3-}UqP z&*=%Ta~{ynPewpyX^XoAQ_C*6s$=W6O_UV%mhU_$4ITBP6d#-h+HzRFObNP|7Qz5Hdpg8Bjw2`LoLBi8h3rz1%BCscnOF6s1o&{miDg z8=k3hGL{7;-LKiEEpkd~&4}S%bYc6J03%{^1g2R@ghE(Q1PBDX$bj`G!WloRLokRb z^E)KSy!nh5nQ!E|qa8Bek}Mf_$I|pyUpxIv8H(mCn1zE7biutj=4IKz6@xviGNDrk_Lawg%qV9G<((o7{uy z=!@Fof;SSl z)=4FE4COoVTxKfsgkO__K9oMrQvUg{Dpc1PTFznM*CqPOKJZGwc~mV3H~q< z5+s`YX?l+IJcm51Sg@lhzzA?S5Fsl~7CHw7P{u!p1uAKpBDt|^rC)SZ4>QILlaV5! z=9a5ME@x`G;iQau?iuTuu&+q(w}rNfowbT3s5TgkP^8-_h06xFib-KylYNPEas4~h zqr-9*P!c(4otj^2_4@*iLN=jSQbuFi4JHwRDvg_hbv0LL%s<|~$PCC~oc?%zs=U>U zyFvY3KV{|MiF2QwQWOo&cpH?Gc6LFyic`Rr#P`dujuk}~X-%7bg}Sx@yq+~E>fWG% z^|Kb9Bdn$&omaMQL-=WsU_<&HAqlcB>5Z<3RO+v2cgPLLHu0WUZn?MQ$2P%hcl-x; zySk|L?$B9Hczl3lU5v@#*lxZ19k#Zmc86ZL`L(3fMw4@pyJF6Mr+zv$p_xhoX`i@s zB)0Lc(5<_9WY_2hVgmB6T<&lMm}ke^l%5Jo$Rq_3Yl>PS@i(j+_Y9T1>+^B(_3Ak6 z32#QUPgbz(P>L;z?Gfr5+tdMlK7kB&ev9(LG6?#@Hvn|!n{Kh>lztX2WG#e2SeSGe zTx5iNtt&q1AQL%MBS&JUR2Y9@M&npXkf2{+>%Vf|Gw@znk=ck}$@s(~!?FK-<9fu( z^#^_T3F8_vitwLghI;tp$bNu7F?J!4-mnPKq>uBT^*h zeVLW9AFx39>^^~wd;=?-N?wPJg5xaIZA?t`V|Q;x_F#bd0s2V_W_E?_B!j+YsS{hx z8-fjUNsu@=vdg=4l{U+DyR2$;BYn|MW~X(WBIalP-IW$)%Dm5 zU}Pam-4?`#a&T^PmkloFm#2RfN3ZbeJ2x)`K#|HdCg5S%Ds&~-luL z@YDeh{pYUqPvg4}?~8HN+D?2;e+e$8MNCDsKRJ-I=9D>`O5eWb zeu=V%0zD$cT&O(avEo}%l3Qp`EtbCY0BWMFKl6vG7&oD8X^puez%KwwT*vgEF{9A}Bsk9YOGiq$}gq&{Ulg+7TSp==p>eep< zGSc*VA7V484@o#Hj@qAm$sJj39hL<;OH4me1gdpS*`?us5_T#Z4uEU>r(p&83uqwH zkD%onRCf85I1*-myel^=u^>_Fe&(A}^MG>meSj%}YV&=arqG&y{ar-;RtO%b`GOQB zORn9vGKULB=zGAd;H=w+5H-qQBz*UeUUw(^SwZAyXps-06Cy2mQqsWpfPo95)J)>n zOs%@8RQ!Cvh>H|Bf%rNDdsz(_jUDBA=f-e0+TP$ld|{);V@}-;5RMMU>H?QXJsA*uasgufe3XTB4LK^t(@aLKx7Y*R7_JfDxS$lgxcZuLtdj*NE ze~Oc!&)y?^c&UgtK8jwK@x!FcoD#u_ASyqwiv?jrzf=Px&$12Ij!37~YR7Q>HROiL z(ntlU6>Z6}2i~ovgZCj+ygy|AG0h|xE|gh#m%VP(KUI@Jjb4;Ay4 z7YQ4{9E9)*2RkhK#82EG=UX`20pM{6e?ESF&Ii{BC%<|Ysb1vX-;Z?9-%lVvC%jDX z1X`QKcN~s7R`!22A~ZOV*;q{(l!}WOJ&_6w{Vxh6g~a=T1Zpq{)C*+L6I%wiGbAGU z9TF4?w=>dM95qRo%nv!~Jz-}vw^j$?%J%5NluS>Yh@NcQweQs=0O}48>dwJU>2cg+ z2Pc)-o+!Bhx#TlS5Mx5Y)!b~dHj)6hv;8$|4^^5>cuOLk=)bzbUS#&k=yS~kzDg$7 zp~vEB?_tUMr#$sdOx|Itkdd&@yV(?4ti|GTpD&KOTROzz!j{GT2Y1AQ#O%(wWpTUV zvuJYJs(9`|UlEs*P2n~6Ln3aQ#kDOh^jh4#!|V@O*G%FuvSdmwvynLBH16Lvtsf9$ zHtOgQBVWF9CFgSm{L(@SGNm>FC6^KjG*jhibdDovTi3NIguNl+p)SNlgWkkLzBI-M zyL<}w#AP@e-LOUa>XydMIavU%;CT$?tmu&1yIP50ZkH2HL(T0C0eU^F47!A4-oh|?Co=Uqr7iikIQbB?v8jh}!-HO2()A4^C7 zWa$Z9_)Y+lw}fHCNF&e4%t!(G6rbG4rwbP3+Bs0P-}KdhpkzPI zZZ`S%cZEhBe+?qN3T`WQ@-#xrcGRPU8tnv8$6DY|EDL z!xk7INhWuS9;6y%t|(QBtK%G9cVr_?!)n@Pij<-vTl&nVrO`emvJu~yOevJoxP@GD z@ozQ+}k)aSUVEq7qIQ`_|y1H>k9tE`<-Ejq<}=J;HadikU-3T zW^lXjpSR8Lev-iej-?Z>`5aYZBD$$b0UOE~RY9CsBJE&5@}C*bS6Q-NLB;EDlJsK+ zyF{>{Al?xE;t~UVhR``JBYjZ)&(L8?G@HI}>oI=h(O+4( z?t`5yrw5p9IW;f^|3t+*eMJN=dGpQCKSg?daUvav3{>J|WV~-T*T>m$!}Qr}BFSrt zy@boeMD0UobP4MBG@{N)y>AbF(+HOc&m+_G$@)&bCYFbKmc7$oMyGXlq}->bbqr5I zd3kNzmorGC6%CDrm&6e*`Jn2LptT!T_W5I5n3BYK68=PWMg)6HZI=UW$wJ#-B)8?9 z@4V!OcyW!rMEF5%KbRpN`Zyua=mUK?w1~(FU3xPfWU_Wv(N$qdk*)< zi9ibXhlw=c73$5u8UBxG+9K2aplfwheVNqL_~=EJ$pJ3%{-!1FcFX3x&D-(y2c6O` zfd*Om_0F2}nIu~f4wGrP(BsXp50dGOkfr12-tiFr^Z)or2gyY4Fa!fp8e-aaBypox zleN87d?CS5NRa2I6O>WGP{IhpSAQ%C6O%%aiV*L0gQM(Zcll~Yy?1>POQi7^8r+2< zmH5i#2M`W&ME2EpL6bT}$L&pnp+xD}8wydn3Dlg9X+}k8aoXd_-Z`&=&=+Z-sNYCYNQh^jd7H7e3vuHizXlhl}6pBcF%^ zchFAYR;~LD_bWf_=q#r++BO~k{a;SY?ZNjK%C)jadpZ$cm3bPNu1qouU1JZ!Yra{Y8KFwOO*O^8 zLOYx|Y4$$@S0VYCjIExoPu5Im{FT@|R0jUAAlD~x|3;Z)7-C!!vBO8LV}XN;2=ZST z{cm06&l3|R0h`pr0wx?|_rTd(hU4fksaRRKXo)8TN zc9^!Z6sugniO5>`gwmHrf3;5%2w4a*qlTSZdR@*XLpdBPcP@~|<**h69v{IgL-|7- zY-})_0_`C;eAu;lvO%x1B{j+mcj{nmI{@cTfN09HkhR43!9Wu^WoRpyBKCX#P&zqK zL|-vc%n<)j|4=}FuJ)Ls=sDaweh8w7`fMB?Vsiuf(wzBM_RrRobE!3`&7gRdjoljT zA(OGMoEO5gT8pu{OhqiF%#c+0$mo>PAWA0`=#=wBROBH|V07oQ(r@P7__SEWR>T%k zAgRn0;9o$v$UzPu93Z+Nga~_Ma=$&cOqK}#vxA}Yl7QmIFdY-w4WyNCeFzLPS?!+8av6&fQ^}RU~c&`8$7yCI$8g`lubS;~K|!TQd#` zh8y{*HUX1K@?Dr1)cAa7IcX_Vf8iQqrT|+ZLE~7W8(ic**b{#Rp{J>ssA!mfmbK6c zV|&FOx3xnq~0Ow8YHV8sEd_ojTYY$q_jxWtG~OG z)Pxo<>?E<|TnB#KxHvz2UD?Ll6#C{sBnL9%aXugWPwn))?RR0ErExN-v4^eFI|ID_ zvYfi}K(d=UaH#aKqZi?|8N5rV`m~RFL2>bOaT=QLQ&xJHf23Ds8FmW16u8tkzZKuJ zr0o2BQ=^~2uH_Ka(uEff&2FDnU2#*~N-dmK^;qS1+tAMwQPe*vgXee4D{r%y@XYWZAP-Q%-oeVf{6tPanGTUIje|iRpH(>|06Qc<2|fpj{J4aV^Gw-A}jZss9-7HX}5z_F!-+F*6a;s3a16@_6lN*6}E=~=i)Cy zUm`cryN(KyB}D%Dn=E_KdAA8(`Q1)qhNo4Advzpd}1O04V6Nq+9>LI+t+GUBP zRxgBvvD+A8xxn3(Q;@w6a*Px*KexH}v|U=qYRo4K)=0XC(Fvk5g;jmo&Xz=~S_<3i zaYL**%FkLJ`oV%vp1mJVA zKb5#Y7^G5eU~R&t$nC3$?g`vs-3pJ>5g$TBU~Povx}XeZ$moA!4=(ZCF|qP3O>^WE z>rj;H3yRIU%A_CulE5YwE;ve<=34vBvU&4|M!G7+O*@IVOR+kZN^zb?x?cP^$R#CE zD-8N~rTYC6h!quY56~!-l?cv6e#JM29}?1b4UcsF^mchFq&#GQ=V52XC^ov>?EsW^NNiZLnh%g)xyD)D+{k|$d6-K56MN$Dh z;Uxc?0GgYVa`LrE@Z^(N_PnDP(7r4A{Ll0Q0+r&7kT76Pk}o?*`#xR21Y{%?iE-5s zh$oDk)WN*4>xd;i({M#TJs*>o!k!=dX!0CZ6OV(*I$4ew`9hyUK&b+;bJujmCcHgF zj7ln)M=97IHNx~~t((Sr;ZB4SvMhXEqx(BI5^=KoYF*=n7Qx`W2p#=Duz$<50l?}S zMSm6{+Mx%9j$p`kOh*QNU&p*|ykkA#Do%!i7z&(6i3HP|v|`z#Iv^v5h~Yj4Me!kK zZjy-=Gh#HcvCgz$NvQlR4Ushc$m$0?B*o3tB+e*`9W7cq zXq$rHHER-;3t1L1PKD{JY!?$mfFc;B8PP@6$ofH|MKThI1rbZjoIb|EaL8ySke*$C zB4xOFDqq(pDY3kUhHtAYIn&esm4DUGeKj_8He&4Py>JQ{%Fnb25Kgj4ECdM>=+9lR za|8);ym?wwuZ=30SyImOg;IfFNi4)x1!?7k*pwyBl<@a{-_0IH%?A3`zGnLB1Q7MK zIjKtaD$V)}DWL{i;YxVPp@1Xf_v4g`WIBNeUkNEG%aOrN=U8I5{#QI+>Y<5KZSAd* z0^jq9(C3`=#UzUmxW{Tr>GK!T$38tdu5ky#K|I^Z$zYD|f67woO7akQ{F@=Ngi1Ut z3n^Fe5Xir#AK?FW{b*sy_wX+!nb+lCK3Bk3RG(5}!7{X$3kt9z21fHpb9)#Tf7*0Q zt)d+P<^1K4MS?ri-B!#my7B6Cx=VupxpE2j|8wOUlV-%prMK+IN16=N9cF|=X-r6L zjJ+!{|M+cwyJ8>nldW=y)IAQ>wYdV$D{M44vh{yI(eflakwls;L%J`+RF$1;1ph7x zQjaKwWL}M$zSyj?(|e;rE?srr*KAmo;N`x=tliL5r(SWL~ysDG~Aapd2Xk`!@ zCy{h4N*ld@nN!wD`*tK_0XR{$VV$3?9mY`$=Z9 z{m;aXPp7V+dudTEMwLtWHn_Y=$;@gM60swb<6K3LJW*(%+L-g)2CE+mu_MMlY2%rGq^Za;@4z5U)3+&w%IUSd8Q$LQ#8%AMkU0fxh12x9L=udXI+)RSm#xN- zcO!dVN-UldJ@wC>aVNM|&9^-tNi4G%iVeoqS0p{Mc$8eya^_d7pc+Zic(H4qM$wW5 zMbOf^B>6eDW{GNMII7r*O5WGFVrNRB!tWt`%^!{Ht{^IFaFS;mQkfQ;vP2VbgRUIR zD<1yRLh24s(K=I2%<&dKCC&g`ESxsYS~8Yqw6NiMJS486%UvzPg;PVR?jQr(a)4Bq7T1pU~1%4W^0Em z<-_2d=e}Gw9I?!U7L{t*M;w)e8}6_nv`F)ASpG>QDNO2+^7#P}eDmnwsYVJ;(hMgu zd|O%DNQq&bo~J^r^;ADuZ(8Lz!D8I$bRytvWVKl0&{#67aOl{vatdD$aJz5PuAo*BN1kTe3Fdhz){rc<+LipqB^>miO3crcQ zwa$6z%jfNKf0|%8+hW@A1><=h0uknU8B4jui{s$azehMH1Rs#PAOaV!Y#$WrGs$6M z0!KjCUgw5#c-ndz8fien?0NaS`}(jmBLF-?w)0jFC<$w3wDbiybSqGRjb0Es7o?sO zIh*6V!nUzs5(+y+ug-~9PtINoUnUdz`F%VemNXpocvl(L-h1!|KN2ikl_E2e32=q4 z1l}NYo)QZAOwPWO7>HNOhHEn4!|dUZ1_eAKT?qg@J++{oMg6`(uWLk>H3BbCfdKFQ znUb(l$eO>9qkt~`Z5faHPLdWq#;;sid^=RCpGw$(dDb(C!p+5qdSHWY*#c#bnBcPn&scSaV$& zqAoNw)dQU|Tps!3Tfdcledp+Megew9j^?lF+=?hJ#gbT$m5i8Oz6@dTyQe&fabtR< zaigEeNmDY2b9)aFji-6i4mWAtjK$b`P8;0IOi|kWo;2H@+%#^ur_tNpStK!&-y;1b zh}lp^t6J#$Gv1U}ck22lt>r+6Iy*Do&pRN87mZIlCZ$bwN*CT$AY+M1UjeXA@9;8b z*O%AxB(+&%n38PdU4H3Qx|QtSu-T`r2u=!PiDK<4`I`5A_U&}iV*l&UJ1voUIcuV( z>$zTz(}pv{uQtZJ$7hz`60>}+f4}Zs9b@IZBYu3FU`;mM>GEFK zGa5Qfi+nTgYT}_5fQ(rWlE?zOI=K{z#&516 z@ZUApcZODgFF!qWuE(uk(U#lfUKjl$7B^NF{*^CE*YB@_U9y z5Zt@_^Sh_xmJk^VdNmp@oupF|j4Oq-Wl6}^5W=~Fr2@kFKNo$(&`L#yGXP^_L@wsK zYp0lARfn{{v9m?$bhBkTf?h@>c67(D&*twEdtp*&GNqnw&xeX4_byM5>zA<|1HZ?+ z*S*8A9-^jr49yQ;^*X>FMGsoFPSFzZu_-gDc|SWu(Pf^ke6w11vRNcgajsmZ{^D5t z>s4;|;^}PV+jL|2zFPHfoBX3T{|?g!j}fe#oort&z%A3OC^C84&&{j*CiePw~ZhgzXEqix3cyQgEkwf*^?9x*lu<~2WDMy>Hx}y zyM_HT3mYDKGyt8!Le^kimN~~)*Q{a9IU_TtGSUWTSfDMPPSJ1+@vx+hpNUl$x=%N? z`CG$Nikke;-S4TppW+OUkAK~!YmR)Jb#e1wR|dkLx9+PIF4y0$Q_-r^AA*TNQN%tZ zEie_ME#WCVv;syj;P<#3l&8J)O>_N}ZSz)Lc{p>FCIPB`V-YR<7?>XeCKCUD7q&z~ zVuc!cp|Y-e-?wr31mCvGbPI+^q>1@Uhi`Qln zGq@e%H%Zzt_NVo)nBFbl#G$L&zyZ;O4y%ZTf=yAjXri;rjv!rMC~4zZ!v*a-|A};}U^X-xRvP z8Xy$;2br2QzbgnG;?>h-51M$1S?W5x2=>Qncs_a(e6Ka#msmi;t>7rZN4YRdAo6+R z5gY^yMDw9n{W6ZJY=aC$FYKZEd!kHIu*SqZW-Cnx&eioUh@M+-(kbk)ajqAH-Y*AG zo4YSfC&{!KD-J>+Zh4xtzBMc+;oItRJ=s)3c?fSb=6@LKgFLxctLbOP;|J+BMgb8@|R(nWUs7cU2L_AZ8+#5Eeq;?3@Bq&E9xmeRXu`v$u~YppCGEp zB_aQ2-G{_#xVB-@&-CrtRn>Oo9*}Q&=yKZxV&_+-4ph_Nmm~tS17UNHKMD+vqcWI3 z>YCOHsJ~RE6rpzO0p0AZg>IasFUGcS-83@N9DcWwe@*xnFn0lp^OYTg9y=bl^53W5 zdIy^fUTy8ygWS-Gt!;np{2}s?R~b2*v1OI4E3BH@94;N9(On51Ir^INu)v-j!Kgt4 z@a!&N5CM}PC0bljZ3fd0k*Iwd%yc`>ZJi8$1Z`TBKmVL816=;_cL^k%)~ZmUo#3Jd z^l}iPuU|#8E9oKb$74C`BBn36>KpcjWqAqr_E`_^vWy>W#@kd-i^P=?-)`i~TLY^B>3hba2HqGD+N2pJm<|ZAZ)}X! z&NLj2Mqi9Z2lSyud>aq`ve{XViF%nOciJ(phkQ;44d%b;-2FW;8ih6<{oVeR;QGR~ zh=QVItWNo6NCc0Hg0Z9Fgt98KH{Zi(t|DYtgTFA;e(svOe_P+j-OIqi7r2tvC9KEC zWAC|8S%c-~w4#70?u2(XU_kh`p+OVyL8NBSOKr?`#uIxLW+F%-E`g^rBqj4RiU^_s$22-N( zGMZJa;Bu$TbM^qDU9f~+c*6A7wBRJ8YPp^1_}}gq6;6nlx@053XVg2#%Xz%iU)vrM z(BSg(i=GHk!IW;gi?bb_?{vzkbEe{r`BxHpsHu?NR1cJSm49~z4&ld)xA9ckPwCuN z`%7dJNsB2?FIjivY5Ddmf9|W^Oig&Q%5_r2jm(6F)d3Lky&X`m#pDbk-P)(1`zZZX zmxTEbqiJ5I<0YUUxgs0E(Ro|YS;05jK0+t{))bzr$NqIOgqqWu1iZL2O6KUWKX#cu z<=0{-QSs&o?<@rAv^|}tM_Mjaj6!d^hm+lZcQ6TtMc7+~H}3hn-FAKM6N=7l2Zx74 z2PJW@HeR8;ksF8Oz|9f1ulPKKt7Q8;Ob5t3p~i}1{>~6@l|}F+NWFYs65+?I zsu6Bf{v2UtOa6e{q3OK+n`_j2I-)U|kh1RTV;5DnPM(Ce)E%=o7ry$&q4{F7%a(xT zJjIM|G&_%>t5 zQHFn8;`g|qDG1c5o6E@fFzepL=k0J4_edpOFMV&5UnVQct3#bMu=dMg6lAajTqy3O z9M+!I03RboIfW%k&4k0>&}j;oE#1@4xA4pvnF@Y%@7$k%hf((P>tt-{(Sa8fLpt4G z2XEg(I0N{6>g;Ed=2YL$_eRt@b7ty&UPn{bE)2J)XGgqI)Tb_qP?XbA}#Wz8}Sb*0=^9 zce;F+_kPbe&8oD`z8X3omFf)k6j5GdSAv}D?U!Y>xnqEs3{lQ*>Z&|9A@iJoh zJ28WG47~X)zv84y_oLua6#hM2qneu@FJRy0Jo-p)U-L;ppp90U;1G(uXjkf;OE=Zx5az60 zzbnE%m`!$GEpQ*;DICA15#On_Al^OMqcf?BEuDEnz0R%ZK7m}4MrX6Wq7WByq#5Yh z_1X7cLKh*5k)S`&yo~>kR+wGNeak0r_BH6lO05ibnMkS2$7C}{r?yYG!5SS-VUpJ7 z9FN_45B~H;;hS8}m)Ff_rA#b$pR49YqqTZRzf_a}-8%;^@FJG;>|UBF>lgi|nWYd5 zaq*RVV$xItlD6IniuB}Pjgw7+Od;Xt^y1|jW_3aumG78fQKlivR}#QF3aji?7&n#$ zH0MQw;x-)eV_B1^%<{uI78;VPeRp+!FE1n%^NFP5MQ_0^4X9zlF}mA!+?~@7BM*0| zH`Mk6F+~}!Y#f)l?Pt{1Z>nqz$v2EOPhC-JzG3!6H1`F~Nv>@~O;v@K8fX?*dK%Z( zy!U(KUhSysmm!rfDt9NXF*j@cTtBq(-I?Db5x1Yj?UQSKjOqvA8??Js>T7*5I-X1e z^Ozz}cej%b(p-zzw%|-Vz6ZI(N*u1W2nrVg)TXeUUZA?aO#~~43N=fFU3#l-O!049 zdv~`Q80|x%ymp&aRi$U-LLDZk*`7-34&vfY8+}H<>`XkXaZ;}Hh^>7&%axxG4O;JS z*7zB9Mr3KKOFOoCDPBoui(d$uOtM~Os^O=DKTH~fdchQ)Xs7@5THN+4m8raxX%%k) zuv^yiiKmFi+{mA%(auIx@7L~fw5^B>rH+L2Yw|u>#^aGU#V1t;guDu}LcTS$4M9ZE zMJxHc_XK9C$W&)J%EfGgo>9{fq2jb>H2*YCERKiXv@5U7>90>T^BFOhM@h6c?@bdC zD{~CvDTAFEi8240CqiSPM#u)C81&3sH=$5Jw?>C zw)SK(;HP8TH*4NA&G4uL<5uvDt=Dh0v2~QkJz=w5t2zI4hxtED1#g=NLFWliO=oOkub&bWhV(hSnpNx>F!s!%wwO2+*QuqQCQ zz6Y9ys$9!)Va(5^f23MQXOK6kZtm7rK2!uaxHTlJT$qelt1)gJl^4c$nr=4pa+qsb z0aE9kdv!y03H?=}Nu(`bLlfxazKfleSY=Jl>2dsP7#Q_=#l$T3f~f$)FK{#dHZheI z^t^$BNvjZR1aa3deIw52m6ZjpCivGY5*Otk88O>~bj1 za*8N9_t%ij_rX(;ehu!KR~m`@w?RXOo`mP5YoyLV*Z*!-SmxPEdvJc_#i70`@?C6C zB+Qmm+HasJa{~_RuHXKlC7J?54K~QLZdMr+EwPwaPSr`FS?fmn79cAwF9fThEpx;& zT-)@SNF0y;ZN0|)df3_)Rs>0l^M|0mBD!;UzCwp!Zo2fw9EWJ<6*L~b?}0bgp8cC2 zZZ1ogjnp}|7q=aJg+_$s3oQRsIC}iWx_nDeOGsVxFz7fki)ZB0wJzqa66*-Tc$-pr z8^JW!f*fa*gmK(tD}b3rN$N@NRdA|s`xQGeY+L_FvxHB49@8rG)6bt0bS>Ik~7$E*XZJc*dQ%%>v5kaIwK)Mtu(m_E$Y0`U-6s33Rf`Zg5(nX4N2@vVh zdoPg^=~y5jAkv9+1Oo&}?wjYC`M&r2~amd4nb;b&6-&k3Kc8l2KVt(dw$P-4+IfXn%-8{#GP=wxJJL(K}O zW^t0vKi{2f!xn^H9yj0E<)px#q#jWVEe+^mm9$My3K()vVNW`ic872qf~o>M&XE6# z2V;EEfc3rMM^V=IfB+Qt62(!?f5kPJFDa`@Dm_8;OvXPJbxoz%&=H=tZHhmEzrOnP z4$dGkaxjwyVsQeqYy|&OX&3!gN+5=i<_S<357J}^(xs&Sy8o9DVJ#GD=m#*6wwkCj zvl4ISA3M)f2K{EAFAvbz*|6%`jGpS($ZoEH!df>cD@!7Il>>ob4aPS~_AS4-5bLrC zoJ&pD%t2Gu9az<+$2l{mI4Og+31wQmle>IFpsePDjMKj<$ANVdS1B)yb?3zPO{Mzv z6!T!Hqeku8u6S@X)Uf-#4sfY|RW%4u#y!!!(*aRH}0qjRb8_gR8d&yd66hT`o7?Mie1E8 z?BzNT)-gTi+x>?WA@n5O?xXK*U&=DK%c-Ko%PLQ$9^uYmWkY*kfzn;Wjx0!0YM|c$ z1BW6lZ-CJ04c2Xg=_tF!akrgE;U?`>x0`mIgKG>cC6Z#oP$A6`qDuGL+DgU3>%?MP zm9a+U`*Dt~Oy~FlyNVQ#4r}(0)Ztna7{x5$R&u&ruT7G{h>@WKeVyMyr1i#>otvIP zd16Jmv?>gA;z>}|XVH=DBcX?Ivt4UGW7d5w2L&TNUi>ZB>M?n5p79$x_T$n{{i(hs zBi-9{b&wpX4cr)E?u2Z{9K7CsHR+ zIIJQhq%G__IFaA~6MqqtV_6=g?sR^t?EvJ@mOkOhQT0K{C8a7aB>L!2uz$^n&mX^FLBlYl!1b)*ZP9yRkD+?^d>b zQCS7T816%b12vp1dT%uVC!2O*dsvW6+v6#L zvxfq5+h8eH2@Ph0TzDfK0s|t!+u&_{Hh$>>SOe?Xx0aU=mHR~`wg>78zQx&VatRD! zR!X0S%Y~Y9m8I+qBWC@D>SzspJW4N9AJRp3R1AmkEOv77Q{%aBy(Y5DQ#3#rXV@$Tz{itmfnRMyWU#i z5q!L?y*vO84-Fl{TmxGV=iIdhJ-7FsOgzCnE0=*b>;I>|`Zcd*fg4&a!c_i$=K?Z;<^mZcCp*iwO| zS_J2UBGEdV`mDY)(Z~xnn>a83)zNkJREMt8eOUvHeXn$-udMB20`{R-0%kMU5CD9~ zwM2ZyNacSgz7zI#?TpNspnY&L$Oqfm@hCoyp7ud8`(*7LkR+mlUJtQOx&+^L_wjeE zg>t}zzA$yq#6r0+3YO36n%;-|p1hrl?xDpGjN#A5_ZDJ|Y{#nERQZZBqWNE65mNcs zZz>A0hLA9@3dI+tF8FDl`>b@yqya%uA_p={)U8N!e+#dkN)1&N%|bTu`Hf?~tTz<) zV=0n4IjRXa03TE4^Vg?hUoNun_22kFxa~`L^_-vPg>O`n z^RmpV>!o*fswXH`N!Et(ttzAqjN}a)#VowS>RC!H%Vw(2bV(WwloR+?$brp)q>MG# z5cICYShjQ_xA|xmyv($m^Xik{R%&OtY3N|bN>f_=%l0o$d%-dHEpA%PfVH@T<>gUC zRMbG92#D;ruw4-Wes-j5=S#wTw^;xQtPia$osxA1@U@q)r(yoAsAGA$a0;*2B zSEO#-%AxS={Xo7Z+I-B+33#Qr#D@HM0d;!IuWKefe!pRbV_!BS$@!CU1B9GRp*ip; zw<~!vLWSK@xvVev+Nke8dmuju?B2`EnrMjLezl7H7O*$FGW%5W0!^pOVudY zF{Mb^mSo*pnSb|Gac)p%R(2&uv#Ir`sD&^pGqZyJW=N!TB?bmij&;u60p?|;t%IAo zFEv|&tGXNg%gy1+re6!)R{U!snz}P4KuqsRcU=p^VfimTvca$Llq9#ko~6a{`Ox@c zmQr$Io?-2_1{RI$*>c*XNq6GihrQ*r&KE*u(jredv!F3~uUCq!)v{wDnzkxrt;)!phmA3U^AG~`W%EI!pK#>c0pPF z7*n={RLehT&RWh9@yn@--G1_`Z=Y4v=$|EjsZpOsGc5QepW3x2IUgpclbF08UMc!{ zxdfyN48KLs9cc^;#>a@k%|4UH1a8TLOMQJU1a)&*V}tzsu%($IWia3v(6ZC-(^ zq1xC{=l;P@`}K(mBK2BygYb3#E?jq9T|U0Z>MXS4B_XEjRQ>zyt%Py;bD(=iGYv|< z*LVccRsW8Wlv{27GEl#gHz#%O!NbZCo+S9{DRFF~e;D%qtFO7VEOZYcUT5E5r;w0R z@b9u>e`b9V)LWG_&E?{yj7Z}ar=Rj^Em?gUws#G_8xX}?X3SCK@VRlNyM2hdHI?dw z`J>#X0;E+oxi4N)sQt#$?hW8CoUHj0jFGh|Aq7M6%ICla7zus?z92S$Da7WNb0;MH z23UADu*!^77RE>XSwJ?oTbAqtn~_6XTl5Em9Is_P>m)=U!RoTnFv2c5Suj(`5^4L} zbT27pV>77{ub>>Rt7Q{oVh8p9GpKVjjQ(gr1QpWs0P*$XB$qN!7$yENi!>9Bt~$P* zvXiPOIj*{mg0-NwFB2;CwO^=CjGDGs&#DYHa+~(H)TbA2jqFzcAj$NV{k7||Ir!~u z0w>ullhMs@Ds>NER+;-|Wb5NS+SqRk+~s^IJ1UP>476;^`=TYlH@5Ic?fgQ+XVOAw z$piXJ)QB({WMKq|(LtEP>Izt=`s8*?;VJKB^su_q*N>Rw9cGSfZguswAg9XaBJO1m ziB5wJvYWwEWifXB@_LuKi~NA=+y}P^iuJcv7V#$V=FozXeqP^3zr|x<7gzxc5Sz!V zMlXWxBy5GOB`$SVrut|1p8`BV>zMx<{M zZ4A5Yp?an)KUP<_PUD6s@)KH8G#<#&0E?FI-qt}!<^3p9;oE^>S@$sfnEU0Z&3cZ2U+_Ra1W z2uy^Fw^XpQ9)c4E5hNES|%oH^m@zkoajEq zY@in1KD0E{`1Z_w?!rCmDxR?uVw;!cCW>wCH13(wbC>wjJ$D=$+dn=kVr9&|9ztMX z?E_xq2D{1N;>jCj;V?Ty_yyWjnzPmr?dD0$sqr?lM4e}0?hU_5k*{VEHF^W@T9V}a zft6e({^R>;d1%JkZ6PNUmW3msM0Yl|oxf&%Rvcvx3A$-5=wPAbG`8vU~Xi(pE-0t}p}JGQ&Osw+t1A{ObDnXc%KG@}1(s^OgT zBUY+w=v_l9RWe#dASaklR3dMMMNKF29-POJQD>KG;~XTMsQf^<2w_L6y_A=e;}|}& z6TK`$6V95Y;h#Yce9Ga-5B;{{k}hi2cT`Rk8agW_v%#N&-&{Pn>Ltf~LRI}3(7r}y zK0qS%dD_pUcTG(@L-SJ>*HQFUw%D1lg!^Q78aJd$rfAJvk?_!ZoNC0fRKmNrM9chd zpuUI3_P-7YCVujC={oz!r=(Pe_?#_ER^ibvf^jCJYhMpHrp_k8AV0Zf4B{ZXYzH`K z>bF3A&{wcl{3&ZoXI3OhHV`NY)UR+XNZH!+1oywZlBD)3b8nwA)sHAxy&9{({8fLV zVVyE}kXYvtG0$X3P;na3W16&RNgfi-gyEnlqxG&nljwRScDBH~?32?4-iBg)S7Y}Q zs;N%kfu{76q~T^`FPGx93$K0&3ARe>yvh#-wpP6KP{wzPZq6Vf{YB1fG0|~=!uAk zJ(W_XNVb@o_~F;pA)-H|j`oiJvHr*~kV}`GPrcB=k$rMQ@n$K(_TMb>%Q=dFvLvU^ zE9#f`!=~L6l$UGAE93mnT(&{j#3@MsmPqgVo#NMia1#~w$xKCtI8nYR<=u%@Xs$O$ z>>K~foW~3wOzp?Y>HNm&8#ZC{baXp^)#y}26Y4jcQnhq7Tf;;dL@U%|Q^d|Xy#=kR z$1#L}&=sMu1S0M`)HP=TAhogH6=KG#{~ww(-O0kxEQ3HP_40M{{J*dL?*){GfG#Z| tBBCTz|MRp)b`eHAbas?*c6ja}?(Ar+M|$m_&Z~q{L8vJ#(@88J{s$UkGD!dc delta 21572 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 My`ELhq_x`r0Q2SFIRF3v diff --git a/database_upgrade/2.1_3.0.sql b/database_upgrade/2.1_3.0.sql index 0992672..df8ac61 100644 --- a/database_upgrade/2.1_3.0.sql +++ b/database_upgrade/2.1_3.0.sql @@ -25,4 +25,5 @@ ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; ALTER TABLE `userloginkeys` -ADD COLUMN `appname` VARCHAR(255) NOT NULL AFTER `uid`; \ No newline at end of file +ADD COLUMN `appname` VARCHAR(255) NOT NULL AFTER `uid`; +ADD COLUMN `appicon` TINYTEXT NULL DEFAULT NULL AFTER `appname`; \ No newline at end of file diff --git a/index.php b/index.php index a922a89..40ba621 100644 --- a/index.php +++ b/index.php @@ -26,16 +26,14 @@ if (!empty($_GET['logout'])) { - +
+
+ +
+

get("You have been logged out.") ?>

@@ -73,7 +71,7 @@ if (empty($_SESSION["login_code"])) { if ($redirecttologin) { try { - $code = LoginKey::generate($SETTINGS["site_title"]); + $code = LoginKey::generate($SETTINGS["site_title"], "../static/img/logo.svg"); $_SESSION["login_code"] = $code; diff --git a/lib/LoginKeys.lib.php b/lib/LoginKeys.lib.php index d445568..3990cc5 100644 --- a/lib/LoginKeys.lib.php +++ b/lib/LoginKeys.lib.php @@ -8,13 +8,13 @@ class LoginKey { - public static function generate(string $appname): string { + public static function generate(string $appname, $appicon = null): string { global $database; do { $code = base64_encode(random_bytes(32)); } while ($database->has('userloginkeys', ['key' => $code])); - $database->insert('userloginkeys', ['key' => $code, 'expires' => date("Y-m-d H:i:s", time() + 600), 'appname' => $appname]); + $database->insert('userloginkeys', ['key' => $code, 'expires' => date("Y-m-d H:i:s", time() + 600), 'appname' => $appname, 'appicon' => $appicon]); return $code; } diff --git a/login/index.php b/login/index.php index 2aaca5d..afd8921 100644 --- a/login/index.php +++ b/login/index.php @@ -21,7 +21,9 @@ if (!$database->has("userloginkeys", ["AND" => ["key" => $_GET["code"]], "expire die("Invalid auth code."); } -$APPNAME = $database->get("userloginkeys", "appname", ["key" => $_GET["code"]]); +$APPINFO = $database->get("userloginkeys", ["appname", "appicon"], ["key" => $_GET["code"]]); +$APPNAME = $APPINFO["appname"]; +$APPICON = $APPINFO["appicon"]; if (empty($_SESSION['thisstep'])) { $_SESSION['thisstep'] = "username"; diff --git a/login/parts/header.php b/login/parts/header.php index edf11e6..ec980a5 100644 --- a/login/parts/header.php +++ b/login/parts/header.php @@ -26,6 +26,21 @@ header("Link: <../static/js/fontawesome-all.min.js>; rel=preload; as=script", fa
+ +
+ +
+ +
+
+
+

build("Login to {app}", ["app" => htmlentities($APPNAME)]); ?>

diff --git a/static/css/login.css b/static/css/login.css index 8b68a67..020bcb6 100644 --- a/static/css/login.css +++ b/static/css/login.css @@ -5,7 +5,19 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/. */ .display-5 { - font-size: 3rem; + font-size: 2.5rem; font-weight: 300; line-height: 1.2; +} + +.banner-image { + max-height: 100px; + margin: 2em auto; + border: 1px solid grey; + border-radius: 15%; +} + +.blank-image { + height: 100px; + margin: 2em auto; } \ No newline at end of file