Fix transcript encryption and endpoints (#35)

pull/38/head
Skyler 3 years ago committed by GitHub
commit 6f5cc9e42e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -193,8 +193,9 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
); );
} }
let userPremiumServers; let userPremiumServers = "";
if ((dbMember?.appliesTo.length ?? 0) > 0) userPremiumServers = "\nIf you want to remove premium from a server, run this command in your DMs with me."; if ((dbMember?.appliesTo.length ?? 0) > 0)
userPremiumServers = "\nIf you want to remove premium from a server, run this command in your DMs with me.";
interaction.editReply({ interaction.editReply({
embeds: [ embeds: [
@ -223,7 +224,9 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
new EmojiEmbed() new EmojiEmbed()
.setTitle("Premium") .setTitle("Premium")
.setDescription( .setDescription(
`You have already activated premium on the maximum amount of servers!` + userPremiumServers + firstDescription `You have already activated premium on the maximum amount of servers!` +
userPremiumServers +
firstDescription
) )
.setEmoji("NUCLEUS.PREMIUMACTIVATE") .setEmoji("NUCLEUS.PREMIUMACTIVATE")
.setStatus("Danger") .setStatus("Danger")
@ -236,7 +239,9 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
embeds: [ embeds: [
new EmojiEmbed() new EmojiEmbed()
.setTitle("Premium") .setTitle("Premium")
.setDescription(`You have activated premium on this server!` + userPremiumServers + firstDescription) .setDescription(
`You have activated premium on this server!` + userPremiumServers + firstDescription
)
.setEmoji("NUCLEUS.LOGO") .setEmoji("NUCLEUS.LOGO")
.setStatus("Danger") .setStatus("Danger")
], ],

@ -33,7 +33,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
) )
.setEmoji("NUCLEUS.LOGO") .setEmoji("NUCLEUS.LOGO")
.setStatus("Danger") .setStatus("Danger")
.setFooter({text: "https://clicksminuteper.github.io/policies/nucleus"}) .setFooter({ text: "https://clicksminuteper.github.io/policies/nucleus" })
) )
.setTitle("Welcome") .setTitle("Welcome")
.setDescription("General privacy information") .setDescription("General privacy information")
@ -48,7 +48,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
) )
.setEmoji("NUCLEUS.LOGO") .setEmoji("NUCLEUS.LOGO")
.setStatus("Danger") .setStatus("Danger")
.setFooter({text: "https://clicksminuteper.github.io/policies/nucleus"}) .setFooter({ text: "https://clicksminuteper.github.io/policies/nucleus" })
) )
.setTitle("Scanners") .setTitle("Scanners")
.setDescription("About Unscan") .setDescription("About Unscan")
@ -62,7 +62,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
) )
.setEmoji("NUCLEUS.LOGO") .setEmoji("NUCLEUS.LOGO")
.setStatus("Danger") .setStatus("Danger")
.setFooter({text: "https://clicksminuteper.github.io/policies/nucleus"}) .setFooter({ text: "https://clicksminuteper.github.io/policies/nucleus" })
) )
.setTitle("Link scanning and Transcripts") .setTitle("Link scanning and Transcripts")
.setDescription("Information about how links and images are scanned, and transcripts are stored") .setDescription("Information about how links and images are scanned, and transcripts are stored")
@ -77,7 +77,7 @@ const callback = async (interaction: CommandInteraction): Promise<void> => {
.setDescription("Below are buttons for controlling this servers privacy settings") .setDescription("Below are buttons for controlling this servers privacy settings")
.setEmoji("NUCLEUS.LOGO") .setEmoji("NUCLEUS.LOGO")
.setStatus("Danger") .setStatus("Danger")
.setFooter({text: "https://clicksminuteper.github.io/policies/nucleus"}) .setFooter({ text: "https://clicksminuteper.github.io/policies/nucleus" })
) )
.setTitle("Options") .setTitle("Options")
.setDescription("Options") .setDescription("Options")

@ -248,7 +248,8 @@ const editTrack = async (
}need a role in this track\n` + }need a role in this track\n` +
`${getEmojiByName("CONTROL." + (current.retainPrevious ? "TICK" : "CROSS"))} Members ${ `${getEmojiByName("CONTROL." + (current.retainPrevious ? "TICK" : "CROSS"))} Members ${
current.retainPrevious ? "" : "don't " current.retainPrevious ? "" : "don't "
}keep all roles below their current highest\n\n` + (previousMessage ? previousMessage + "\n\n": "") + }keep all roles below their current highest\n\n` +
(previousMessage ? previousMessage + "\n\n" : "") +
createVerticalTrack( createVerticalTrack(
mapped.map((role) => renderRole(role)), mapped.map((role) => renderRole(role)),
new Array(current.track.length).fill(false), new Array(current.track.length).fill(false),
@ -322,7 +323,7 @@ const editTrack = async (
case "addRole": { case "addRole": {
const role = out.values![0]!; const role = out.values![0]!;
const roleObj = roles.get(role)!; const roleObj = roles.get(role)!;
if (roleObj.position >= (interaction.member as GuildMember).roles.highest.position){ if (roleObj.position >= (interaction.member as GuildMember).roles.highest.position) {
previousMessage = "You can't add a role that is higher than your highest role."; previousMessage = "You can't add a role that is higher than your highest role.";
} else { } else {
if (!current.track.includes(role)) { if (!current.track.includes(role)) {

@ -20,7 +20,7 @@ export async function callback(_client: NucleusClient, message: Message) {
message.channel.type === ChannelType.GuildAnnouncement && message.channel.type === ChannelType.GuildAnnouncement &&
message.reference === null message.reference === null
) { ) {
if(message.channel.permissionsFor(message.guild.members.me!)!.has("ManageMessages")) { if (message.channel.permissionsFor(message.guild.members.me!)!.has("ManageMessages")) {
await message.crosspost(); await message.crosspost();
} else { } else {
singleNotify(`I don't have permissions to publish in <#${message.channel.id}>`, message.guild.id, true); singleNotify(`I don't have permissions to publish in <#${message.channel.id}>`, message.guild.id, true);

@ -17,7 +17,6 @@ client.on("ready", async () => {
} }
await client.database.premium.checkAllPremium(); await client.database.premium.checkAllPremium();
await client.database.guilds.updateAllGuilds(); await client.database.guilds.updateAllGuilds();
}); });
process.on("unhandledRejection", (err) => { process.on("unhandledRejection", (err) => {

@ -55,7 +55,7 @@ export class Guilds {
} catch (e) { } catch (e) {
guildObj = null; guildObj = null;
} }
if(!guildObj) await this.delete(guild.id); if (!guildObj) await this.delete(guild.id);
} }
} }
@ -251,7 +251,13 @@ export class Transcript {
.replace(/\//g, "_") .replace(/\//g, "_")
.replace(/\+/g, "-") .replace(/\+/g, "-")
.substring(0, 32); .substring(0, 32);
const iv = getIV().toString("base64").replace(/=/g, "").replace(/\//g, "_").replace(/\+/g, "-"); const iv = getIV()
.toString("base64")
.substring(0, 16)
.replace(/=/g, "")
.replace(/\//g, "_")
.replace(/\+/g, "-");
console.log(iv);
for (const message of transcript.messages) { for (const message of transcript.messages) {
if (message.content) { if (message.content) {
const encCipher = crypto.createCipheriv("AES-256-CBC", key, iv); const encCipher = crypto.createCipheriv("AES-256-CBC", key, iv);
@ -320,9 +326,10 @@ export class Transcript {
} }
async read(code: string, key: string, iv: string) { async read(code: string, key: string, iv: string) {
// console.log("Transcript read") console.log("Transcript read");
let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code }); let doc: TranscriptSchema | null = await this.transcripts.findOne({ code: code });
let findDoc: findDocSchema | null = null; let findDoc: findDocSchema | null = null;
console.log(doc);
if (!doc) findDoc = await this.messageToTranscript.findOne({ transcript: code }); if (!doc) findDoc = await this.messageToTranscript.findOne({ transcript: code });
if (findDoc) { if (findDoc) {
const message = await ( const message = await (
@ -348,6 +355,7 @@ export class Transcript {
if (!data) return null; if (!data) return null;
doc = JSON.parse(Buffer.from(data).toString()) as TranscriptSchema; doc = JSON.parse(Buffer.from(data).toString()) as TranscriptSchema;
} }
console.log(doc);
if (!doc) return null; if (!doc) return null;
for (const message of doc.messages) { for (const message of doc.messages) {
if (message.content) { if (message.content) {
@ -401,15 +409,15 @@ export class Transcript {
discriminator: parseInt(message.author.discriminator), discriminator: parseInt(message.author.discriminator),
id: message.author.id, id: message.author.id,
topRole: { topRole: {
color: message.member!.roles.highest.color color: message.member ? message.member.roles.highest.color : 0x000000
}, },
iconURL: message.member!.user.displayAvatarURL({ forceStatic: true }), iconURL: (message.member?.user || message.author).displayAvatarURL({ forceStatic: true }),
bot: message.author.bot bot: message.author.bot || false
}, },
createdTimestamp: message.createdTimestamp createdTimestamp: message.createdTimestamp
}; };
if (message.member?.nickname) msg.author.nickname = message.member.nickname; if (message.member?.nickname) msg.author.nickname = message.member.nickname;
if (message.member!.roles.icon) msg.author.topRole.badgeURL = message.member!.roles.icon.iconURL()!; if (message.member?.roles.icon) msg.author.topRole.badgeURL = message.member!.roles.icon.iconURL()!;
if (message.content) msg.content = message.content; if (message.content) msg.content = message.content;
if (message.embeds.length > 0) if (message.embeds.length > 0)
msg.embeds = message.embeds.map((embed) => { msg.embeds = message.embeds.map((embed) => {

@ -4,7 +4,7 @@ import { toHexArray } from "./calculate.js";
import { promisify } from "util"; import { promisify } from "util";
import generateKeyValueList from "./generateKeyValueList.js"; import generateKeyValueList from "./generateKeyValueList.js";
import client from "./client.js"; import client from "./client.js";
import {DiscordAPIError} from "discord.js"; import { DiscordAPIError } from "discord.js";
const wait = promisify(setTimeout); const wait = promisify(setTimeout);
@ -44,12 +44,12 @@ export const Logger = {
return `${user.username} [<@${user.id}>]`; return `${user.username} [<@${user.id}>]`;
}, },
renderTime(t: number) { renderTime(t: number) {
if(isNaN(t)) return "Unknown" if (isNaN(t)) return "Unknown";
t = Math.floor((t /= 1000)); t = Math.floor((t /= 1000));
return `<t:${t}:D> at <t:${t}:T>`; return `<t:${t}:D> at <t:${t}:T>`;
}, },
renderDelta(t: number) { renderDelta(t: number) {
if(isNaN(t)) return "Unknown" if (isNaN(t)) return "Unknown";
t = Math.floor((t /= 1000)); t = Math.floor((t /= 1000));
return `<t:${t}:R> (<t:${t}:D> at <t:${t}:T>)`; return `<t:${t}:R> (<t:${t}:D> at <t:${t}:T>)`;
}, },

@ -1,18 +1,20 @@
import * as fs from 'fs'; import * as fs from "fs";
import client from "../client.js"; import client from "../client.js";
import _ from "lodash"; import _ from "lodash";
const dir = './data'; const dir = "./data";
const files = fs.readdirSync(dir); const files = fs.readdirSync(dir);
for (const file of files) { for (const file of files) {
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
let rsmData: any; let rsmData: any;
try { try {
rsmData = JSON.parse(fs.readFileSync(`${dir}/${file}`, 'utf8')); rsmData = JSON.parse(fs.readFileSync(`${dir}/${file}`, "utf8"));
} catch { continue } } catch {
continue;
}
if (!rsmData.version || rsmData.version < 3) continue; if (!rsmData.version || rsmData.version < 3) continue;
const nucleusData = await client.database.guilds.readOld(rsmData.guild_info.id) const nucleusData = await client.database.guilds.readOld(rsmData.guild_info.id);
const rsmToNucleus = { const rsmToNucleus = {
id: rsmData.guild_info.id, id: rsmData.guild_info.id,
version: 1, version: 1,
@ -20,54 +22,54 @@ for (const file of files) {
filters: { filters: {
images: { images: {
NSFW: rsmData.images?.nsfw, NSFW: rsmData.images?.nsfw,
size: rsmData.images?.toosmall, size: rsmData.images?.toosmall
}, },
malware: null, malware: null,
wordFilter: { wordFilter: {
enabled: true, enabled: true,
words: { words: {
strict: rsmData.wordfilter?.strict, strict: rsmData.wordfilter?.strict,
loose: rsmData.wordfilter?.soft, loose: rsmData.wordfilter?.soft
}, },
allowed: { allowed: {
users: rsmData.wordfilter?.ignore?.members, users: rsmData.wordfilter?.ignore?.members,
roles: rsmData.wordfilter?.ignore?.roles, roles: rsmData.wordfilter?.ignore?.roles,
channels: rsmData.wordfilter?.ignore?.channels, channels: rsmData.wordfilter?.ignore?.channels
}, }
}, },
invite: { invite: {
enabled: rsmData.invite?.enabled, enabled: rsmData.invite?.enabled,
allowed: { allowed: {
channels: rsmData.invite?.whitelist?.members, channels: rsmData.invite?.whitelist?.members,
roles: rsmData.invite?.whitelist?.roles, roles: rsmData.invite?.whitelist?.roles,
users: rsmData.invite?.whitelist?.channels, users: rsmData.invite?.whitelist?.channels
}, }
} }
}, },
welcome: { welcome: {
enabled: true, enabled: true,
role: rsmData.welcome?.role, role: rsmData.welcome?.role,
channel: rsmData.welcome?.message?.channel, channel: rsmData.welcome?.message?.channel,
message: rsmData.welcome?.message?.text ?? null, message: rsmData.welcome?.message?.text ?? null
}, },
logging: { logging: {
logs: { logs: {
enabled: true, enabled: true,
channel: rsmData.log_info?.log_channel, channel: rsmData.log_info?.log_channel
}, },
staff: { staff: {
channel: rsmData.log_info?.staff, channel: rsmData.log_info?.staff
} }
}, },
verify: { verify: {
enabled: true, enabled: true,
role: rsmData.verify_role, role: rsmData.verify_role
}, },
tickets: { tickets: {
enabled: true, enabled: true,
category: rsmData.modmail?.cat, category: rsmData.modmail?.cat,
supportRole: rsmData.modmail?.mention, supportRole: rsmData.modmail?.mention,
maxTickets: rsmData.modmail?.max, maxTickets: rsmData.modmail?.max
}, },
tags: rsmData.tags tags: rsmData.tags
} as Partial<ReturnType<typeof client.database.guilds.read>>; } as Partial<ReturnType<typeof client.database.guilds.read>>;
@ -75,5 +77,4 @@ for (const file of files) {
const merged = _.merge(nucleusData, rsmToNucleus); const merged = _.merge(nucleusData, rsmToNucleus);
// console.log(merged) // console.log(merged)
await client.database.guilds.write(merged.id!, merged); await client.database.guilds.write(merged.id!, merged);
} }

Loading…
Cancel
Save