From b79022bc4110b98745e7c2788f956d5c150b61dd Mon Sep 17 00:00:00 2001 From: max Date: Sun, 27 Sep 2026 16:07:18 +0200 Subject: [PATCH] windows installer fixes --- compilation/assets/logo.ico | Bin 0 -> 15351 bytes compilation/assets/logo.png | Bin 0 -> 24735 bytes compilation/assets/logo.svg | 50 ++++ compilation/assets/logo_256x256.png | Bin 0 -> 8906 bytes compilation/assets/wizard_header.bmp | Bin 0 -> 25818 bytes compilation/assets/wizard_sidebar.bmp | Bin 0 -> 154542 bytes compilation/generate_branding_assets.py | 349 ++++++++++++++++++++++++ compilation/installer_client.iss | 3 + compilation/installer_client.nsi | 10 +- compilation/installer_server.iss | 3 + compilation/installer_server.nsi | 10 +- compilation/package_dist.py | 8 + src/Server.py | 38 +-- 13 files changed, 450 insertions(+), 21 deletions(-) create mode 100644 compilation/assets/logo.ico create mode 100644 compilation/assets/logo.png create mode 100644 compilation/assets/logo.svg create mode 100644 compilation/assets/logo_256x256.png create mode 100644 compilation/assets/wizard_header.bmp create mode 100644 compilation/assets/wizard_sidebar.bmp create mode 100644 compilation/generate_branding_assets.py diff --git a/compilation/assets/logo.ico b/compilation/assets/logo.ico new file mode 100644 index 0000000000000000000000000000000000000000..179d4ad733eb049ce354e9ba580bd7658051def2 GIT binary patch literal 15351 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

5odkuzWMI?N{0a+1}_IH^g-hH6BKZr>V5 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 literal 0 HcmV?d00001 diff --git a/compilation/assets/logo.png b/compilation/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..98c1fcfaef8d65f90950820507a185d939a83f35 GIT binary patch literal 24735 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 literal 0 HcmV?d00001 diff --git a/compilation/assets/logo.svg b/compilation/assets/logo.svg new file mode 100644 index 0000000..e6261f3 --- /dev/null +++ b/compilation/assets/logo.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/compilation/assets/logo_256x256.png b/compilation/assets/logo_256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..c530a5a71b0335020763c7131325f46cdcab4a2d GIT binary patch literal 8906 zcmbt)X*g7U{P&sDjAls~TWOiGFA*vtG9&vE3K6p8E@g>GQO1ldNg_)mJ7uZREn664 z6e{7)8Zjn9B(jce<~gJPi|5t?z@&iO8%@8`Rn7%K}SUbGk*003SSWBs!L z0E2$Q03;7|aq=&^3;+_3O!Reaf(BMUmGJX|c7bsjcfd~L5N68rvtyP$hkKJWGh)6t)42Xi#9 zz#PKQjf%Qj#x)#s*g2rZw_%TG%%P~FTcqhZMxzWzY|CqCdUidfrB|#UUZc)OR-grn$S-LvHZ+c^P4ySL zR8tSGpIGxMEGukm8A-3$uijyoj0XlV4JctqEi=Dr1`8dDxYaf5>MP7U1Y@m97Mk|p)P-_?r{9Z zcT@h8;e7uOHxequ`w_43yNST$e@h*|;chCu*u32u7*PM}&pFER9qlL;$FVq|0<16n z<3O?7(Y|Z`e#--(dxv>=__|cKf;Pa1%~e@ncjY1*r1<_V}M<6&MkWwZW;L{)yqJ zxILcNL=Zpn()U#i)XT>aIOV|0qdFE_AUHQ-KdNUkAc@xRJx{bwDt#J95&aBmDp+V;~%yC`&3=A0t^JcK{ zrxvg>fU&FU`b)lbi)BWrx%-divdiyrN>2DCk-M0H$T%V3wHzgGs)9LHhv|yeuFeT( z`r`LXWk@^4qbfY{;~!5jJ0$^iO;uC8K4eAHr6J-HSVPPl znsF8=06~_>mb%zh|ADQ6`#;~{*qKqyQ2~)pqnh^EHS`4&_}Oc_2r;@K45pE78dP0)VDpU*?*F07RaiK4;HlnhW zK6=ca`gu#{Rkzal6cfPv+(lcE39`_n^<(QRN0zR8JwI`qbxSlnPuf+4 zM(!#b>uPN1>MSX%zVxvfQ6BC0z%SQNE2|=Oc;DhPuIVE&0Cs>vC4r<6@%7t$&+GkI zxA+Gy(&&LfREN**E{PcOJs@;sig-#P+ysIwcFC8#w0M4M?m*hgCO9A{7}`sT()ts! z>^PF9903d@7bswnqBO&$Ipd{(TT821<{OWh3}NV)Yt++ur)42G+ikl@bM2BFk27@1 zj?iJG6m#S^9o^_mn=?)w}UJm(x&42AZ~x&I_c1JjuGtGdwkSk zx=&Eny0CA1e;yIyq(ljrhUG*{bVE3m%1bI;Z;)^1j77STyP`Su9QgiE^t8% znHNspuYLWD`h0+=%j?E97my|R4mJK4Hz){pA&oBhr zCPw+qS;LMRCR1UP&yC#czobGTqYDd(VIPbOoeN_#v;vYMRj0to6FgnL+y83WC(U;t#TwMiU=`dj|rcm2sVI^ z@%{2clt||aT?hvrQya36A_#q(t8lP$62fIk)~Ksl;?T*sSdVKiGd$Nx(~U)HLxv8BxQX(C+>iQA)MIAk-@aG_=b5=dCIxyTk_K~McHLNUiWlB_@}A!Rs@J4BPgp1y3r06B^or{i!p z<^8))d}cCEvnu^c{VLQaye?(Vi}Dk{Uz37Nk}Mg<4`tCqm4DohOCDDs)IC$(bi_3F zw1f;7#;vWNNCEAq9HPOtHvkoq6Z#vUwdUZ7ICtv9zLpT)4{>V_SS08B7q&<#>$KA- zbh79)EXd1^pRzc2VyyY@m9gfB7QL);(4CqkD017Kx(hV^#ajT#Q8c6zT!5#Kk|xh; z>6njPF?*o35WjrRJ>fDcJBWE4<+`dKQ_!(D^0D!BWorFpbwonTvI-Kwvf#mcOAj0^ zUFbQYG!z50fq#@J)!W> zqq1=yjOS43g(%K@dAXxefgN9nP&tAZK0bS)|AY`x9X|RhP8aA9%!2oc8|giIQ5rKO zvdeqp!l9*Zi`BIzDau9B(q6Yo(XGYn^)m8cQQvav0yPm&@pLAi;l>Z{jdj$zxXXt@ zk)Eop&2Ez6xW(!jX8d`;_UMXJ|A|d_LZ&5f2I2@-AvzA3q0n>W>QE^Ar;c)P;RcJz zCqOK@)~Cf))Ekxa5RQfnY=773XCc~_?5I*cJDL4^@nO0AeL$=YEQm5i;!n>AT>Y$w z&biztmky|l+p&vJ^)f`>C0LS%<_fz>kFRoV*E3vHePPB5_$s(6EjN56j0 zNCs{pSfNVxcUi#OcwL~l-o&>Sa@W7|fbXkzu**{TEv{CpQbA9@Qat-Y`AJp9TW{mh z1jtubz-u&sowpPgyZbG$n8kl)?b0%IhF!&Y_wA<+53FE?r{SkV;jdLztrsskhYpzr z;MnBG3|8e3^xuR&iw?QjUA1-j4p-?i16cd@S9;Jhxh0{F-pHm;(>39J689^%HpR1# zUl|JhG!qGxm}f}=asWCf5i5s>DzMrrrJx9P{Tn-nzya%h3&p-0q)S-hv~RmNG#=99Sj$?{^k&PmV`MX{R&=l~V1mI!++eV!1*oBiQ zS*VSTo9`D~dH?m29rWHgNWMLAE5YNJ9&aCRdzE<}U`UeLRinafg&(gr)F8TyHLxD3 z!*_k|_1AZkY*=PO#81r~%D3I_lj7FbG@O%!V38Nh)DQ`CBxzmX`Y@+v<4ch8Hq99B zjuuaylq`(a%B9RZ@sc!x${PWf*pysh3&UmOyee( zzA8kSu7$00b&MJCInv$l^49|cp=o28zuozXr-vW(J3+1%B08fYF%aKehc5&REDS1^ z&aGDqpMY0wo$EpUb)c;PAXP3=t~3Cv^|2}i98j&OVbu&PAFcLfi&a%*&cwBMFCZWS zX#CuXbi}-xzowYx?89$W3afSOXjEq8)AC`J3#_*D0!Xq5T&25mHoSGyI1R*YqW$y7{kB!rF2Nr2~q3|G3dQe3jB^l92i7)mlt-^|2+pxg9+*gt9+8k+bnMAt6v!kua;`}t z?U7vUb62`{-s22#^sfOlp_7mCWu!-pmA1vsJamq#A)gC=sjq5FJsob<9ZMMA7Fj5_ms(&Gl(vp{OGdgum2=PrF57oK~*lKm(*FHgWnQ7^k^uo?e)iir$vxj zN>u$C!67tMr>DWK7BPg+e;?;y2jw2!Yetf-3Z1igXky%cs(?pgu}@T`GfNMi5Mz)% z4UuvVV46te@}a}{s=#=yyA5oK|M&Zwba3uQHdK)YPX!ye=u122hw41+mofm{`p=$* zjo)!G;U_w+5>O2<8)d?QP-1ASMCZx8NS8P<_Mr|5>mgM3INgN^JW>5E#HAXVB_K^g zw@E^Ei{N;Woc}OX0Xd(_{#KQJko^)fdTBdQ_zM9%jO=Lj<87)5P>pGR9XJ2X1bE`$ z4F!jB37n3YmtJ`3PpUHkcFe!Zv+XD$LLK9k@*(yU`jcPW2)|+rNY~?DfCJgAnf(&L zq^c$OB4Gw51A9PUX}TpubbaLFza8C=;qwRlPkxjFDt*d3xY^-IZ5uaIc~IkAC|dj& zlA<6+e(DI(9%DB1wgawQ4hSsi0+Rrp&)g>SNF7bN2I40<%D>Xv*`&~o>Ea-}84OSO z`JOcL7lOk(xEOgXf~CnoD&zp3&cM?JGTii;fL!B3avVQU*AhduUZsGT;nE+$S z5`U4=R)DI~M8My0IRlPLoP{v{aihux=JyB0X#SPVJ{3TelfS2HmOg(D7%PIKd1s(g zai;ibS;~4HJMoH!JM`+UgG%U}f>rl3z^@MyzxCwFpdS;A)o9sPPRbBSCb|k_2W}hm zT(ir^0KiF~>#3`qEr0O*qS)BA2iul2&H(aEbKZ+*#)d|u1Z`8%nD(qg;kTKx=fFZk znG_OVx{+PQj^7%hY(u;tpYtl@fW{)O(6FwLnGI|T;;Z7>@6q^=`Z?yx({g{o;>C)6 zf)u(WgWt{p#iFz?|2_vjZn_!0{p*(BWKHX^SWQuUQtU?ZwjgqcHdQk){6GK6F+V(? zv~3|;9w3pqOK8oTxa}aU2zyTl&x4Q?eiI_Wk$?RzMQJPC!FU+(t~dC*%Uu-heAcU{ zqq}asYQ8LEu=+#gxDBAt+E(##c~%Ctgk47pMoB}xp37Y%C-XRf066@+^mx{5IGC6`}qt?wX~im;-blmCtyU7P(MfDQZ z`CQJq32~00hINg_9yxQ7bLsF=#ej;+DG}FzBx8>F5sa&}zZSpdx!`Mpwm@7|eiSBh zgpTx<^oD9SAkiCElp#?jnZUp#aJg&#s2d@-!7rujc(u|Mexj0D&cjPeO+2!X*t>W| zDUGxJqH8|!+MMzy5`_ z_lH;qj4bM8)JA#cJhfcY9LR#-{8~0KaPi;!2+!-o#^zgv9KJDa(5hBnr&Xftc28`x`D9(PBkBt-gWKq0_HpM}AUN{$DpEDWO7e5R5e7QUaOUq5w=dD#0< zyD+sQ12`B6Iau}?WMF~X{c#yLjjlOr{z%^3!5dk1YA2J2DIW6TN|XuE@nz8SibuKE z0d=jfd2?BQ`AAoU{~EvlAe6~QlN}f0j|n~$IE?+>RfTBGfvj})0<361RP^1#7b=u} z&d@Mr=lVqMh&&qU6&X5k+1?vVR5GCjL;CN_@)m$v2NB8mt%S~_3H?49HKy#>hV)1D zHM-AW)o7~>EYc+Bebb~!gWP-SUw9n6IlH(!XkY!aKQd|gs{875RWZ;=Pb^5dy(b9K z-j%ld`Big-^)Y9jBsFJH*|Q$V>Q95qgrmed!~TfvfuDV~fxG3B?rc4IM*;!QSt#_` z7`_`)lA-SZU2$#a3~B>ih_pkldJTm$o+8S9r*nZsaf-v#Gvlqx{FINGRkODU{=sN} zht8O~aon(h#wiWEn!Q83-H~cCFb%UWLWM8Z{A&t3sL zBB0>WHiR56+qW=4FV_E{ToV5T)(F+oRS3eog>Z>2Y}buhZVf07(thgTpyI1vB3dDS zIny*{^IsYInNy-n@@w8dCFLVhlsBfdy`zIr5A+hK+Jk-S0?a(BaBI6DI$j=Q{UOn% zMwsdzQsVclN=bvEWqS`w0df?31f`oa;WZR$CqY(-cGOHc>~onSCe0T0ah%tK<|*%g z);+Qy_v;7|We}s87&j4G^k5akC86#Mbq1FY?`fw9MtuT@!k?Oh#!ulHJ1=Zl0Z#;p zzg^S#VMW@As;$F%za6xC729`d2<5-yy!62wj+LOy{sa30A`*7N3W_}>mTiy06rrM* z{hD|glSM^6 zf$hAwRNknhp=&>$sUTDVq~k&?{v+U8y)vj=59b3Vft<15pX9jqi%pOv56zj6zY0rA zPCVW%lpkGp@y@AC19fYA4=m9^2Vn(l!d+(@*-?n{-I`+eodOLy(odKu1nWVqrjSMR zN~D;nhGCj)h!>W!sJr0%vb&Y*N)${((kUOXxt5Tv+SZ-YmiqB)pT!r`k)CT|KDvQ2 zUv1n1Pa{V;PLOegXqKRT+@>~mU}fmDi6^28(d$P)LmwI`KE=ajY7#bfk;2tB99S_? zb7t{!#rBmX+>*XLRMzIxw9ildYb^cjc7l+=xXSw<<<~UrsB#e)3LjP}@T*ZVW4)82 zNSV=U8IWXF-C!HHY*vtM`{XxX=$Kcvb^n`4J&#B7Nm<1u3*jRu*GUpKCV*>SXkZe# zVpMSO2ofmVP}Fx`mmqu?S~+ylu^e+(c(;JFKwmmM!3M>xQoWhVij>N>5B%fL%_OR~ z?hlA)3pb;C)mtj)ceWMLh)ukepLvIi1~qwL(xhJw$oRc@(BB{DAK-a$`#+YV@98L- z3!Hm?7Fex;qU&EpN=jR6^I$^fKfW6V-$bDMBk~V~Mz~TU@mH~2v?ezD@&gvD!Gdcw zP;2vb&?LZ(+n(HRP$336+n+4~(yM1}dU&n2yfG z^308g=Eb9#3N{4*(qy=m19E+XNr={IizbX$gjpYY#w%b8H9ZR2GVM_89zoL18>140 z?sDXh-v|2eJLAPgC+#k^c_5i_kW9U$~X%( zjlyCQB^`&gjB3v8k%AJS6(AJ>+J~`mk=hv%A-|@3Jel52V^IV&hd)bbBB&6(7fwVa z*l^vgG3>E>or7y@{?pgFVnzXazJ~9_c%b@GeCQMxpLnW1VwqJhwI}DiJemp+VHRFeR;R zHEAP`rt}m6VBv-~g-tjRJkasM^uv2~Z0Mm)-I`||Tuf_V&| zqpqZ^nY5^rfAMm4}^;nveH~GH{Ce#LRPZ?KxcYD*Ub2So6q&g>W8V{1FZj@5q;ykigD& zi|k9GmN~ChPKL3!Uv32!d}kiV&~S^rE_X&6ePps$mG!_o&>Xhr!aiJ8lN4YHYR#U$ zXX_6QMkv#EKJERp(5Uo|$`2+uaBjfmN*T%0b$^S@Ry2q=5v5F9FU@Go26I-XW_+Ib zSHN$IhUP=Eo^gA7T&Eomc<4wI74MSY>@xtoy2|1`p@}7TbpG%#Y%A^h^0%dKNG3?z zBH)dxi)FrV_w|>zKt#FZL>@HC4f?PTcbSWoE2oWLLenseD`MS-JmRwa=b?GvAMAXm z;C%dEoOrv4P9b3Y1)j5x-O@az)mL|OV#7`s@bqgdi#+;f4rOjLmTV4oNq24LJcKq5 zzqlI*>;Ks}5JcI2un-D+DSMT$W2^2!x6@mA&uD^VBJi96BaQPl`#Y`U1tx;WnxPsLl`znpZ3OIDRO2HBE3Ys8v!tZA zKLWnlB%Y~4xNy?$q^-RVmU6T+usY?bv9Y{{W!)Kgx!4vum4n8bw*&hF*DQP2%L(gWa7$;h zi{o6tI921^Llea>CSQ6$azTZd8_c!6UvY`a=t?ai>^u7ECOk(5HTQydcP*|}L0Kpi zDF{V}DH__f6@}_C;*4!2tdl!2>pf^I#(uB(F|7+c)3{x{< zY3#DE!36X%gsHsTC;hFnb@UqJ3^{>DgsO`t4oL#gF+6n4dCxuf$9CH*Hv5>+efQW} zn5{Ncqi`}&ka>j(<{qDT)%m9-Itob(j>qD~ndBB;VW1`Cvu@+EA*Wc!n{IQ?8T9;j z`s$vVuAKq>qSnB>JU}GBb3JFyhBMoG?3^X&N%!>F<-8}{J@t4b3V$EIqEVD@r25(V zSEt>y+B0XfzETFa4OW?$v0eJAG*u^=MxQnt4cg^gvv09~@=hT-3OQ=rFVu z;1)3XjlT^W4|Fa`8-WK@C~o}F`b-a&um@4jLsCPM`ofCMvfzj5O|h2DwO?h;TpTFT zAsm#%cUfBIHXgn>n5YyUn$}9q0P(6wSIzZeTzASr)UM`$!R%-hEjSh1c7v52sK;fC zlK8u-wm*|7>7S_gK>Q^n@xaWG|-MMVJgCtw>dz765D6xu;N7ot6ef!D%1U zkWg7mY3d9*1AG+*VpEc!QGybz+}=?LVYLCezLtogaChR+u3Qw65DHy?^g$mhIHg7} zOV7VHP`BZK+JENb+iTa!1C@&VB+~vL7W*%-5>xsA+2v=qM8MX)b|F<%`1piJU3hrT zzgw!qG)#u{i#qKfk;0*m3|>%2YBy-5|Ja)GoTUB8DQpoQHH~u?v%Bi_>iTJl*W!F3 z=;ZO}RO3;`2F5uel(Zf=Gm~4E)Od6K_PW=vSDJP4DN+J&{=dGA_;RTWeoQz$>?ARu z3w#5AMN_6_iQT#SW_S6mgDbCzREA)P^7=*(qmg`?t+w9(t1PThhAp<{)z{-1$PJc0QUs< z0`~^@0rv&>1LuSLg9m^If(L;Mz=OdI^1Y8Y120jix2|fir4L%D#2R;wJ2)+cq4897!2EGoy3BCos4ZaJ$2fhz} z2z~^v0Y3&m0oQ?_fZt{s{gA{tW&C{tEsE z{to^D{t5mC{tf=49R4pjoHKRu?DmEP^tCrcqtwt>MsKOXLVa&3h@Mh?1={L+EOfWk z$Dr8VX3*uMwb&JfS*^un%xoznU`9(J8qI|nWpp+dEaW?zgXn0^SD-21VPSexJ_fnz zO$O6^H0Gv7Vavu`0s!SOnm{2|IUG@Ag$PBHmI$RBBSNWH9lEki5TP`w4&x?L)!~Q; zWqDK`>UyYq8r{yNlzvaccgkj=7>8mdimfOXqu7lvlx;|{B%di;l~0t7%+;_o zsrypj&PX;aq_uh+c1)f$K9reM4r|L{$COFwq4uF??@zoA#dp>@Wl{hO`Zo*I1ipql zh+j`_{4$Lb%punr|7U=oaeoyL?VL@EuB#@>Nh6*cwGT6059NIehn-XEGK9F>T^g0c zSg&bTdm2OFI?QOS%NFLyWEG4QmBXrY$U$>>lr4cWnsPYWp+#1Ux;bdZ--QUeo{JxrHHcC|ZOjgusU!-;2*i95!;M|BC0Wk#m1>)i{0{2@DvB z8ArkiRzh_cGq0xK)0ohSAfu3MbM}mrsL2MI2=o$dFv8$yV$LyE&H(6JPAX>1m>REx45uaqJ;^KxtJDCz!+gK@VARDC5}M z8l6j1%%wdo`BCAkOA1bBTZB?}D?JhV-I7OE4lAXYW-d*B)6&XE;lriNnn;zyTF2_k zdN?|Va*@VERvhYjSSi9Z=N7_YZ%aNI<{Fd-r)OX;bt|p8GuTF_r|~klzMRb1a(;cMSJTLHJVnP z6~ZvL>^+2A{TiD?ztS$4v;caJA5CETxpWi`CD_e_%}JoF96Hz6yx@HQriD`wmXeWj zE_E*B8z~NAPFrDousMtzLF3vIY0QK}VbX~&jbtEYrJQ`o|A_4)waaQ-q_Zt#Pvhv& zol)0~Uy5-&Ym9KB0-ZTFD;>Htu0?;TkRkNG#l&(b$!VN>PyMB0CeV9NwY$5P34t<* za##xvjTF~lZmAf+;%%k{Y64%w9rO;VXKExH7SfvGdgv$ml4N>w+ly%+nf>%GcTG8T z$TXP|otRQdmpHb(80OG_z{!rGITd_Mza~2L1u2D!gnRPUO1LLwE15~4tQ;zbj_t4c z+Oo(oq&kdEov3*eHE*K7PF7=Is_UV36Uya8yhk|zu9Ba| NR-@`rb(mI%{{mKBna2PC literal 0 HcmV?d00001 diff --git a/compilation/assets/wizard_sidebar.bmp b/compilation/assets/wizard_sidebar.bmp new file mode 100644 index 0000000000000000000000000000000000000000..e88d01ec9ad8ff3acf409d5a234abed223a2f81c GIT binary patch literal 154542 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 literal 0 HcmV?d00001 diff --git a/compilation/generate_branding_assets.py b/compilation/generate_branding_assets.py new file mode 100644 index 0000000..17034e4 --- /dev/null +++ b/compilation/generate_branding_assets.py @@ -0,0 +1,349 @@ +""" +LOGAR Branding & Installer Graphics Generator +Generates clean, professional SVG, PNG, ICO, and BMP visual assets for +LOGAR installers (Inno Setup & NSIS), application icons, and WebUI branding. +Zero external dependencies required (uses standard library zlib and struct). +""" + +import os +import math +import zlib +import struct + +ASSETS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), "assets") +os.makedirs(ASSETS_DIR, exist_ok=True) + + +def create_bmp_24bit(width: int, height: int, pixel_func) -> bytes: + """Generates an uncompressed 24-bit RGB BMP image.""" + row_bytes = width * 3 + padding = (4 - (row_bytes % 4)) % 4 + image_size = (row_bytes + padding) * height + file_size = 14 + 40 + image_size + + # BITMAPFILEHEADER (14 bytes) + header = struct.pack( + "<2sIHHI", + b"BM", + file_size, + 0, 0, + 54 # Offset to pixel data + ) + + # BITMAPINFOHEADER (40 bytes) + info = struct.pack( + " bytes: + """Generates a standard 32-bit RGBA PNG image.""" + raw_scanlines = bytearray() + for y in range(height): + raw_scanlines.append(0) # Filter type 0 (None) + for x in range(width): + r, g, b, a = pixel_func(x, y, width, height) + raw_scanlines.extend(bytes([int(r) & 0xFF, int(g) & 0xFF, int(b) & 0xFF, int(a) & 0xFF])) + + compressed = zlib.compress(bytes(raw_scanlines), level=9) + + def chunk(tag: bytes, data: bytes) -> bytes: + chk = tag + data + crc = zlib.crc32(chk) & 0xFFFFFFFF + return struct.pack(">I", len(data)) + chk + struct.pack(">I", crc) + + ihdr = struct.pack(">IIBBBBB", width, height, 8, 6, 0, 0, 0) + png_bytes = b"\x89PNG\r\n\x1a\n" + chunk(b"IHDR", ihdr) + chunk(b"IDAT", compressed) + chunk(b"IEND", b"") + return png_bytes + + +def draw_logo_rgba(x: int, y: int, w: int, h: int) -> tuple: + """Renders a sleek modern cyberpunk hexagon shield and pulse log streams.""" + nx = (x - w / 2) / (w / 2) + ny = (y - h / 2) / (h / 2) + dist = math.sqrt(nx * nx + ny * ny) + + if dist > 0.98: + return 0, 0, 0, 0 + + # Background rounded container / shield + # Hexagon radius + angle = math.atan2(ny, nx) + hex_radius = 0.88 / (math.cos((angle % (math.pi / 3)) - (math.pi / 6)) + 0.001) + + if dist > hex_radius: + # Subtle anti-aliased edge + if dist < hex_radius + 0.05: + alpha = max(0.0, min(1.0, (hex_radius + 0.05 - dist) / 0.05)) + return 11, 25, 44, int(alpha * 255) + return 0, 0, 0, 0 + + # Gradient background: Dark Slate Blue to Navy + grad_t = (ny + 1) / 2 + bg_r = int(12 * (1 - grad_t) + 6 * grad_t) + bg_g = int(24 * (1 - grad_t) + 14 * grad_t) + bg_b = int(48 * (1 - grad_t) + 32 * grad_t) + + # Hexagon outer border (Cyber Cyan / Emerald highlight) + if dist > hex_radius - 0.06: + glow_t = (nx + 1) / 2 + br = int(0 * (1 - glow_t) + 0 * glow_t) + bg = int(229 * (1 - glow_t) + 160 * glow_t) + bb = int(255 * (1 - glow_t) + 255 * glow_t) + return br, bg, bb, 255 + + # Center stylized 'L' log symbol and dynamic telemetry bars + # Bar 1 (Left Log Stream): x in [-0.45, -0.25], y in [-0.5, 0.4] + if -0.42 <= nx <= -0.22 and -0.45 <= ny <= 0.45: + # Cyan gradient + v = (ny + 0.45) / 0.9 + return int(0), int(220 * (1 - v) + 140 * v), int(255), 255 + + # Bar 2 (Bottom Base of 'L'): x in [-0.42, 0.35], y in [0.25, 0.45] + if -0.42 <= nx <= 0.35 and 0.25 <= ny <= 0.45: + v = (nx + 0.42) / 0.77 + return int(0), int(220 * (1 - v) + 180 * v), int(255), 255 + + # Bar 3 (Central Stream Wave 1): x in [-0.10, 0.08], y in [-0.30, 0.12] + if -0.10 <= nx <= 0.08 and -0.30 <= ny <= 0.12: + return 0, 240, 255, 255 + + # Bar 4 (Central Stream Wave 2): x in [0.18, 0.36], y in [-0.50, 0.12] + if 0.18 <= nx <= 0.36 and -0.50 <= ny <= 0.12: + return 0, 180, 255, 255 + + # Subtle inner grid dots / pulse nodes + grid_x = (nx * 10) % 1 + grid_y = (ny * 10) % 1 + if 0.45 <= grid_x <= 0.55 and 0.45 <= grid_y <= 0.55: + return bg_r + 20, bg_g + 30, bg_b + 50, 255 + + return bg_r, bg_g, bg_b, 255 + + +def draw_wizard_header_bgr(x: int, y: int, w: int, h: int) -> tuple: + """Renders 150x57 BMP header graphic.""" + # Dark modern gradient background + t = x / w + r = int(14 * (1 - t) + 8 * t) + g = int(24 * (1 - t) + 16 * t) + b = int(44 * (1 - t) + 30 * t) + + # Right-aligned emblem icon in header + icon_center_x = w - 35 + icon_center_y = h / 2 + dx = (x - icon_center_x) / 22 + dy = (y - icon_center_y) / 22 + d = math.sqrt(dx * dx + dy * dy) + + if d < 0.95: + # Render miniature emblem + er, eg, eb, ea = draw_logo_rgba(int((dx + 1) * 32), int((dy + 1) * 32), 64, 64) + if ea > 128: + return er, eg, eb + + # Decorative bottom accent line (Cyan gradient) + if y >= h - 2: + return 0, int(200 * t + 55), 255 + + return r, g, b + + +def draw_wizard_sidebar_bgr(x: int, y: int, w: int, h: int) -> tuple: + """Renders 164x314 BMP sidebar graphic for NSIS / Inno Setup.""" + t_y = y / h + t_x = x / w + + # Deep cyber navy to midnight blue vertical gradient + r = int(10 * (1 - t_y) + 4 * t_y) + g = int(22 * (1 - t_y) + 12 * t_y) + b = int(48 * (1 - t_y) + 26 * t_y) + + # Subtle telemetry grid / stream lines + if int(x) % 18 == 0 or int(y) % 24 == 0: + r = min(255, r + 8) + g = min(255, g + 14) + b = min(255, b + 25) + + # Decorative node glow in top region + emblem_cx = w / 2 + emblem_cy = 90 + edx = (x - emblem_cx) / 44 + edy = (y - emblem_cy) / 44 + ed = math.sqrt(edx * edx + edy * edy) + + if ed < 0.98: + er, eg, eb, ea = draw_logo_rgba(int((edx + 1) * 64), int((edy + 1) * 64), 128, 128) + if ea > 128: + return er, eg, eb + + # Glowing pulse lines streaming downwards from the emblem + if 55 <= x <= 110 and y > 150: + line_idx = int((x - 55) / 14) + line_offset = (line_idx * 37 + int(y * 0.4)) % 100 + if line_offset < 30: + glow = math.sin((line_offset / 30) * math.pi) + g = min(255, int(g + 160 * glow)) + b = min(255, int(b + 220 * glow)) + + # Bottom accent band + if y >= h - 4: + accent_t = x / w + return 0, int(220 * accent_t), 255 + + return r, g, b + + +def generate_ico_file(png_images: list) -> bytes: + """Packs multiple PNG images into a valid Windows .ico container.""" + count = len(png_images) + header = struct.pack(" str: + """Generates a high-quality SVG vector graphic for LOGAR.""" + return """ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +""" + + +def main(): + print("[*] Generating high-resolution branding assets for LOGAR...") + + # 1. Generate SVG Logo + svg_path = os.path.join(ASSETS_DIR, "logo.svg") + with open(svg_path, "w", encoding="utf-8") as f: + f.write(generate_svg_logo()) + print(f"[+] Saved SVG logo: {svg_path}") + + # 2. Generate PNG images of various sizes + png_sizes = [16, 32, 48, 64, 128, 256, 512] + png_buffers = [] + for s in png_sizes: + png_data = create_png_rgba(s, s, draw_logo_rgba) + png_buffers.append((s, s, png_data)) + if s in [256, 512]: + out_p = os.path.join(ASSETS_DIR, f"logo_{s}x{s}.png" if s != 512 else "logo.png") + with open(out_p, "wb") as f: + f.write(png_data) + print(f"[+] Saved PNG logo: {out_p}") + + # 3. Generate Windows ICO File + ico_path = os.path.join(ASSETS_DIR, "logo.ico") + ico_data = generate_ico_file(png_buffers[:-1]) # Up to 256x256 + with open(ico_path, "wb") as f: + f.write(ico_data) + print(f"[+] Saved Windows Icon (.ico): {ico_path}") + + # 4. Generate NSIS / Inno Setup Wizard Header Bitmap (150x57) + header_bmp_path = os.path.join(ASSETS_DIR, "wizard_header.bmp") + header_bmp_data = create_bmp_24bit(150, 57, draw_wizard_header_bgr) + with open(header_bmp_path, "wb") as f: + f.write(header_bmp_data) + print(f"[+] Saved Wizard Header Bitmap: {header_bmp_path}") + + # 5. Generate NSIS / Inno Setup Wizard Sidebar Bitmap (164x314) + sidebar_bmp_path = os.path.join(ASSETS_DIR, "wizard_sidebar.bmp") + sidebar_bmp_data = create_bmp_24bit(164, 314, draw_wizard_sidebar_bgr) + with open(sidebar_bmp_path, "wb") as f: + f.write(sidebar_bmp_data) + print(f"[+] Saved Wizard Sidebar Bitmap: {sidebar_bmp_path}") + + print("[+] All LOGAR branding and installer graphics generated successfully.") + + +if __name__ == "__main__": + main() diff --git a/compilation/installer_client.iss b/compilation/installer_client.iss index b90e7b0..0480ca5 100644 --- a/compilation/installer_client.iss +++ b/compilation/installer_client.iss @@ -12,6 +12,9 @@ PrivilegesRequired=admin Compression=lzma SolidCompression=yes WizardStyle=modern +SetupIconFile=assets\logo.ico +WizardImageFile=assets\wizard_sidebar.bmp +WizardSmallImageFile=assets\wizard_header.bmp VersionInfoCompany=LOGAR Security Systems VersionInfoDescription=LOGAR Windows Edge Log Forwarder Setup VersionInfoVersion=0.3.2.0 diff --git a/compilation/installer_client.nsi b/compilation/installer_client.nsi index d49b80e..bc7e768 100644 --- a/compilation/installer_client.nsi +++ b/compilation/installer_client.nsi @@ -7,7 +7,7 @@ OutFile "../dist/LOGAR-Client-Setup.exe" InstallDir "$PROGRAMFILES64\LOGAR" RequestExecutionLevel admin -BrandingText "LOGAR Enterprise SIEM & Edge Forwarder" +BrandingText "LOGAR Centralized Log Aggregator & Forwarder" VIProductVersion "0.3.2.0" VIAddVersionKey "ProductName" "LOGAR Client" @@ -17,6 +17,14 @@ VIAddVersionKey "FileDescription" "LOGAR Windows Edge Log Forwarder Setup" VIAddVersionKey "FileVersion" "0.3.2.0" VIAddVersionKey "ProductVersion" "0.3.2.0" +# --- Visual Graphics & Branding --- +!define MUI_ICON "assets/logo.ico" +!define MUI_UNICON "assets/logo.ico" +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "assets/wizard_header.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP "assets/wizard_sidebar.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "assets/wizard_sidebar.bmp" + Var DATADIR Var CFGFILE Var CfgDialog diff --git a/compilation/installer_server.iss b/compilation/installer_server.iss index 7714f37..3528a94 100644 --- a/compilation/installer_server.iss +++ b/compilation/installer_server.iss @@ -12,6 +12,9 @@ PrivilegesRequired=admin Compression=lzma SolidCompression=yes WizardStyle=modern +SetupIconFile=assets\logo.ico +WizardImageFile=assets\wizard_sidebar.bmp +WizardSmallImageFile=assets\wizard_header.bmp VersionInfoCompany=LOGAR Security Systems VersionInfoDescription=LOGAR Cloud Hub & TCP Ingestion Server Setup VersionInfoVersion=0.3.2.0 diff --git a/compilation/installer_server.nsi b/compilation/installer_server.nsi index 6b74359..025afd7 100644 --- a/compilation/installer_server.nsi +++ b/compilation/installer_server.nsi @@ -6,7 +6,7 @@ OutFile "../dist/LOGAR-Server-Setup.exe" InstallDir "$PROGRAMFILES64\LOGAR-Server" RequestExecutionLevel admin -BrandingText "LOGAR Enterprise SIEM & Log Ingestion" +BrandingText "LOGAR Centralized Log Aggregator & Ingestion Hub" VIProductVersion "0.3.2.0" VIAddVersionKey "ProductName" "LOGAR Server" @@ -16,6 +16,14 @@ VIAddVersionKey "FileDescription" "LOGAR Cloud Hub & TCP Ingestion Server Setup" VIAddVersionKey "FileVersion" "0.3.2.0" VIAddVersionKey "ProductVersion" "0.3.2.0" +# --- Visual Graphics & Branding --- +!define MUI_ICON "assets/logo.ico" +!define MUI_UNICON "assets/logo.ico" +!define MUI_HEADERIMAGE +!define MUI_HEADERIMAGE_BITMAP "assets/wizard_header.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP "assets/wizard_sidebar.bmp" +!define MUI_UNWELCOMEFINISHPAGE_BITMAP "assets/wizard_sidebar.bmp" + Var DATADIR # --- UI Pages --- diff --git a/compilation/package_dist.py b/compilation/package_dist.py index 98fbc35..97ba729 100644 --- a/compilation/package_dist.py +++ b/compilation/package_dist.py @@ -35,6 +35,14 @@ def clean_and_prep(): pass os.makedirs(BUILD_TEMP, exist_ok=True) + # Generate or verify branding images and icons + branding_script = os.path.join(ROOT_DIR, "compilation", "generate_branding_assets.py") + if os.path.exists(branding_script): + try: + subprocess.run([sys.executable, branding_script], cwd=os.path.join(ROOT_DIR, "compilation"), check=False) + except Exception: + pass + def calculate_sha256(filepath): h = hashlib.sha256() diff --git a/src/Server.py b/src/Server.py index 324cb61..10c0662 100644 --- a/src/Server.py +++ b/src/Server.py @@ -1327,7 +1327,15 @@ def login_page(request: Request):