From 23c19d79e98f4840e19ddf77685348a1332647b8 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 13 Sep 2021 23:49:07 +0200 Subject: [PATCH 01/36] Apply example_ynh --- .kateproject | 6 - check_process | 25 ++-- conf/app.src | 6 - conf/config.json | 2 +- conf/nginx.conf | 2 + doc/DESCRIPTION.md | 1 + doc/DISCLAIMER.md | 30 +++++ .../homepage-all-platforms-1_1.png | Bin 0 -> 114701 bytes manifest.json | 26 ++-- scripts/_common.sh | 25 ++-- scripts/backup | 46 ++++--- scripts/change_url | 114 ++++++++++++++---- scripts/experimental_helper.sh | 0 scripts/install | 97 ++++++++++----- scripts/remove | 44 ++++--- scripts/restore | 76 ++++++++---- scripts/upgrade | 104 ++++++++++------ 17 files changed, 403 insertions(+), 201 deletions(-) create mode 100644 doc/DESCRIPTION.md create mode 100644 doc/DISCLAIMER.md create mode 100644 doc/screenshots/homepage-all-platforms-1_1.png delete mode 100644 scripts/experimental_helper.sh diff --git a/.kateproject b/.kateproject index 757cbe5..d945148 100644 --- a/.kateproject +++ b/.kateproject @@ -2,9 +2,3 @@ "name": "Element_ynh" , "files": [ { "git": 1 } ] } - - - - - - diff --git a/check_process b/check_process index 9fbfa5f..79e24c6 100644 --- a/check_process +++ b/check_process @@ -1,11 +1,9 @@ -;; General - auto_remove=1 -# Commentaire ignoré +;; Test complet ; Manifest - domain="domain.tld" (DOMAIN) - path="/path" (PATH) + domain="domain.tld" + path="/path" default_home_server="matrix.org" - is_public=1 (PUBLIC|public=1|private=0) + is_public=1 ; Checks pkg_linter=1 setup_sub_dir=1 @@ -14,14 +12,15 @@ setup_private=1 setup_public=1 upgrade=1 + upgrade=1 from_commit=CommitHash backup_restore=1 multi_instance=1 - wrong_user=0 - wrong_path=1 - incorrect_path=1 - corrupt_source=1 - fail_download_source=1 - port_already_use=0 (XXXX) - final_path_already_use=1 + port_already_use=0 change_url=1 ;;; Upgrade options +;;; Upgrade options + ; commit=CommitHash + name=Name and date of the commit. + manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& + + \ No newline at end of file diff --git a/conf/app.src b/conf/app.src index 543a56c..0023a20 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,11 +1,5 @@ SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.8.4/element-v1.8.4.tar.gz SOURCE_SUM=5787a44ace859920a95059408a94f2add7b8cfe12b4026fdcf392d6d7f18b42f -# (Optional) Program to check the integrity (sha256sum, md5sum...) -# default: sha256 SOURCE_SUM_PRG=sha256sum -# (Optional) Archive format -# default: tar.gz SOURCE_FORMAT=tar.gz -# (Optional) Put false if sources are directly in the archive root -# default: true SOURCE_IN_SUBDIR=true diff --git a/conf/config.json b/conf/config.json index a9220ed..fb0a558 100644 --- a/conf/config.json +++ b/conf/config.json @@ -1,5 +1,5 @@ { - "default_hs_url": "https://__DEFAULT_SERVER__", + "default_hs_url": "https://__DEFAULT_HOME_SERVER__", "default_is_url": "https://vector.im", "brand": "Element", "integrations_ui_url": "https://scalar.vector.im/", diff --git a/conf/nginx.conf b/conf/nginx.conf index 9ae1053..c3eb079 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -1,10 +1,12 @@ #sub_path_only rewrite ^__PATH__$ __PATH__/ permanent; location __PATH__/ { + alias __FINALPATH__/; if ($scheme = http) { rewrite ^ https://$server_name$request_uri? permanent; } + index index.html; # Include SSOWAT user panel. diff --git a/doc/DESCRIPTION.md b/doc/DESCRIPTION.md new file mode 100644 index 0000000..762c76b --- /dev/null +++ b/doc/DESCRIPTION.md @@ -0,0 +1 @@ +Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. \ No newline at end of file diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md new file mode 100644 index 0000000..08f2579 --- /dev/null +++ b/doc/DISCLAIMER.md @@ -0,0 +1,30 @@ + +## YunoHost specific features + +### Multi-users support + +Now this application support the SSO. If you want to use the sso you need to define the path to the default homeserver as your homeserver witch is installed on your YunoHost instance. + +## Additional informations + +### Important Security Note + +We do not recommend running Element from the same domain name as your Matrix +homeserver (synapse). The reason is the risk of XSS (cross-site-scripting) +vulnerabilities that could occur if someone caused Element to load and render +malicious user generated content from a Matrix API which then had trusted +access to Element (or other apps) due to sharing the same domain. + +We have put some coarse mitigations into place to try to protect against this +situation, but it's still not good practice to do it in the first place. See +https://github.com/vector-im/riot-web/issues/1977 for more details. + +### Migration from old app name "Riot" + +As this app don't contains any data on the server side no migration was made to migrate from "Riot" to "Element". +So you just will need to remove Riot and install Element on the same domain (you can change the path) to be able to keep the data on your web browser. +So the process to migrate to element is the following: + +1. Get the domain of "Riot": `yunohost app setting riot domain` +2. Remove Riot: `yunohost app remove riot` +3. Install Element: `yunohost app install element` diff --git a/doc/screenshots/homepage-all-platforms-1_1.png b/doc/screenshots/homepage-all-platforms-1_1.png new file mode 100644 index 0000000000000000000000000000000000000000..40238a1c9891a15e412f921defba9a3795a72674 GIT binary patch literal 114701 zcmX6@WmH@}*TsrE6eu>h7cW{E+=^4&p%iN=RvZR*cOTrX1&Tv)XK*d<6n7c<`h0KJ z{gGrP`|Rv{l9ilwqBPYN@vteek&uw^l$GSPk&w_pNJywnn5h4HaQq#Vk&sZHHB~># z|7)II-2D3i@VsrCwef#iV<$vYx#m)KE{pRlR+UCLj(HS;2-u&_gJ|5xiBb11c z7!w1F;th5G&^T^qG!Z^79xgT+0lt8s2qiJm*!0To&MttIn3RN!{temJug-5d`SOAj zo1;^T!_pH#SrwJlEG+C5ky%~wnRy|ZYye6MG74>Nz0AOj`snPAzOmZKWVScNF|o0f z)Qn|ei33S#v+0>6*qFjhZwexEc>ttisaesfg)Q;9prDYqOmx+aT|Qx{;+%9Tp~*QV z^-b-)=H^xz{!#Pu3vpScDgJ2;0Q#lOsIG*>&WN};Q2caCbVg`yUvloy_{?xhSaD5@ zFb^LMJ{BK4n;b7Y4C=Fy7Xo{Uc`nvIEXtH+CLfNAFA55q&hX#JO@gnRgaxM3(sQWr z(3nZGo)ib#+Xu~Dyx%}kM`dZq;jH~&% zPQFoN+41%YyplqqZLO^uYMNQuxnABr?GyB-QJtGR}F!YPmqu9y4=k%zCK?AomJ)Nx|4=a z_lx&t%j^|idi7%5L*uPJKCec<3`Yc83BBxl8#%Z)HPl^I&Ul!6K(mfkzpz}8>*^i`YF}Tdf<0= zlAp&_UK6FDZdtfSRbdXRoOOyD(1e2w_Pja}v z7s!jZB3k#H|0kAIn`^T?Z+#g^rL=N($I|;9iS_ z+}WlqC;icD^>kUyp`Vvf%98z<;BzQj!xg=CT9Cldaxp0896bVT5+akZZfmgR6=lKt0e(BMXnX6Hjp1GdhsFo(rn zO5#1$88~X%j|isE)`!4T&%6j;1X9PKMGKIMYT)Uwh6*T9l6X~9C;#pB_b4q7Sx}&Q zuP$r7#Mw6@X6avZfGzXBA~71qL{g3lydt1fxexrO|J~vW*#oer0QfupX2~H0YHoFV zSbNuT=1>iLXxMCdDL#DSkK1+6f`}negl{F7cT0cvM(nnt={|357PY*%J?9R6mc&E) z^W=Etv2S1N+I5xBA=|zRfLU$Edgq`QAx%6(wK>I(bGPTIoPL(4BtlU;U9M@bIJwG{ zvLbaVtT91Tfhl$R;VM5?85lV=J654tL{(3)irhG&D z{&(790tEKDDXJpYYa&yBcsvG)5YQ@o_+B0D<1PHyd;a}Q%5Oa}r(0|y$^xtl0*mGF zQ|?uZ5Je$A*!c!VyURLc8^5CAU|TRu=~DGGwUqhFySPJ+df}uZSNvmYB%M;Lu1GfB z;1K#EF(ihW8P(`NkE|MBqbAaLbF#DrkVe8{eG#|N@3|ndjmNMCjAv8|rz=uf+}_Ev z$w^If>TfvnvD9J+dUasT%S(D7rl6EqOZ6whIR+AC%hN*bAFyg2*{WCxsk}cP3_cBhUv@GISJ{_5o1qEyc#x3O}vYH1C$mY8)+C*zuEW=fOVam|V&FkO$uG{y3-!G+Ua-s-bdaf_@WWyh5Bx4529ZB-5fhLXOC63OUuwMjNBgH z2cWgLQa3~AXotCbla}B_%5PJc#w(TPQn3=T1>dXN^aHDS`6&OAf0S;dV3O&*6@Oj( zfzQ&c4o!z8Q}1u*1H{Fp>N^qvVXWs6re(r*@27;6ib14y%y2D1rs=pPgb2**R3aU8 z3FiL|_3(djVU8*KIM>)9i6*9w)4V%9=(=a{ho{~F`3aA378l9H7By<5k~o{9BuP=F zREY|nln2kc$+GvRAVJr0I0WbiN38;j9w1tLBg*?>$XMYaAyb!eErLOc*ZvJukp zZRtaGE+;D!3Vzn54{l7Hsz{!`q6}slsKO3nZWwH#y#|j`qeo-Do7zaI){1E(o&wH( zirN4U_nCbleoo2iU+O!CFo}P;J$|%@aiW0VSB)0ttOC_J8)Q{kNZz^mQj7FOz(~w$ zF3LRrF5GrbzZw&8C&`2$prQ=3-AwE7wvClxT=NQ^Zsbm?uWjfU8V1y*SOT*a-e#Kk z$@1^Zz9UlD;#I!6X7AILn#t4hq344bva*e0UMajao zVyIU`S-hf=3|P@Ipd{zd`9T?9e%wb!_Pq21U8`#Z5F>>v9 zk6?NllDUGFKd}UlwkCgvnP1?QIe;z^gcozZq)6TZ++~+Mh^#GF)v5;>y8}uR`Wm{s zUOjpEkUjZXATPBI3;oDT;X{Ynw6H4)DzuGa|;5^O4U5s2nFqw30QiW-K1!g|c6g zW^9k7DLK7Ay?{kQX0couaXN>Nj~)b?U&*KCRed>cq5OJc{X;9`QNTP)|M#ZjmPb#+ z%*GB2t)GTHo@cAuPVN(qNNWzlFn+uwtJ3&fJ~8&mGuNUapVzjK4?zfI@wd_#9YVIp_<0#P zUG?A5OeYL3z!#@^d|%e(C;|_C5i8UYU&2Q!e7G#7lDKAwLQOsayD<6QFlH`u%$LpK zyeYuKnxSeJOy{Rd#x*@6d@YZM{UI6u3%%u(b`;ke0e8#Yp2kh_m%QE1j8LYEhf0XQ zXLlp`Bh&=}x?kbt|J8s*S|5;rA1>QE*-tM~cC8W?EJT?mU^2_y=6efmJYiYOI|g(l z`kVC)xZITF*%TU&*}i+SUHm-Z;2YZv%G-eYo(wLAU=RezBcOo`WH(%znr{Lp#jz~l z7<9e4!_;GTl_8Cj3=(2X)Fk1QvVh5cyl~klF~sS3P@+|>ISYC}^EUQvQPnhTH~$16 z+|N1HOE8+PfkW?z(&3okGy?lfuDAgLtgZS5PrqDa= zZ?YyjM9V}MlQFe~A<|di7YxivmN}~aM~tYqoF0zQlwJK7Rsj7||DZWj@j}*7i<763 z0X$I2;TqWZrlYX~2>0`YZVgV|)H-=y4Bi4X!0`#-+*sKlW?SWO^I0Gf84_D@7RU&H zTu0iPM#@R4ofSc>^T!KU*aH`JejhBH{;;V>zdYlLC~Uy9;x!?j=ZqJiT>U!kBE7&wLxw#t6fGq!qS1g>`+BL8V4 z|4nz-0^~_~XP*me?vu6rJ7Cc&$VE?)CRJtxH(a>#%7nV9;&|flO#*ZGE;$g(Dy9p< zNO%XJk0ZLBnX7qI=UKa8Ait)NjKpRD9QxFvvnc`g@pg7@U=0jH!kyGP2B*vJW3nf~ z+uqze|NtzVb1zF3yM5L`Tm40e6(?9 z)PxJhD5R~)bpyfk9oG1=8}7|-freMam^Vkzy!h#~8R}rOyTC84XYNvziKZ@=m+9@*x>^&^eRwx!98VG-z(*Qjo~>*aY-t%{rKb@WdoGWA9)2GQ{Jeu z{1E`^Z=Uw}(2yOfsyaj95eK3yg{Rw@(15NS5WJp&LNn|@#GrD5Ub%AOy>jCvF8cg{ zIqRfe^@6-nZBzyjb}MlG5;7T43Ix1lqYgvlaQO?&5w36m>b+huz=YETB>{!5$X0e(*F z^7w<&j!}RVn)JvQObO0gOj#0(wSLt$fGbO-qYz_kMY`4+>e_=#_K)@$$*>@L|&R zO#}p2KVtg3o_biiGoRq2Qz?_@f*}iWuT8vBPGd~ZRpg*mW8OiI%_jnyqR{7?HjvOG z{1{FjM4t3J8XLZCzXDV`X=557h(X$xK*-@HPVgo%!%|uU7k-)tFx3M~WAMqKe#XFw zMD5kJl1gFQfaH6H&qL>5H2g#xAMaSfe%A}b4IDSroYj|zV14}sod-D0I?z#32KWvh zrNaUo12RR*R~`WXXWQke&RjQ`f3FXca?Nbn2{X}-!P5%Dx6lyRer^uL?)W1Pf{-Wa z9g32?$gAZzPQ-0Mxb17GEQvauHvC6auV&E(5L>h3GwZaJnr`?k6_#|dzaR7(W(@j@ z_$lE5YU~i{YCV$vb{BO*u5{Tb;f!~gP4oSG^95iY#z@;+aYHc35D*Oy;#FFoeH>Pa znz-I#!3?9jK6lD2cx4a@;$wjAmQo1Z!BC6Zt_ezhqpWZu&j^Yq$5_Se2PJa-BRHj; zj8*_;G>JMKg{9mHQz%>}@Z+#Xucr`vR2p%++6z?J^?InhQE>G2_1#|2a`OCqMK8s3 zh8*nh>KNc}W|A<#-R0+^hKGRfzvCWg>@3nN0FZ6Tp6?Vm=&IScb&(%>Yw6mbop3bt z^hzmQB}mLa-&ENThS_bdbi+PZ-`Q=~|A-KX5g^!nb+qp1*()7)J@7hhoO`~y+B{gr z!N82C+rw5?Y2`h_#%rB@6JdgY=RMzni7sYxT8w)B1T;19dV=a28@8$*|8hBfV)973 z)Bpas`aBe!iDGQdXlRCuGd^J9<^LwK=Znz;y!XGk_m7KmH+60gSB%tXZ@K(Rt|9%0 zppS2RxX&)#I1+IoCt7f9uaNC`3f&+>trxgW2SuQ+d18}y&)s9X+r#~OhbI6Sz;v*A z1$xX1;Gh{;Q1zUQiK};~$CtN3)7xd@M;Wh=kH1&TAGq`hfgAF~IeuwF)<*hL<+f@w za?bT9px?!5-RJLQi_>O=TcPik7_Hx7@kY!iCtp4agyM&FLpah&x};$YTPvmE#-dSZ$WZ7;}qTngls3n7-vXR5i?vRJ3NwO zdHsGO#tXEW{h++7ZCSbCu{;)pHLuA4aF$b6(Jb0BgeM@YGMCf$I&W#LKK9K&3mLrd z9}8@XU$M4fir^(ZuVk(LqPQYS5Rw5EP$H04`)T`GZD8L`N-u> ztQfZwgK2iB&&K8+2sa$GB5qAyUMLdp>CcR{jpyWYPVL-!bu=AlSmONl$m3s3$!JtJ zxIo0%nb4(eP?e>LEbnx-l;V%+M3rWulT&x69H^{kZ)sqI?(F3@yYnIWpiWlO55!}C zQDwhXYC=BL<7#sX`fYyo z>$#ls%kDUOn+76{uI@q%2foIaoDNpsA02U2-@HcbH>>h4&Yh?WOB|8CRj(8sMQ5AIb$^f)R&OZM+e#5s-vIvbT2Yy!gxe-{7$Q#WpkkSB}Hff&EY%NKE=7?*ULXQALf=) zm|=y!{Nz7?Nvr}hEhb#L$dPGc7z(NJq!{Ye9I&G@X1+UDnqK=S1W4YG zo7>FMO{(~6-uzXl9})b!=kHr{hp(X53ytGmmwVRbyP=j|DVE80jQfqs zMSJ3otfLQ1K9k9zjUIwFIZC%Acjf}55z;uOh8QoTc%j{(*Vc3iQs2l|e_0_d%M>o0 z%wg~ywcNH~#kIq?(*eG$SJmY=^a=QH9QN*G1fV(SAKQKS7l z84=qVt7@SLn$eM&>^g`1CdY4&5&)hf3I_3GZ+UBYXsP84sd@4Ct_%Qxols<8ooZX& zSC@NF(DMs(3ZmaQ<0VLW_j2P!3(5o?xvPIev!p=FO}my@RYEvxIhB@3M=BOkk3Tz> zX;Py+z8uzKd%zLB*S~f0qd2g+F4dVSB?6h368i?!+sNKEac+a}`v|>iBz17bmeo z8>7whYWgncw4V>f)~p!07#(?@KJlM)+Ksy$7u&DuH_k=(7c~3#u2+2;MwkmtN13NN zoUow`7j(uIy-ughpW=3!Pt+*T#gsxf#i0BSbrZNm^*xyU%vcD3h=U=A{@j`Gm8YGnCOtBM$0D5 zm0%VF`=cEr3M&^A3vT}6%8wqsVIa=Sgl8~`#V^=7Q=|LCvEs%op~Fgyfkl+lgzYcg zL2DG1*#O#t{q}X(0t<{kd|fk~P+;Gc2EB&ZKn>C38x6QJWn4Oc-#sK>|Gh2xg1$-z zW7IgvS5hx?QrjEFHi&0rAPPDTY)G^`L1Q%HYkG`??zZ;4xi?`IS64%1rh^yF;ant| zJ)3}m2Qe9`LhH39GTVPXZWjH7QG~w-?oo93M?UXU_Ncm^NK8b(asqMUezv$kvceYz zKRFD(xZ8x|1NXQ7N9}qk&|+f`!c}$N6cow?jA~tI+ngab!lV&GCY<$;Bk2X=Mb~^TJKU#MoPnGmF861|U}-h#++gZTWJ^6D=+DhHuJj z1qI>pU2@0Pe93jQ5<$zT*tcyh1^f7t91gIyCj*~a?a#vynf*5aLqrxs+G-6*Z!=wq zqpBzLCC8C?V)sS2xg-%AxM;S+t@nkhYH?^$G3RMN*SmxIM}WkGZln22IYX_a*g6pV z?&itu9x|7~vw1cR%n`2N#I28zg>3So(TxTQ_94dx^Y`5)uLOSK#1;*DnvaW1RZfg8 zFD9Mfhv~FRbDv!U5}d@I;I@VcLqymexY|V4vibVPqj7zwRal+Cik%_K146YLGl zt*`v*M&l$=R=|l^esbPC!K)CvMZLDi0(P|c|mellNWhEfyLe(2{5#oq}eYO6~2BUTaKh#S?6&S zb4#cdNQ}l&8|bahjiR?tFFs<3r1TRd#79oE&C0z-2CGqFf^R|#yLWc%sq?O42qHx4 zYaRC2qPK?+ua#qn2g*&f^z@gknLV;W=UvL9ZMNT%Fd*Qb=Szm7z**Z{2qpGU-5oNi zb`pe$MBJxN)T@NtyEXWXx)3%(34)CcPXb9@feU_{L*3@Gx)7QNK*h(yVQJHCsV=k8 zbsxs19GmZ9zgB8EsK*wH)8@^`JK>CQQFW%$lxR0we5G;dGlcl!McQ9->SOs6#>dsO zycg)@%FDw=zC;v{rW9Z39=@)*x8_VmOZW-(MYdeWjN+@1Z)dzwaz*!g((8&EwxQ_R z^X?lqAJF0oCw;uH>pk3xra)SWG;Wl z9{|Q@C;grz#M?)bH>AVkWq!0I?r!iWFC`eL3fCca8qxQ;g1m8dJU^ydN+^FJ_Wlh_ zxr%cwB&f-#2E1xI_~l~e?hlU1Qd|Lg*0m}_-6kZa%R%kT0#zgzz!H@!Dt*Nb1lJ$6 z*1g^C(+7KUD?g%RiBrJa0w#j0ZiQk&yTq;2#bUJ15A7ivzv{qp3?aYpi~U_!Z$4py zI!0_!mupc%VY^bzlWbVAN@qxD-(FT@N1ITV4w9y*$~MYMB+gzfeGNLYKBH8HWTAZK zU&XKc+Wo?Mv{ylRYnWy& z16RQjiA)$048Yj~04jr^bEtx6Uts&oMosZIbBpqJK zeJz3iwCsc)?0^L;w6F=^Zo&bT6cy_gcw*Z+EMI->WIH zfnk6ssMx~e-VmF#t`vY&kkhb@5H(;~2pEVHeF%Ys!o?AS-dDq4zhmwI0_)rng94Ia~ZlwpHr z-%f=lGF%K>j;2liN;A)D>(j(uu8HZJG=g-R@$Hp!ru$)!bt%cE)#5spXTsFyr|D8? z`_;cyRGsEu57|oR9imk{B0}5>5r2U3Dhy{9(SR);tEOFsWAmb%T*v7Q3|fDii+C53 z@IoY9$f!Ww9a9;XZaKfrj*$df7pgVSw)ib^mo!tl(-$eyQ3fnRLM4J5kYnekCmSGv z0{;d;_`|DJ906gbvtHm+tVx8;&k2a}^MhHO%|#E2L)uJQ#AF42X;K zTv1nDGv8c6=tv_W3SM#aMkXi`>)E;iSX70E$rA`){+ne;#uSfm&L&ru3Y zWPP@-1$I3P@(qPEQe4Y{YVH&TlhmNTh&ZaRVHZ{SUjh?}o~>(u?2@H*yS>IHj@4%2 zU-vueP5P~er`D?laTP47!D}I<)Xv1zxqq<3YQ&62yKd1taSKVanJwzJOyWQMBFEV| z)iLAcD<#4Z-gbV5(v8wUxA$O}fv~GZz)UZO#irSVn1MUQXB4hUeVWh+kHpUpTs+mx zT2atA(5L>*MtDDL3sNcIU)#30uPYu7=CmNieA#UTRxLsFENy>n9x1!@zxIj_g0GkZ^gjw6Aiwet4824ZKJ2{%lu|P&OSV|STY?Ct z^;GGiEx#AV@02WA@$4F};=V8`A|4-OK$)Ap65C)pkv4?PYgbr_1d;Ut#u)aT#QN-F zK;gwgIfzzXtaixxHX-Bl2-o7pJ)8v1bE_GCMK!Gj44jQ*tCcB@61HG^rI&SQc(M(* z=86Tv=A!JlKiG`_kLN8x!I(7A7ct0hh^(5199=#qxA=S0KRU4oBPr*28Du$`Q&k5c zh5`ZL50``8ZF|3n`YpUBi-d5$ww^Hig>kRSFG`=k4it}O-3rH;VRnB-Q$WhB!Saf@ zqXN|{@QIvK#m^pP0wd1)o8H5|MsDEZV-{4@{dNFn`RN^*nHh+Bs=nusmyhIoVApMk zmge#L)1jYOUOYT&X8UDjJ%Oh+VkB)Vn%I9&3GlJa$PG)`-EFKEkJ$7B_c!LBpD=6B zQqxuVy4NjtU^rN73mFK6g!7Gfg=;){18)Kl49#_S-(`-S0%Q6P1N0S>0r^5M&^7`P zZdTGON!=j=YAeDWvr=L%tF{fp&u9EPxEq`zS7t5m2*V+z`KsZPEV8m)T-N))KS&#| zi~K;L7f>u9TW;3%X9md(f0Oict9V>K+jXe}m$^7I?l4#=#53!cfYps3?;%}}I!M~R zxZq??v9>&s;Lo$9<&s`A z0=`4^gsM3aQKOff;8Z0g>^lB=ePG+k-Xv{ER}Y${wS)CTlYztW-kYO1HhC$KNFE0y z66=62;B12Rvv6!yv&8V8=J-p4$L*2kskT?MX>>u!3Mx)$c3V!7+}DQ7G4~C*ke@pV z3xZFmCq$#Qrc?`4;Nd+2OO#%QA$H6A%2z3&YS;%?npPy$jH)X-&&}{jK<#YnlZ>tw zlX-P=kQ&+`D+^wX;*Tbyj0YZLZaw*BR0D}bC9O_xLDhl^nZ5%&L9wyH-Y)%MZkd)W zsaPx^ZMj`I*6ru!n?t@Q)Xd@H5xklp3Krfs z1Z571`#WXt`_z2z!+>#Y`UIa)M)D_oMwx^^y|e$`J+T!A#B%c-7fB1e4czmH?zZ@f z>(HfLa*zJ=l!-d!EoH|}%h`}j%2Yg7n)gvu;)q%-ACLb{o~|Q2HPe$Jr%+*a3Owm> z2Sg;4|@oBxS+s7D0L;H@@?J*0C-Yv}0)WRkKACE|F zi&GtTJs#a`XyAUVpg+X=HDqQ#L*KX3cyAMo_Zz+CfwJGs*;1!r!@Vw9cg+-i4IsHDt_HjMGTb|meo_3M2i6qnn=w2D5H`sZT%9T>NsoZ7I0@s zi+#sxD?g^t{GRjh`LO-p%7oyjDo@}(QU9N|zqr?YtAj7xN)BzKRVpkNCF6=NIXXRi z&7t;&K#pA~?EfcxhMP#e>fu*;xu|>EI_&!g(LY7=QwUcMnR=^Z2Xbcc}`OMBJ_9t@GrFnkFQL z@IVX)gxOz*r38ozEj{R8R#C;A6vgnNPjhIW4VL@JylU_khkFO{VY^71hh14gNGUxg z4fD6_8EFwhGL8G@-a@Tv=iigu&gD?2VhH(zWih7?t}k(%B^l$6)~Cf*;L( z4EVLh_wH*}8jmC}Z;w*Lk1aU@Vu{vqHLOBO_!}J|hhHir2ng)8BvD?)S?m?^fA3Npl*@zCq{9| zGe`KCKmlrnq>!WHypS~8#JqOlFCy`fbxLts5g~dqyqB+eFJzYLcAByZh^povO6mACCi&tpw}p!%6>aix=cbmokgU49Pfz3x4Km zz$DaRlhj>u8G%r%kk-5j1o<5*-G;!W6NjLUl;1bg_lrBMn-dvk;L0EIQO1%(V_vDyW+kF1-|T?jcj5*bacm*E2GeZYe27}R8h|74@Qfea4%bxr>Ka1{&wFk1T2WWSOy ze-!*~%VaMthQ$SL{lsw8vCAC{!wAEbOjQDE=^bGC>S-9t0Hw02|wA=Jh-Wg$DhjiU|8d72I zKKkX;N>>P{Dn-SZa-ikPDpjBt%0?u@NoGftd9zCs)uh=zz9q%RpJl*2n|Eh3mCH~! z6-zz8*aA#ntXJDTm)&9<6Ri1}nYlf@hnW5%@Em>dK}Z}wmA4!90txgU6Jk6sXsuqF z1HK~$tINUpa^9P9MW8`oFyLO}$G+9!eg^3xhwk6(-QQ9wNlZ5|^Ga?UVe#Z7m$H&W z@T?;}9kk|h1jD@N>i(*_MFU*(A$B$x@!71b2P+KDr^G+4f%BZDXrr?H2iGAlprcH; zhoj)l;pTBFGl2Xl^wXzY_T#6B+R{KI56d-Sz^^re8>LAt<$#zWEbe0SL^$(YJlWe6PVl$PDY|hrQjDw_5G>I_ydrd6wXw}UPmBkM8r2W)#X>o zK442$$_xEg2~!E@9G|AWVO&aGf-QEP?zQ z^Sep#cp%2JDG#f%-~q8>P|C zSsgpvYO0ead#X$6eoR@3CMpbsm&cLT0w!LElT=Bu5g zI)#-WG)S*{sRbiMItV>fAw*@c&?Oc{uGem^IF9AJWwK`5ZNf&N4(V%Af~fbpit{oR z#)zh44qsh?^hpzxiVistW5c6bUpDq8{Jdr2m_hM2nKSlDal3$>UPgv$#X!coaZ>x)mNEEWcw1XnDIbkBXYzBO@_*Fw zK~hg4BDaprUU%5fK_H*k85XE|g)Vf#pGlUg;V$f&RI|We`&Af-qm9zK_ohp_d-cz@ zpXf`eVZ{;c{Ms{)M?b$RA=rM^dG*WznS+c!1!xNJ&Exr9|d} zpldhDeYDNp0-&+tAdilS5NO{Kpf!aD1vWuEsx`}JxkU00AFAk?GGB{ zuQ3q3R3BKV#DxYv4X?ipOFRw}S3+li6vJQA`1=!eDHxqN-;===5PK%%aC>$wQ-O%@ zwVUVS2GIGY`$@|zrXPD$zr81bvx0jAz)-glN8$&9B<<|aJOlhwVIN_Q~cTrN2tj#0v-r1W2Z%GK$TmhosVN!k>UqJc9`!PB#^} z4n#;;-?Ibny|8NEUU_ESHBnjs20s0jFun}elCQo!8Cwv$GFHkBVs6pOC3q;dvVM4n zMM75Blx4^F97BiI6bdRj>N{QtuJ}k0986pO zkkW$(cW@BDRdRV6$uHj=%8bF0_a9^=ee>sJ@Bi7H<(8qyIaTmkutwbW_^x(MT`wns{)pqSpqDnK)X zxtkHQj$2hgms9p<#NwS)Cw%Nn(iQNg5&k5O{~kWE@$~mS9xAe5H+mJ)Px2U&_HUv* zcY7F@c7`X9%AImU>PmR`RG}GLIbLBZN~c`!6={*hr=x+d$QTlRfX!o1uA?@`8lsgd zaDgrCIYDor6$rt5N06j~#f%2*`pB}SaLV{cXa~G-0lH509r(JFzqY3+SZy?g7m z78MwpqX2FE32J?|U9|65h%I;Fn$ltqXgIjbb!J2%cA~t3jKODaa);*`<0)Ts%-}Dl zyH^y)^mqJ0SS@jnwl;{{_lKckxDh|SYuvEXT!jhKQq&V#b^zPyM2MPGa5;g%L*oze zG%$!I&@?IWJsTyPn}c@HjOPWadxa`KC8zxVU3&l)%jd z@?voa0NRf~6$uJOpj|kwU7&%%|O>^33ZPSt>4FN0L9(o-GZ% z;a2;uLlXCnP!Vef40;6(4rsu@zS<8^tXnO|w-9gc;iPH}r}7e{ZF*(#`XswIXJQCB z)bdk*V7LeyUIn%9J1-%$!)zRdkfCqT6g!Jhi`7wbgjY!5qCgftcB9PW({^!QfR@K39y@^$u$D7WB~LLewMQ~OA5utbr)HMasN85 zb^>=TS6bre&tU#Wb=O1Hdilyo5o+^QA#h&WF8c~!llfoHwt|i)s8-b4=y48O>Qaeb z+SNPAp3#d9_Tm++2vF!~A{6um7cSiHr89kZ_#-I-tQcK7^Fa!G_)_DnhqG^OpNxTJ?&3Ii?Es z+bC*r!NtYOfg&Kt}4>i?15U^_Gg80h`gV;^S z_28f*)G ziu~xz#v){PNl>jS&-cPwjQYjg;h)_UhSRite)?z}Bte(O$0U&vU zw>=rl4x7+9GA$^=*&1x9qv#KNp_*J~V&gv}hv1MJ@B+RaSs%yhvP&g%4ew(H z?8b4AB1*~8hVhxzoV!@WO$DqZSK()syrwo}2UyBNfuM9p>&N0{891DR!XEe(-)tOS=)A%^#~5b%{o3MHm8H7rQ>1yz*Q+2WLa-J2VPYGI&_^ zm832m(F`I`yG;EP9uf|5UheB>c?mI`{qTY8-pCodNq8>-2^jF0#A7F(KsL7A=82|2}}CImqyirYg#{l|URvu%^W z>FhYk+tbE4oxQ`>$#aKPxm7={WNQhAoJ6q)I>2}dA#8!)is2yUzd*nktGl1-I6Tgl zXPHj!OADn(39mJzFt3gwHKNhGk93_6^%|Yw+keiTB#r}$dLIvig-ZI}Mu5ol1ILIwX5_I3&s{n@c8_u9ce7zo5<;2W1A;gI zN7q}1#nCijqqqf!AOW%jf)m_=Ef$<0!QCMQcVFBSJV20z;O_1o+}+*XVddj_ukV~+ z=ghykX1b)SyQjLQ>TWZkBaFInu8}Vs4!s>Y(BnPgN5ZX26A=D(BZ$*1vfzDHGWA~3 zOR%GAKzTK=WG{AIZyq%1?Eo!+uBSq-)0qyKw`(+L(ItFm`8*dbe@otmt9 z+(nM0{A?)2;j7p>`ORvFmqK}p^_wV#-a?Cx`-tv=L&8$6tTXQF&;~d;i1f=O?@9$HkoV@*VP) z+R_z4)`^>}r%k>U$c#1RK?ZaN$lOVay9~#zA4K}_$&-d`xM!2IwT7BV4o@#S&_p_V zHwWdz5eJuCh7Y9$VYDdG-q)M!?;mG&5z6Iz;$)i|5>VaVeP!3ukqKa%=cD*C4M9cT zTl~MobCFf{KyZjRS+x`r@-BuSLf#8MJO<5Pq9o_TBV`;80xe1RLh7b)S=aaP82HHC z?sN~B#CKI-5Ynl&LSOOoV0PRsC5KI8BWAzDC<4VJB68zFrSuN(_%d++$jS0kwofpf zY5zMel%}|Wb`Z)W4V@(xzJfgmxx6A{%)1d6yj28_6~Y5HLYIUD_N>m~{2VEDh-8uW zL|Qju^Xa!Gm-6ZCPlY!Vt#}?rl@*PRMxy=>1vWhE%fLhMua|?4K`e2s;7X!j7vImo zlx+_p2@B;`jIc@I_v`ji*p%7PZK8W$f|>41p|lU243m?CvLBHiJtYfDOS!`Y&AouP zG_Be;^7A(W-CJAl8;5=lP`sdjMXgg;nN#k27dS#5#vw&^BqlQa2ilA6`Gx^g&YMw_ z)if2#{W&$|37vRrVBGu-k@%m8^ibZHL4r+O$V?)AS)}1kc#Boo5CV7{_~`27)ZV_l zX3JK|zu}&K=HvI`lY5oYUi-!_FAC}MCNn*z+Ad0vZ+R(YHwUeRw#Yb@ei}FaxvFX< zj)o0Jth)U?*=N1RL-n(}NcIi$Gsv{MB#TJb#4>3}CaRF%bvt`O2 z0E=k;+kRbL4sVlRsyDSKhBxd7jG!jPO@DrEf%M}2Y4jl1kT$Ek!+=bxtvz94!x*0_ z`d1>{19(q2gmx2W^V!S+?KV8PaT>~ zL{@?uK7Fk7Syhpt&>#_{( zA_>5-?mAN9=H)VNkZuMEkiJ8|jt!Wl)xV{oVGS`FXrt27U*Z?OdE6NUcpv8UA9*T! zC@ULn7T@3FN~5ABkQ<=4+6IE=wdUn0Fwo|V;z%<2+Go(dEMwKJ%!_|<44hDOVdKI5 z1IG}4vpfj28W=!IF>+cfPE-C>Nd@|0_T$INe!qHIp@WLNp)t2jdmUNb-Lwf0)8c`~*l;mL^0I9Y+Bm_1vqX(J<7rn-@syjT%!W9T?= zGn6%ElNyok=zCIfzzJd)lzlU90F0e=#@A8jTdTLzqmu07dBM8Hs$Ok`7m)zOWs4wA zsG0x$;4NOBxHJs;XR=#S-PcMzLawjnV%U_aG8|NWTl&Uze_`8mDS=)0v4REPmlSr2 zR|_L&dkm6&k8~NkUh6v$pAnadUIiMw9Vs}Xc0nwA`ku`vPy<0W<@)+(A!3WZXG`Cj zvI#~Q=P?UR4KiGBcA8+af3);u2Qg1R>g4bK7N{iEFroha(ACa=-N#bx$w zI&O1@)#VkvE@WL~jKg|ryRGWUpJ~o@VQUXe0#7nov$srM-%U)OXO~w+7|wOH1)R3K zSAdc2FD(V_Cn6F88PO^8^F~ee46!D84F4z(S>3~LCKun4Azo0LIZ||LZ)M*t^sy(_ z5Nf7SLv;jO?*2t4%aD+~Z-d_V@1CFq>%8`ATirjPHu|7u=}3NmBOl-J_IliYuQ-`4 z`xY@4fFqFXKoIW-+6D#Qi2$0<#Qj8*^Zsbsdd@e6!uK5xmS^J>@0+*!Lt6p9j;b(= z)4PRw@yv{H;hSZdklxQIxDaTiWxrW_^A|9Fd9wUSEUeDy8Y(|!B^Qk7>Kb*+7+air)6BF=9GtlGwjWa5=KAxaw zixLUFv@@iA+fj=pS)Qr=_=ni@jJ9D#TW6d8-BO{(N1eGux%;SgN8C4CtHB~ewjztK zd8M0Ils3}cY+rl+ma$m%AYT-G74gNobus;M-nTR8z%rT+SyUL8k!}JBgm)uCdVL3_ zXLNKb)o1dT2cGx6+f{Y=tRr06r@O`n_HqzT_2+RFFr(3o#7a!J^c^{~9&t61f8h0J zYxhV@GHeLnJl_Rwy%eO7&c9Df_c?jIn%26xS-A-iTT~eq^`iDYXtTzFO<`1a3X~V- z!%UQZdvf`adr8FKnRlGul*=se|DCdKH>_-Sg3hTcJ4dLA#3iri%>rcQ1(Ph)_&A!C zmx870VoTy!$>t?8wIzr$lKWB_XcUJ_o&_ODr|rFQa9`)!ETUL8Hp}%DKGa+8YNESd zX-y32oXeyk|4m#naEkV0E()!Vhp(miZhaxx|2aDLk(H;Aw{9JHzpQ{ilh&bU&YP)Z zDNnKIox9HXn}6PKsziV7Wdl_%5!qiv;V3;J+P#PSsE}=J@7lXartqF!vg!wITgjd= za~XYlJ&H_zwf(RDFgR+qcxv5|Q9F94IP|Wa>2l&q24G<5EB5@{{`9nQaDa&nisOLn z+?^c&e9*D)l_!-sy4QsKIZZFG55OSN>vvm@x?fIi02#<*!&ln!^TC1LiscQul^P2D zy7h)-$)?_Erg`RkEJJL6sDhBa5-i>Dc=QA1Vn1=4R1DFg{LU&vSKvOi;9)>Hz(AZc zvhBO*NZ zJUd4CP32V3oyVK%gy_L(XO7L}Titf;_w1z6r5qFn@_iQlKmCm7jdbo#4K<2oaAleE zvuvr42GN|g?FcCosNDr{`@01&82Ey6BU3HNow}eDZ$A>5o|mP>`cpF;y0;OQp@J%5JT)-2;Ep1za#Xy%Tl$hUg#o& zl6y3Cq8&h@1wI4?bP06AJ2DkhzKW_K!F?av#k6@&*va`Yfmd!lhVM2$6+$oN^nZoKOKZJ0MQNixy3R_rk|gzPRiLdubUNB ze%DfUoAMlU1NN>xc>%F_0|`#Ip`0_otUP&!#P@=mcPc}Y2Geoq?(Z-0SmMR8Ov=nY zq>6U?p(LSj`cSLH%@Gy<5}4+@ds*0kcC@!cp${X`3^UUUD?lMBy>w;o)P*@!iGo zN1I*2R;K_I7^gx0Gt~dH^@*6eT*9dAC7y5*=VJxv-%^-S%@g`D`=*5<$Vpe~1R8u3 zZe5==#vJvBsw~-W@24~Q?Kh*$Ps!5@bw-JDDN`?6*WT@jZ_%cZ)exMsocXW z^0#oW#vxZguOdY&`m!wfI;|AF9<#HTr*cG6Y4QM+v3{T}{M&94tr+=1LZaIu^DR@= zery@6DAEY$GsEoyumf)F1B)FvE_3;Kk0)##>uT!xQ9fWiV2KZEcGP={eKjOdL*=THFs}I;vbTtOG`^@OYi1vc&R!+7O)^&*MA3= zDGu0ReWfR)?4-AJ;6A0@G(05cBI}J7_*I7l>au#0LDo|AWK#NTV4Xz)gJ0Xil_Pa~hZ#+WVP zWO&hT{y$)XqGHElac9hJIQ#1eQ7*j(==bDl`Q3T9Pc1U0F!wt*t5Jl9$Z9hDc)O!O zKAdM)P5~w7P!H~{&Rx6#j>F|>2nl!49{Y97XhL&vq7Y<%i0wSOW3ex&bXMfyq4F+*g|Qjohy1QbBqAO~fHYs4;CBeQ_@ONGz|xI1j@t*{97^`Qs#T zfQmi@s$!`a;^pH%Vb8j>n~k!_=PPEA*A-2hd21kN%Otp1!k6xDb2}ev@{wb zZ5lnQqx>jDvKZ17(3d%sLx|(u-p%+V^SB$J^@o~r{Ha^~8o(Ms>vtsRd*qkf#(eU{ zVBY)_qt>2&vHx=jJ$(iDeElw4c(8R#eUpX`igxH?!O z-#$zmv^;+YX*H!tv(_3jAvls_P~{r@^_t%);6o`qUz8F+a;WamzDIHt=(+*m9!x^a zO0D$M^aa7}yvK8qram$t_BJR3UdRUCk zP`(^GUX8gqdA^)YbrWhr<|Z6?$cqP*7I)GBeoIPYA|H+w|3RMiTTVoHi)1K%U;6dY zPvRI&hmTwc=_-9Vy&*J`_zY^wAJi`=*I}|vEb51aCWmxED~H;o8B+2l(9vHmfBK$v zsI%aX0&o*p@Ot>UZ?W2nXX$#;zKaNz*4<&tZ(JL$k7CZkJK`5w{1JcoQDBHr?I*mo zJLLu9#s1qba8AMf0%Vm89F^+H+X z7-!7bQ^jmAJpAJpWep;THK)O?myqz@Cx>eQ#QoE6W`+|Wv`)3Otl;_CdCC5B=6Hd{ zXK;+twt5afb~=XnXVl@_*jF!nvKZ#*X@fCN7RD4|OxOzQQs+nzq6{l{>LCi+i9?^Y z_$7eS+a$p=%j;T(fGEo?;PKfC7QCHac;<8dYQZ>2@8f!sc8NL#g%PAqwOGUWh{Z)g zFnOe)-u16gvsFuj2ZpX$T_=#I>lW{A?43+sv7>{7gVqd?fPifU>Vn-8nC=eULCOuZ zcZZm%+h*qlatItQ5>Jo%W8&*+7NM`-yejp1_0B`T;*mMo#&0J&*2YT&Jl^Nhtj?S~ zK2QFrl5^4#hlNMGdwu4;-@L`=JR?T+(0)=7so<1Ke+C$$uN%G2gKqY_fAgx`+ zZe?8JtJ`m8R~zc9o`Df`s6U)3`FO&5w;&Hsc==N{d%JqlsK1p9?a9%ci_JYeM$Pmp zaAmNp4!|O)9t*^|Fs!#RPgbce?)=c5Ag_HG6`YddjU=)lUf@8?ljR67ONG(db^++h zsD=@^A<@nO+?8%vWPpn^+^d^E#{6&KcV@x~+_|#{29#gp`O$Z`t`GWd{mChA47oAz zuNtm1RA^{LsLyd9q_)11{H=HSh9Wv3StSxg7iHz8LY?I-eK`Se7JzR(Yt=H5m|zwC ziGHXz!d19TF9D9UI(pUL%V>wevN(L z=*a&Th#SB_23D42b>|cO1|n1C7aNqEzEoJMN>nHd;)Z``SpfX&gigD*sPA%rp~RgG z+5n)it-ijP5n*qsRXiu56<_r4Gd{gS@zLJV3lL^KFJ+^#1b! z+z&qTlF6#dRH1@G75ViBc7{+x`}C$Z^e9j&2LbBx1Gc)C6`o~8z3xj)Ery`U<{LmQ z+gjZTBXBWUfL+c)uP577XlKxrxH1Sa^T8KE$>dzC$KFTE)7VxHO&^vZxRC zB*f;LS;h31M=1!>!VIb-e>nnFqqNaV)pfxafqy+7r@zr{e--DHKyOC2XNsqKbURyt zK)-=vWWMg&^xh=)1_v{6FO;kG&xmzzPM|=8De>-SfbSpZTJK^#z@GIAr7wk&bwln? zO-7+bG#(>sH(d{%NTQb$&n@iulioFHx9kUD=!T*Ox@?B2Y=n5P;RvchpjM&%S3jx8 z=Wn-o(_yDKuRHY@8L3kMfht#)E6)mW-1cvL-=S0E7q8|wT1FBWXRE+Qhs1h-X1KJS zU!IlmX5a3R4B&I7p#d97p@JbIaYhqni3#k9hpg>0;)>RXNP7B7pzKTa#6xEY!m~vk)5Q?KAG-F zgog=r1WMQN)sVB;phG|&Q~(J&Dsr0DqzB(EN3ChN?`;ft_e`BG zn|-sykKsS#g#Htx3-;X! zoGZElo z=zfBs6QDT0yn5(NAk^$fZUZmLO3`mpK&d4y*cy4xIr(P#xYXgmG7{qfj{_C<^oBWN z4MY$(q4b}&9~Ob1&cU2NY+38OAU9)6HiC(AZMCYXsljD;>@KJ^Z^k!FHvvY}XIS^j z(JxkkPE?Ru&wI7GtgQFs#X$iAq()G#ln)rrzTN+6&5H1J=`abj8lgB)7zMfw@7)-Q ze)~s&^0~tpUe^S=_PSKwlUHrM^7Go!Wx5%s*b4)djJ#I$;yGvhuf4v}zk?eGLniZS zHMbpI&cydo>YtH!U|DH~shTpK%H}{!cZWan;%3>#vu!6dP2Qo4@DB{1^ z|I-IhuclMPI!9j{IaoUPL)UWCRaH-a7xvjfM>C1~-xcahVLz0pNS)b;ZO-|qaD1I{ zqe)%XDr!03VR+72P{miZ#YQo5irnL)-nT z?FE>z*(Eb)2aN<;p|_V0cy+N78q~hPv2^_7j55jjps+Fr zFOrI+<%38;c@3%NM?$(Fkgbl!KN9%AV(Y%yCtPi7^_Q-`u`Y=&OItaNR{`?ry>dg-yrG08QnyL*#1P~!l8w(YT8bk1i@xYW zDoS!KiU{rj_B{G|mvY3K+EooZ-dGKYu;~~*Z}dQi`}^n%wC*fWUrZk;`s(%J zp9EFgcWx*{-QZQQz^f~6*BPLd@q-Bn{>J(*2<3V?(Tu&_^?3P7)}8ulJl}yv?jrYT zLST?7M?C|&=uCck3~u6XA%&|%Ive%51t=Xq$}s3tQkLk&e}c&|3nENc+YzR`)zMsC zvT$dbxxxb)-r^;@cGY#~{E30Pzx%EV7eLy6b_#1YA{&RMI0%m#x!%06i#5Rsk@hd| zlpV0i09GUTb|oN$G z_VI2be;J1~M_;G_cEL$$(@nLM4KIV6Fh?jYMPGLnjTGP5M@084ywg~|=Wq~h zlB2D!B=&b5I0s_$-D?JV7YzdsZqTtS^c$e^;#_of0u=JXJ^}lTp)UC?k`f)L?X<{Y zPNN_vVG>}4!ylOfI(?pKAkiwOFHXPSL{H@l{j>m_RY|b@PC$=i+zPUluv-9f*atSG z?(#@7s3TG!3B3%)ygH4BQaH(k6deQ_@k^9dO0yWE$P&7@FTkHpu_obPvt+iNWVRo` zLi%u5&xeV?>^}+S+O}MJYB9tn%N%(ad&jcZzL%G=-^s)N_AEu2A0`ZcoyX|HlVu*I ztN>*gy^UdZ{F;QY0?F-V`%wx~C*xQ|^mU&37?TMl3T3Bdy1GDAEVyzAF=DT92Ghv0 zJP)cS$OK0OIqxCa{(66Y08GE=^r))=A(TvmY^!(&qwtkoiE!P2xrLzsO8SWAd{&$D zFh(~}wo}A4TK2pjvERLR;H#vujM!IJ>*W0~FAjoCPo&r409y2W6A`s{&aYYh8-seJ8B~;TpjM{8hyMRc~&- zga<=!E)b#F0dYIxZ=S7K7J*7cj)zSivE}E`$cccshWxkC9R*D`b9*Jr@PZ2uQ#em_ zBG709^?c22q>?irj&HB)CA?(bl}7JhM~!+qh5w23NBQ<=8AY59VF(!X2)9e!R+XmA}7`Wo>6!<#-_Tn9$=pjiG;7ZW^v<@#C=gX4Ip-1ziT2qTNl_%|1Jzz~j(u54MMmoL8nw97t}Z#oC7?%?zm%vLfE zlik1mzW3ia25(FOWqoQkU`tWTsPMAN7bL`ThIBc&v%Tl$-c0`9cIeSI5X{T6RW&sP z*@=BD2JpS5Pou?H_??{=Tr7y0_?u;IAx0kVIL$WRl+s zE=$Xsy|G!N$-i&j45_3jpVD0_7jmJ&jwn^vCqII;a{{FF0uGbtuY`;1VNOUzJ9pkt zU+l6RP+aGdPzruwAO`|CeFOW83SNT9?Y?;E-}R5PF$I4;36>wlRD>Bj@N`MHUo;}J zZM%atRf9H<^E;xxsFHr~CZ!={jC8%*MMk+=j^;L#k4bkg*PCyF87l#6ZEfo_RV=#j3v&W0v)#Zt99<(z45W;i*7P& zJ}5~3kLYULgdBC0#@5o5zbKKlVTCYEc>6Yhl-q9`V2vrOF6L9|pZY#v505MVmDqcL z!p9N-@MC&b<8j!*)bKQFv`hUTx=KeGpnn~nWWWVrF~!(mF=L5oA1v@<-SVLfB*4+$ zKhWsF{}qn%ctQG4J>LWNSx^8Nuj^U2={4R)@yqI*kwkf(a_|Z__E$^pJ&U!ZukNK_ znrwTgUKu}1Yb=iJ7L+j+1gCWfeb5XF+>@C@<_=xCwHQ#RX_thcM8hF)t{6OY;bPpB~{ze>D0FtNM2RuMzw+DU{dYyfNO^OaK#O}1W zSgmZ%04HL4U)M2n%I8I3@0?n39UPJi86r2lS(b(EZaOQgxU}_c4z*5R$O6X?0Vv-k z0WSwm-lV#xvsv)786>Zo7zG`<5ag(kc#xMRxbUT;B9JD5 z7=#6}P)YrT_M0{nuzt;5n9I&%ZsJpXpOXw)cO5h4%OFh$2*c5QGJ4Wdjlk- z57x{0Fu8BZ!_=j}OPt}C5vbnc`K*J(CdO!`~Jd@S+0w1lwPP@xx+j z$Qq5r{w&e#yqE~dJEvcxv`00kco<9ad$p@xKO$dmYe5({6Hn63YOJ{LKdV)2Q245M zAg8d6o9efrm@pQRp97S_@({h>MKD2f3&hz1>=9DArljbk-WI&+z*67;E$}btquX!H zV*nNemqZy8o)?%%VD@tajf<;KLllJ$GbBg?Q!3#9veHJZJ9xTz9+7VT(6r$xiqL3@ zX%D^52n|xS*asxcs#7Umf}bw`#cE{nu8hG=_xABSnE$9m?Oatg}+G2@5AE7 zv-9304avB=L=BjxMd|eJj;%DwzFHh}W&sv2nziiz*RYabcNWnSx@mg26*(!bYXQsA zrJorG)+GO;_yi{=c1OKYPWa#gXEcNKe*1VCTVd7YsBT)F7_aL8I5?T;G|Y~B?@dxk z@Y3FZWzM4bm{uO3_b9$?H^fhP-Hl1v8gMW)WOFQ5yUB&KiuD_;pI4FF^66X(-|Vg52I zqY0fc6@4dPu8dS?V=Mpami>#y{Lj7%y z@D4B5dien_r$pEKwbo4i^&k-?C2ZFme2${i7lv`RIbZmt;-3;URO$kxY*huT>T!~9 z^K=6I$_dPd63jc)m=P*ldFodRA$H>UXY?L6ghrPmNy62Zb_o@OxsW& zyfU-_0=r$!(;2ay36jB2l~IbRHH$1K#i(F9D0U;M5qfTnR?A8af2|R7UZ=Dgls5WC z`{yIghbT+pKS~$6rU&B`3)wDjh|(hJk}~87$@IKKaHgKf$H?+Xll)N_X-2G zR_rXnPOAg29X$)G7x{>hD(i+w#IIH7($YvObyOG)d!ttRyR5R!_xD)ExMeMaJK*cE zH8si;75rcK=j@#eA0JG`Hi8=?hJwGiX}{zNzpX6*kzX{&3_8a|tN+CNxzn_ks=pIm z)f7AEFo^o_58fpOhcP@K=J>Z5twZ-HMfs;3D1P)t`6PWEPX!E*RYt%lSPI2KxNt=$@0W_Z_p-kozv?zw5B^onGr$k{-aF|YY#nb(8K55kG zsP*9cARl5v`S2`gmX@zRqq%G$tj^&lhB8Gqg&n3ULC+>`3y@M-`SOWd#*QD)uM6ev z2Ls{RQww4{Yxa87_X%M^_Ef`qbaGqedJ{r^4raN2_UA7Yln0qk*g;QMpe&D!xtSvl zdM>^&=(pdB%GR383qoTBZ|Yg7q^PlZ8tkW?w6%}ek8&>DaV~2MmqCvPBEC#qGEvgu zMEIa-6`w6M9`o!2y~R&^H9DC4CF&+?-wn>yS?2hN&CYB_ew}_=lsY5H`>R?1#oqNJ zHbz6m_rcSE+(FpHM%)YlR~G0(!WC*sls^->B_%iGR<6#Pbo+17;P>0%J!gDB<=Sb^ zy4mlVe?FNz@ac^WyM-XfQ_ap6cQwgjarYQc=EG`UKRb47D!)sf@`)|3@E-C3!`lx= z6(8i3?IxplbdTmErF`2Ql~|NW%$srP$gBthx`dLME81e7OPA|twQ8|~Pd2m0(eVOP zFhaz;EZN9^`1gp2)EmNVVb!pK^RQ!gth*h^&Sq1*dWm~EnH)Xs0#>7Zizp?_Wg9k3 zbrdPC9Xayg8@zDZwsB<)t405Nu1!BK0Y+?kgcuo$?b^++opA9(55p%vma^zx|0%i7 zG6D0T5$^n$7#^D;SFSYda9)EMhI+Z*dkf;|x~lsBk~H(p9tTnPNYKzfXrT^QKq zt03)m`_v-Lo^D#9)5>@APW6|myMR~WPTIG7(nan-*1RB|I_4yTh3Z>u$4MhSMJTNo zN>16X4bv&u(WVSBChx5#P()vx$S|hWT%KtlF=d%iw574-QXP5u)gx?WtWuQ z@a?sX8RA8WnD9G{v59m)bxWq5%m-i4!Ot#OWe#Rqmt0g$`c9rY;mqW1d{}|V^CsX6 z4eZ0HjqMtWnF!pXL7?UhDeEm75~l+rezfKGl=ZFSz>}Y>DTG+st#p>byzR(Ejrii_ z5KKNLerzR9fBHV*<1eBD8#zTmLi@u%1fb(6YDFcb4@f5WrYDku^G}0mvFzGSeXV^$ zzT4Ke5NmoYT;1xdE0v8Gne2cvfC2+q9}9teJvHs*B2fGfQVj9{-%lg%&ICz%f$)#| zAh}8JflV;@IF}Wph}AK}%7*_xjrpR3MyAdpzCUl}rlGPl;^H|_y$=V!>*KCgVSJ}o zMa{!wAQqE~S}#BjmY>oAkznuLypTsZantl$?Ktt{$<$)^3NQg|Ew^TB1a@Zdxw<*~ zm@K}k*n|a4AIawC08N(!9|wESvao3Wr^l8**zln9aA8VgijG40^^^`0521;Ss6w&hC?0scWEMy|s=N#S zEJ?}p=j2WuN46l5n!0_wBh;w#4Sqn_KK1{Y)xVfQA(A!|CzFum_4@vym98~Yq!R`N zg2Nbij6(}3L^#$C8P=VgJnDM}09T8*26tx8(|P{WviO?xcRK z7p?-K0C9%UAUmVaJAWfV8TM#9A)AR>bHeGFSI;?dAd^vv2^})dxpO($RFrCe5dLV`Y_ag|14bu z>J)XN%s?c+q1CXT=aGXU;OB58Xq(^56!7w}cZKWGN?C_VA*!!=GSGK!PdLbEGr@?nU+Bui_%s?QS{0$7nDMy^1x7z-hterkARZ)Mn-M~f$ z?cR6WU$kF`F@E(O-`06m2K;Y`(BIT6@4@K&A6t2b%*6I0zC5}SUS|HrP~YU|1~{_r z77pAq`(M!WoAsO_*4A1u6giYUxbPf@;A(VqA(kp_oB6<*RY(_^FMnp?e9sGC<^0p* zV9m?T=JAI(yt4PN=0~VL1U_)W>(7#!1UnXmgbg!T=_-@ImXSD!bn?5iH*hr|rCz-3 z_ik+F0Xur%bUeP{SvLc70xj$H<36i@)zrB^+n;LnaELwMzM-b}Uu&WKq2rgs5RMxd zVC?pu00TK<3DU}I`4kSMi(2xk?t9$H#k7OB_muOh1e`Uw6W=0_#(I!qaGb?oAiKi3 zEx+RGik=E-j18T5icaj@3A#m7={RjAg4q5i>z%&uXVzC_jSAL{OwVnp9FA2oF9Gj8 z?dQF|?n_U4qFC-x=g$8A7ia}sQM4-Ceo-UYFD0>C2tnP5t8K6B?xr8ej~~bpu-I`I z<94$&H3rlHzy(3_!m7+~3Agx(isPjpVSRmpD^sJY#u|t48M%!&$5A7>H9oVHDAb0( zaR}tt%*SxH0XMyMM zJGuj%$l zvzTn5RFj#bx%c-<3l!puOMOAIc?Yk-3<6^0lGrn7>Uu6lWDn+Fu~RcgP#%lRnv`bC z4)?OGrmc+Zv+dWIs(7R^q|v^N@vp4)rlc(`ZO6O8(#on~q1DF=={s*be(nt9RbDNkhLsBsSzW+|UZWz=e9A&G=oG0fKO$*<@ifs78m;w;H^yLPX*I6A z>gVD)IQvWQCv9Tl*j1%Tdxy`(BX|z@6SXMjPn*kI(WLbRvx%#?D22p>OrO$+^@-gN1pO8q;hzQ)PTE*pZ_n-r4O_x z0R1NIqsz^qw6q)UYJXh6PSD{sOo?%%XgIv~Ln^XoOdtoHfM=2Z8Z`|)r3w+YfUN9? zb}6=aLPCtKrzlJ;8BPnev|V~y^UV%50@oBr4m8Jtw)L@145}Mn`XI*lS<%l2hTDKv z1P3O@e8k$gQ{KtSUs;_`+21xg?z;NU3V-r{d$<5D!^!uG-Vwcm9qSV~1~g-TMZjoL zhlilpqkI>{3@$`soW6;DPcT;pLc#aKN0CZnR5$?`;f2ubmw1egjVZPSkOqdKaEaj_ zgBJz~;ft8o3gS%VSBpOP2OEKJTHWXL%IB|;ouD`F8&i@qV@jJE!F|RR*+GN_bX#a# zACKTh1GI|H<4738`e4RvQrCb#4#$81A1TLi$-lYc$AF4f${EzuAKc@KY{=OWgMli8 zH!5)bi&Oi7Rc;rBBG-m8H+K&L4GGkPbc4isV~ z0617V(`;>jTAeE#+u!*%Bc}e-WbPOX-X#Cs;*l3$yo)l`5@L3{soEqVfrWmEO1J5w z01Kqfo|e*>0G3<;m@zPvA&D{EoPqjtz`@@TGY>JnD7pPR_P;BK&*+Y%`v=Qs_p9{^ zg_RjUvP7EEYiu@IAjtbaN(Ew=#PLJ2>?1+eeZ{CY(KaB&-3=%oss0)t5Cd zmxF~Kdc%jWC>RV3=pSI_7cov0AvqkU$tsm=-dVUyrK--Tm8D$}hk&-)x0T{`E;U9y6B4*K2H~8SlVb*F`@laO8xD$#P2li+uUM2QB zN7NgStYu#Z7*pgmvr--?wQe|a7$ZPMDB98QWfXS)f&Czc7zHe>s@SEWKjZ zus{7gD~^$ya#P}kKc2`c`ar()QEmb7@rhs{o#Wo3Pliu<71!i zxLy~IV~@}I0cqy=vYCI|g&7$X6x1;c zUIg|F!d*gU(Ubegx+X@lW*EJu462vrL*wW_XDX@EH&kVk+aOq2S`Kjq(}Y-7HGZN_ znM`>Keha!rqy`{myexH6&Z|mY z`)WlWuVgMq(2LLwM2*#?t=aJ};jaIg)~Yvon=fJ8u=H!1vV@8@BtOZGV!(Mp;(P4F zld!}%o1c$E$=3P-F4cc@zw8@TxEgk}PR&Dj*tt5R7!PU~qwQ2{9e_5-2ohsV1VSxq z1TDkPo|OoE+-l{FYh@9}+z2@NwlZ@4#$ZBvj58G8(Mi|Z9)!o)On3du0>?uz1n=rC z5-2E0w73!k7tSi&dNbKR>c7!-I)dPzP)FchTP($(-C#f=iezmqJfgi z=-cMPelnI4^)8pa8FV6QdA@a+EEiQGZ6(8O9GHU^>U8BYL4=cD1*0UsrQ6zoM=9fT z_YE@Q=C(>#B%GGNbNND;bzo6nj0iN)TAh1&-QvoiwU>NSY|%9DN6;fj;g)od()a~r z``9=s5X!@i@+hgP_xCNbTVE{UE$amNpG`sgNR!~12%Rk7R1hkvK@U8JRq!O{lIqIj z9<>x0cAX;4XQyRXQZds~S|g~;xEqTv)v$JQa-yjR!%q}vEgER3$h6tcI`TxC6`-UcMHxdE6oYKt(15^o)Isd66=m06 z-UT84t0{zw-Xho$=aIZpJQolDkZHPd)(6huY>G9TmXkwNtEorTfO7INGm zNizHk)!?m=_+W$}mLeQ^B?4l>FRGp}4#vY1$W^8A;I~y}#-KxFuHUcVMmgTBEq;dX zYbJ$_HZ#S8$jwNwY#ltRsKqXP9=dBRk4qn_i(_u-2nYPx0UwM?s}=~9eP$Q@U3$xt z5|EhtM?tdGW&0rZGPKMnDV7cwuAzcI?{O8sC(ei7PmlzGSphF)gzb&y)jaIlW(?>` zTF1t(86-#rugH=`ISNE!m&x$E@x@J~<;Q1VdLh1ddRv$M5IlDE?nO*e=OMKA&0# zDGTRM%u7l6^WHDWCxloC5)qeAfEXOoE6f?Bg*H4iQ@!9-g5&+A9n#mtb*x(ph_Y(8 zG%3OFa9a3VkZ|6R&g~bNqX52!9Wimp<4(GdN#{-_0Y1&7eIv_ASm8;E!LunCGL<>M zcRm>N{cFWnD4xg#Xk2*obYgo8`cOa6=eqrE{2+Dx22%rngzW&NjZ9(FOjFu(_NQjE zMiXf>p;e_5xF1Upx+#`e;QAsPC2?a0tNUpuWoJUU$i&@p5x?@@lO4S$iI)h{q-Dr7 zg#h{^Dlt;>j!WH9wQe?xXVw)L!Z~UE7+%7Kg(U&GBBug+I_5Xx{e#!F^6d$8awWU( zqaqx;uNmAoMRy|@5KI`*f#KbZUhKY0x%_`I&<4XjdKmxMCYJoxnr3GETeG= zsBe{M3C=*5aakWDp(ORxZ6)tGi!+rp?M!|9(5H-JjJ7mSaHO-A6yPZ?)X`-Q&m-R> zxC%d?spCY6N;)tF@ZEP!q6LTfTOll=gA25HSaTP^PTt#D%KS6`g%lB2F@nE6&WE|l zFA=;j{LulA_CW6m6u_EhZ{z8M7w=)*TE;pF z0{iEN`JwM~&e^*Kl9%l0_*;m=XCt}EMPevJH4)fXe>FQIKO-|!VS^SD0g4nOn*`1! z`Ahn!NT3~d@lIGA>9JH4#@T*BPCH%<_+&DggPMW&`>?G z%jVqzQSYKLuUh?G~>f(qO&unCU{fe5i zDI}B2EdbnzQC*!Wtifv}3HomWLmMZe;Bw5ry^Hzu)-EUY;OO*d^=72}NJB$7Vv?Su zGtddkSAA5%3CF9m-J*lnm82;<;>y6!)xl~%!roSA&OUwg5Dp*_FAi%j%c!&s+)2{y z0vv`AX+bLW(6Hwqg*B{$uu-7O>$oEex>q-*(q9{h{dp!LV?qBVj2hAM2Fw=a+cSW1 zKRE?tpm!wfc^xEm)=1J~2Bv?pxIf4LlL+!ZvHNiiYolX409z)-Ex52)vhBtu=*>43 z2WCXa&CBcR>HX@AyB20v|3!NQ@l$qjRk}?cl=}WBPkb;W>oZ?(vz14$2jUo$$WzvZ zOp_8STU!KEqeQQ-buE;d|9p!g5=Zh05vb+_4>bi15aC^28K}ag&QBuiBaSS3$fM>y zLI=(`CU9NwlzB-A;6)st8O&`}n^Pj=*^~oLJE<2l;*;PhalBt)=#ydI%4-ZfW$Eb4 zg9VBMqnR$rjqsv(Hj(7e0i(=LbCfc3(FHJs*|8jdW=*xK3p6l4-5aOPYL~``hxziA z1tB4zU;>H!kloMA8L1JT46pXPPCwlERy5?n39n(0i;JY2@nN`oL=N|;Wo!sb2oah2 zHX1lYFn(w+RJ?3(>ZOizkE+uIByEQyWdCM>yw!7s>F3iSb)QYNu{ihJR?Wd%ae}WP z+@$de@?xDYY!)lX5S9uX)W|0yWvxXlfV+GiI8gVhANFLP?mx1ha}jNl5NZhyQ~yU} z988PX7B(?J3p!e6S6Xhc-o8Iu)?U05F2nYFT0Q-0$$4RSF!M}mJUk(ZPmPKw)$k

GPuoK+BvI3zHu%m#TQn$7QuhNdJU3d|hq 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%0D4Rxd=`3=xqDfs}6awRU&={z0?2Wqf^g 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 Q)&Kwi07*qoM6N<$f*C}hQvd(} literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index 27b84da..ae362fe 100644 --- a/manifest.json +++ b/manifest.json @@ -6,16 +6,26 @@ "yunohost": ">= 4.2.6.1" }, "description": { - "en": "A web client for matrix", - "fr": "Un client web pour matrix" + "en": "Web client for matrix", + "fr": "Client web pour matrix" }, "version": "1.8.4~ynh1", "url": "https://element.io", + "upstream": { + "license": "Apache-2.0", + "website": "https://element.io", + "demo": "https://app.element.io/", + "admindoc": "https://element.io/help", + "code": "https://github.com/vector-im/element-web/" + }, "license": "Apache-2.0", "maintainer": { "name": "Josué Tille", "email": "josue@tille.ch" }, + "requirements": { + "yunohost": ">= 4.2.6.1" + }, "multi_instance": true, "services": [ "nginx" @@ -25,19 +35,11 @@ { "name": "domain", "type": "domain", - "ask": { - "en": "Choose a domain for Element", - "fr": "Choisissez un domaine pour Element" - }, "example": "domain.org" }, { "name": "path", "type": "path", - "ask": { - "en": "Choose a path for Element", - "fr": "Choisissez un chemin pour Element" - }, "example": "/element", "default": "/element" }, @@ -54,10 +56,6 @@ { "name": "is_public", "type": "boolean", - "ask": { - "en": "Is it a public application?", - "fr": "Est-ce une application publique ?" - }, "help": { "en": "A public application means that anyone can access it. Note that this application provides just files (html, javascript, images, etc.)", "fr": "Une application publique signifie que n'importe qui peut y accéder. Notez que cette application ne fournit que des fichiers (html, javascript, images, etc.)" diff --git a/scripts/_common.sh b/scripts/_common.sh index 4834a45..944a65e 100755 --- a/scripts/_common.sh +++ b/scripts/_common.sh @@ -1,26 +1,17 @@ #!/bin/bash #================================================= -# SET ALL CONSTANTS +# COMMON VARIABLES #================================================= -app=$YNH_APP_INSTANCE_NAME -final_path="/var/www/$app" - #================================================= -# DEFINE ALL COMMON FONCTIONS +# PERSONAL HELPERS #================================================= -config_element() { - cp ../conf/config.json $final_path/config.json - ynh_replace_string --match_string __DEFAULT_SERVER__ --replace_string $default_home_server --target_file $final_path/config.json -} +#================================================= +# EXPERIMENTAL HELPERS +#================================================= -install_source() { - ynh_setup_source --dest_dir $final_path/ -} - -set_permission() { - chown www-data:root -R $final_path - chmod u=rX,g=rX,o= -R $final_path -} +#================================================= +# FUTURE OFFICIAL HELPERS +#================================================= diff --git a/scripts/backup b/scripts/backup index 9a60af7..8f87a63 100644 --- a/scripts/backup +++ b/scripts/backup @@ -3,32 +3,48 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Import common cmd -source ../settings/scripts/experimental_helper.sh +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh - -# Source YunoHost helpers source /usr/share/yunohost/helpers -# Stop script if errors +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script ynh_abort_if_errors #================================================= -# STANDARD BACKUP STEPS +# LOAD SETTINGS +#================================================= +ynh_print_info --message="Loading installation settings..." + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) + +#================================================= +# DECLARE DATA AND CONF FILES TO BACKUP +#================================================= +ynh_print_info --message="Declaring files to be backed up..." + +#================================================= +# BACKUP THE APP MAIN DIR #================================================= -# Retrieve arguments -ynh_print_info --message="Loading installation settings..." -domain=$(ynh_app_setting_get --app $app --key domain) +ynh_backup --src_path="$final_path" -ynh_print_info --message="Backing configuration..." +#================================================= +# BACKUP THE NGINX CONFIGURATION +#================================================= -# Copy Nginx config -ynh_backup --src_path "/etc/nginx/conf.d/${domain}.d/${app}.conf" +ynh_backup --src_path="/etc/nginx/conf.d/$domain.d/$app.conf" -# Backup element files -ynh_print_info --message="Backing up the main app directory..." -ynh_backup --src_path "/var/www/$app" +#================================================= +# END OF SCRIPT +#================================================= ynh_print_info --message="Backup script completed for $app. (YunoHost will then actually copy those files to the archive)." diff --git a/scripts/change_url b/scripts/change_url index 3a95905..4d5a344 100644 --- a/scripts/change_url +++ b/scripts/change_url @@ -1,42 +1,104 @@ #!/bin/bash #================================================= -# GENERIC START +# GENERIC STARTING +#================================================= +# IMPORT GENERIC HELPERS #================================================= -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -# Source YunoHost helpers +source _common.sh source /usr/share/yunohost/helpers -# Stop script if errors +#================================================= +# RETRIEVE ARGUMENTS +#================================================= + +old_domain=$YNH_APP_OLD_DOMAIN +old_path=$YNH_APP_OLD_PATH + +new_domain=$YNH_APP_NEW_DOMAIN +new_path=$YNH_APP_NEW_PATH + +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +# Needed for helper "ynh_add_nginx_config" +final_path=$(ynh_app_setting_get --app=$app --key=final_path) + +#================================================= +# BACKUP BEFORE CHANGE URL THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before changing its URL (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Remove the new domain config file, the remove script won't do it as it doesn't know yet its location. + ynh_secure_remove --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" + + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Retrive arguments -ynh_script_progression --message="Loading installation settings..." -old_domain=$YNH_APP_OLD_DOMAIN -path_url=$(ynh_normalize_url_path --path_url ${YNH_APP_NEW_PATH:-'/'}) -domain=$YNH_APP_NEW_DOMAIN - #================================================= -# STANDARD MODIFICATIONS +# CHECK WHICH PARTS SHOULD BE CHANGED #================================================= -ynh_script_progression --message="Updating configuration..." - -# Update nginx config -if [ "$old_domain" != "$domain" ] +change_domain=0 +if [ "$old_domain" != "$new_domain" ] then - # Delete file checksum for the old conf file location - ynh_delete_file_checksum --file "/etc/nginx/conf.d/$old_domain.d/$app.conf" - - mv "/etc/nginx/conf.d/$old_domain.d/$app.conf" "/etc/nginx/conf.d/$domain.d/$app.conf" - - # Store file checksum for the new config file location - ynh_store_file_checksum --file "/etc/nginx/conf.d/$domain.d/$app.conf" + change_domain=1 fi -ynh_add_nginx_config + +change_path=0 +if [ "$old_path" != "$new_path" ] +then + change_path=1 +fi + +#================================================= +# MODIFY URL IN NGINX CONF +#================================================= +ynh_script_progression --message="Updating NGINX web server configuration..." --weight=1 + +nginx_conf_path=/etc/nginx/conf.d/$old_domain.d/$app.conf + +# Change the path in the NGINX config file +if [ $change_path -eq 1 ] +then + # Make a backup of the original NGINX config file if modified + ynh_backup_if_checksum_is_different --file="$nginx_conf_path" + # Set global variables for NGINX helper + domain="$old_domain" + path_url="$new_path" + # Create a dedicated NGINX config + ynh_add_nginx_config +fi + +# Change the domain for NGINX +if [ $change_domain -eq 1 ] +then + # Delete file checksum for the old conf file location + ynh_delete_file_checksum --file="$nginx_conf_path" + mv $nginx_conf_path /etc/nginx/conf.d/$new_domain.d/$app.conf + # Store file checksum for the new config file location + ynh_store_file_checksum --file="/etc/nginx/conf.d/$new_domain.d/$app.conf" +fi +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= ynh_script_progression --message="Change of URL completed for $app" --last diff --git a/scripts/experimental_helper.sh b/scripts/experimental_helper.sh deleted file mode 100644 index e69de29..0000000 diff --git a/scripts/install b/scripts/install index 40a7bae..b6a6102 100644 --- a/scripts/install +++ b/scripts/install @@ -3,18 +3,22 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -# Source YunoHost helpers +source _common.sh source /usr/share/yunohost/helpers -# Stop script if errors +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + +# Exit if an error occurs during the execution of the script ynh_abort_if_errors -ynh_script_progression --message="Validating installation parameters..." +#================================================= +# RETRIEVE ARGUMENTS FROM THE MANIFEST +#================================================= # Retrieve arguments domain=$YNH_APP_ARG_DOMAIN @@ -22,47 +26,84 @@ path_url=$YNH_APP_ARG_PATH is_public=$YNH_APP_ARG_IS_PUBLIC default_home_server=$YNH_APP_ARG_DEFAULT_HOME_SERVER +app=$YNH_APP_INSTANCE_NAME + +#================================================= +# CHECK IF THE APP CAN BE INSTALLED WITH THESE ARGS +#================================================= +ynh_script_progression --message="Validating installation parameters..." --weight=1 + +final_path=/var/www/$app +test ! -e "$final_path" || ynh_die --message="This path already contains a folder" + # Register (book) web path -ynh_webpath_register --app $app --domain $domain --path_url $path_url +ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url -# Check Final Path availability -test ! -e "$final_path" || ynh_die --message "This path already contains a folder" +#================================================= +# STORE SETTINGS FROM MANIFEST +#================================================= +ynh_script_progression --message="Storing installation settings..." --weight=1 -# Enregistre les infos dans la config YunoHost -ynh_script_progression --message="Storing installation settings..." ynh_app_setting_set --app $app --key is_public --value $is_public ynh_app_setting_set --app $app --key default_home_server --value $default_home_server ynh_app_setting_set --app $app --key final_path --value $final_path #================================================= -# STANDARD MODIFICATIONS +# CREATE DEDICATED USER #================================================= +ynh_script_progression --message="Configuring system user..." --weight=1 -# Get source and install in source dir -ynh_script_progression --message="Installing sources files..." --weight=10 -install_source +# Create a system user +ynh_system_user_create --username=$app --home_dir="$final_path" -# Update Element config -config_element +#================================================= +# DOWNLOAD, CHECK AND UNPACK SOURCE +#================================================= +ynh_script_progression --message="Setting up source files..." --weight=4 -# Config nginx +ynh_app_setting_set --app=$app --key=final_path --value=$final_path +# Download, check integrity, uncompress and patch the source from app.src +ynh_setup_source --dest_dir="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Configuring NGINX web server..." --weight=1 + +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= -# GENERIC FINALIZATION +# ADD A CONFIGURATION #================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 -# Set final permission -ynh_script_progression --message="Protecting directory" -set_permission +ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" -ynh_script_progression --message="Configuring permissions" -if [ "$is_public" == '1' ]; +#================================================= +# SETUP SSOWAT +#================================================= +ynh_script_progression --message="Configuring permissions..." --weight=1 + +# Make app public if necessary +if [ $is_public -eq 1 ] then - ynh_permission_update --permission "main" --add "visitors" + ynh_permission_update --permission="main" --add="visitors" fi -# Recharge la configuration Nginx -systemctl reload nginx.service +#================================================= +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT +#================================================= ynh_script_progression --message="Installation of $app completed" --last diff --git a/scripts/remove b/scripts/remove index ea3e66d..894b04e 100755 --- a/scripts/remove +++ b/scripts/remove @@ -3,28 +3,36 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -# Source YunoHost helpers +source _common.sh source /usr/share/yunohost/helpers #================================================= -# STANDARD REMOVE +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) + +#================================================= +# REMOVE APP MAIN DIR +#================================================= +ynh_script_progression --message="Removing app main directory..." --weight=1 + +# Remove the app directory securely +ynh_secure_remove --file="$final_path" + +#================================================= +# REMOVE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 + +#================================================= +# END OF SCRIPT #================================================= -# Retrieve arguments -ynh_script_progression --message="Loading installation settings..." -domain=$(ynh_app_setting_get --app $app --key domain) - -# Remove all files -ynh_script_progression --message="Removing app main directory..." --weight=4 -ynh_secure_remove --file="/var/www/$app" - -# Suppression de la configuration nginx -ynh_script_progression --message="Removing configuration..." -ynh_remove_nginx_config - ynh_script_progression --message="Removal of $app completed" --last diff --git a/scripts/restore b/scripts/restore index 47c7be4..16fa9f7 100644 --- a/scripts/restore +++ b/scripts/restore @@ -3,47 +3,79 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Import common cmd -source ../settings/scripts/experimental_helper.sh +# Keep this path for calling _common.sh inside the execution's context of backup and restore scripts source ../settings/scripts/_common.sh - -# Source YunoHost helpers source /usr/share/yunohost/helpers +#================================================= +# MANAGE SCRIPT FAILURE +#================================================= + # Stop script if errors ynh_abort_if_errors -# Retrieve arguments -ynh_script_progression --message="Loading settings..." -domain=$(ynh_app_setting_get --app $app --key domain) -path_url=$(ynh_app_setting_get --app $app --key path) +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 -# Check domain/path availability -ynh_webpath_available --domain $domain --path_url $path_url || ynh_die --message "$domain/$path_url is not available, please use an other domain or path." +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) + + +#================================================= +# CHECK IF THE APP CAN BE RESTORED +#================================================= +ynh_script_progression --message="Validating restoration parameters..." --weight=1 + +test ! -d $final_path \ + || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS #================================================= +# RESTORE THE NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Restoring the NGINX configuration..." --weight=1 -# Create a system user -ynh_script_progression --message="Recreating the dedicated system user..." -ynh_system_user_create --username $app +ynh_restore_file --origin_path="/etc/nginx/conf.d/$domain.d/$app.conf" -# Restore all config and data -ynh_script_progression --message="Restoring files..." --weight=10 -ynh_restore +#================================================= +# RECREATE THE DEDICATED USER +#================================================= +ynh_script_progression --message="Recreating the dedicated system user..." --weight=1 + +# Create the dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" + +#================================================= +# RESTORE THE APP MAIN DIR +#================================================= +ynh_script_progression --message="Restoring the app main directory..." --weight=1 + +ynh_restore_file --origin_path="$final_path" + +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" #================================================= # GENERIC FINALIZATION #================================================= +# RELOAD NGINX AND PHP-FPM +#================================================= +ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 -# Set final permission -ynh_script_progression --message="Protecting directory..." -set_permission +ynh_systemd_action --service_name=php$phpversion-fpm --action=reload +ynh_systemd_action --service_name=nginx --action=reload -# Reload nginx -ynh_script_progression --message="Reloading services..." -systemctl reload nginx.service +#================================================= +# END OF SCRIPT +#================================================= ynh_script_progression --message="Restoration completed for $app" --last diff --git a/scripts/upgrade b/scripts/upgrade index 7bf9fe0..04a0f34 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -3,58 +3,92 @@ #================================================= # GENERIC START #================================================= +# IMPORT GENERIC HELPERS +#================================================= -# Import common cmd -source ./experimental_helper.sh -source ./_common.sh - -# Source YunoHost helpers +source _common.sh source /usr/share/yunohost/helpers -# Stop script if errors +#================================================= +# LOAD SETTINGS +#================================================= +ynh_script_progression --message="Loading installation settings..." --weight=1 + +app=$YNH_APP_INSTANCE_NAME + +domain=$(ynh_app_setting_get --app=$app --key=domain) +path_url=$(ynh_app_setting_get --app=$app --key=path) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) +default_home_server=$(ynh_app_setting_get --app=$app --key=default_home_server) + +#================================================= +# CHECK VERSION +#================================================= + +upgrade_type=$(ynh_check_app_version_changed) + +#================================================= +# BACKUP BEFORE UPGRADE THEN ACTIVE TRAP +#================================================= +ynh_script_progression --message="Backing up the app before upgrading (may take a while)..." --weight=1 + +# Backup the current version of the app +ynh_backup_before_upgrade +ynh_clean_setup () { + # Restore it if the upgrade fails + ynh_restore_upgradebackup +} +# Exit if an error occurs during the execution of the script ynh_abort_if_errors -# Retrieve arguments -ynh_script_progression --message="Loading installation settings..." -domain=$(ynh_app_setting_get --app $app --key domain) -path_url=$(ynh_normalize_url_path --path_url $(ynh_app_setting_get --app $app --key path)) -is_public=$(ynh_app_setting_get --app $app --key is_public) -final_path=$(ynh_app_setting_get --app $app --key final_path) -default_home_server=$(ynh_app_setting_get --app $app --key default_home_server) +#================================================= +# CREATE DEDICATED USER +#================================================= +ynh_script_progression --message="Making sure dedicated system user exists..." --weight=1 + +# Create a dedicated user (if not existing) +ynh_system_user_create --username=$app --home_dir="$final_path" #================================================= -# STANDARD UPGRADE STEPS +# DOWNLOAD, CHECK AND UNPACK SOURCE #================================================= -# Get source and install in source dir -ynh_script_progression --message="Upgrading source files..." --weight=6 -ynh_secure_remove --file=$final_path -install_source +if [ "$upgrade_type" == "UPGRADE_APP" ] +then + ynh_script_progression --message="Upgrading source files..." --weight=1 -ynh_script_progression --message="Configuring application..." + # Download, check integrity, uncompress and patch the source from app.src + ynh_setup_source --dest_dir="$final_path" +fi -# Update Element config -config_element +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" -# Remove the dedicated php-fpm config -ynh_remove_fpm_config +#================================================= +# ADD A CONFIGURATION +#================================================= +ynh_script_progression --message="Adding a configuration file..." --weight=1 -# Delete a system user -ynh_script_progression --message="Removing apps user..." -ynh_system_user_delete --username $app +ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" -# Update nginx config +#================================================= +# NGINX CONFIGURATION +#================================================= +ynh_script_progression --message="Upgrading NGINX web server configuration..." --weight=1 + +# Create a dedicated NGINX config ynh_add_nginx_config #================================================= -# GENERIC FINALIZATION +# RELOAD NGINX +#================================================= +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 + +ynh_systemd_action --service_name=nginx --action=reload + +#================================================= +# END OF SCRIPT #================================================= -# Set final permission -ynh_script_progression --message="Protecting directory..." -set_permission - -# Recharge la configuration Nginx -systemctl reload nginx.service - ynh_script_progression --message="Upgrade of $app completed" --last From 7a94a0cfdceff34155f70499db1ee63a60e64da9 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 13 Sep 2021 21:49:12 +0000 Subject: [PATCH 02/36] Auto-update README --- README.md | 121 ++++++++++++--------------------------------------- README_fr.md | 76 ++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 93 deletions(-) create mode 100644 README_fr.md diff --git a/README.md b/README.md index 2c34c62..f6270f1 100644 --- a/README.md +++ b/README.md @@ -1,81 +1,40 @@ -Element For yunohost -================= + + +# Element for YunoHost [![Integration level](https://dash.yunohost.org/integration/element.svg)](https://dash.yunohost.org/appci/app/element) ![](https://ci-apps.yunohost.org/ci/badges/element.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/element.maintain.svg) [![Install Element with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=element) -> *This package allow you to install Element quickly and simply on a YunoHost server. -If you don't have YunoHost, please see [here](https://yunohost.org/#/install) to know how to install and enjoy it.* +*[Lire ce readme en français.](./README_fr.md)* -Overview --------- +> *This package allows you to install Element quickly and simply on a YunoHost server. +If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* -It's a webclient for matrix. For a matrix server you can install synapse on your server : https://github.com/YunoHost-Apps/synapse_ynh +## Overview -Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) +Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.8.4 +**Shipped version:** 1.8.4~ynh1 -Screenshots ------------ +**Demo:** https://app.element.io/ -#### Own your conversations +## Screenshots -All-in-one secure chat app for teams, friends and organisations. Keeps conversations in your control, safe from data-mining and ads. Talk to everyone through the open global Matrix network, protected by proper end-to-end encryption. +![](./doc/screenshots/homepage-all-platforms-1_1.png) -![](https://element.io/images/homepage-all-platforms-1-p-800.png) -![](https://element.io/images/ios-room-chat-012x-p-500.png) -![](https://element.io/images/pixel4-rooms-light-012x-p-500.png) +## Disclaimers / important information -**Element gives you the privacy you expect from a conversation in your own home, but with everyone across the globe.** -##### Keep it personal - -Group chat, video calls and sharing to stay in touch and coordinate with family and friends. - -![](https://element.io/images/for-personal.png) - -##### Revolutionise the workplace - -Highly effective teamwork within a company, across a business ecosystem or an entire government. - -![](https://element.io/images/temp-img-pro-use-01.png) - -##### Host your community - -From clubs to social movements, keep everyone together with a platform everyone can use. - -![](https://element.io/images/temp-community-image-02.png) - -Demo ----- - -* [Official demo](https://app.element.io/) - -Documentation -------------- - - * Official documentation: https://element.io/help - * YunoHost documentation: There no other documentations, feel free to contribute. - -YunoHost specific features --------------------------- +## YunoHost specific features ### Multi-users support -Now this application support the sso. If you want to use the sso you need to define the path to the default homeserver as your homeserver witch is installed on your yunohost instance. +Now this application support the SSO. If you want to use the sso you need to define the path to the default homeserver as your homeserver witch is installed on your YunoHost instance. -### Supported architectures - -* x86-64 - [![Build Status](https://ci-apps.yunohost.org/ci/logs/element%20%28Apps%29.svg)](https://ci-apps.yunohost.org/ci/apps/element/) -* ARMv8-A - [![Build Status](https://ci-apps-arm.yunohost.org/ci/logs/element%20%28Apps%29.svg)](https://ci-apps-arm.yunohost.org/ci/apps/element/) - - - -Additional informations ------------------------ +## Additional informations ### Important Security Note @@ -99,33 +58,17 @@ So the process to migrate to element is the following: 2. Remove Riot: `yunohost app remove riot` 3. Install Element: `yunohost app install element` -Links ------ +## Documentation and resources - * Report a bug: https://github.com/YunoHost-Apps/element_ynh/issues - * App website: https://element.io/ - * YunoHost website: https://yunohost.org/ +* Official app website: https://element.io +* Official admin documentation: https://element.io/help +* Upstream app code repository: https://github.com/vector-im/element-web/ +* YunoHost documentation for this app: https://yunohost.org/app_element +* Report a bug: https://github.com/YunoHost-Apps/element_ynh/issues ---- +## Developer info -Install -------- - -From command line: - -`sudo yunohost app install -l element https://github.com/YunoHost-Apps/element_ynh` - -Upgrade -------- - -From command line: - -`sudo yunohost app upgrade element -u https://github.com/YunoHost-Apps/element_ynh` - -Developers infos ----------------- - -Please do your pull request to the [testing branch](https://github.com/YunoHost-Apps/element_ynh/tree/testing). +Please send your pull request to the [testing branch](https://github.com/YunoHost-Apps/element_ynh/tree/testing). To try the testing branch, please proceed like that. ``` @@ -134,12 +77,4 @@ or sudo yunohost app upgrade element -u https://github.com/YunoHost-Apps/element_ynh/tree/testing --debug ``` -License -------- - -Element-Web is published under the Apache License : https://github.com/vector-im/riot-web/blob/master/LICENSE - -Todo for official App ---------------------- - -- Improve documentation +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file diff --git a/README_fr.md b/README_fr.md new file mode 100644 index 0000000..145cd09 --- /dev/null +++ b/README_fr.md @@ -0,0 +1,76 @@ +# Element pour YunoHost + +[![Niveau d'intégration](https://dash.yunohost.org/integration/element.svg)](https://dash.yunohost.org/appci/app/element) ![](https://ci-apps.yunohost.org/ci/badges/element.status.svg) ![](https://ci-apps.yunohost.org/ci/badges/element.maintain.svg) +[![Installer Element avec YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=element) + +*[Read this readme in english.](./README.md)* +*[Lire ce readme en français.](./README_fr.md)* + +> *Ce package vous permet d'installer Element rapidement et simplement sur un serveur YunoHost. +Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour savoir comment l'installer et en profiter.* + +## Vue d'ensemble + +Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. + +**Version incluse :** 1.8.4~ynh1 + +**Démo :** https://app.element.io/ + +## Captures d'écran + +![](./doc/screenshots/homepage-all-platforms-1_1.png) + +## Avertissements / informations importantes + + +## YunoHost specific features + +### Multi-users support + +Now this application support the SSO. If you want to use the sso you need to define the path to the default homeserver as your homeserver witch is installed on your YunoHost instance. + +## Additional informations + +### Important Security Note + +We do not recommend running Element from the same domain name as your Matrix +homeserver (synapse). The reason is the risk of XSS (cross-site-scripting) +vulnerabilities that could occur if someone caused Element to load and render +malicious user generated content from a Matrix API which then had trusted +access to Element (or other apps) due to sharing the same domain. + +We have put some coarse mitigations into place to try to protect against this +situation, but it's still not good practice to do it in the first place. See +https://github.com/vector-im/riot-web/issues/1977 for more details. + +### Migration from old app name "Riot" + +As this app don't contains any data on the server side no migration was made to migrate from "Riot" to "Element". +So you just will need to remove Riot and install Element on the same domain (you can change the path) to be able to keep the data on your web browser. +So the process to migrate to element is the following: + +1. Get the domain of "Riot": `yunohost app setting riot domain` +2. Remove Riot: `yunohost app remove riot` +3. Install Element: `yunohost app install element` + +## Documentations et ressources + +* Site officiel de l'app : https://element.io +* Documentation officielle de l'admin : https://element.io/help +* Dépôt de code officiel de l'app : https://github.com/vector-im/element-web/ +* Documentation YunoHost pour cette app : https://yunohost.org/app_element +* Signaler un bug : https://github.com/YunoHost-Apps/element_ynh/issues + +## Informations pour les développeurs + +Merci de faire vos pull request sur la [branche testing](https://github.com/YunoHost-Apps/element_ynh/tree/testing). + +Pour essayer la branche testing, procédez comme suit. +``` +sudo yunohost app install https://github.com/YunoHost-Apps/element_ynh/tree/testing --debug +ou +sudo yunohost app upgrade element -u https://github.com/YunoHost-Apps/element_ynh/tree/testing --debug +``` + +**Plus d'infos sur le packaging d'applications :** https://yunohost.org/packaging_apps \ No newline at end of file From c0e4f3ae9066542a3ea50bf21a9dd10cd32b069b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 00:02:12 +0200 Subject: [PATCH 03/36] Update install --- scripts/install | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/install b/scripts/install index b6a6102..8220d0f 100644 --- a/scripts/install +++ b/scripts/install @@ -44,7 +44,6 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= ynh_script_progression --message="Storing installation settings..." --weight=1 -ynh_app_setting_set --app $app --key is_public --value $is_public ynh_app_setting_set --app $app --key default_home_server --value $default_home_server ynh_app_setting_set --app $app --key final_path --value $final_path From a35e040d8506d0d1f86fd7afe9befb5ec7632687 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 00:04:09 +0200 Subject: [PATCH 04/36] Update remove --- scripts/remove | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/remove b/scripts/remove index 894b04e..74191a7 100755 --- a/scripts/remove +++ b/scripts/remove @@ -31,6 +31,19 @@ ynh_secure_remove --file="$final_path" #================================================= ynh_script_progression --message="Removing NGINX web server configuration..." --weight=1 +# Remove the dedicated NGINX config +ynh_remove_nginx_config + +#================================================= +# GENERIC FINALIZATION +#================================================= +# REMOVE DEDICATED USER +#================================================= +ynh_script_progression --message="Removing the dedicated system user..." --weight=1 + +# Delete a system user +ynh_system_user_delete --username=$app + #================================================= # END OF SCRIPT #================================================= From 414a7291c8939bf958f52fa1671035aadff2179b Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 00:10:48 +0200 Subject: [PATCH 05/36] Fix --- scripts/install | 4 ++-- scripts/remove | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/install b/scripts/install index 8220d0f..054be2c 100644 --- a/scripts/install +++ b/scripts/install @@ -44,8 +44,8 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= ynh_script_progression --message="Storing installation settings..." --weight=1 -ynh_app_setting_set --app $app --key default_home_server --value $default_home_server -ynh_app_setting_set --app $app --key final_path --value $final_path +ynh_app_setting_set --app=$app --key=default_home_server --value=$default_home_server +ynh_app_setting_set --app=$app --key=final_path --value=$final_path #================================================= # CREATE DEDICATED USER diff --git a/scripts/remove b/scripts/remove index 74191a7..e2bc3c1 100755 --- a/scripts/remove +++ b/scripts/remove @@ -17,6 +17,7 @@ ynh_script_progression --message="Loading installation settings..." --weight=1 app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # REMOVE APP MAIN DIR From 801230edb15db52e87e96238325c94a9a1a43956 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 00:12:18 +0200 Subject: [PATCH 06/36] Update install --- scripts/install | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/install b/scripts/install index 054be2c..3903911 100644 --- a/scripts/install +++ b/scripts/install @@ -64,10 +64,6 @@ ynh_app_setting_set --app=$app --key=final_path --value=$final_path # Download, check integrity, uncompress and patch the source from app.src ynh_setup_source --dest_dir="$final_path" -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # NGINX CONFIGURATION #================================================= @@ -83,6 +79,10 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # SETUP SSOWAT #================================================= From e22c60c5fc42f83a9c910e7df1511383c76682e0 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 00:12:37 +0200 Subject: [PATCH 07/36] Update upgrade --- scripts/upgrade | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/upgrade b/scripts/upgrade index 04a0f34..bc105ba 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -61,10 +61,6 @@ then ynh_setup_source --dest_dir="$final_path" fi -chmod 750 "$final_path" -chmod -R o-rwx "$final_path" -chown -R $app:www-data "$final_path" - #================================================= # ADD A CONFIGURATION #================================================= @@ -72,6 +68,10 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" +chmod 750 "$final_path" +chmod -R o-rwx "$final_path" +chown -R $app:www-data "$final_path" + #================================================= # NGINX CONFIGURATION #================================================= From 22c62423d594dea9da467e03eb63a53fff613d5e Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 07:31:14 +0200 Subject: [PATCH 08/36] Fix --- manifest.json | 3 --- scripts/restore | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/manifest.json b/manifest.json index ae362fe..ee9b063 100644 --- a/manifest.json +++ b/manifest.json @@ -2,9 +2,6 @@ "name": "Element", "id": "element", "packaging_format": 1, - "requirements": { - "yunohost": ">= 4.2.6.1" - }, "description": { "en": "Web client for matrix", "fr": "Client web pour matrix" diff --git a/scripts/restore b/scripts/restore index 16fa9f7..454c011 100644 --- a/scripts/restore +++ b/scripts/restore @@ -26,7 +26,7 @@ app=$YNH_APP_INSTANCE_NAME domain=$(ynh_app_setting_get --app=$app --key=domain) path_url=$(ynh_app_setting_get --app=$app --key=path) - +final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= # CHECK IF THE APP CAN BE RESTORED From 1227bb7a5fc3917a894b88dd6086188c31334279 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 07:56:22 +0200 Subject: [PATCH 09/36] Fix --- scripts/backup | 1 + scripts/install | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/backup b/scripts/backup index 8f87a63..6201eec 100644 --- a/scripts/backup +++ b/scripts/backup @@ -24,6 +24,7 @@ ynh_print_info --message="Loading installation settings..." app=$YNH_APP_INSTANCE_NAME +final_path=$(ynh_app_setting_get --app=$app --key=final_path) domain=$(ynh_app_setting_get --app=$app --key=domain) #================================================= diff --git a/scripts/install b/scripts/install index 3903911..895b16f 100644 --- a/scripts/install +++ b/scripts/install @@ -44,8 +44,9 @@ ynh_webpath_register --app=$app --domain=$domain --path_url=$path_url #================================================= ynh_script_progression --message="Storing installation settings..." --weight=1 +ynh_app_setting_set --app=$app --key=domain --value=$domain +ynh_app_setting_set --app=$app --key=path --value=$path_url ynh_app_setting_set --app=$app --key=default_home_server --value=$default_home_server -ynh_app_setting_set --app=$app --key=final_path --value=$final_path #================================================= # CREATE DEDICATED USER From 09e54beed91096b9de7a8d041366ba9e8593cbb6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 08:05:08 +0200 Subject: [PATCH 10/36] Update check_process --- check_process | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/check_process b/check_process index 79e24c6..a01e917 100644 --- a/check_process +++ b/check_process @@ -12,15 +12,15 @@ setup_private=1 setup_public=1 upgrade=1 - upgrade=1 from_commit=CommitHash + upgrade=1 from_commit=34d457d13e526997fddb8348650674a7db2247be backup_restore=1 multi_instance=1 port_already_use=0 change_url=1 ;;; Upgrade options ;;; Upgrade options - ; commit=CommitHash - name=Name and date of the commit. + ; commit=Sep 13, 2021 + name=34d457d13e526997fddb8348650674a7db2247be manifest_arg=domain=DOMAIN&path=PATH&admin=USER&language=fr&is_public=1&password=pass&port=666& \ No newline at end of file From e02d54f43531f97bdda365f4f81adf70fd6be641 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 14 Sep 2021 08:12:36 +0200 Subject: [PATCH 11/36] Update restore --- scripts/restore | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/restore b/scripts/restore index 454c011..4377a08 100644 --- a/scripts/restore +++ b/scripts/restore @@ -69,9 +69,8 @@ chown -R $app:www-data "$final_path" #================================================= # RELOAD NGINX AND PHP-FPM #================================================= -ynh_script_progression --message="Reloading NGINX web server and PHP-FPM..." --weight=1 +ynh_script_progression --message="Reloading NGINX web server..." --weight=1 -ynh_systemd_action --service_name=php$phpversion-fpm --action=reload ynh_systemd_action --service_name=nginx --action=reload #================================================= From 3ebe61c72aeafcf2bd1350c1ffd28984fe60d881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Mon, 27 Sep 2021 22:03:16 +0200 Subject: [PATCH 12/36] Upgrade element to 1.9.0 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 0449f4f..1511639 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It's a webclient for matrix. For a matrix server you can install synapse on your Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) -**Shipped version:** 1.8.5 +**Shipped version:** 1.9.0 Screenshots ----------- diff --git a/conf/app.src b/conf/app.src index 265e852..8838215 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.8.5/element-v1.8.5.tar.gz -SOURCE_SUM=1371fa8970518b89a786ed26bbdea5cbd7fc0183a23057fdcd37298c399f1f2e +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.0/element-v1.9.0.tar.gz +SOURCE_SUM=40c2dad41833f5f780011f4f2955c0ce5443ced2416671881be4ac3e0c2f611c # (Optional) Program to check the integrity (sha256sum, md5sum...) # default: sha256 SOURCE_SUM_PRG=sha256sum diff --git a/manifest.json b/manifest.json index 5fb85a0..783737f 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "en": "A web client for matrix", "fr": "Un client web pour matrix" }, - "version": "1.8.5~ynh1", + "version": "1.9.0~ynh1", "url": "https://element.io", "license": "Apache-2.0", "maintainer": { From be0f3f091ae51c25ba5696f222774625533d3628 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Wed, 29 Sep 2021 09:14:20 +0000 Subject: [PATCH 13/36] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f6270f1..b1bebd5 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.8.4~ynh1 +**Shipped version:** 1.9.0~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index 145cd09..babae95 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Version incluse :** 1.8.4~ynh1 +**Version incluse :** 1.9.0~ynh1 **Démo :** https://app.element.io/ From cc2a8cc24e8faf0d056d873d71ddd085e16c2a65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Mon, 11 Oct 2021 22:03:15 +0200 Subject: [PATCH 14/36] Upgrade element to 1.9.1 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 1511639..9c9ffb6 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It's a webclient for matrix. For a matrix server you can install synapse on your Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) -**Shipped version:** 1.9.0 +**Shipped version:** 1.9.1 Screenshots ----------- diff --git a/conf/app.src b/conf/app.src index 8838215..7a5eda8 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.0/element-v1.9.0.tar.gz -SOURCE_SUM=40c2dad41833f5f780011f4f2955c0ce5443ced2416671881be4ac3e0c2f611c +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.1/element-v1.9.1.tar.gz +SOURCE_SUM=3209df7cdc1b4c4c4f18ba0b22a8f191d256530e8de369efa2ae75869b437c1d # (Optional) Program to check the integrity (sha256sum, md5sum...) # default: sha256 SOURCE_SUM_PRG=sha256sum diff --git a/manifest.json b/manifest.json index 783737f..509e37d 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "en": "A web client for matrix", "fr": "Un client web pour matrix" }, - "version": "1.9.0~ynh1", + "version": "1.9.1~ynh1", "url": "https://element.io", "license": "Apache-2.0", "maintainer": { From 284afecd8964a1850ddc329e2f97259069698eed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Tue, 12 Oct 2021 22:03:17 +0200 Subject: [PATCH 15/36] Upgrade element to 1.9.2 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9c9ffb6..c33e5a1 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It's a webclient for matrix. For a matrix server you can install synapse on your Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) -**Shipped version:** 1.9.1 +**Shipped version:** 1.9.2 Screenshots ----------- diff --git a/conf/app.src b/conf/app.src index 7a5eda8..08924cd 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.1/element-v1.9.1.tar.gz -SOURCE_SUM=3209df7cdc1b4c4c4f18ba0b22a8f191d256530e8de369efa2ae75869b437c1d +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.2/element-v1.9.2.tar.gz +SOURCE_SUM=4249f4bf2646bc101e39f4f3c72756ce3150270637f4834087064d5f8c6c33b5 # (Optional) Program to check the integrity (sha256sum, md5sum...) # default: sha256 SOURCE_SUM_PRG=sha256sum diff --git a/manifest.json b/manifest.json index 509e37d..544e4fd 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "en": "A web client for matrix", "fr": "Un client web pour matrix" }, - "version": "1.9.1~ynh1", + "version": "1.9.2~ynh1", "url": "https://element.io", "license": "Apache-2.0", "maintainer": { From 3e1aef07342310ee9742a19affc3a221f5979262 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Mon, 25 Oct 2021 22:03:16 +0200 Subject: [PATCH 16/36] Upgrade element to 1.9.3 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c33e5a1..80c1ab4 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It's a webclient for matrix. For a matrix server you can install synapse on your Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) -**Shipped version:** 1.9.2 +**Shipped version:** 1.9.3 Screenshots ----------- diff --git a/conf/app.src b/conf/app.src index 08924cd..783b6d8 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.2/element-v1.9.2.tar.gz -SOURCE_SUM=4249f4bf2646bc101e39f4f3c72756ce3150270637f4834087064d5f8c6c33b5 +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.3/element-v1.9.3.tar.gz +SOURCE_SUM=f793a021127d8b100454426f9a5c3481f495027c7640e30da8357a77225a971a # (Optional) Program to check the integrity (sha256sum, md5sum...) # default: sha256 SOURCE_SUM_PRG=sha256sum diff --git a/manifest.json b/manifest.json index 544e4fd..7f64646 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "en": "A web client for matrix", "fr": "Un client web pour matrix" }, - "version": "1.9.2~ynh1", + "version": "1.9.3~ynh1", "url": "https://element.io", "license": "Apache-2.0", "maintainer": { From 396bb1b3f93224941064b9164407eaa11cc533a8 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Wed, 3 Nov 2021 22:20:38 +0000 Subject: [PATCH 17/36] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b1bebd5..8b6cc84 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.0~ynh1 +**Shipped version:** 1.9.3~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index babae95..4673774 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Version incluse :** 1.9.0~ynh1 +**Version incluse :** 1.9.3~ynh1 **Démo :** https://app.element.io/ From d2bc77d2ed041d280e974bfb7a95e47f7f7c8bd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Mon, 8 Nov 2021 22:03:16 +0100 Subject: [PATCH 18/36] Upgrade element to 1.9.4 --- README.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 80c1ab4..a402769 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ It's a webclient for matrix. For a matrix server you can install synapse on your Yunohost chattroom with matrix : [https://app.element.io/#/room/#yunohost:matrix.org](https://app.element.io/#/room/#yunohost:matrix.org) -**Shipped version:** 1.9.3 +**Shipped version:** 1.9.4 Screenshots ----------- diff --git a/conf/app.src b/conf/app.src index 783b6d8..c67853a 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.3/element-v1.9.3.tar.gz -SOURCE_SUM=f793a021127d8b100454426f9a5c3481f495027c7640e30da8357a77225a971a +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.4/element-v1.9.4.tar.gz +SOURCE_SUM=44bc322aaa285515cda7a001109e34737e7c9289ad0d13af1bdbf3cda4f83190 # (Optional) Program to check the integrity (sha256sum, md5sum...) # default: sha256 SOURCE_SUM_PRG=sha256sum diff --git a/manifest.json b/manifest.json index 7f64646..bfb6a5c 100644 --- a/manifest.json +++ b/manifest.json @@ -9,7 +9,7 @@ "en": "A web client for matrix", "fr": "Un client web pour matrix" }, - "version": "1.9.3~ynh1", + "version": "1.9.4~ynh1", "url": "https://element.io", "license": "Apache-2.0", "maintainer": { From 0f7749958cd440ca053adc24b446b8a8b116ff61 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Nov 2021 14:14:02 +0100 Subject: [PATCH 19/36] Update to 4.3 --- conf/nginx.conf | 4 ---- manifest.json | 5 ++--- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/conf/nginx.conf b/conf/nginx.conf index c3eb079..b5f38e3 100644 --- a/conf/nginx.conf +++ b/conf/nginx.conf @@ -2,10 +2,6 @@ location __PATH__/ { alias __FINALPATH__/; - - if ($scheme = http) { - rewrite ^ https://$server_name$request_uri? permanent; - } index index.html; diff --git a/manifest.json b/manifest.json index 101739d..0447680 100644 --- a/manifest.json +++ b/manifest.json @@ -21,7 +21,7 @@ "email": "josue@tille.ch" }, "requirements": { - "yunohost": ">= 4.2.6.1" + "yunohost": ">= 4.3.0" }, "multi_instance": true, "services": [ @@ -31,8 +31,7 @@ "install" : [ { "name": "domain", - "type": "domain", - "example": "domain.org" + "type": "domain" }, { "name": "path", From 779841e69a49afaa6d026c958e42531f3e7f86c3 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 21 Nov 2021 14:18:32 +0100 Subject: [PATCH 20/36] Add templates fr --- conf/app.src | 4 ++-- doc/DESCRIPTION_fr.md | 1 + doc/DISCLAIMER.md | 3 +-- doc/DISCLAIMER_fr.md | 29 +++++++++++++++++++++++++++++ manifest.json | 2 +- 5 files changed, 34 insertions(+), 5 deletions(-) create mode 100644 doc/DESCRIPTION_fr.md create mode 100644 doc/DISCLAIMER_fr.md diff --git a/conf/app.src b/conf/app.src index 450b091..4c2bfda 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.3/element-v1.9.3.tar.gz -SOURCE_SUM=f793a021127d8b100454426f9a5c3481f495027c7640e30da8357a77225a971a +SOURCE_URL=https://github.com/vector-im/element-web/archive/refs/tags/v1.9.4.tar.gz +SOURCE_SUM=e5f98816d630d6ecc2f8942bfc1ff5bba2d9e479ecc38f2329171ae39609351a SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/doc/DESCRIPTION_fr.md b/doc/DESCRIPTION_fr.md new file mode 100644 index 0000000..81380b4 --- /dev/null +++ b/doc/DESCRIPTION_fr.md @@ -0,0 +1 @@ +Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. \ No newline at end of file diff --git a/doc/DISCLAIMER.md b/doc/DISCLAIMER.md index 08f2579..5f9bf9f 100644 --- a/doc/DISCLAIMER.md +++ b/doc/DISCLAIMER.md @@ -1,4 +1,3 @@ - ## YunoHost specific features ### Multi-users support @@ -10,7 +9,7 @@ Now this application support the SSO. If you want to use the sso you need to def ### Important Security Note We do not recommend running Element from the same domain name as your Matrix -homeserver (synapse). The reason is the risk of XSS (cross-site-scripting) +homeserver (Synapse). The reason is the risk of XSS (cross-site-scripting) vulnerabilities that could occur if someone caused Element to load and render malicious user generated content from a Matrix API which then had trusted access to Element (or other apps) due to sharing the same domain. diff --git a/doc/DISCLAIMER_fr.md b/doc/DISCLAIMER_fr.md new file mode 100644 index 0000000..07f2ecf --- /dev/null +++ b/doc/DISCLAIMER_fr.md @@ -0,0 +1,29 @@ +## Fonctionnalités spécifiques à YunoHost + +### Prise en charge multi-utilisateurs + +Maintenant, cette application prend en charge le SSO. Si vous souhaitez utiliser le sso, vous devez définir le chemin d'accès au serveur domestique par défaut car votre serveur domestique est installé sur votre instance YunoHost. + +## Informations supplémentaires + +### Note de sécurité importante + +Nous vous déconseillons d'exécuter Element à partir du même nom de domaine que votre Matrix +serveur domestique (Synapse). La raison en est le risque de XSS (cross-site-scripting) +vulnérabilités qui pourraient survenir si quelqu'un provoquait le chargement et le rendu d'Element +un utilisateur malveillant a généré du contenu à partir d'une API Matrix qui avait alors fait confiance +accès à Element (ou à d'autres applications) en raison du partage du même domaine. + +Nous avons mis en place des mesures d'atténuation grossières pour essayer de nous protéger contre ce +situation, mais ce n'est toujours pas une bonne pratique de le faire en premier lieu. Voir +https://github.com/vector-im/riot-web/issues/1977 pour plus de détails. + +### Migration à partir de l'ancien nom d'application "Riot" + +Comme cette application ne contient aucune donnée côté serveur, aucune migration n'a été effectuée pour migrer de "Riot" vers "Element". +Il vous suffira donc de supprimer Riot et d'installer Element sur le même domaine (vous pouvez modifier le chemin) pour pouvoir conserver les données sur votre navigateur Web. +Ainsi, le processus de migration vers l'élément est le suivant : + +1. Obtenez le domaine de "Riot": `yunohost app setting riot domain` +2. Supprimer Riot : `yunohost app remove riot` +3. Élément d'installation : `yunohost app install element` diff --git a/manifest.json b/manifest.json index 0447680..ce14e48 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Web client for matrix", "fr": "Client web pour matrix" }, - "version": "1.9.3~ynh1", + "version": "1.9.4~ynh1", "url": "https://element.io", "upstream": { "license": "Apache-2.0", From 30d37fece10f5962876e4c5f1ea0517586869b95 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 21 Nov 2021 13:18:37 +0000 Subject: [PATCH 21/36] Auto-update README --- README.md | 5 ++--- README_fr.md | 45 ++++++++++++++++++++++----------------------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 8b6cc84..ba47f44 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.3~ynh1 +**Shipped version:** 1.9.4~ynh1 **Demo:** https://app.element.io/ @@ -27,7 +27,6 @@ Element is a new type of messaging app. You choose where your messages are store ## Disclaimers / important information - ## YunoHost specific features ### Multi-users support @@ -39,7 +38,7 @@ Now this application support the SSO. If you want to use the sso you need to def ### Important Security Note We do not recommend running Element from the same domain name as your Matrix -homeserver (synapse). The reason is the risk of XSS (cross-site-scripting) +homeserver (Synapse). The reason is the risk of XSS (cross-site-scripting) vulnerabilities that could occur if someone caused Element to load and render malicious user generated content from a Matrix API which then had trusted access to Element (or other apps) due to sharing the same domain. diff --git a/README_fr.md b/README_fr.md index 4673774..68ba907 100644 --- a/README_fr.md +++ b/README_fr.md @@ -11,9 +11,9 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour ## Vue d'ensemble -Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. +Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. -**Version incluse :** 1.9.3~ynh1 +**Version incluse :** 1.9.4~ynh1 **Démo :** https://app.element.io/ @@ -23,36 +23,35 @@ Element is a new type of messaging app. You choose where your messages are store ## Avertissements / informations importantes +## Fonctionnalités spécifiques à YunoHost -## YunoHost specific features +### Prise en charge multi-utilisateurs -### Multi-users support +Maintenant, cette application prend en charge le SSO. Si vous souhaitez utiliser le sso, vous devez définir le chemin d'accès au serveur domestique par défaut car votre serveur domestique est installé sur votre instance YunoHost. -Now this application support the SSO. If you want to use the sso you need to define the path to the default homeserver as your homeserver witch is installed on your YunoHost instance. +## Informations supplémentaires -## Additional informations +### Note de sécurité importante -### Important Security Note +Nous vous déconseillons d'exécuter Element à partir du même nom de domaine que votre Matrix +serveur domestique (Synapse). La raison en est le risque de XSS (cross-site-scripting) +vulnérabilités qui pourraient survenir si quelqu'un provoquait le chargement et le rendu d'Element +un utilisateur malveillant a généré du contenu à partir d'une API Matrix qui avait alors fait confiance +accès à Element (ou à d'autres applications) en raison du partage du même domaine. -We do not recommend running Element from the same domain name as your Matrix -homeserver (synapse). The reason is the risk of XSS (cross-site-scripting) -vulnerabilities that could occur if someone caused Element to load and render -malicious user generated content from a Matrix API which then had trusted -access to Element (or other apps) due to sharing the same domain. +Nous avons mis en place des mesures d'atténuation grossières pour essayer de nous protéger contre ce +situation, mais ce n'est toujours pas une bonne pratique de le faire en premier lieu. Voir +https://github.com/vector-im/riot-web/issues/1977 pour plus de détails. -We have put some coarse mitigations into place to try to protect against this -situation, but it's still not good practice to do it in the first place. See -https://github.com/vector-im/riot-web/issues/1977 for more details. +### Migration à partir de l'ancien nom d'application "Riot" -### Migration from old app name "Riot" +Comme cette application ne contient aucune donnée côté serveur, aucune migration n'a été effectuée pour migrer de "Riot" vers "Element". +Il vous suffira donc de supprimer Riot et d'installer Element sur le même domaine (vous pouvez modifier le chemin) pour pouvoir conserver les données sur votre navigateur Web. +Ainsi, le processus de migration vers l'élément est le suivant : -As this app don't contains any data on the server side no migration was made to migrate from "Riot" to "Element". -So you just will need to remove Riot and install Element on the same domain (you can change the path) to be able to keep the data on your web browser. -So the process to migrate to element is the following: - -1. Get the domain of "Riot": `yunohost app setting riot domain` -2. Remove Riot: `yunohost app remove riot` -3. Install Element: `yunohost app install element` +1. Obtenez le domaine de "Riot": `yunohost app setting riot domain` +2. Supprimer Riot : `yunohost app remove riot` +3. Élément d'installation : `yunohost app install element` ## Documentations et ressources From d15cabbc0f6191436d6478b83fe42f12be82c674 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Sun, 21 Nov 2021 13:19:50 +0000 Subject: [PATCH 22/36] Auto-update README --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 68771ed..ba47f44 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ It shall NOT be edited by hand. [![Install Element with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=element) *[Lire ce readme en français.](./README_fr.md)* + > *This package allows you to install Element quickly and simply on a YunoHost server. If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/install) to learn how to install it.* From 4d7e07341a45702cd78a79ca0fe701b18e7d74b6 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 22 Nov 2021 16:54:52 +0100 Subject: [PATCH 23/36] 1.9.5 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 4c2bfda..ac13117 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/archive/refs/tags/v1.9.4.tar.gz -SOURCE_SUM=e5f98816d630d6ecc2f8942bfc1ff5bba2d9e479ecc38f2329171ae39609351a +SOURCE_URL=https://github.com/vector-im/element-web/archive/refs/tags/v1.9.5.tar.gz +SOURCE_SUM=c03c2a556852d20c609cfcfd1fad65e13cc17bfed499968f2fea9a5e1c70e068 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index ce14e48..3f5112b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Web client for matrix", "fr": "Client web pour matrix" }, - "version": "1.9.4~ynh1", + "version": "1.9.5~ynh1", "url": "https://element.io", "upstream": { "license": "Apache-2.0", From 6a89fef788be761b61ac25413fcc032f89f6b572 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 22 Nov 2021 15:54:59 +0000 Subject: [PATCH 24/36] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba47f44..b097f18 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.4~ynh1 +**Shipped version:** 1.9.5~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index 68ba907..2c593d6 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. -**Version incluse :** 1.9.4~ynh1 +**Version incluse :** 1.9.5~ynh1 **Démo :** https://app.element.io/ From 6f8a4a7e0b1093cff3162a4a15dfc1de428b93da Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Tue, 23 Nov 2021 13:17:03 +0100 Subject: [PATCH 25/36] Update app.src --- conf/app.src | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/app.src b/conf/app.src index ac13117..3fa0743 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/archive/refs/tags/v1.9.5.tar.gz -SOURCE_SUM=c03c2a556852d20c609cfcfd1fad65e13cc17bfed499968f2fea9a5e1c70e068 +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.5/element-v1.9.5.tar.gz +SOURCE_SUM=14e82a1dd21750eba7c787ef0bc0d040e4449f956b3a63d07d08d1b1f65eea12 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true From 6685112e001784ba84b290993c951741ff834110 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 6 Dec 2021 16:57:37 +0100 Subject: [PATCH 26/36] 1.9.5 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 3fa0743..454197f 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.5/element-v1.9.5.tar.gz -SOURCE_SUM=14e82a1dd21750eba7c787ef0bc0d040e4449f956b3a63d07d08d1b1f65eea12 +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.6/element-v1.9.6.tar.gz +SOURCE_SUM=2577352424072764b98f54446518d9a2f3328fa3fdd621969701452142343c98 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 3f5112b..1543b9b 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Web client for matrix", "fr": "Client web pour matrix" }, - "version": "1.9.5~ynh1", + "version": "1.9.6~ynh1", "url": "https://element.io", "upstream": { "license": "Apache-2.0", From e7da6957cf15f80a44fb82cfc001499fcf93dbbc Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 6 Dec 2021 15:57:43 +0000 Subject: [PATCH 27/36] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index b097f18..bd881a1 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.5~ynh1 +**Shipped version:** 1.9.6~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index 2c593d6..dab5de8 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. -**Version incluse :** 1.9.5~ynh1 +**Version incluse :** 1.9.6~ynh1 **Démo :** https://app.element.io/ From 9e0004eaa4269ffff657b1344787ef2354ecaa50 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 6 Dec 2021 17:01:34 +0100 Subject: [PATCH 28/36] Remove permissions --- scripts/install | 1 - scripts/restore | 4 +--- scripts/upgrade | 1 - 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/install b/scripts/install index 895b16f..39c9aec 100644 --- a/scripts/install +++ b/scripts/install @@ -80,7 +80,6 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" -chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" diff --git a/scripts/restore b/scripts/restore index 4377a08..0958a88 100644 --- a/scripts/restore +++ b/scripts/restore @@ -33,8 +33,7 @@ final_path=$(ynh_app_setting_get --app=$app --key=final_path) #================================================= ynh_script_progression --message="Validating restoration parameters..." --weight=1 -test ! -d $final_path \ - || ynh_die --message="There is already a directory: $final_path " +test ! -d $final_path || ynh_die --message="There is already a directory: $final_path " #================================================= # STANDARD RESTORATION STEPS @@ -60,7 +59,6 @@ ynh_script_progression --message="Restoring the app main directory..." --weight= ynh_restore_file --origin_path="$final_path" -chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" diff --git a/scripts/upgrade b/scripts/upgrade index bc105ba..e6e1c85 100644 --- a/scripts/upgrade +++ b/scripts/upgrade @@ -68,7 +68,6 @@ ynh_script_progression --message="Adding a configuration file..." --weight=1 ynh_add_config --template="../conf/config.json" --destination="$final_path/config.json" -chmod 750 "$final_path" chmod -R o-rwx "$final_path" chown -R $app:www-data "$final_path" From e4aef17087a251a3a194e2c8ab5eee384a38ebb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josu=C3=A9=20Tille?= Date: Mon, 6 Dec 2021 22:03:20 +0100 Subject: [PATCH 29/36] Upgrade element to 1.9.6 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bd881a1..7d187e9 100644 --- a/README.md +++ b/README.md @@ -76,4 +76,4 @@ or sudo yunohost app upgrade element -u https://github.com/YunoHost-Apps/element_ynh/tree/testing --debug ``` -**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file +**More info regarding app packaging:** https://yunohost.org/packaging_apps From a51860753b9553c017db88449ecf0947aa483c75 Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Tue, 7 Dec 2021 06:58:36 +0000 Subject: [PATCH 30/36] Auto-update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d187e9..bd881a1 100644 --- a/README.md +++ b/README.md @@ -76,4 +76,4 @@ or sudo yunohost app upgrade element -u https://github.com/YunoHost-Apps/element_ynh/tree/testing --debug ``` -**More info regarding app packaging:** https://yunohost.org/packaging_apps +**More info regarding app packaging:** https://yunohost.org/packaging_apps \ No newline at end of file From d2cfa2d1e2b24813ee1e6cf10eeb8c0dc40bfadf Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Sun, 12 Dec 2021 23:28:33 +0100 Subject: [PATCH 31/36] typo --- manifest.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 1543b9b..3ae727b 100644 --- a/manifest.json +++ b/manifest.json @@ -3,8 +3,8 @@ "id": "element", "packaging_format": 1, "description": { - "en": "Web client for matrix", - "fr": "Client web pour matrix" + "en": "Web client for Matrix", + "fr": "Client web pour Matrix" }, "version": "1.9.6~ynh1", "url": "https://element.io", From b505798b66709d2e2287010aa4ddc5c3aa97c0ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Tue, 14 Dec 2021 07:48:12 +0100 Subject: [PATCH 32/36] 1.9.7 (#32) * 1.9.7 * Auto-update README Co-authored-by: Yunohost-Bot <> --- README.md | 2 +- README_fr.md | 2 +- conf/app.src | 4 ++-- manifest.json | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bd881a1..5bac9c7 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.6~ynh1 +**Shipped version:** 1.9.7~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index dab5de8..eb8afd2 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. -**Version incluse :** 1.9.6~ynh1 +**Version incluse :** 1.9.7~ynh1 **Démo :** https://app.element.io/ diff --git a/conf/app.src b/conf/app.src index 454197f..097d07f 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.6/element-v1.9.6.tar.gz -SOURCE_SUM=2577352424072764b98f54446518d9a2f3328fa3fdd621969701452142343c98 +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.7/element-v1.9.7.tar.gz +SOURCE_SUM=43f3c01ee9e922affec278fc0cc5b9c9ff3b93ae69087627417af385edb7a1bb SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 3ae727b..48768c3 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Web client for Matrix", "fr": "Client web pour Matrix" }, - "version": "1.9.6~ynh1", + "version": "1.9.7~ynh1", "url": "https://element.io", "upstream": { "license": "Apache-2.0", From cb9c65760e330acb47234e829c1e9b1384337b10 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 20 Dec 2021 16:12:03 +0100 Subject: [PATCH 33/36] 1.9.8 --- conf/app.src | 4 ++-- manifest.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conf/app.src b/conf/app.src index 097d07f..01ee5ad 100644 --- a/conf/app.src +++ b/conf/app.src @@ -1,5 +1,5 @@ -SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.7/element-v1.9.7.tar.gz -SOURCE_SUM=43f3c01ee9e922affec278fc0cc5b9c9ff3b93ae69087627417af385edb7a1bb +SOURCE_URL=https://github.com/vector-im/element-web/releases/download/v1.9.8/element-v1.9.8.tar.gz +SOURCE_SUM=585283f72925628374748beec3768fcee24d337715312f92a99c9646e0c62e90 SOURCE_SUM_PRG=sha256sum SOURCE_FORMAT=tar.gz SOURCE_IN_SUBDIR=true diff --git a/manifest.json b/manifest.json index 48768c3..e489a92 100644 --- a/manifest.json +++ b/manifest.json @@ -6,7 +6,7 @@ "en": "Web client for Matrix", "fr": "Client web pour Matrix" }, - "version": "1.9.7~ynh1", + "version": "1.9.8~ynh1", "url": "https://element.io", "upstream": { "license": "Apache-2.0", From 42c2b6bc58843a0f735587cf32b16d9fa467ce9f Mon Sep 17 00:00:00 2001 From: Yunohost-Bot <> Date: Mon, 20 Dec 2021 15:12:11 +0000 Subject: [PATCH 34/36] Auto-update README --- README.md | 2 +- README_fr.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5bac9c7..7f4158a 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ If you don't have YunoHost, please consult [the guide](https://yunohost.org/#/in Element is a new type of messaging app. You choose where your messages are stored, putting you in control of your data. It gives you access to the Matrix open network, so you can talk to anyone. Element provides a new level of security, adding cross-signed device verification to default end-to-end encryption. -**Shipped version:** 1.9.7~ynh1 +**Shipped version:** 1.9.8~ynh1 **Demo:** https://app.element.io/ diff --git a/README_fr.md b/README_fr.md index eb8afd2..7db1050 100644 --- a/README_fr.md +++ b/README_fr.md @@ -13,7 +13,7 @@ Si vous n'avez pas YunoHost, regardez [ici](https://yunohost.org/#/install) pour Element est un nouveau type d'application de messagerie. Vous choisissez où vos messages sont stockés, ce qui vous donne le contrôle de vos données. Il vous donne accès au réseau ouvert Matrix, vous pouvez donc parler à n'importe qui. Element offre un nouveau niveau de sécurité, en ajoutant la vérification des appareils par signature croisée au chiffrement de bout en bout par défaut. -**Version incluse :** 1.9.7~ynh1 +**Version incluse :** 1.9.8~ynh1 **Démo :** https://app.element.io/ From dc5b7ff219c419761c863d9c0b946c4f6246dd59 Mon Sep 17 00:00:00 2001 From: ericgaspar Date: Mon, 20 Dec 2021 16:32:58 +0100 Subject: [PATCH 35/36] Create updater.sh --- .github/workflows/updater.sh | 136 +++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100755 .github/workflows/updater.sh diff --git a/.github/workflows/updater.sh b/.github/workflows/updater.sh new file mode 100755 index 0000000..c4d53fc --- /dev/null +++ b/.github/workflows/updater.sh @@ -0,0 +1,136 @@ +#!/bin/bash + +#================================================= +# PACKAGE UPDATING HELPER +#================================================= + +# This script is meant to be run by GitHub Actions +# The YunoHost-Apps organisation offers a template Action to run this script periodically +# Since each app is different, maintainers can adapt its contents so as to perform +# automatic actions when a new upstream release is detected. + +# Remove this exit command when you are ready to run this Action +exit 1 + +#================================================= +# FETCHING LATEST RELEASE AND ITS ASSETS +#================================================= + +# Fetching information +current_version=$(cat manifest.json | jq -j '.version|split("~")[0]') +repo=$(cat manifest.json | jq -j '.upstream.code|split("https://github.com/")[1]') +# Some jq magic is needed, because the latest upstream release is not always the latest version (e.g. security patches for older versions) +version=$(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '.[] | select( .prerelease != true ) | .tag_name' | sort -V | tail -1) +assets=($(curl --silent "https://api.github.com/repos/$repo/releases" | jq -r '[ .[] | select(.tag_name=="'$version'").assets[].browser_download_url ] | join(" ") | @sh' | tr -d "'")) + +# Later down the script, we assume the version has only digits and dots +# Sometimes the release name starts with a "v", so let's filter it out. +# You may need more tweaks here if the upstream repository has different naming conventions. +if [[ ${version:0:1} == "v" || ${version:0:1} == "V" ]]; then + version=${version:1} +fi + +# Setting up the environment variables +echo "Current version: $current_version" +echo "Latest release from upstream: $version" +echo "VERSION=$version" >> $GITHUB_ENV +# For the time being, let's assume the script will fail +echo "PROCEED=false" >> $GITHUB_ENV + +# Proceed only if the retrieved version is greater than the current one +if ! dpkg --compare-versions "$current_version" "lt" "$version" ; then + echo "::warning ::No new version available" + exit 0 +# Proceed only if a PR for this new version does not already exist +elif git ls-remote -q --exit-code --heads https://github.com/$GITHUB_REPOSITORY.git ci-auto-update-v$version ; then + echo "::warning ::A branch already exists for this update" + exit 0 +fi + +# Each release can hold multiple assets (e.g. binaries for different architectures, source code, etc.) +echo "${#assets[@]} available asset(s)" + +#================================================= +# UPDATE SOURCE FILES +#================================================= + +# Here we use the $assets variable to get the resources published in the upstream release. +# Here is an example for Grav, it has to be adapted in accordance with how the upstream releases look like. + +# Let's loop over the array of assets URLs +for asset_url in ${assets[@]}; do + +echo "Handling asset at $asset_url" + +# Assign the asset to a source file in conf/ directory +# Here we base the source file name upon a unique keyword in the assets url (admin vs. update) +# Leave $src empty to ignore the asset +case $asset_url in + *"admin"*) + src="app" + ;; + *"update"*) + src="app-upgrade" + ;; + *) + src="" + ;; +esac + +# If $src is not empty, let's process the asset +if [ ! -z "$src" ]; then + +# Create the temporary directory +tempdir="$(mktemp -d)" + +# Download sources and calculate checksum +filename=${asset_url##*/} +curl --silent -4 -L $asset_url -o "$tempdir/$filename" +checksum=$(sha256sum "$tempdir/$filename" | head -c 64) + +# Delete temporary directory +rm -rf $tempdir + +# Get extension +if [[ $filename == *.tar.gz ]]; then + extension=tar.gz +else + extension=${filename##*.} +fi + +# Rewrite source file +cat < conf/$src.src +SOURCE_URL=$asset_url +SOURCE_SUM=$checksum +SOURCE_SUM_PRG=sha256sum +SOURCE_FORMAT=$extension +SOURCE_IN_SUBDIR=true +SOURCE_FILENAME= +EOT +echo "... conf/$src.src updated" + +else +echo "... asset ignored" +fi + +done + +#================================================= +# SPECIFIC UPDATE STEPS +#================================================= + +# Any action on the app's source code can be done. +# The GitHub Action workflow takes care of committing all changes after this script ends. + +#================================================= +# GENERIC FINALIZATION +#================================================= + +# Replace new version in manifest +echo "$(jq -s --indent 4 ".[] | .version = \"$version~ynh1\"" manifest.json)" > manifest.json + +# No need to update the README, yunohost-bot takes care of it + +# The Action will proceed only if the PROCEED environment variable is set to true +echo "PROCEED=true" >> $GITHUB_ENV +exit 0 From d30cdb898fa05e006e6852822f4d5e0441f074ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Gaspar?= <46165813+ericgaspar@users.noreply.github.com> Date: Mon, 20 Dec 2021 16:33:36 +0100 Subject: [PATCH 36/36] Create updater.yml --- .github/workflows/updater.yml | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/updater.yml diff --git a/.github/workflows/updater.yml b/.github/workflows/updater.yml new file mode 100644 index 0000000..fb72ba0 --- /dev/null +++ b/.github/workflows/updater.yml @@ -0,0 +1,49 @@ +# This workflow allows GitHub Actions to automagically update your app whenever a new upstream release is detected. +# You need to enable Actions in your repository settings, and fetch this Action from the YunoHost-Apps organization. +# This file should be enough by itself, but feel free to tune it to your needs. +# It calls updater.sh, which is where you should put the app-specific update steps. +name: Check for new upstream releases +on: + # Allow to manually trigger the workflow + workflow_dispatch: + # Run it every day at 6:00 UTC + schedule: + - cron: '0 6 * * *' +jobs: + updater: + runs-on: ubuntu-latest + steps: + - name: Fetch the source code + uses: actions/checkout@v2 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run the updater script + id: run_updater + run: | + # Setting up Git user + git config --global user.name 'yunohost-bot' + git config --global user.email 'yunohost-bot@users.noreply.github.com' + # Run the updater script + /bin/bash .github/workflows/updater.sh + - name: Commit changes + id: commit + if: ${{ env.PROCEED == 'true' }} + run: | + git commit -am "Upgrade to v$VERSION" + - name: Create Pull Request + id: cpr + if: ${{ env.PROCEED == 'true' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + commit-message: Update to version ${{ env.VERSION }} + committer: 'yunohost-bot ' + author: 'yunohost-bot ' + signoff: false + base: testing + branch: ci-auto-update-v${{ env.VERSION }} + delete-branch: true + title: 'Upgrade to version ${{ env.VERSION }}' + body: | + Upgrade to v${{ env.VERSION }} + draft: false