Skip to content

Commit 9e8bf6f

Browse files
committed
Inject JS code into code execution
1 parent b4605bd commit 9e8bf6f

File tree

6 files changed

+111
-53
lines changed

6 files changed

+111
-53
lines changed

src/commands/prefixed/tools/code.ts

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Command, CommandClient } from 'detritus-client';
22

3-
import { CommandTypes } from '../../../constants';
3+
import { CodeLanguages, CommandTypes } from '../../../constants';
44
import { Formatter, Parameters, editOrReply, getCodeLanguage } from '../../../utils';
55

66
import { BaseCommand } from '../basecommand';
@@ -41,13 +41,24 @@ export default class CodeCommand extends BaseCommand<CommandArgs> {
4141
}
4242

4343
async run(context: Command.Context, args: CommandArgs) {
44-
const language = getCodeLanguage(args.code.language || args.language);
44+
let code = args.code.text;
45+
46+
let language: CodeLanguages | null = null;
47+
if (!args.code.language) {
48+
const parts = code.split(' ');
49+
language = getCodeLanguage(parts[0]);
50+
if (language) {
51+
code = parts.slice(1).join(' ');
52+
}
53+
}
54+
if (!language) {
55+
language = getCodeLanguage(args.code.language || args.language);
56+
}
57+
4558
if (!language) {
4659
return editOrReply(context, `Give me a valid language! (One of ${Formatter.Commands.ToolsCode.languagesText})`);
4760
}
48-
return Formatter.Commands.ToolsCode.createMessage(context, {
49-
code: args.code.text,
50-
language,
51-
});
61+
62+
return Formatter.Commands.ToolsCode.createMessage(context, {code, language});
5263
}
5364
}

src/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import {
1212

1313

1414

15+
export const MAX_MEMBERS_SAFE = 1000;
16+
1517
export const MOMENT_FORMAT = 'y [years], w [weeks], d [days], h [hours], m [minutes], s [seconds]';
1618
export const SNOWFLAKE_EPOCH = 1564790400000;
1719

src/utils/formatter/commands/tools.code.ts

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Command, Interaction } from 'detritus-client';
1+
import { Collections, Command, Interaction, Structures } from 'detritus-client';
22
import { MessageFlags } from 'detritus-client/lib/constants';
33
import { Embed, Markup } from 'detritus-client/lib/utils';
44

@@ -8,9 +8,17 @@ import {
88
CodeLanguagesToName,
99
EmbedBrands,
1010
EmbedColors,
11+
MAX_MEMBERS_SAFE,
1112
} from '../../../constants';
1213

13-
import { createUserEmbed, editOrReply, toTitleCase } from '../../tools';
14+
import {
15+
createUserEmbed,
16+
editOrReply,
17+
generateCodeFromLanguage,
18+
generateCodeStdin,
19+
toTitleCase,
20+
} from '../../tools';
21+
1422

1523

1624
export const languagesText = Object.values(CodeLanguages).map((x: any) => {
@@ -25,7 +33,7 @@ export const COMMAND_ID = 'tools code';
2533

2634
export interface CommandArgs {
2735
code: string,
28-
language: string,
36+
language: CodeLanguages,
2937
}
3038

3139
export async function createMessage(
@@ -34,26 +42,9 @@ export async function createMessage(
3442
) {
3543
const isFromInteraction = (context instanceof Interaction.InteractionContext);
3644

37-
let guild: any = context.guild;
38-
if (guild) {
39-
guild = guild.toJSON();
40-
guild.members = [];
41-
guild.presences = [];
42-
guild.voice_states = [];
43-
}
4445
const { content, error, stats } = await utilitiesCodeRun(context, {
45-
code: args.code,
46-
input: JSON.stringify({
47-
channel: context.channel,
48-
channel_id: context.channelId,
49-
guild,
50-
guild_id: context.guildId,
51-
member: context.member,
52-
member_bot: context.me,
53-
message: (context instanceof Command.Context) ? context.message : null,
54-
user: context.user,
55-
user_bot: context.client.user,
56-
}),
46+
code: generateCodeFromLanguage(args.language, args.code),
47+
input: generateCodeStdin(context),
5748
language: args.language,
5849
});
5950

src/utils/paginator.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,13 @@ export class Paginator {
467467
}; break;
468468
case PageButtonNames.STOP: {
469469
await this.onStop(null, true, context, true);
470+
if (context instanceof Command.Context && !context.message.deleted && context.message.canDelete) {
471+
try {
472+
await context.message.delete();
473+
} catch(error) {
474+
475+
}
476+
}
470477
}; break;
471478
default: {
472479
return;

src/utils/tags.ts

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import { runInNewContext } from 'vm';
22

3-
import { Command, Interaction, Structures } from 'detritus-client';
3+
import { Collections, Command, Interaction, Structures } from 'detritus-client';
44
import { MAX_ATTACHMENT_SIZE } from 'detritus-client/lib/constants';
55
import { Markup } from 'detritus-client/lib/utils';
66

77
import { utilitiesCodeRun, utilitiesFetchMedia, utilitiesFetchText, utilitiesImagescriptV1 } from '../api';
8-
import { CodeLanguages } from '../constants';
8+
import { CodeLanguages, MAX_MEMBERS_SAFE } from '../constants';
99

1010
import * as DefaultParameters from './defaultparameters';
1111
import * as Parameters from './parameters';
1212
import {
1313
bigIntGenerateBetween,
1414
bigIntMax,
1515
bigIntMin,
16+
generateCodeFromLanguage,
17+
generateCodeStdin,
1618
getCodeLanguage,
1719
randomFromArray,
1820
randomFromIterator,
@@ -95,7 +97,7 @@ export const AllowedDiscordProperties = Object.freeze({
9597

9698
export enum TagIfComparisons {
9799
EQUAL = '=',
98-
NOT_EQUAL = "!=",
100+
EQUAL_NOT = "!=",
99101
GREATER_THAN = '>',
100102
GREATER_THAN_OR_EQUAL = '>=',
101103
LESS_THAN = '<',
@@ -106,7 +108,7 @@ export enum TagIfComparisons {
106108

107109
export const TAG_IF_COMPARISONS = [
108110
TagIfComparisons.EQUAL,
109-
TagIfComparisons.NOT_EQUAL,
111+
TagIfComparisons.EQUAL_NOT,
110112
TagIfComparisons.GREATER_THAN,
111113
TagIfComparisons.GREATER_THAN_OR_EQUAL,
112114
TagIfComparisons.LESS_THAN,
@@ -485,27 +487,9 @@ const ScriptTags = Object.freeze({
485487
tag.variables[PrivateVariables.NETWORK_REQUESTS]++;
486488

487489
if (arg) {
488-
let guild: any = context.guild;
489-
if (guild) {
490-
guild = guild.toJSON();
491-
guild.members = [];
492-
guild.presences = [];
493-
guild.voice_states = [];
494-
}
495490
const response = await utilitiesCodeRun(context, {
496-
code: arg,
497-
input: JSON.stringify({
498-
channel: context.channel,
499-
channel_id: context.channelId,
500-
guild,
501-
guild_id: context.guildId,
502-
member: context.member,
503-
member_bot: context.me,
504-
message: (context instanceof Command.Context) ? context.message : null,
505-
user: context.user,
506-
user_bot: context.client.user,
507-
variables: tag.variables,
508-
}),
491+
code: generateCodeFromLanguage(language, arg),
492+
input: generateCodeStdin(context, tag.variables),
509493
language,
510494
});
511495
if (response.error) {
@@ -913,7 +897,7 @@ const ScriptTags = Object.freeze({
913897
case TagIfComparisons.EQUAL: {
914898
compared = values[0] === values[1];
915899
}; break;
916-
case TagIfComparisons.NOT_EQUAL: {
900+
case TagIfComparisons.EQUAL_NOT: {
917901
compared = values[0] !== values[1];
918902
}; break;
919903
case TagIfComparisons.GREATER_THAN:

src/utils/tools.ts

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
LanguageCodesText,
1919
Mimetypes,
2020
Timezones,
21+
MAX_MEMBERS_SAFE,
2122
MIMETYPES_SAFE_EMBED,
2223
TRUSTED_URLS,
2324
} from '../constants';
@@ -832,6 +833,68 @@ export function formatTime(ms: number, options: FormatTimeOptions = {}): string
832833
}
833834

834835

836+
export function generateCodeFromLanguage(language: CodeLanguages, code: string): string {
837+
switch (language) {
838+
case CodeLanguages.JAVASCRIPT: {
839+
code = `(() => {global.discord = JSON.parse(require('fs').readFileSync(0))})();` + '\n'.repeat(5) + code;
840+
}; break;
841+
}
842+
return code;
843+
}
844+
845+
846+
export function generateCodeStdin(
847+
context: Command.Context | Interaction.InteractionContext,
848+
variables?: Record<any, any>,
849+
): string {
850+
let guild: any = context.guild;
851+
if (guild) {
852+
guild = guild.toJSON();
853+
if (MAX_MEMBERS_SAFE < guild.members.length) {
854+
guild.members = new Collections.BaseCollection<string, Structures.Member>();
855+
guild.members.set(context.client.userId, context.me!);
856+
guild.members.set(context.userId, context.member!);
857+
for (let [userId, voiceState] of guild.voice_states) {
858+
guild.members.set(userId, voiceState.member!);
859+
}
860+
}
861+
862+
guild.presences = new Collections.BaseCollection<string, any>();
863+
for (let [userId, member] of guild.members) {
864+
const presence = member.presence;
865+
if (presence) {
866+
const data = presence.toJSON() as any;
867+
const guildIds = [guild.id];
868+
869+
data.guild_ids = guildIds;
870+
data.activities = data.activities.toArray().map((x: any) => x.toJSON());
871+
for (let x of data.activities) {
872+
x.guild_ids = guildIds;
873+
}
874+
if (data.game) {
875+
data.game.guild_ids = guildIds;
876+
}
877+
878+
guild.presences.set(userId, data);
879+
}
880+
}
881+
}
882+
883+
return JSON.stringify({
884+
channel: context.channel,
885+
channel_id: context.channelId,
886+
guild,
887+
guild_id: context.guildId,
888+
member: context.member,
889+
member_bot: context.me,
890+
message: (context instanceof Command.Context) ? context.message : null,
891+
user: context.user,
892+
user_bot: context.client.user,
893+
variables,
894+
});
895+
}
896+
897+
835898
export function getCodeLanguage(value?: string): CodeLanguages | null {
836899
if (value) {
837900
const insensitive = value.toUpperCase();

0 commit comments

Comments
 (0)