From 716ea8b233b9a2d958da403ce546540e789d1482 Mon Sep 17 00:00:00 2001 From: unknownPerson115 <69736850+unknownPerson115@users.noreply.github.com> Date: Thu, 23 Dec 2021 20:40:13 -0600 Subject: [PATCH 01/31] Fixed potential guild message SQL constraints i have tied member dependencies to the author id rather than the member id to avoid a dependency cycle and you can now kick/ban someone from a guild/server and the messages will remain in the guild (just like discord) as stated in issue #441 I have also tested this code seems clean so far (new pull request opened because of branch commit issues) --- util/src/entities/Message.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/util/src/entities/Message.ts b/util/src/entities/Message.ts index 20a44ca3b..e577d5df9 100644 --- a/util/src/entities/Message.ts +++ b/util/src/entities/Message.ts @@ -84,8 +84,10 @@ export class Message extends BaseClass { @RelationId((message: Message) => message.member) member_id: string; - @JoinColumn({ name: "member_id" }) - @ManyToOne(() => Member) + @JoinColumn({ name: "author_id", referencedColumnName: "id" }) + @ManyToOne(() => User, { + onDelete: "CASCADE", + }) member?: Member; @Column({ nullable: true }) From 4f6a1a8e12a04696692f61efa2df161b9b669848 Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Thu, 13 Jan 2022 20:02:09 +0000 Subject: [PATCH 02/31] Add erlpack warning (#587) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add warning if erlpack is missing Co-authored-by: Erkin Alp Güney --- gateway/src/util/Send.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gateway/src/util/Send.ts b/gateway/src/util/Send.ts index 196d4205c..c8627b032 100644 --- a/gateway/src/util/Send.ts +++ b/gateway/src/util/Send.ts @@ -1,7 +1,9 @@ var erlpack: any; try { erlpack = require("@yukikaze-bot/erlpack"); -} catch (error) {} +} catch (error) { + console.log("Missing @yukikaze-bot/erlpack, electron-based desktop clients designed for discord.com will not be able to connect!"); +} import { Payload, WebSocket } from "@fosscord/gateway"; export async function Send(socket: WebSocket, data: Payload) { From aa38c188ea9e62c7dc8606938b126283457d9768 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Fri, 14 Jan 2022 23:03:57 +0300 Subject: [PATCH 03/31] Further debranding of premium tiers --- .../skus/#sku_id/subscription-plans.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts index 723a51607..d0b533d81 100644 --- a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts +++ b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts @@ -14,7 +14,7 @@ const skus = new Map([ interval_count: 1, tax_inclusive: true, sku_id: "521842865731534868", - currency: "usd", + currency: "eur", price: 0, price_tier: null }, @@ -25,7 +25,7 @@ const skus = new Map([ interval_count: 1, tax_inclusive: true, sku_id: "521842865731534868", - currency: "usd", + currency: "eur", price: 0, price_tier: null } @@ -36,23 +36,23 @@ const skus = new Map([ [ { id: "511651871736201216", - name: "Premium Classic Monthly", + name: "Individual Premium Tier 1 Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "521846918637420545", - currency: "usd", + currency: "eur", price: 0, price_tier: null }, { id: "511651876987469824", - name: "Premium Classic Yearly", + name: "Individual Premium Tier 1 Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "521846918637420545", - currency: "usd", + currency: "eur", price: 0, price_tier: null } @@ -63,34 +63,34 @@ const skus = new Map([ [ { id: "642251038925127690", - name: "Premium Quarterly", + name: "Individual Premium Tier 2 Quarterly", interval: 1, interval_count: 3, tax_inclusive: true, sku_id: "521847234246082599", - currency: "usd", + currency: "eur", price: 0, price_tier: null }, { id: "511651880837840896", - name: "Premium Monthly", + name: "Individual Premium Tier 2 Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "521847234246082599", - currency: "usd", + currency: "eur", price: 0, price_tier: null }, { id: "511651885459963904", - name: "Premium Yearly", + name: "Individual Premium Tier 2 Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "521847234246082599", - currency: "usd", + currency: "eur", price: 0, price_tier: null } @@ -101,25 +101,25 @@ const skus = new Map([ [ { id: "590665532894740483", - name: "Server Boost Monthly", + name: "Crowd Premium Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "590663762298667008", discount_price: 0, - currency: "usd", + currency: "eur", price: 0, price_tier: null }, { id: "590665538238152709", - name: "Server Boost Yearly", + name: "Crowd Premium Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "590663762298667008", discount_price: 0, - currency: "usd", + currency: "eur", price: 0, price_tier: null } From dbe88d5b188fc91c560da3b8a839b743acc543b0 Mon Sep 17 00:00:00 2001 From: Chris Chrome Date: Sun, 16 Jan 2022 23:51:04 -0500 Subject: [PATCH 04/31] Revert previous commit --- .../skus/#sku_id/subscription-plans.ts | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts index d0b533d81..723a51607 100644 --- a/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts +++ b/api/src/routes/store/published-listings/skus/#sku_id/subscription-plans.ts @@ -14,7 +14,7 @@ const skus = new Map([ interval_count: 1, tax_inclusive: true, sku_id: "521842865731534868", - currency: "eur", + currency: "usd", price: 0, price_tier: null }, @@ -25,7 +25,7 @@ const skus = new Map([ interval_count: 1, tax_inclusive: true, sku_id: "521842865731534868", - currency: "eur", + currency: "usd", price: 0, price_tier: null } @@ -36,23 +36,23 @@ const skus = new Map([ [ { id: "511651871736201216", - name: "Individual Premium Tier 1 Monthly", + name: "Premium Classic Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "521846918637420545", - currency: "eur", + currency: "usd", price: 0, price_tier: null }, { id: "511651876987469824", - name: "Individual Premium Tier 1 Yearly", + name: "Premium Classic Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "521846918637420545", - currency: "eur", + currency: "usd", price: 0, price_tier: null } @@ -63,34 +63,34 @@ const skus = new Map([ [ { id: "642251038925127690", - name: "Individual Premium Tier 2 Quarterly", + name: "Premium Quarterly", interval: 1, interval_count: 3, tax_inclusive: true, sku_id: "521847234246082599", - currency: "eur", + currency: "usd", price: 0, price_tier: null }, { id: "511651880837840896", - name: "Individual Premium Tier 2 Monthly", + name: "Premium Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "521847234246082599", - currency: "eur", + currency: "usd", price: 0, price_tier: null }, { id: "511651885459963904", - name: "Individual Premium Tier 2 Yearly", + name: "Premium Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "521847234246082599", - currency: "eur", + currency: "usd", price: 0, price_tier: null } @@ -101,25 +101,25 @@ const skus = new Map([ [ { id: "590665532894740483", - name: "Crowd Premium Monthly", + name: "Server Boost Monthly", interval: 1, interval_count: 1, tax_inclusive: true, sku_id: "590663762298667008", discount_price: 0, - currency: "eur", + currency: "usd", price: 0, price_tier: null }, { id: "590665538238152709", - name: "Crowd Premium Yearly", + name: "Server Boost Yearly", interval: 2, interval_count: 1, tax_inclusive: true, sku_id: "590663762298667008", discount_price: 0, - currency: "eur", + currency: "usd", price: 0, price_tier: null } From d5987856450545ab551b8737a8a9c6e86692eafd Mon Sep 17 00:00:00 2001 From: Featyre Date: Sun, 23 Jan 2022 02:03:14 +0800 Subject: [PATCH 05/31] Branding updates --- api/assets/fosscord-login.css | 6 +++--- api/assets/fosscord.css | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/api/assets/fosscord-login.css b/api/assets/fosscord-login.css index bc32b82ea..34cf542bf 100644 --- a/api/assets/fosscord-login.css +++ b/api/assets/fosscord-login.css @@ -22,10 +22,10 @@ h3.title-jXR8lp.marginBottom8-AtZOdT.base-1x0h_U.size24-RIRrxO::after { /* Logo in top left when bg removed */ #app-mount > div.app-1q1i1E > div > a { /* replace me: original dimensions: 130x36 */ - background: url(https://raw.githubusercontent.com/fosscord/fosscord/9900329e5ef2c17bdeb6893e04c0511f72027f97/assets/logo/temp.svg); + background: url(https://raw.githubusercontent.com/fosscord/fosscord/master/assets-rebrand/svg/Fosscord-Wordmark-Gradient.svg); + width: 130px; + height: 23px; background-size: contain; - width: 128px; - height: 128px; border-radius: 50%; } diff --git a/api/assets/fosscord.css b/api/assets/fosscord.css index 6a8b4c64e..6078fdeb4 100644 --- a/api/assets/fosscord.css +++ b/api/assets/fosscord.css @@ -13,10 +13,14 @@ /* home button icon */ #app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div { - background-image: url(https://raw.githubusercontent.com/fosscord/fosscord/9900329e5ef2c17bdeb6893e04c0511f72027f97/assets/logo/temp.svg); + background-image: url(https://raw.githubusercontent.com/fosscord/fosscord/master/assets-rebrand/svg/Fosscord-Icon-Rounded-Subtract.svg); background-size: contain; border-radius: 50%; } + +#app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div, #app-mount > div.app-1q1i1E > div > div.layers-3iHuyZ.layers-3q14ss > div > div > nav > ul > div.scroller-1Bvpku.none-2Eo-qx.scrollerBase-289Jih > div.tutorialContainer-2sGCg9 > div > div.listItemWrapper-KhRmzM > div > svg > foreignObject > div > div:hover { + background-color: white; +} /* Login QR */ #app-mount > div.app-1q1i1E > div > div > div > div > form > div > div > div.transitionGroup-aR7y1d.qrLogin-1AOZMt, #app-mount > div.app-1q1i1E > div > div > div > div > form > div > div > div.verticalSeparator-3huAjp, From 46860979be03995b4ada511598cab0b539138485 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 22 Jan 2022 23:09:07 +0000 Subject: [PATCH 06/31] Bump node-fetch from 2.6.2 to 3.1.1 in /api Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.2 to 3.1.1. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.2...v3.1.1) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- api/package-lock.json | Bin 810634 -> 830717 bytes api/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/api/package-lock.json b/api/package-lock.json index aa0c07c5ac7e42777567eeb0b1192af1eb83d085..28af2e8b1ca5b3b2a69c3a28342ce75f47ca53da 100644 GIT binary patch delta 11874 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 delta 3040 zcmcImeN>cH8b9~W`@VDUyaNNu%6}jI?4CVm-#_Mk z?tPz+`#itr{+_vcDxrD*w3cJKx$`q{Wt3KGXQ5KX>bbQ05X?Ff zt?dM%Wvvt_@^xev8C~L=L(-00HhzuGdvKP()xQkujh*ocB>ekFI#%foo`c7#EGq^@9GVP5>6w~l0+x>Ot=xO zdORDW#dVsO;gFgR2=$TJ8{}#8iNgH+2(N-M~d+&#AWg(6)i4KkSXz2 zNA%An2NeJ2`z{j3P+_H35m!Q*2!<<2CIV*4W6?iTKHyWIbRWr+efb~FkbC_uo?1%& zs`u^vZWVdV>UY-gD7hxVRwY+>?XaavKI0SGYUIN{Pk(PF#Xs{E$P-kgN6V9BrMPUQ zi}XHwn088~xEV{#qWmlQb$_4}7V03f?|y)ks#cFnNO)s`6jeMwD}Pyf?t|;@nNqi) za$RkCW5u%D%H1W)>SyGnl-5)xH{MxOu(+5WzO%OA)t zT2Po#l~tKJueNr@9qyW}?7M5{r{}GKixUUFu+nz_k#fG48_*X@En-O+?UVi3&v{oZ`d0pa*MP-#cUOxiHoRZ~zOtaNYQ zY8Dx@=*m9X2R+R)+LmtCrz22P%y)JM@oI}4A+v} zlN?R+dGFq|8Z% zd6ovDd#wh~KW8ekbYPn1vh{pY#T^~9ey@~aYmhu-} z+AR4bk&pEZUsT25Q>@eA3yzXKTonV)uro}Y+{wlS8b*q*z2Hn%%@|75!lb>-nicVo z-Z+tn$i3_n8R~P)EYf<}27;4`TAfVEhE4t8*}wvHLi$!Z)c z&J40mI-FLtG4lM!Y^X}?FXWdLxKh;>;`UO0km^VN%i!2sEDQzdeB8qS3sXNZYnEfA z*c%#YIIQ>cr$qn#T*%()hTz6htpFNHAH=NNc_cDER4sUIJr6|MDK4QYP9KfSc3Ost zRF;5+m0ZS)Hi_ZzLW31Aj-z_)eT`YgwQ_#98OBKlGah}2UlrTe^P_Qo)VsU+Jm!lf zX6)f_N+aT4UTnElv2-^H74P-)PjxtXoOk1e6Z|E=+Sd1Ycp!eVMmy-$zwry-g8;L$ zRlApXRrJo`R%q;720qCUDSFRyh2q!+?G_BaB{Mjm(=f4L;LAtCzjcY*NBY_E55D9F z`&VfF+a8GSEo`>PB!+Kd`~|yrvcV);CKy^(kv84%)2YzL+;%*@*pP&?Mq{98Ut@UT zb%7)`iiyu=t7N0ta!@sg{O`0_@_(VlbgeJM_Ooi94#OX*8Ue Date: Sat, 22 Jan 2022 23:09:41 +0000 Subject: [PATCH 07/31] Bump node-fetch from 2.6.2 to 3.1.1 in /gateway Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.2 to 3.1.1. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.2...v3.1.1) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- gateway/package-lock.json | Bin 432728 -> 543051 bytes gateway/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/gateway/package-lock.json b/gateway/package-lock.json index a9813b6f2685458f684fca6a70ebed92a727a058..d02106f803bfbede3f5b3658e822a962e7cd2c1d 100644 GIT binary patch delta 26502 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 G_WvK+oU4NX delta 13321 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 diff --git a/gateway/package.json b/gateway/package.json index f976b3e7a..7daddfc0d 100644 --- a/gateway/package.json +++ b/gateway/package.json @@ -32,7 +32,7 @@ "jsonwebtoken": "^8.5.1", "lambert-server": "^1.2.11", "missing-native-js-functions": "^1.2.18", - "node-fetch": "^2.6.1", + "node-fetch": "^3.1.1", "proxy-agent": "^5.0.0", "typeorm": "^0.2.37", "ws": "^7.4.2" From bb07db99790cb052b741d4fc28d38cb606f1ee6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 23 Jan 2022 04:42:07 +0000 Subject: [PATCH 08/31] Bump node-fetch from 2.6.2 to 2.6.7 in /util Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.2 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.2...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- util/package-lock.json | Bin 491038 -> 497311 bytes util/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/util/package-lock.json b/util/package-lock.json index c6f2ed6fc7f3ab3f4e94143563280098d4bfec91..2b33b7de44ff37d98a5d8cd383b31bbd02e352fa 100644 GIT binary patch delta 3360 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 delta 2361 zcmcIleNa@_6`%X=yZ5onHw(Lbqbr%lD7y<(P-?mAn)5%Q#$ouQQ zch5Wbch33!ez)gDZ1;3bZvcTymuRqJE=jR0v@C$qQpu=B6V+DU=&E!%U7NR<7tb=6 z*epqw#3b{4y-qylMpspJLQQpZWv#ZEWJ$Ipsu#(V?nvqEdurH4lNvbm2(~Aa2zSm^ zJyEx`8`Xj9vFgcdQ{Y%aX50hU6#{u_#Pc~$wGBT|C*Lu`o~0zw{mLKaM8mByYJy{9 zvIFWX6rFnLPJkLU9i=wkzYUXi5(S+z)CY1M0&3)Rv^qHcchDz`KN9v!eyVknyZs;7 z30zL0W(b;)_0U!%nY$85j3@fX6CZsU?6yvp64-E!)`+cf@NJfi5cH|6a~C{1O`!gu zczyksB-CB>c{kM{-cBVP7g6FQT5#7+3h*i=L8^5)ey@$`pnj6ig{NMk3~t9LkudA~ z^fHcek{JLmU7_g^?avIJa`0>zkpiLRfH>h-lTs8&k?bbqRSuPycmK$lx(-c;RMSCw4-Y*AHnYWAXH zmouexh3h-zo9kSe_DZ|Mwkq4TaCwnqdviu>Lvzi>tb+CV%Ny*@%-p7?+GWqW>{&TY zYctlgK+^#!5+aUB54FMJn%AT(ore}UbV4!{c$L#M82YWmu=u2uL)16ht&n$43~HoT zGQpfwGHZSLYFBH4Yh`kNP4PUNBX?6nVaCSBMe|l?RxPjNx3szvX(#h-*B zLIZF|8okRsDh|ijSI|Gt(q`FTO^sZQKVn4LNv8=|HVA^GHPTNsJz$lKz8ej7!__t9!O^-3WK_- z?JH7C=%(RcE49wU)M4@v>@jF-mi!=Uy%YyQhlMt)_ zxVAxPX=V%94f&J_CiA!fg=?)M82JxbCUE5d3&UqVlS2s{OkknVHp2Zpj%0wI5$*%S_vKM7 z21HB<{HajUVaz{ePM~L<;t$0S6G?Ic)8Ngkxe^JpxY zk*RiCDE53V*L#=n3mXf8okk@Nw-L6?*Zcoxe(X1Xcq@V>>Hkxs{|j;i96Txq!2oiYWMN!sYXDer5bhnZWy#^kDPjs2ProKllF|MbS566dTjh zgl|913HeG%!Y!`iXbEpoydAw#BMf!qgpg%#4WEX4y`00`OL9P$k0j&0jXeE-8A#DL zV;~;9SDf4(;elqrv%7c-!LWAzlO=fIZ64#}ov<(o!L36ff~M62{C1#L2YL*HdrLaH zg1WHmFWegSZ*FzH$wE&LDtQc2xbhIzDayDvQustU-tkfDP1+=(emAX!euH9E`)v$@ z;uRklyewq-a=UW;zZe6Sc!i^3j&h%3!nc%L%$xD%C2^k)?57oQDnYsH1$@Jz9RE69 v>`PKMg}|b7%n1FQ_ Date: Sun, 23 Jan 2022 04:42:07 +0000 Subject: [PATCH 09/31] Bump node-fetch from 2.6.6 to 2.6.7 in /cdn Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.6 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.6...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- cdn/package-lock.json | Bin 500032 -> 500169 bytes cdn/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/cdn/package-lock.json b/cdn/package-lock.json index 367f411e68a970a65c9bf3e0ca71f00b999847b5..a6c2df2d47d99fcb8fc19e17c0d4d401913cb995 100644 GIT binary patch delta 391 zcmX?bNbclexd~e)Pi9q`Ea1jD{hv7t$Hu2#OpNB64VdkjC(ANRPhQSuGCgcEqsVlp ze=Hu&((LWh?2JInv|XB=`I6oABpW9EX>ZtAr(3^Z6Q5ob$*2$-mE{}Y=9(5(VVb2~ zX;kTEZ0cQAVOs2Fp6yaqQRM6qGo1eMHIohpOmzChHYV$K19#@_2JS5DwxM{Y9q5_uPXAbszNDK6rZ41SmjU@e WVfuu}Y+}>*c`~zaS9r;$umb?@GKBvC delta 331 zcmX?kSnj|fxd~gCJ%gPmPmERDct41V(Qva7vpw@ Date: Sun, 23 Jan 2022 04:45:47 +0000 Subject: [PATCH 10/31] Bump node-fetch from 2.6.5 to 2.6.7 in /bundle Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.5 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.5...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- bundle/package-lock.json | Bin 606883 -> 607272 bytes bundle/package.json | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/package-lock.json b/bundle/package-lock.json index e8b99037923888c5a45a3d5e0cb11678489edec6..d026e7c7785fe4ff8a10d165315f79892d994f10 100644 GIT binary patch delta 603 zcmZ47s=A^>bwd#=qxt4y*4eBRD}|U73o<88l$)O3%_1w1lbM{FSDdP3rJ&><;1gy% z{o^$zmFad`Z0wT_*qtWVGjdL!Wx*D^{e%@;FXQA5yla?^^$a)1^L=LqnUtK8H*umS zD_G}bK^OJu5A4|THVX(pW@I# zDXF??sU^u7`nviEj;@iOnV$LdjWZbKL!+{M1KeEG!YWL&v@4A&-Hc7Wt13*3-ORIH zswzrdvdpS7Jxtu(lKcxS%&WXzqWmf>DqSnQJd+Ge{oUP6{BlYxJw4n!eVwv{a!d@v zQp%G3Qj#Wrv{0CCE5V^KEsjxgdd^B_k?FrLu_y?n<|XH+Wag!VLN(4n&v3e9Hlq#) zOmuo-4~zBmh84_Q?F&{i12N0?1uI$iOa_JQ_IO)1A7ET<2L@gx6T<85{;q7>{ax7; TFAcPx+Z81^wkt|-HfaF>XS~JN delta 472 zcmZ3{p}M$Lbwd&B^tcX2?#;EV6Imy}cIKX*@R5;c`f~v$*~xL-+{~WA&XW^^ zJkN@B*YwmXvm{IR^zewJ?5Hf$$SCu)3T>kzOOr$+SMAWuqT&KGkK%xkfSml?v=on$ zf)afvgX9$Nvdr@A{6t@~g37W`|LGs+F)2=eu#(w#@}G-h)9UDm)3Rz7dCAsh_cxd wa?>NuvG7gq;nHb8;KsK7fE&BoC6G5lY2l56>4I Date: Sun, 23 Jan 2022 04:45:21 +0000 Subject: [PATCH 11/31] Bump node-fetch from 2.6.6 to 2.6.7 in /api/scripts/stresstest Bumps [node-fetch](https://github.com/node-fetch/node-fetch) from 2.6.6 to 2.6.7. - [Release notes](https://github.com/node-fetch/node-fetch/releases) - [Changelog](https://github.com/node-fetch/node-fetch/blob/main/docs/CHANGELOG.md) - [Commits](https://github.com/node-fetch/node-fetch/compare/v2.6.6...v2.6.7) --- updated-dependencies: - dependency-name: node-fetch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- api/scripts/stresstest/package-lock.json | Bin 29134 -> 29271 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/api/scripts/stresstest/package-lock.json b/api/scripts/stresstest/package-lock.json index ca84a8cf4fff99e8a6aa59d3771c3fe512eb9502..81c9b817abcc9af86421cec78987cefed923e50b 100644 GIT binary patch delta 349 zcmX^2nDP1(#trLL7|ka$YUxeBry>Jn84AgVMP>O0xVffk63CK;IeySthA<&;=@dboM|I%Nmt zm>7nolqLJ6Bn3_`P|e}i;o{`vR4PbKEpnNh$R(PRnwOlPl9`vTWTl`KXP{@OXP^X9 zQH!K5wIDSQq%JeH*f+H#5vZ~nq=ZumNiRf%Qz^foBr`uRF$buqq^L9%tgd#lAglD| PPpZD=bn@t?xO2h)x-x4D delta 237 zcmccqgz?;C#trLL7|kY64Aq-_PelgEG8B>zi?Yx+D+|gA33bj0PVr3lO*A#kst7d6 zDJs|Zsx%Gu4>vUMPfBz&G1m`r%_(;DGfFlM$g@ZaNq2J(&(qILDzAzNakVHcFEWg* nsxY!BD^5+0aCMwqpqeweTt#eiwVJOvz3dc>mfpN1ZnH1|V}?)9 From f9ff5b35f3b65d72302ff131cdd6375d572c1842 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Sun, 23 Jan 2022 17:46:04 +0300 Subject: [PATCH 12/31] Closed-join guilds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves #537 Signed-off-by: Erkin Alp Güney --- api/src/routes/invites/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/src/routes/invites/index.ts b/api/src/routes/invites/index.ts index ac8131269..37e9e05a3 100644 --- a/api/src/routes/invites/index.ts +++ b/api/src/routes/invites/index.ts @@ -19,7 +19,8 @@ router.post("/:code", route({}), async (req: Request, res: Response) => { const { features } = await Guild.findOneOrFail({ id: guild_id}); const { public_flags } = await User.findOneOrFail({ id: req.user_id }); - if(features.includes("INTERNAL_EMPLOYEE_ONLY") && (public_flags & 1) !== 1) throw new HTTPError("The Maze isn't meant for you.", 401) + if(features.includes("INTERNAL_EMPLOYEE_ONLY") && (public_flags & 1) !== 1) throw new HTTPError("Only intended for the staff of this server.", 401); + if(features.includes("INVITES_CLOSED")) throw new HTTPError("Sorry, this guild has joins closed.", 403); const invite = await Invite.joinGuild(req.user_id, code); From 35c7489f72feb3c432d67e2d6d1d0ef8c70c08a4 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 14 Jan 2022 01:20:26 +1100 Subject: [PATCH 13/31] Added `ILLEGAL_CHANNEL_NAMES` and `NULL_CHANNEL_NAMES` guild feature flags --- util/src/entities/Channel.ts | 682 ++++++++++++++------------- util/src/util/InvisibleCharacters.ts | 55 +++ util/src/util/index.ts | 1 + 3 files changed, 406 insertions(+), 332 deletions(-) create mode 100644 util/src/util/InvisibleCharacters.ts diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index 4036b5d66..e7e0bace5 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -1,332 +1,350 @@ -import { Column, Entity, JoinColumn, ManyToOne, OneToMany, RelationId } from "typeorm"; -import { BaseClass } from "./BaseClass"; -import { Guild } from "./Guild"; -import { PublicUserProjection, User } from "./User"; -import { HTTPError } from "lambert-server"; -import { containsAll, emitEvent, getPermission, Snowflake, trimSpecial } from "../util"; -import { ChannelCreateEvent, ChannelRecipientRemoveEvent } from "../interfaces"; -import { Recipient } from "./Recipient"; -import { Message } from "./Message"; -import { ReadState } from "./ReadState"; -import { Invite } from "./Invite"; -import { VoiceState } from "./VoiceState"; -import { Webhook } from "./Webhook"; -import { DmChannelDTO } from "../dtos"; - -export enum ChannelType { - GUILD_TEXT = 0, // a text channel within a server - DM = 1, // a direct message between users - GUILD_VOICE = 2, // a voice channel within a server - GROUP_DM = 3, // a direct message between multiple users - GUILD_CATEGORY = 4, // an organizational category that contains up to 50 channels - GUILD_NEWS = 5, // a channel that users can follow and crosspost into their own server - GUILD_STORE = 6, // a channel in which game developers can sell their game on Discord - // TODO: what are channel types between 7-9? - GUILD_NEWS_THREAD = 10, // a temporary sub-channel within a GUILD_NEWS channel - GUILD_PUBLIC_THREAD = 11, // a temporary sub-channel within a GUILD_TEXT channel - GUILD_PRIVATE_THREAD = 12, // a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission - GUILD_STAGE_VOICE = 13, // a voice channel for hosting events with an audience -} - -@Entity("channels") -export class Channel extends BaseClass { - @Column() - created_at: Date; - - @Column({ nullable: true }) - name?: string; - - @Column({ type: "text", nullable: true }) - icon?: string | null; - - @Column({ type: "int" }) - type: ChannelType; - - @OneToMany(() => Recipient, (recipient: Recipient) => recipient.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - recipients?: Recipient[]; - - @Column({ nullable: true }) - last_message_id: string; - - @Column({ nullable: true }) - @RelationId((channel: Channel) => channel.guild) - guild_id?: string; - - @JoinColumn({ name: "guild_id" }) - @ManyToOne(() => Guild, { - onDelete: "CASCADE", - }) - guild: Guild; - - @Column({ nullable: true }) - @RelationId((channel: Channel) => channel.parent) - parent_id: string; - - @JoinColumn({ name: "parent_id" }) - @ManyToOne(() => Channel) - parent?: Channel; - - // only for group dms - @Column({ nullable: true }) - @RelationId((channel: Channel) => channel.owner) - owner_id: string; - - @JoinColumn({ name: "owner_id" }) - @ManyToOne(() => User) - owner: User; - - @Column({ nullable: true }) - last_pin_timestamp?: number; - - @Column({ nullable: true }) - default_auto_archive_duration?: number; - - @Column({ nullable: true }) - position?: number; - - @Column({ type: "simple-json", nullable: true }) - permission_overwrites?: ChannelPermissionOverwrite[]; - - @Column({ nullable: true }) - video_quality_mode?: number; - - @Column({ nullable: true }) - bitrate?: number; - - @Column({ nullable: true }) - user_limit?: number; - - @Column({ nullable: true }) - nsfw?: boolean; - - @Column({ nullable: true }) - rate_limit_per_user?: number; - - @Column({ nullable: true }) - topic?: string; - - @OneToMany(() => Invite, (invite: Invite) => invite.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - invites?: Invite[]; - - @OneToMany(() => Message, (message: Message) => message.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - messages?: Message[]; - - @OneToMany(() => VoiceState, (voice_state: VoiceState) => voice_state.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - voice_states?: VoiceState[]; - - @OneToMany(() => ReadState, (read_state: ReadState) => read_state.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - read_states?: ReadState[]; - - @OneToMany(() => Webhook, (webhook: Webhook) => webhook.channel, { - cascade: true, - orphanedRowAction: "delete", - }) - webhooks?: Webhook[]; - - // TODO: DM channel - static async createChannel( - channel: Partial, - user_id: string = "0", - opts?: { - keepId?: boolean; - skipExistsCheck?: boolean; - skipPermissionCheck?: boolean; - skipEventEmit?: boolean; - } - ) { - if (!opts?.skipPermissionCheck) { - // Always check if user has permission first - const permissions = await getPermission(user_id, channel.guild_id); - permissions.hasThrow("MANAGE_CHANNELS"); - } - - switch (channel.type) { - case ChannelType.GUILD_TEXT: - case ChannelType.GUILD_VOICE: - if (channel.parent_id && !opts?.skipExistsCheck) { - const exists = await Channel.findOneOrFail({ id: channel.parent_id }); - if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400); - if (exists.guild_id !== channel.guild_id) - throw new HTTPError("The category channel needs to be in the guild"); - } - break; - case ChannelType.GUILD_CATEGORY: - break; - case ChannelType.DM: - case ChannelType.GROUP_DM: - throw new HTTPError("You can't create a dm channel in a guild"); - // TODO: check if guild is community server - case ChannelType.GUILD_STORE: - case ChannelType.GUILD_NEWS: - default: - throw new HTTPError("Not yet supported"); - } - - if (!channel.permission_overwrites) channel.permission_overwrites = []; - // TODO: auto generate position - - channel = { - ...channel, - ...(!opts?.keepId && { id: Snowflake.generate() }), - created_at: new Date(), - position: channel.position || 0, - }; - - await Promise.all([ - new Channel(channel).save(), - !opts?.skipEventEmit - ? emitEvent({ - event: "CHANNEL_CREATE", - data: channel, - guild_id: channel.guild_id, - } as ChannelCreateEvent) - : Promise.resolve(), - ]); - - return channel; - } - - static async createDMChannel(recipients: string[], creator_user_id: string, name?: string) { - recipients = recipients.unique().filter((x) => x !== creator_user_id); - const otherRecipientsUsers = await User.find({ where: recipients.map((x) => ({ id: x })) }); - - // TODO: check config for max number of recipients - if (otherRecipientsUsers.length !== recipients.length) { - throw new HTTPError("Recipient/s not found"); - } - - const type = recipients.length === 1 ? ChannelType.DM : ChannelType.GROUP_DM; - - let channel = null; - - const channelRecipients = [...recipients, creator_user_id]; - - const userRecipients = await Recipient.find({ - where: { user_id: creator_user_id }, - relations: ["channel", "channel.recipients"], - }); - - for (let ur of userRecipients) { - let re = ur.channel.recipients!.map((r) => r.user_id); - if (re.length === channelRecipients.length) { - if (containsAll(re, channelRecipients)) { - if (channel == null) { - channel = ur.channel; - await ur.assign({ closed: false }).save(); - } - } - } - } - - if (channel == null) { - name = trimSpecial(name); - - channel = await new Channel({ - name, - type, - owner_id: type === ChannelType.DM ? undefined : creator_user_id, - created_at: new Date(), - last_message_id: null, - recipients: channelRecipients.map( - (x) => - new Recipient({ user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) }) - ), - }).save(); - } - - const channel_dto = await DmChannelDTO.from(channel); - - if (type === ChannelType.GROUP_DM) { - for (let recipient of channel.recipients!) { - await emitEvent({ - event: "CHANNEL_CREATE", - data: channel_dto.excludedRecipients([recipient.user_id]), - user_id: recipient.user_id, - }); - } - } else { - await emitEvent({ event: "CHANNEL_CREATE", data: channel_dto, user_id: creator_user_id }); - } - - return channel_dto.excludedRecipients([creator_user_id]); - } - - static async removeRecipientFromChannel(channel: Channel, user_id: string) { - await Recipient.delete({ channel_id: channel.id, user_id: user_id }); - channel.recipients = channel.recipients?.filter((r) => r.user_id !== user_id); - - if (channel.recipients?.length === 0) { - await Channel.deleteChannel(channel); - await emitEvent({ - event: "CHANNEL_DELETE", - data: await DmChannelDTO.from(channel, [user_id]), - user_id: user_id, - }); - return; - } - - await emitEvent({ - event: "CHANNEL_DELETE", - data: await DmChannelDTO.from(channel, [user_id]), - user_id: user_id, - }); - - //If the owner leave we make the first recipient in the list the new owner - if (channel.owner_id === user_id) { - channel.owner_id = channel.recipients!.find((r) => r.user_id !== user_id)!.user_id; //Is there a criteria to choose the new owner? - await emitEvent({ - event: "CHANNEL_UPDATE", - data: await DmChannelDTO.from(channel, [user_id]), - channel_id: channel.id, - }); - } - - await channel.save(); - - await emitEvent({ - event: "CHANNEL_RECIPIENT_REMOVE", - data: { - channel_id: channel.id, - user: await User.findOneOrFail({ where: { id: user_id }, select: PublicUserProjection }), - }, - channel_id: channel.id, - } as ChannelRecipientRemoveEvent); - } - - static async deleteChannel(channel: Channel) { - await Message.delete({ channel_id: channel.id }); //TODO we should also delete the attachments from the cdn but to do that we need to move cdn.ts in util - //TODO before deleting the channel we should check and delete other relations - await Channel.delete({ id: channel.id }); - } - - isDm() { - return this.type === ChannelType.DM || this.type === ChannelType.GROUP_DM; - } -} - -export interface ChannelPermissionOverwrite { - allow: string; - deny: string; - id: string; - type: ChannelPermissionOverwriteType; -} - -export enum ChannelPermissionOverwriteType { - role = 0, - member = 1, -} +import { Column, Entity, JoinColumn, ManyToOne, OneToMany, RelationId } from "typeorm"; +import { BaseClass } from "./BaseClass"; +import { Guild } from "./Guild"; +import { PublicUserProjection, User } from "./User"; +import { HTTPError } from "lambert-server"; +import { containsAll, emitEvent, getPermission, Snowflake, trimSpecial, InvisibleCharacters } from "../util"; +import { ChannelCreateEvent, ChannelRecipientRemoveEvent } from "../interfaces"; +import { Recipient } from "./Recipient"; +import { Message } from "./Message"; +import { ReadState } from "./ReadState"; +import { Invite } from "./Invite"; +import { VoiceState } from "./VoiceState"; +import { Webhook } from "./Webhook"; +import { DmChannelDTO } from "../dtos"; + +export enum ChannelType { + GUILD_TEXT = 0, // a text channel within a server + DM = 1, // a direct message between users + GUILD_VOICE = 2, // a voice channel within a server + GROUP_DM = 3, // a direct message between multiple users + GUILD_CATEGORY = 4, // an organizational category that contains up to 50 channels + GUILD_NEWS = 5, // a channel that users can follow and crosspost into their own server + GUILD_STORE = 6, // a channel in which game developers can sell their game on Discord + // TODO: what are channel types between 7-9? + GUILD_NEWS_THREAD = 10, // a temporary sub-channel within a GUILD_NEWS channel + GUILD_PUBLIC_THREAD = 11, // a temporary sub-channel within a GUILD_TEXT channel + GUILD_PRIVATE_THREAD = 12, // a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission + GUILD_STAGE_VOICE = 13, // a voice channel for hosting events with an audience +} + +@Entity("channels") +export class Channel extends BaseClass { + @Column() + created_at: Date; + + @Column({ nullable: true }) + name?: string; + + @Column({ type: "text", nullable: true }) + icon?: string | null; + + @Column({ type: "int" }) + type: ChannelType; + + @OneToMany(() => Recipient, (recipient: Recipient) => recipient.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + recipients?: Recipient[]; + + @Column({ nullable: true }) + last_message_id: string; + + @Column({ nullable: true }) + @RelationId((channel: Channel) => channel.guild) + guild_id?: string; + + @JoinColumn({ name: "guild_id" }) + @ManyToOne(() => Guild, { + onDelete: "CASCADE", + }) + guild: Guild; + + @Column({ nullable: true }) + @RelationId((channel: Channel) => channel.parent) + parent_id: string; + + @JoinColumn({ name: "parent_id" }) + @ManyToOne(() => Channel) + parent?: Channel; + + // only for group dms + @Column({ nullable: true }) + @RelationId((channel: Channel) => channel.owner) + owner_id: string; + + @JoinColumn({ name: "owner_id" }) + @ManyToOne(() => User) + owner: User; + + @Column({ nullable: true }) + last_pin_timestamp?: number; + + @Column({ nullable: true }) + default_auto_archive_duration?: number; + + @Column({ nullable: true }) + position?: number; + + @Column({ type: "simple-json", nullable: true }) + permission_overwrites?: ChannelPermissionOverwrite[]; + + @Column({ nullable: true }) + video_quality_mode?: number; + + @Column({ nullable: true }) + bitrate?: number; + + @Column({ nullable: true }) + user_limit?: number; + + @Column({ nullable: true }) + nsfw?: boolean; + + @Column({ nullable: true }) + rate_limit_per_user?: number; + + @Column({ nullable: true }) + topic?: string; + + @OneToMany(() => Invite, (invite: Invite) => invite.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + invites?: Invite[]; + + @OneToMany(() => Message, (message: Message) => message.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + messages?: Message[]; + + @OneToMany(() => VoiceState, (voice_state: VoiceState) => voice_state.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + voice_states?: VoiceState[]; + + @OneToMany(() => ReadState, (read_state: ReadState) => read_state.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + read_states?: ReadState[]; + + @OneToMany(() => Webhook, (webhook: Webhook) => webhook.channel, { + cascade: true, + orphanedRowAction: "delete", + }) + webhooks?: Webhook[]; + + // TODO: DM channel + static async createChannel( + channel: Partial, + user_id: string = "0", + opts?: { + keepId?: boolean; + skipExistsCheck?: boolean; + skipPermissionCheck?: boolean; + skipEventEmit?: boolean; + skipNameChecks?: boolean; + } + ) { + if (!opts?.skipPermissionCheck) { + // Always check if user has permission first + const permissions = await getPermission(user_id, channel.guild_id); + permissions.hasThrow("MANAGE_CHANNELS"); + } + + if (!opts?.skipNameChecks) { + const guild = await Guild.findOneOrFail({ id: channel.guild_id }); + if (!guild.features.includes("ILLEGAL_CHANNEL_NAMES") && channel.name) { + for (var character of InvisibleCharacters) + channel.name = channel.name.split(character).join("-"); + + channel.name = channel.name.split(/\-+/g).join("-"); //replace multiple occurances with just one + channel.name = channel.name.split("-").filter(Boolean).join("-"); //trim '-' character + } + + if (!guild.features.includes("NULL_CHANNEL_NAMES")) { + if (channel.name) channel.name = channel.name.trim(); + + if (!channel.name) throw new HTTPError("Channel name cannot be empty."); + } + } + + switch (channel.type) { + case ChannelType.GUILD_TEXT: + case ChannelType.GUILD_VOICE: + if (channel.parent_id && !opts?.skipExistsCheck) { + const exists = await Channel.findOneOrFail({ id: channel.parent_id }); + if (!exists) throw new HTTPError("Parent id channel doesn't exist", 400); + if (exists.guild_id !== channel.guild_id) + throw new HTTPError("The category channel needs to be in the guild"); + } + break; + case ChannelType.GUILD_CATEGORY: + break; + case ChannelType.DM: + case ChannelType.GROUP_DM: + throw new HTTPError("You can't create a dm channel in a guild"); + // TODO: check if guild is community server + case ChannelType.GUILD_STORE: + case ChannelType.GUILD_NEWS: + default: + throw new HTTPError("Not yet supported"); + } + + if (!channel.permission_overwrites) channel.permission_overwrites = []; + // TODO: auto generate position + + channel = { + ...channel, + ...(!opts?.keepId && { id: Snowflake.generate() }), + created_at: new Date(), + position: channel.position || 0, + }; + + await Promise.all([ + new Channel(channel).save(), + !opts?.skipEventEmit + ? emitEvent({ + event: "CHANNEL_CREATE", + data: channel, + guild_id: channel.guild_id, + } as ChannelCreateEvent) + : Promise.resolve(), + ]); + + return channel; + } + + static async createDMChannel(recipients: string[], creator_user_id: string, name?: string) { + recipients = recipients.unique().filter((x) => x !== creator_user_id); + const otherRecipientsUsers = await User.find({ where: recipients.map((x) => ({ id: x })) }); + + // TODO: check config for max number of recipients + if (otherRecipientsUsers.length !== recipients.length) { + throw new HTTPError("Recipient/s not found"); + } + + const type = recipients.length === 1 ? ChannelType.DM : ChannelType.GROUP_DM; + + let channel = null; + + const channelRecipients = [...recipients, creator_user_id]; + + const userRecipients = await Recipient.find({ + where: { user_id: creator_user_id }, + relations: ["channel", "channel.recipients"], + }); + + for (let ur of userRecipients) { + let re = ur.channel.recipients!.map((r) => r.user_id); + if (re.length === channelRecipients.length) { + if (containsAll(re, channelRecipients)) { + if (channel == null) { + channel = ur.channel; + await ur.assign({ closed: false }).save(); + } + } + } + } + + if (channel == null) { + name = trimSpecial(name); + + channel = await new Channel({ + name, + type, + owner_id: type === ChannelType.DM ? undefined : creator_user_id, + created_at: new Date(), + last_message_id: null, + recipients: channelRecipients.map( + (x) => + new Recipient({ user_id: x, closed: !(type === ChannelType.GROUP_DM || x === creator_user_id) }) + ), + }).save(); + } + + const channel_dto = await DmChannelDTO.from(channel); + + if (type === ChannelType.GROUP_DM) { + for (let recipient of channel.recipients!) { + await emitEvent({ + event: "CHANNEL_CREATE", + data: channel_dto.excludedRecipients([recipient.user_id]), + user_id: recipient.user_id, + }); + } + } else { + await emitEvent({ event: "CHANNEL_CREATE", data: channel_dto, user_id: creator_user_id }); + } + + return channel_dto.excludedRecipients([creator_user_id]); + } + + static async removeRecipientFromChannel(channel: Channel, user_id: string) { + await Recipient.delete({ channel_id: channel.id, user_id: user_id }); + channel.recipients = channel.recipients?.filter((r) => r.user_id !== user_id); + + if (channel.recipients?.length === 0) { + await Channel.deleteChannel(channel); + await emitEvent({ + event: "CHANNEL_DELETE", + data: await DmChannelDTO.from(channel, [user_id]), + user_id: user_id, + }); + return; + } + + await emitEvent({ + event: "CHANNEL_DELETE", + data: await DmChannelDTO.from(channel, [user_id]), + user_id: user_id, + }); + + //If the owner leave we make the first recipient in the list the new owner + if (channel.owner_id === user_id) { + channel.owner_id = channel.recipients!.find((r) => r.user_id !== user_id)!.user_id; //Is there a criteria to choose the new owner? + await emitEvent({ + event: "CHANNEL_UPDATE", + data: await DmChannelDTO.from(channel, [user_id]), + channel_id: channel.id, + }); + } + + await channel.save(); + + await emitEvent({ + event: "CHANNEL_RECIPIENT_REMOVE", + data: { + channel_id: channel.id, + user: await User.findOneOrFail({ where: { id: user_id }, select: PublicUserProjection }), + }, + channel_id: channel.id, + } as ChannelRecipientRemoveEvent); + } + + static async deleteChannel(channel: Channel) { + await Message.delete({ channel_id: channel.id }); //TODO we should also delete the attachments from the cdn but to do that we need to move cdn.ts in util + //TODO before deleting the channel we should check and delete other relations + await Channel.delete({ id: channel.id }); + } + + isDm() { + return this.type === ChannelType.DM || this.type === ChannelType.GROUP_DM; + } +} + +export interface ChannelPermissionOverwrite { + allow: string; + deny: string; + id: string; + type: ChannelPermissionOverwriteType; +} + +export enum ChannelPermissionOverwriteType { + role = 0, + member = 1, +} diff --git a/util/src/util/InvisibleCharacters.ts b/util/src/util/InvisibleCharacters.ts new file mode 100644 index 000000000..147f51c21 --- /dev/null +++ b/util/src/util/InvisibleCharacters.ts @@ -0,0 +1,55 @@ +export const InvisibleCharacters = [ + "\t", + " ", + "­", + "͏", + "؜", + "ᅟ", + "ᅠ", + "឴", + "឵", + "᠎", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + " ", + "​", + "‌", + "‍", + "‎", + "‏", + " ", + " ", + "⁠", + "⁡", + "⁢", + "⁣", + "⁤", + "", + "", + "", + "", + "", + "", + " ", + "⠀", + "ㅤ", + "", + "ᅠ", + "𝅙", + "𝅳", + "𝅴", + "𝅵", + "𝅶", + "𝅷", + "𝅸", + "𝅹", + "𝅺" +] \ No newline at end of file diff --git a/util/src/util/index.ts b/util/src/util/index.ts index c57034685..98e1146ca 100644 --- a/util/src/util/index.ts +++ b/util/src/util/index.ts @@ -18,3 +18,4 @@ export * from "./Snowflake"; export * from "./String"; export * from "./Array"; export * from "./TraverseDirectory"; +export * from "./InvisibleCharacters"; \ No newline at end of file From 0df2a0adf6da4a86b4c14eb00c2d170191412757 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Thu, 13 Jan 2022 22:57:55 +0300 Subject: [PATCH 14/31] Update Channel.ts --- util/src/entities/Channel.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index e7e0bace5..f0bbfe960 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -21,11 +21,14 @@ export enum ChannelType { GUILD_CATEGORY = 4, // an organizational category that contains up to 50 channels GUILD_NEWS = 5, // a channel that users can follow and crosspost into their own server GUILD_STORE = 6, // a channel in which game developers can sell their game on Discord - // TODO: what are channel types between 7-9? + ENCRYPTED = 7, // end-to-end encrypted channel + ENCRYPTED_THREAD = 8, // end-to-end encrypted thread channel GUILD_NEWS_THREAD = 10, // a temporary sub-channel within a GUILD_NEWS channel GUILD_PUBLIC_THREAD = 11, // a temporary sub-channel within a GUILD_TEXT channel GUILD_PRIVATE_THREAD = 12, // a temporary sub-channel within a GUILD_TEXT channel that is only viewable by those invited and those with the MANAGE_THREADS permission GUILD_STAGE_VOICE = 13, // a voice channel for hosting events with an audience + CUSTOM_START = 64, // start custom channel types from here + UNHANDLED = 255 // unhandled unowned pass-through channel type } @Entity("channels") @@ -257,7 +260,7 @@ export class Channel extends BaseClass { channel = await new Channel({ name, type, - owner_id: type === ChannelType.DM ? undefined : creator_user_id, + owner_id: type === ChannelType.DM ? undefined : null, // 1:1 DMs are ownerless in fosscord-server created_at: new Date(), last_message_id: null, recipients: channelRecipients.map( @@ -304,9 +307,9 @@ export class Channel extends BaseClass { user_id: user_id, }); - //If the owner leave we make the first recipient in the list the new owner + //If the owner leave the server user is the new owner if (channel.owner_id === user_id) { - channel.owner_id = channel.recipients!.find((r) => r.user_id !== user_id)!.user_id; //Is there a criteria to choose the new owner? + channel.owner_id = 1; // The channel is now owned by the server user await emitEvent({ event: "CHANNEL_UPDATE", data: await DmChannelDTO.from(channel, [user_id]), From 028fd7b8b3fb6a94afce0176f38da1a766f936cc Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sat, 15 Jan 2022 18:00:54 +1100 Subject: [PATCH 15/31] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Erkin Alp Güney --- util/src/entities/Channel.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index f0bbfe960..aa1b823e9 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -161,7 +161,8 @@ export class Channel extends BaseClass { if (!opts?.skipNameChecks) { const guild = await Guild.findOneOrFail({ id: channel.guild_id }); - if (!guild.features.includes("ILLEGAL_CHANNEL_NAMES") && channel.name) { + if (!guild.features.includes("ALLOW_INVALID_CHANNEL_NAMES") && channel.name) { + for (var character of InvisibleCharacters) channel.name = channel.name.split(character).join("-"); @@ -169,7 +170,8 @@ export class Channel extends BaseClass { channel.name = channel.name.split("-").filter(Boolean).join("-"); //trim '-' character } - if (!guild.features.includes("NULL_CHANNEL_NAMES")) { + if (!guild.features.includes("ALLOW_UNNAMED_CHANNELS")) { + if (channel.name) channel.name = channel.name.trim(); if (!channel.name) throw new HTTPError("Channel name cannot be empty."); From d6f5a08cb5bda45131e2195b12307204f6e1eebb Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sat, 15 Jan 2022 18:42:29 +1100 Subject: [PATCH 16/31] Add unhandled channel types to IsTextChannel method --- api/src/routes/channels/#channel_id/messages/index.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts index c3d3d408e..1ae9d6761 100644 --- a/api/src/routes/channels/#channel_id/messages/index.ts +++ b/api/src/routes/channels/#channel_id/messages/index.ts @@ -37,7 +37,11 @@ export function isTextChannel(type: ChannelType): boolean { case ChannelType.GUILD_PUBLIC_THREAD: case ChannelType.GUILD_PRIVATE_THREAD: case ChannelType.GUILD_TEXT: + case ChannelType.ENCRYPTED: + case ChannelType.ENCRYPTED_THREAD: return true; + default: + throw new HTTPError("unimplemented", 400); } } @@ -87,7 +91,7 @@ router.get("/", async (req: Request, res: Response) => { permissions.hasThrow("VIEW_CHANNEL"); if (!permissions.has("READ_MESSAGE_HISTORY")) return res.json([]); - var query: FindManyOptions & { where: { id?: any } } = { + var query: FindManyOptions & { where: { id?: any; }; } = { order: { id: "DESC" }, take: limit, where: { channel_id }, @@ -216,7 +220,7 @@ router.post( channel.save() ]); - postHandleMessage(message).catch((e) => {}); // no await as it shouldnt block the message send function and silently catch error + postHandleMessage(message).catch((e) => { }); // no await as it shouldnt block the message send function and silently catch error return res.json(message); } From 0a53860645dbddd4f127988ccd8da0abee7c6f2b Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sat, 15 Jan 2022 18:44:04 +1100 Subject: [PATCH 17/31] channel.owner_id is type string not number --- util/src/entities/Channel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index aa1b823e9..6750a0024 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -311,7 +311,7 @@ export class Channel extends BaseClass { //If the owner leave the server user is the new owner if (channel.owner_id === user_id) { - channel.owner_id = 1; // The channel is now owned by the server user + channel.owner_id = "1"; // The channel is now owned by the server user await emitEvent({ event: "CHANNEL_UPDATE", data: await DmChannelDTO.from(channel, [user_id]), From f8f236afb24d5c806ea0e5981e7f95de6ee4885c Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Sat, 15 Jan 2022 18:48:22 +1100 Subject: [PATCH 18/31] * Replaced list of invisible characters with unicode codepoints * No longer silently edit invalid channel names * No longer trim channel names in unnamed check --- util/src/entities/Channel.ts | 18 +++-- util/src/util/InvisibleCharacters.ts | 109 ++++++++++++++------------- 2 files changed, 65 insertions(+), 62 deletions(-) diff --git a/util/src/entities/Channel.ts b/util/src/entities/Channel.ts index 6750a0024..1cc4a5386 100644 --- a/util/src/entities/Channel.ts +++ b/util/src/entities/Channel.ts @@ -162,19 +162,21 @@ export class Channel extends BaseClass { if (!opts?.skipNameChecks) { const guild = await Guild.findOneOrFail({ id: channel.guild_id }); if (!guild.features.includes("ALLOW_INVALID_CHANNEL_NAMES") && channel.name) { - for (var character of InvisibleCharacters) - channel.name = channel.name.split(character).join("-"); + if (channel.name.includes(character)) + throw new HTTPError("Channel name cannot include invalid characters", 403); - channel.name = channel.name.split(/\-+/g).join("-"); //replace multiple occurances with just one - channel.name = channel.name.split("-").filter(Boolean).join("-"); //trim '-' character + if (channel.name.match(/\-\-+/g)) + throw new HTTPError("Channel name cannot include multiple adjacent dashes.", 403) + + if (channel.name.charAt(0) === "-" || + channel.name.charAt(channel.name.length - 1) === "-") + throw new HTTPError("Channel name cannot start/end with dash.", 403) } if (!guild.features.includes("ALLOW_UNNAMED_CHANNELS")) { - - if (channel.name) channel.name = channel.name.trim(); - - if (!channel.name) throw new HTTPError("Channel name cannot be empty."); + if (!channel.name) + throw new HTTPError("Channel name cannot be empty.", 403); } } diff --git a/util/src/util/InvisibleCharacters.ts b/util/src/util/InvisibleCharacters.ts index 147f51c21..2b014e146 100644 --- a/util/src/util/InvisibleCharacters.ts +++ b/util/src/util/InvisibleCharacters.ts @@ -1,55 +1,56 @@ +// List from https://invisible-characters.com/ export const InvisibleCharacters = [ - "\t", - " ", - "­", - "͏", - "؜", - "ᅟ", - "ᅠ", - "឴", - "឵", - "᠎", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - " ", - "​", - "‌", - "‍", - "‎", - "‏", - " ", - " ", - "⁠", - "⁡", - "⁢", - "⁣", - "⁤", - "", - "", - "", - "", - "", - "", - " ", - "⠀", - "ㅤ", - "", - "ᅠ", - "𝅙", - "𝅳", - "𝅴", - "𝅵", - "𝅶", - "𝅷", - "𝅸", - "𝅹", - "𝅺" -] \ No newline at end of file + '\u{9}', //Tab + '\u{20}', //Space + '\u{ad}', //Soft hyphen + '\u{34f}', //Combining grapheme joiner + '\u{61c}', //Arabic letter mark + '\u{115f}', //Hangul choseong filler + '\u{1160}', //Hangul jungseong filler + '\u{17b4}', //Khmer vowel inherent AQ + '\u{17b5}', //Khmer vowel inherent AA + '\u{180e}', //Mongolian vowel separator + '\u{2000}', //En quad + '\u{2001}', //Em quad + '\u{2002}', //En space + '\u{2003}', //Em space + '\u{2004}', //Three-per-em space + '\u{2005}', //Four-per-em space + '\u{2006}', //Six-per-em space + '\u{2007}', //Figure space + '\u{2008}', //Punctuation space + '\u{2009}', //Thin space + '\u{200a}', //Hair space + '\u{200b}', //Zero width space + '\u{200c}', //Zero width non-joiner + '\u{200d}', //Zero width joiner + '\u{200e}', //Left-to-right mark + '\u{200f}', //Right-to-left mark + '\u{202f}', //Narrow no-break space + '\u{205f}', //Medium mathematical space + '\u{2060}', //Word joiner + '\u{2061}', //Function application + '\u{2062}', //Invisible times + '\u{2063}', //Invisible separator + '\u{2064}', //Invisible plus + '\u{206a}', //Inhibit symmetric swapping + '\u{206b}', //Activate symmetric swapping + '\u{206c}', //Inhibit arabic form shaping + '\u{206d}', //Activate arabic form shaping + '\u{206e}', //National digit shapes + '\u{206f}', //Nominal digit shapes + '\u{3000}', //Ideographic space + '\u{2800}', //Braille pattern blank + '\u{3164}', //Hangul filler + '\u{feff}', //Zero width no-break space + '\u{ffa0}', //Haldwidth hangul filler + '\u{1d159}', //Musical symbol null notehead + '\u{1d173}', //Musical symbol begin beam + '\u{1d174}', //Musical symbol end beam + '\u{1d175}', //Musical symbol begin tie + '\u{1d176}', //Musical symbol end tie + '\u{1d177}', //Musical symbol begin slur + '\u{1d178}', //Musical symbol end slur + '\u{1d179}', //Musical symbol begin phrase + '\u{1d17a}' //Musical symbol end phrase +]; \ No newline at end of file From 108829140ac6596f9a93d68b4b20c5bc4faef375 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Mon, 24 Jan 2022 17:06:31 +1100 Subject: [PATCH 19/31] revert dependabot PRs that update node-fetch to v3 --- api/package-lock.json | Bin 830717 -> 830717 bytes bundle/package-lock.json | Bin 607272 -> 607272 bytes bundle/package.json | 4 ++-- cdn/package-lock.json | Bin 500169 -> 500169 bytes gateway/package-lock.json | Bin 543051 -> 538296 bytes gateway/package.json | 2 +- util/package-lock.json | Bin 497311 -> 497311 bytes util/package.json | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 28af2e8b1ca5b3b2a69c3a28342ce75f47ca53da..75945cbebc5f08ef7be68f20371d41cbf2a16d30 100644 GIT binary patch delta 88 zcmex+)9CL_qYdhuOh!u6-*$6~H#=~)J8&`rF%u9o12GE_vjQ>Ob_Y&&mYFbxlN~r4 Z+V3u62VxE&<^*CcAm-kFcM*>Q7XUMFA9DZz delta 92 zcmex+)9CL_qYdhu(|60Wa8Ccy%_-3Az}fD=$q2+uK+FupEI`Z(#BAFgIN4cdB9u;c b;B08WyNDf#Ie?fGh`E56d;8r*JPKR@>02Sg diff --git a/bundle/package-lock.json b/bundle/package-lock.json index d026e7c7785fe4ff8a10d165315f79892d994f10..573d40598c29a2dafcaf115e83fc172a85d6973d 100644 GIT binary patch delta 88 zcmZ3{p}L|&bwd#=qtWJKR%u~YBRw-cqsb3hRhxH6wC|8$1Y#y2W(HywAZFdZLxOFw dE<)M#@N+EulY6*y+7Gy~0Wtgb18y7{e*qVk9(Mo$ delta 86 zcmZ3{p}L|&bwd&BWPMT2&DE^J!jr4`_$I$%m1*7~(Y`~15r~<9m>Gy!fS7gr4hgo! ex-do4!_TqsPwwH;X+Pk`2E^>!54dq;`~?6uFCTya diff --git a/bundle/package.json b/bundle/package.json index 9b1dc9e9f..758275214 100644 --- a/bundle/package.json +++ b/bundle/package.json @@ -91,7 +91,7 @@ "missing-native-js-functions": "^1.2.18", "morgan": "^1.10.0", "multer": "^1.4.2", - "node-fetch": "^2.6.7", + "node-fetch": "^2.6.2", "node-os-utils": "^1.3.5", "patch-package": "^6.4.7", "pg": "^8.7.1", @@ -107,4 +107,4 @@ "ws": "^7.4.2", "nanocolors": "^0.2.12" } -} +} \ No newline at end of file diff --git a/cdn/package-lock.json b/cdn/package-lock.json index a6c2df2d47d99fcb8fc19e17c0d4d401913cb995..93d35f895e6be8b03b52a4e0a8a38127a9fbd400 100644 GIT binary patch delta 53 zcmX?kSnlLuxed*1j7HO||FO(ymSJy~VP^zlCLm_sF2l|e_npzG9ViFHtlO*qvH2|q E01kK)tpET3 delta 53 zcmX?kSnlLuxed*1jE2*z|FO(ymSJy~VP^zlCLm_sF2l|e_npzO9ViFHtlO*qvH2|q E01iGAs{jB1 diff --git a/gateway/package-lock.json b/gateway/package-lock.json index d02106f803bfbede3f5b3658e822a962e7cd2c1d..dfac1bd71ef56575e36d0fb73c86739fa74e90cb 100644 GIT binary patch delta 275 zcmV+u0qp+Ek|DV5Ah6B>1u`x+E;5(dl>{ZT_yHON0Wz10l?0fBs|AOv1p$Yv1p>FL z1p^i=m&_>w8n!e8|7W*Wo&zujxBaC9Sz4ES9ReMf<1quumrFhZ7MIvE1MHV=C;}Ll zU>^hwx9|l7|4*0mcmo!<8dd~xAD7N{1ihE@fdm(qt_}komtY?RGnO<6U6)x#0T#E9 zcm(~>1l?Atol?IERm*KevpO?*81{as0s{|CcCpHIyRk!zy2N4CgK$8dT zMwiAh1Lv1Y&j%8h*fIkem(Ldn3Aex92faYIksb&(6PM?O1s9jxTLTQ2ASMG0mw$8z ZCzmQS2xph3GYGerS#Spuw}dnZ#}vSJX7&I8 delta 2768 zcmdUwTWr%-7{`?yCvJg43zQaU+B6%qBP6!tv}r*_P1+<)<208x*Od-8agwHS?w2;> zwsF%y6R-|GO+p)c+9Wh!>>+#Dq&)+gm^6@(rU@Q5hQ`w#$`G@Is*cOcB$zf!$Fk4G z$KUt;|G)F~edVF7$hOMcpzj2>_N#hnJ%WARcs&>j@IE6vupJI;k;>q0g;W6t7tvKX(IRbz!OzhK*z*wmR{exRJL7V$ z5RPl6fx3ZOVDOOyljz~o(@489`eY!Po+dQJ@{5KB_5ga#YtHrrNe#q*x($Rt;6Jp~@uW=}zv4$oHN1pQY<4nqIoXML5`AVWvB=YJo z*E3kz_X-+b^Dlxpe`Ri3lP}~rmd|T4>EwKLCYh|wqO~NvGbrs^ zJ4NZVI#RiJuX5LblG1A_8mIx(R=xcZqT~&Hge|a3E1~Iuv;`xz6j@8y8_{&`sqv(k zw`cn_dSR!|_waTYJdfn#TzRD8Ca7k+RsbF1Lwx`5gUhkS8rPr85SG-EetM^5%20P{4O*r0t3qD?(K> z%sx2jlDrOsG9;7qz?YAOz~5R#3Q!)!R>8fESS`XWRH0b23Ig$ z@I?HTY{)th;))h~GCxYji+a1OG~>3?|nsMco=&P(Jk|-YI~~#e2-0 zvr;IqjECZ(O3{5fiR65_p;Xe%hU3O-Wq6MV!Zu^7;cNDW`CM(uE? z8KYqnkL`xrG*VaJ=ds1MWtJZkSS~bK_55*p{$r79aOh7=0s9wG{TZm+Cc3fWEthaG{C-h>63*?AwZN%M@;>k delta 44 scmbQgR&M@UxeW&y8O@syF}5FK1Yss1W(HywAZ7((w(W-)+3!vP0DmbEhyVZp diff --git a/util/package.json b/util/package.json index 1ef3031e8..d7baed9ae 100644 --- a/util/package.json +++ b/util/package.json @@ -44,7 +44,7 @@ "lambert-server": "^1.2.12", "missing-native-js-functions": "^1.2.18", "multer": "^1.4.3", - "node-fetch": "^2.6.7", + "node-fetch": "^2.6.2", "patch-package": "^6.4.7", "pg": "^8.7.1", "picocolors": "^1.0.0", From db0392d688e44f9abef09397d7313806ffc0b9ac Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Mon, 24 Jan 2022 13:25:00 +0100 Subject: [PATCH 20/31] Speed up setup by not installing optional packages (#605) Only downside is no db engines are included by default, removing compile time for packages like sqlite3. --- bundle/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundle/package.json b/bundle/package.json index 758275214..331e4ebef 100644 --- a/bundle/package.json +++ b/bundle/package.json @@ -4,7 +4,7 @@ "description": "", "main": "src/start.js", "scripts": { - "setup": "node scripts/install.js && npm install && ts-patch install -s && patch-package --patch-dir ../api/patches/ && npm run build", + "setup": "node scripts/install.js && npm install --no-optional && ts-patch install -s && patch-package --patch-dir ../api/patches/ && npm run build", "build": "node scripts/build.js", "start": "node scripts/build.js && node dist/bundle/src/start.js", "start:bundle": "node dist/bundle/src/start.js", From 713b6d07b4528f6d38944ccadbda9f07c87c967f Mon Sep 17 00:00:00 2001 From: TheArcaneBrony Date: Mon, 24 Jan 2022 15:22:09 +0100 Subject: [PATCH 21/31] Add dummy endpoints to prevent client loading some settings panels indefinitely --- .../routes/channels/#channel_id/webhooks.ts | 4 ++++ api/src/routes/guilds/#guild_id/audit-logs.ts | 20 +++++++++++++++++++ .../routes/guilds/#guild_id/integrations.ts | 12 +++++++++++ api/src/routes/guilds/#guild_id/webhooks.ts | 12 +++++++++++ 4 files changed, 48 insertions(+) create mode 100644 api/src/routes/guilds/#guild_id/audit-logs.ts create mode 100644 api/src/routes/guilds/#guild_id/integrations.ts create mode 100644 api/src/routes/guilds/#guild_id/webhooks.ts diff --git a/api/src/routes/channels/#channel_id/webhooks.ts b/api/src/routes/channels/#channel_id/webhooks.ts index 7b8944551..92895da6a 100644 --- a/api/src/routes/channels/#channel_id/webhooks.ts +++ b/api/src/routes/channels/#channel_id/webhooks.ts @@ -14,6 +14,10 @@ export interface WebhookCreateSchema { name: string; avatar: string; } +//TODO: implement webhooks +router.get("/", route({}), async (req: Request, res: Response) => { + res.json([]); +}); // TODO: use Image Data Type for avatar instead of String router.post("/", route({ body: "WebhookCreateSchema", permission: "MANAGE_WEBHOOKS" }), async (req: Request, res: Response) => { diff --git a/api/src/routes/guilds/#guild_id/audit-logs.ts b/api/src/routes/guilds/#guild_id/audit-logs.ts new file mode 100644 index 000000000..a4f2f800b --- /dev/null +++ b/api/src/routes/guilds/#guild_id/audit-logs.ts @@ -0,0 +1,20 @@ +import { Router, Response, Request } from "express"; +import { Channel, ChannelUpdateEvent, getPermission, emitEvent } from "@fosscord/util"; +import { HTTPError } from "lambert-server"; +import { route } from "@fosscord/api"; +import { ChannelModifySchema } from "../../channels/#channel_id"; +const router = Router(); + +//TODO: implement audit logs +router.get("/", route({}), async (req: Request, res: Response) => { + res.json({ + audit_log_entries: [], + users: [], + integrations: [], + webhooks: [], + guild_scheduled_events: [], + threads: [], + application_commands: [] + }); +}); +export default router; diff --git a/api/src/routes/guilds/#guild_id/integrations.ts b/api/src/routes/guilds/#guild_id/integrations.ts new file mode 100644 index 000000000..abf997c9d --- /dev/null +++ b/api/src/routes/guilds/#guild_id/integrations.ts @@ -0,0 +1,12 @@ +import { Router, Response, Request } from "express"; +import { Channel, ChannelUpdateEvent, getPermission, emitEvent } from "@fosscord/util"; +import { HTTPError } from "lambert-server"; +import { route } from "@fosscord/api"; +import { ChannelModifySchema } from "../../channels/#channel_id"; +const router = Router(); + +//TODO: implement integrations list +router.get("/", route({}), async (req: Request, res: Response) => { + res.json([]); +}); +export default router; diff --git a/api/src/routes/guilds/#guild_id/webhooks.ts b/api/src/routes/guilds/#guild_id/webhooks.ts new file mode 100644 index 000000000..8b2febeac --- /dev/null +++ b/api/src/routes/guilds/#guild_id/webhooks.ts @@ -0,0 +1,12 @@ +import { Router, Response, Request } from "express"; +import { Channel, ChannelUpdateEvent, getPermission, emitEvent } from "@fosscord/util"; +import { HTTPError } from "lambert-server"; +import { route } from "@fosscord/api"; +import { ChannelModifySchema } from "../../channels/#channel_id"; +const router = Router(); + +//TODO: implement webhooks +router.get("/", route({}), async (req: Request, res: Response) => { + res.json([]); +}); +export default router; From 8d5eb3669d93cedf49d96b99ef7d63afccad3b1b Mon Sep 17 00:00:00 2001 From: ImAaronFR <96433859+ImAaronFR@users.noreply.github.com> Date: Mon, 31 Jan 2022 03:04:39 +0330 Subject: [PATCH 22/31] Update index.html Compatible client version with Role Icons --- api/client_test/index.html | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api/client_test/index.html b/api/client_test/index.html index 0b3a775a9..384c598a0 100644 --- a/api/client_test/index.html +++ b/api/client_test/index.html @@ -65,11 +65,11 @@ localStorage.setItem("UserSettingsStore", JSON.stringify(settings)); } - - - - - + + + + + From b512fa49b08e9f4ef9cdba3537335c37bb663180 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 4 Feb 2022 19:59:13 +1100 Subject: [PATCH 23/31] Remove nulled properties from GET `/channels/#id/messages` for improved compatibility with some client ( discord.js ) --- api/src/routes/channels/#channel_id/messages/index.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts index 1ae9d6761..5fdab6236 100644 --- a/api/src/routes/channels/#channel_id/messages/index.ts +++ b/api/src/routes/channels/#channel_id/messages/index.ts @@ -126,6 +126,13 @@ router.get("/", async (req: Request, res: Response) => { y.proxy_url = `${endpoint == null ? "" : endpoint}${new URL(uri).pathname}`; }); + //Some clients ( discord.js ) only check if a property exists within the response, + //which causes erorrs when, say, the `application` property is `null`. + for (var curr in x) { + if (x[curr] === null) + delete x[curr]; + } + return x; }) ); From 7944ae3242b80d999e9ff96cbf6ec806aaa70d5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Fri, 4 Feb 2022 23:14:48 +0300 Subject: [PATCH 24/31] automated security fixes applied (#619) --- bundle/package-lock.json | Bin 607272 -> 576191 bytes bundle/package.json | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bundle/package-lock.json b/bundle/package-lock.json index 573d40598c29a2dafcaf115e83fc172a85d6973d..898c041c76670ef3d9676afe6c64b3b6ac5f60e9 100644 GIT binary patch delta 15470 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 diff --git a/bundle/package.json b/bundle/package.json index 331e4ebef..8915665d5 100644 --- a/bundle/package.json +++ b/bundle/package.json @@ -91,6 +91,7 @@ "missing-native-js-functions": "^1.2.18", "morgan": "^1.10.0", "multer": "^1.4.2", + "nanocolors": "^0.2.12", "node-fetch": "^2.6.2", "node-os-utils": "^1.3.5", "patch-package": "^6.4.7", @@ -98,13 +99,12 @@ "picocolors": "^1.0.0", "proxy-agent": "^5.0.0", "reflect-metadata": "^0.1.13", - "sqlite3": "^5.0.2", + "sqlite3": "^4.2.0", "supertest": "^6.1.6", "tslib": "^2.3.1", "typeorm": "^0.2.37", "typescript": "^4.1.2", "typescript-json-schema": "^0.50.1", - "ws": "^7.4.2", - "nanocolors": "^0.2.12" + "ws": "^7.4.2" } -} \ No newline at end of file +} From f3869cb4f6856e6ff6861675be0cad0a0891215c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 23:16:46 +0300 Subject: [PATCH 25/31] Bump simple-get from 3.1.0 to 3.1.1 in /util (#620) Bumps [simple-get](https://github.com/feross/simple-get) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/feross/simple-get/releases) - [Commits](https://github.com/feross/simple-get/compare/v3.1.0...v3.1.1) --- updated-dependencies: - dependency-name: simple-get dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- util/package-lock.json | Bin 497311 -> 497311 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/util/package-lock.json b/util/package-lock.json index 386f95ec4b734dc3566d2db355459bef37422422..9d20da93600eedc252341cbf4cfec29d85c2d753 100644 GIT binary patch delta 261 zcmbQgR&M@UxrP?T7N#xCae31PW-{qdU(e1iGrirCSs~Op(9|cy+da*>pv=|K+aS-V zv{*a4)Hfh0Tffl2)jP++sMsViBQ?x2KO)P`waP49Khiuu&@IfXG}J86-P}AQD8$4) zBgr%%~gXsp#m?YZM@|l5{1&CRYoSw!MR--{^o_Y}2Gb3eF-f$i Date: Tue, 8 Feb 2022 08:44:07 +0330 Subject: [PATCH 26/31] [Fix] Column "groups" contains null-values (#622) --- util/src/entities/Emoji.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/src/entities/Emoji.ts b/util/src/entities/Emoji.ts index 32d39234f..a3615b7da 100644 --- a/util/src/entities/Emoji.ts +++ b/util/src/entities/Emoji.ts @@ -41,6 +41,6 @@ export class Emoji extends BaseClass { @Column({ type: "simple-array" }) roles: string[]; // roles this emoji is whitelisted to (new discord feature?) - @Column({ type: "simple-array" }) + @Column({ type: "simple-array", nullable: true }) groups: string[]; // user groups this emoji is whitelisted to (Fosscord extension) } From 385bdfdff4d1166a556e70c6fa98754dadd84d51 Mon Sep 17 00:00:00 2001 From: ImAaronFR <96433859+ImAaronFR@users.noreply.github.com> Date: Wed, 9 Feb 2022 09:52:27 +0330 Subject: [PATCH 27/31] [Fix] Client bug (#623) If you don't delete this property for some reasons after you send a message in a guild, your roles will be removed (client sided) for everyone, this fixes it. --- api/src/routes/channels/#channel_id/messages/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts index 5fdab6236..2fd08b04e 100644 --- a/api/src/routes/channels/#channel_id/messages/index.ts +++ b/api/src/routes/channels/#channel_id/messages/index.ts @@ -219,7 +219,10 @@ router.post( }) ); } - + + //Fix for the client bug + delete message.member + await Promise.all([ message.save(), emitEvent({ event: "MESSAGE_CREATE", channel_id: channel_id, data: message } as MessageCreateEvent), From 27f6589008e876ef5c3a8e2e8945899b4ab1e12a Mon Sep 17 00:00:00 2001 From: ImAaronFR <96433859+ImAaronFR@users.noreply.github.com> Date: Thu, 10 Feb 2022 08:26:48 +0330 Subject: [PATCH 28/31] [Fix] Trying to remove a null element (#625) Fix for: Uncaught TypeError: document.querySelector(...) is null --- api/client_test/index.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/api/client_test/index.html b/api/client_test/index.html index 384c598a0..39ff346dc 100644 --- a/api/client_test/index.html +++ b/api/client_test/index.html @@ -54,9 +54,14 @@ setInterval(() => { var token = JSON.parse(localStorage.getItem("token")); if (token) { + var logincss = document.querySelector('#logincss'), + canRemove = logincss ? logincss: ""; + if(canRemove !== "") { document.querySelector("#logincss").remove(); + canRemove = ""; + } } - }, 1000); + }, 1000) const settings = JSON.parse(localStorage.getItem("UserSettingsStore")); if (settings && settings.locale.length <= 2) { From 3e0d2db0cb1e362b78b91eac79b11802988fb4de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Thu, 10 Feb 2022 21:14:48 +0300 Subject: [PATCH 29/31] Add more rights (#541) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Erkin Alp Güney * Added the backfilling-related rights * Added kick/ban rights * Added the presence right * Guild directory * Interactions rights --- util/src/util/Rights.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/util/src/util/Rights.ts b/util/src/util/Rights.ts index f0d00baf5..9a99d3936 100644 --- a/util/src/util/Rights.ts +++ b/util/src/util/Rights.ts @@ -35,9 +35,9 @@ export class Rights extends BitField { ADD_MEMBERS: BitFlag(8), // can manually add any members in their guilds BYPASS_RATE_LIMITS: BitFlag(9), CREATE_APPLICATIONS: BitFlag(10), - CREATE_CHANNELS: BitFlag(11), + CREATE_CHANNELS: BitFlag(11), // can create guild channels or threads in the guilds that they have permission CREATE_DMS: BitFlag(12), - CREATE_DM_GROUPS: BitFlag(13), + CREATE_DM_GROUPS: BitFlag(13), // can create group DMs or custom orphan channels CREATE_GUILDS: BitFlag(14), CREATE_INVITES: BitFlag(15), // can create mass invites in the guilds that they have CREATE_INSTANT_INVITE CREATE_ROLES: BitFlag(16), @@ -57,6 +57,17 @@ export class Rights extends BitField { SELF_DELETE_DISABLE: BitFlag(30), // can disable/delete own account DEBTABLE: BitFlag(31), // can use pay-to-use features CREDITABLE: BitFlag(32), // can receive money from monetisation related features + KICK_BAN_MEMBERS: BitFlag(33), + // can kick or ban guild or group DM members in the guilds/groups that they have KICK_MEMBERS, or BAN_MEMBERS + SELF_LEAVE_GROUPS: BitFlag(34), + // can leave the guilds or group DMs that they joined on their own (one can always leave a guild or group DMs they have been force-added) + PRESENCE: BitFlag(35), + // inverts the presence confidentiality default (OPERATOR's presence is not routed by default, others' are) for a given user + SELF_ADD_DISCOVERABLE: BitFlag(36), // can mark discoverable guilds that they have permissions to mark as discoverable + MANAGE_GUILD_DIRECTORY: BitFlag(37), // can change anything in the primary guild directory + INITIATE_INTERACTIONS: BitFlag(40), // can initiate interactions + RESPOND_TO_INTERACTIONS: BitFlag(41), // can respond to interactions + SEND_BACKDATED_EVENTS: BitFlag(42), // can send backdated events }; any(permission: RightResolvable, checkOperator = true) { From 1ea553ccdd445eceb261b2fb76744c97425b803a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Erkin=20Alp=20G=C3=BCney?= Date: Thu, 10 Feb 2022 23:43:49 +0300 Subject: [PATCH 30/31] Manually lock node to >15 --- api/package-lock.json | Bin 830717 -> 830739 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/api/package-lock.json b/api/package-lock.json index 75945cbebc5f08ef7be68f20371d41cbf2a16d30..21afe02c57f5768530c7f50d3dccf53a46751988 100644 GIT binary patch delta 76 zcmex+(`fQ7qYc-YIh3pvlh&Am#vK RP9Ww2V(#san0cgE0sv128{_~0 delta 62 zcmbPy%joY-qYc-Yo8L0Gzh!0wVkRI4u~~qa6^Pk@m>q~YfS41Axqz5^`&(unwUq#4 Cycvc7 From c38d147a91025f6852429f9190fa64501b648d25 Mon Sep 17 00:00:00 2001 From: RealMANI <96433859+ImAaronFR@users.noreply.github.com> Date: Fri, 11 Feb 2022 08:43:46 +0330 Subject: [PATCH 31/31] Appropriate DB charset (#629) causes bugs like turning emojis to "????" --- util/src/util/Database.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/util/src/util/Database.ts b/util/src/util/Database.ts index e8177093f..9ab5d14c2 100644 --- a/util/src/util/Database.ts +++ b/util/src/util/Database.ts @@ -25,6 +25,7 @@ export function initDatabase(): Promise { // @ts-ignore promise = createConnection({ type, + charset: 'utf8mb4', url: isSqlite ? undefined : dbConnectionString, database: isSqlite ? dbConnectionString : undefined, // @ts-ignore