summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--api/package-lock.json8
-rw-r--r--api/src/routes/channels/#channel_id/invites.ts7
-rw-r--r--api/src/routes/channels/#channel_id/messages/index.ts5
-rw-r--r--api/src/routes/guilds/#guild_id/invites.ts4
-rw-r--r--api/src/routes/guilds/#guild_id/members/#member_id/index.ts15
-rw-r--r--api/src/routes/invites/index.ts4
-rw-r--r--cdn/package-lock.json8
-rw-r--r--gateway/package-lock.json8
-rw-r--r--gateway/src/opcodes/Identify.ts15
-rw-r--r--util/src/entities/Guild.ts10
-rw-r--r--util/src/entities/Invite.ts2
-rw-r--r--util/src/entities/Member.ts1
-rw-r--r--util/src/util/Permissions.ts7
-rw-r--r--webrtc/package-lock.json8
14 files changed, 59 insertions, 43 deletions
diff --git a/api/package-lock.json b/api/package-lock.json
index da41d26d..7b1e000b 100644
--- a/api/package-lock.json
+++ b/api/package-lock.json
@@ -7569,7 +7569,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -7619,7 +7619,7 @@
 		},
 		"node_modules/mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==",
 			"engines": {
 				"node": ">=4.0.0"
@@ -18668,7 +18668,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -18704,7 +18704,7 @@
 		},
 		"mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA=="
 		},
 		"mquery": {
diff --git a/api/src/routes/channels/#channel_id/invites.ts b/api/src/routes/channels/#channel_id/invites.ts
index fcc8a1ad..fe22d3bc 100644
--- a/api/src/routes/channels/#channel_id/invites.ts
+++ b/api/src/routes/channels/#channel_id/invites.ts
@@ -1,12 +1,9 @@
 import { Router, Request, Response } from "express";
 import { HTTPError } from "lambert-server";
-
 import { check } from "../../../util/instanceOf";
 import { random } from "../../../util/RandomInviteID";
-
 import { InviteCreateSchema } from "../../../schema/Invite";
-
-import { getPermission, Channel, Invite, InviteCreateEvent, emitEvent, User, Guild } from "@fosscord/util";
+import { getPermission, Channel, Invite, InviteCreateEvent, emitEvent, User, Guild, PublicInviteRelation } from "@fosscord/util";
 import { isTextChannel } from "./messages";
 
 const router: Router = Router();
@@ -74,7 +71,7 @@ router.get("/", async (req: Request, res: Response) => {
 	const permission = await getPermission(user_id, guild_id);
 	permission.hasThrow("MANAGE_CHANNELS");
 
-	const invites = await Invite.find({ guild_id });
+	const invites = await Invite.find({ where: { guild_id }, relations: PublicInviteRelation });
 
 	res.status(200).send(invites);
 });
diff --git a/api/src/routes/channels/#channel_id/messages/index.ts b/api/src/routes/channels/#channel_id/messages/index.ts
index 86de6de8..1a3150cf 100644
--- a/api/src/routes/channels/#channel_id/messages/index.ts
+++ b/api/src/routes/channels/#channel_id/messages/index.ts
@@ -15,13 +15,13 @@ export default router;
 
 export function isTextChannel(type: ChannelType): boolean {
 	switch (type) {
+		case ChannelType.GUILD_STORE:
 		case ChannelType.GUILD_VOICE:
 		case ChannelType.GUILD_CATEGORY:
 			throw new HTTPError("not a text channel", 400);
 		case ChannelType.DM:
 		case ChannelType.GROUP_DM:
 		case ChannelType.GUILD_NEWS:
-		case ChannelType.GUILD_STORE:
 		case ChannelType.GUILD_TEXT:
 			return true;
 	}
@@ -48,8 +48,7 @@ router.get("/", async (req: Request, res: Response) => {
 	if (!limit) limit = 50;
 	var halfLimit = Math.floor(limit / 2);
 
-	// @ts-ignore
-	const permissions = await getPermission(req.user_id, channel.guild_id, channel_id, { channel });
+	const permissions = await getPermission(req.user_id, channel.guild_id, channel_id);
 	permissions.hasThrow("VIEW_CHANNEL");
 	if (!permissions.has("READ_MESSAGE_HISTORY")) return res.json([]);
 
diff --git a/api/src/routes/guilds/#guild_id/invites.ts b/api/src/routes/guilds/#guild_id/invites.ts
index 1843b689..39a934ee 100644
--- a/api/src/routes/guilds/#guild_id/invites.ts
+++ b/api/src/routes/guilds/#guild_id/invites.ts
@@ -1,4 +1,4 @@
-import { getPermission, Invite } from "@fosscord/util";
+import { getPermission, Invite, PublicInviteRelation } from "@fosscord/util";
 import { Request, Response, Router } from "express";
 
 const router = Router();
@@ -9,7 +9,7 @@ router.get("/", async (req: Request, res: Response) => {
 	const permissions = await getPermission(req.user_id, guild_id);
 	permissions.hasThrow("MANAGE_GUILD");
 
-	const invites = await Invite.find({ guild_id });
+	const invites = await Invite.find({ where: { guild_id }, relations: PublicInviteRelation });
 
 	return res.json(invites);
 });
diff --git a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
index 7e79caad..0d62e555 100644
--- a/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
+++ b/api/src/routes/guilds/#guild_id/members/#member_id/index.ts
@@ -38,14 +38,13 @@ router.patch("/", check(MemberChangeSchema), async (req: Request, res: Response)
 		member.roles = body.roles.map((x) => new Role({ id: x })); // foreign key constraint will fail if role doesn't exist
 	}
 
-	Promise.all([
-		member.save(),
-		emitEvent({
-			event: "GUILD_MEMBER_UPDATE",
-			guild_id,
-			data: { ...member, roles: member.roles.map((x) => x.id) }
-		} as GuildMemberUpdateEvent)
-	]);
+	await member.save();
+	// do not use promise.all as we have to first write to db before emitting the event
+	await emitEvent({
+		event: "GUILD_MEMBER_UPDATE",
+		guild_id,
+		data: { ...member, roles: member.roles.map((x) => x.id) }
+	} as GuildMemberUpdateEvent);
 
 	res.json(member);
 });
diff --git a/api/src/routes/invites/index.ts b/api/src/routes/invites/index.ts
index 23fa3aec..b8c24c1f 100644
--- a/api/src/routes/invites/index.ts
+++ b/api/src/routes/invites/index.ts
@@ -1,12 +1,12 @@
 import { Router, Request, Response } from "express";
-import { getPermission, Guild, Invite, Member } from "@fosscord/util";
+import { getPermission, Guild, Invite, Member, PublicInviteRelation } from "@fosscord/util";
 import { HTTPError } from "lambert-server";
 const router: Router = Router();
 
 router.get("/:code", async (req: Request, res: Response) => {
 	const { code } = req.params;
 
-	const invite = await Invite.findOneOrFail({ code });
+	const invite = await Invite.findOneOrFail({ where: { code }, relations: PublicInviteRelation });
 
 	res.status(200).send(invite);
 });
diff --git a/cdn/package-lock.json b/cdn/package-lock.json
index ec638f86..541ee77c 100644
--- a/cdn/package-lock.json
+++ b/cdn/package-lock.json
@@ -4040,7 +4040,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -4099,7 +4099,7 @@
 		},
 		"node_modules/mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==",
 			"engines": {
 				"node": ">=4.0.0"
@@ -8596,7 +8596,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -8631,7 +8631,7 @@
 		},
 		"mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA=="
 		},
 		"mquery": {
diff --git a/gateway/package-lock.json b/gateway/package-lock.json
index fc5d3bf2..340f595d 100644
--- a/gateway/package-lock.json
+++ b/gateway/package-lock.json
@@ -1210,7 +1210,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -1253,7 +1253,7 @@
 		},
 		"node_modules/mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==",
 			"peer": true,
 			"engines": {
@@ -2893,7 +2893,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.11",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"optional-require": "1.0.x",
@@ -2926,7 +2926,7 @@
 		},
 		"mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==",
 			"peer": true
 		},
diff --git a/gateway/src/opcodes/Identify.ts b/gateway/src/opcodes/Identify.ts
index cd09653f..adfd98da 100644
--- a/gateway/src/opcodes/Identify.ts
+++ b/gateway/src/opcodes/Identify.ts
@@ -12,6 +12,8 @@ import {
 	EVENTEnum,
 	Config,
 	dbConnection,
+	PublicMemberProjection,
+	PublicMember,
 } from "@fosscord/util";
 import { setupListener } from "../listener/listener";
 import { IdentifySchema } from "../schema/Identify";
@@ -68,9 +70,16 @@ export async function onIdentify(this: WebSocket, data: Payload) {
 			"roles",
 		],
 	});
-	const merged_members = members.map((x: any) => {
-		return [x];
-	}) as Member[][];
+	const merged_members = members.map((x: Member) => {
+		return [
+			{
+				...x,
+				roles: x.roles.map((x) => x.id),
+				settings: undefined,
+				guild: undefined,
+			},
+		];
+	}) as PublicMember[][];
 	const guilds = members.map((x) => ({ ...x.guild, joined_at: x.joined_at }));
 	const user_guild_settings_entries = members.map((x) => x.settings);
 
diff --git a/util/src/entities/Guild.ts b/util/src/entities/Guild.ts
index 14bf1637..029a1b0b 100644
--- a/util/src/entities/Guild.ts
+++ b/util/src/entities/Guild.ts
@@ -53,7 +53,15 @@ import { Webhook } from "./Webhook";
 // 		"Gacha"
 // 	],
 
-export const PublicGuildRelations = ["channels", "emojis", "members", "roles", "stickers", "voice_states"];
+export const PublicGuildRelations = [
+	"channels",
+	"emojis",
+	"members",
+	"roles",
+	"stickers",
+	"voice_states",
+	"members.user",
+];
 
 @Entity("guilds")
 export class Guild extends BaseClass {
diff --git a/util/src/entities/Invite.ts b/util/src/entities/Invite.ts
index 01e22294..afad9c02 100644
--- a/util/src/entities/Invite.ts
+++ b/util/src/entities/Invite.ts
@@ -4,6 +4,8 @@ import { Channel } from "./Channel";
 import { Guild } from "./Guild";
 import { User } from "./User";
 
+export const PublicInviteRelation = ["inviter", "guild", "channel"];
+
 @Entity("invites")
 export class Invite extends BaseClass {
 	@PrimaryColumn()
diff --git a/util/src/entities/Member.ts b/util/src/entities/Member.ts
index 8f391af3..66f5d9a1 100644
--- a/util/src/entities/Member.ts
+++ b/util/src/entities/Member.ts
@@ -24,7 +24,6 @@ import {
 } from "../interfaces";
 import { HTTPError } from "lambert-server";
 import { Role } from "./Role";
-import { Snowflake } from "../util/Snowflake";
 import { BaseClassWithoutId } from "./BaseClass";
 import { Ban, PublicGuildRelations } from ".";
 import { DiscordApiErrors } from "../util/Constants";
diff --git a/util/src/util/Permissions.ts b/util/src/util/Permissions.ts
index 94fb3b51..ab8dd9b1 100644
--- a/util/src/util/Permissions.ts
+++ b/util/src/util/Permissions.ts
@@ -254,7 +254,7 @@ export async function getPermission(
 		if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR);
 
 		member = await Member.findOneOrFail({
-			where: { guild_id, user_id },
+			where: { guild_id, id: user_id },
 			relations: ["roles", ...(opts.member_relations || [])],
 			select: [
 				"id",
@@ -265,6 +265,9 @@ export async function getPermission(
 		});
 	}
 
+	let recipient_ids: any = channel?.recipients?.map((x) => x.id);
+	if (!recipient_ids?.length) recipient_ids = null;
+
 	// TODO: remove guild.roles and convert recipient_ids to recipients
 	var permission = Permissions.finalPermission({
 		user: {
@@ -277,7 +280,7 @@ export async function getPermission(
 		channel: {
 			overwrites: channel?.permission_overwrites,
 			owner_id: channel?.owner_id,
-			recipient_ids: channel?.recipients?.map((x) => x.id),
+			recipient_ids,
 		},
 	});
 
diff --git a/webrtc/package-lock.json b/webrtc/package-lock.json
index bcc22d24..8419f0a9 100644
--- a/webrtc/package-lock.json
+++ b/webrtc/package-lock.json
@@ -647,7 +647,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.8",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"regexp-clone": "1.0.0",
@@ -724,7 +724,7 @@
 		},
 		"node_modules/mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA==",
 			"engines": {
 				"node": ">=4.0.0"
@@ -1515,7 +1515,7 @@
 				"kareem": "2.3.2",
 				"mongodb": "3.6.8",
 				"mongoose-legacy-pluralize": "1.0.2",
-				"mpath": "0.8.3",
+				"mpath": "0.8.4",
 				"mquery": "3.2.5",
 				"ms": "2.1.2",
 				"regexp-clone": "1.0.0",
@@ -1558,7 +1558,7 @@
 		},
 		"mpath": {
 			"version": "0.8.3",
-			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.3.tgz",
+			"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
 			"integrity": "sha512-eb9rRvhDltXVNL6Fxd2zM9D4vKBxjVVQNLNijlj7uoXUy19zNDsIif5zR+pWmPCWNKwAtqyo4JveQm4nfD5+eA=="
 		},
 		"mquery": {