summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--package-lock.json4
-rw-r--r--package.json2
-rw-r--r--src/util/Permissions.ts64
3 files changed, 53 insertions, 17 deletions
diff --git a/package-lock.json b/package-lock.json

index e4374275..3a10bdef 100644 --- a/package-lock.json +++ b/package-lock.json
@@ -1,12 +1,12 @@ { "name": "@fosscord/server-util", - "version": "1.0.6", + "version": "1.0.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@fosscord/server-util", - "version": "1.0.6", + "version": "1.0.7", "license": "ISC", "dependencies": { "@types/jsonwebtoken": "^8.5.0", diff --git a/package.json b/package.json
index 105c353c..0731724d 100644 --- a/package.json +++ b/package.json
@@ -1,6 +1,6 @@ { "name": "@fosscord/server-util", - "version": "1.0.7", + "version": "1.0.8", "description": "Utility functions for the all server repositories", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/src/util/Permissions.ts b/src/util/Permissions.ts
index 2f43f7e1..8debfa08 100644 --- a/src/util/Permissions.ts +++ b/src/util/Permissions.ts
@@ -7,7 +7,7 @@ import { Role, RoleModel } from "../models/Role"; import { BitField } from "./BitField"; import { GuildDocument, GuildModel } from "../models/Guild"; -var HTTPError: typeof Error; +var HTTPError: any; try { HTTPError = require("lambert-server").HTTPError; @@ -142,6 +142,8 @@ export class Permissions extends BitField { guild: { roles: Role[] }; channel?: { overwrites?: ChannelPermissionOverwrite[]; + recipients?: string[]; + owner_id?: string; }; }) { let roles = guild.roles.filter((x) => user.roles.includes(x.id)); @@ -156,42 +158,76 @@ export class Permissions extends BitField { permission = Permissions.channelPermission(overwrites, permission); } + if (channel?.recipients) { + if (channel?.owner_id === user.id) return new Permissions("ADMINISTRATOR"); + if (channel.recipients.includes(user.id)) { + // Default dm permissions + return new Permissions([ + "VIEW_CHANNEL", + "SEND_MESSAGES", + "STREAM", + "ADD_REACTIONS", + "EMBED_LINKS", + "ATTACH_FILES", + "READ_MESSAGE_HISTORY", + "MENTION_EVERYONE", + "USE_EXTERNAL_EMOJIS", + "CONNECT", + "SPEAK", + "MANAGE_CHANNELS", + ]); + } + + return new Permissions(); + } + return permission; } } export async function getPermission( user_id: string, - guild_id: string, + guild_id?: string, channel_id?: string, cache?: { channel?: ChannelDocument | null; member?: MemberDocument | null; guild?: GuildDocument | null } ) { var { channel, member, guild } = cache || {}; + var roles; + + if (channel_id && !channel) { + channel = await ChannelModel.findOne( + { id: channel_id }, + { permission_overwrites: true, recipients: true, owner_id: true, guild_id: true } + ).exec(); + if (!channel) throw new HTTPError("Channel not found", 404); + if (channel.guild_id) guild_id = channel.guild_id; + } - if (!guild) guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec(); - if (!guild) throw new Error("Guild not found"); - if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR); + if (guild_id) { + if (!guild) guild = await GuildModel.findOne({ id: guild_id }, { owner_id: true }).exec(); + if (!guild) throw new Error("Guild not found"); + if (guild.owner_id === user_id) return new Permissions(Permissions.FLAGS.ADMINISTRATOR); - if (!member) member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec(); - if (!member) throw new Error("Member not found"); + if (!member) member = await MemberModel.findOne({ guild_id, id: user_id }, "roles").exec(); + if (!member) throw new Error("Member not found"); - var roles = await RoleModel.find({ guild_id, id: { $in: member.roles } }) - .lean() - .exec(); - if (channel_id && !channel) { - channel = await ChannelModel.findOne({ id: channel_id }, "permission_overwrites").exec(); + roles = await RoleModel.find({ guild_id, id: { $in: member.roles } }) + .lean() + .exec(); } var permission = Permissions.finalPermission({ user: { id: user_id, - roles: member.roles, + roles: member?.roles || [], }, guild: { - roles: roles, + roles: roles || [], }, channel: { overwrites: channel?.permission_overwrites, + owner_id: channel?.owner_id, + recipients: channel?.recipients, }, });