diff --git a/.env.example b/.env.example index 5a977bb24..59d90f078 100644 --- a/.env.example +++ b/.env.example @@ -18,6 +18,16 @@ # DISCORD_VOICE_CHANNELS=3 # DISCORD_BOT_NAME=CTFNote +# Enable this if you want users to be able to make accounts through the /register command in discord +# DISCORD_REGISTRATION_ENABLED=false + +# Which role the user should be granted on the ctfnote when creating a account through the bot +# DISCORD_REGISTRATION_CTFNOTE_ROLE=user_guest + +# If you want the bot to verify if a user has a specific role in the discord before allowing them to make a account through +# the Discord command, set the ID of the role below, else leave this field empty. +#DISCORD_REGISTRATION_ROLE_ID=discord_id + # Configure timezone and locale # TZ=Europe/Paris # LC_ALL=en_US.UTF-8 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..887ad3429 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +**/.yarn/releases/** binary +**/.yarn/plugins/** binary \ No newline at end of file diff --git a/.gitignore b/.gitignore index c05c53c29..90b3dbef0 100644 --- a/.gitignore +++ b/.gitignore @@ -132,16 +132,11 @@ temp/ # https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored .yarn/* -!.yarn/releases +!.yarn/cache +!.yarn/patches !.yarn/plugins +!.yarn/releases !.yarn/sdks !.yarn/versions -# if you are NOT using Zero-installs, then: -# comment the following lines -!.yarn/cache - -# and uncomment the following lines -# .pnp.* - # End of https://www.toptal.com/developers/gitignore/api/yarn,node diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..2e232da36 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "search.exclude": { + "**/.yarn": true, + "**/node_modules": true + } +} diff --git a/api/.gitignore b/api/.gitignore index a789943ab..73a1772f8 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -132,18 +132,13 @@ temp/ # https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored .yarn/* -!.yarn/releases +!.yarn/cache +!.yarn/patches !.yarn/plugins +!.yarn/releases !.yarn/sdks !.yarn/versions -# if you are NOT using Zero-installs, then: -# comment the following lines -!.yarn/cache - -# and uncomment the following lines -# .pnp.* - # End of https://www.toptal.com/developers/gitignore/api/yarn,node diff --git a/api/.yarn/cache/@typescript-eslint-parser-npm-7.16.0-4ab8d925d5-dc374e6c9e.zip b/api/.yarn/cache/@typescript-eslint-parser-npm-7.16.0-4ab8d925d5-dc374e6c9e.zip new file mode 100644 index 000000000..9c12c797e Binary files /dev/null and b/api/.yarn/cache/@typescript-eslint-parser-npm-7.16.0-4ab8d925d5-dc374e6c9e.zip differ diff --git a/api/.yarn/cache/@typescript-eslint-parser-npm-7.3.1-47e82bf9e5-018326010f.zip b/api/.yarn/cache/@typescript-eslint-parser-npm-7.3.1-47e82bf9e5-018326010f.zip deleted file mode 100644 index cf951e4cb..000000000 Binary files a/api/.yarn/cache/@typescript-eslint-parser-npm-7.3.1-47e82bf9e5-018326010f.zip and /dev/null differ diff --git a/api/.yarn/cache/@typescript-eslint-scope-manager-npm-7.16.0-d2b623c807-bf39a3ab80.zip b/api/.yarn/cache/@typescript-eslint-scope-manager-npm-7.16.0-d2b623c807-bf39a3ab80.zip new file mode 100644 index 000000000..ab67418a2 Binary files /dev/null and b/api/.yarn/cache/@typescript-eslint-scope-manager-npm-7.16.0-d2b623c807-bf39a3ab80.zip differ diff --git a/api/.yarn/cache/@typescript-eslint-types-npm-7.16.0-11f01089f2-0813d9eb15.zip b/api/.yarn/cache/@typescript-eslint-types-npm-7.16.0-11f01089f2-0813d9eb15.zip new file mode 100644 index 000000000..5caf972e0 Binary files /dev/null and b/api/.yarn/cache/@typescript-eslint-types-npm-7.16.0-11f01089f2-0813d9eb15.zip differ diff --git a/api/.yarn/cache/@typescript-eslint-typescript-estree-npm-7.16.0-a50da0d3d7-5719c0cb64.zip b/api/.yarn/cache/@typescript-eslint-typescript-estree-npm-7.16.0-a50da0d3d7-5719c0cb64.zip new file mode 100644 index 000000000..f776f9350 Binary files /dev/null and b/api/.yarn/cache/@typescript-eslint-typescript-estree-npm-7.16.0-a50da0d3d7-5719c0cb64.zip differ diff --git a/api/.yarn/cache/@typescript-eslint-visitor-keys-npm-7.16.0-13dcd1a3db-aae065bdd6.zip b/api/.yarn/cache/@typescript-eslint-visitor-keys-npm-7.16.0-13dcd1a3db-aae065bdd6.zip new file mode 100644 index 000000000..635fa5513 Binary files /dev/null and b/api/.yarn/cache/@typescript-eslint-visitor-keys-npm-7.16.0-13dcd1a3db-aae065bdd6.zip differ diff --git a/api/.yarn/cache/braces-npm-3.0.2-782240b28a-966b1fb48d.zip b/api/.yarn/cache/braces-npm-3.0.2-782240b28a-966b1fb48d.zip deleted file mode 100644 index 4cf997e3b..000000000 Binary files a/api/.yarn/cache/braces-npm-3.0.2-782240b28a-966b1fb48d.zip and /dev/null differ diff --git a/api/.yarn/cache/braces-npm-3.0.3-582c14023c-fad11a0d46.zip b/api/.yarn/cache/braces-npm-3.0.3-582c14023c-fad11a0d46.zip new file mode 100644 index 000000000..bebc93863 Binary files /dev/null and b/api/.yarn/cache/braces-npm-3.0.3-582c14023c-fad11a0d46.zip differ diff --git a/api/.yarn/cache/express-npm-4.19.1-d5e6949ba4-7b817f21af.zip b/api/.yarn/cache/express-npm-4.19.1-d5e6949ba4-7b817f21af.zip deleted file mode 100644 index 99eb07e3a..000000000 Binary files a/api/.yarn/cache/express-npm-4.19.1-d5e6949ba4-7b817f21af.zip and /dev/null differ diff --git a/api/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip b/api/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip new file mode 100644 index 000000000..310f90f2a Binary files /dev/null and b/api/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip differ diff --git a/api/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-e260f7592f.zip b/api/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-e260f7592f.zip deleted file mode 100644 index 7be5ed272..000000000 Binary files a/api/.yarn/cache/fill-range-npm-7.0.1-b8b1817caa-e260f7592f.zip and /dev/null differ diff --git a/api/.yarn/cache/fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip b/api/.yarn/cache/fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip new file mode 100644 index 000000000..2dbb57d46 Binary files /dev/null and b/api/.yarn/cache/fill-range-npm-7.1.1-bf491486db-a7095cb39e.zip differ diff --git a/api/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip b/api/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip deleted file mode 100644 index c751a851a..000000000 Binary files a/api/.yarn/cache/ip-npm-2.0.0-204facb3cc-1270b11e53.zip and /dev/null differ diff --git a/api/.yarn/cache/ip-npm-2.0.1-ee48691f03-d6dd154e1b.zip b/api/.yarn/cache/ip-npm-2.0.1-ee48691f03-d6dd154e1b.zip new file mode 100644 index 000000000..5764c675c Binary files /dev/null and b/api/.yarn/cache/ip-npm-2.0.1-ee48691f03-d6dd154e1b.zip differ diff --git a/api/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip b/api/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip new file mode 100644 index 000000000..4b97afd83 Binary files /dev/null and b/api/.yarn/cache/minimatch-npm-9.0.5-9aa93d97fa-dd6a8927b0.zip differ diff --git a/api/.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip b/api/.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip new file mode 100644 index 000000000..f3e5303fa Binary files /dev/null and b/api/.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip differ diff --git a/api/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip b/api/.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip similarity index 62% rename from api/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip rename to api/.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip index 194ce1253..066f40476 100644 Binary files a/api/.yarn/cache/tar-npm-6.2.0-3eb25205a7-2042bbb148.zip and b/api/.yarn/cache/tar-npm-6.2.1-237800bb20-bfbfbb2861.zip differ diff --git a/api/.yarn/cache/typescript-npm-5.4.3-702063d215-de4c69f49a.zip b/api/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip similarity index 56% rename from api/.yarn/cache/typescript-npm-5.4.3-702063d215-de4c69f49a.zip rename to api/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip index 5a815ac93..bb766b3d8 100644 Binary files a/api/.yarn/cache/typescript-npm-5.4.3-702063d215-de4c69f49a.zip and b/api/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip differ diff --git a/api/.yarn/cache/typescript-patch-0b5476accc-5aedd97595.zip b/api/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip similarity index 54% rename from api/.yarn/cache/typescript-patch-0b5476accc-5aedd97595.zip rename to api/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip index 59423582d..af3fc0ca3 100644 Binary files a/api/.yarn/cache/typescript-patch-0b5476accc-5aedd97595.zip and b/api/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip differ diff --git a/api/migrations/55-discord-account-invitation-link.sql b/api/migrations/55-discord-account-invitation-link.sql new file mode 100644 index 000000000..dff46b91d --- /dev/null +++ b/api/migrations/55-discord-account-invitation-link.sql @@ -0,0 +1,104 @@ +ALTER TABLE ctfnote_private.invitation_link + ADD COLUMN "discord_id" TEXT UNIQUE DEFAULT NULL; + +DROP FUNCTION ctfnote.create_invitation_link ("role" ctfnote.role); +CREATE OR REPLACE FUNCTION ctfnote.create_invitation_link ("role" ctfnote.role, "discord_id" text default null) + RETURNS ctfnote.invitation_link_response + AS $$ +DECLARE + invitation_link ctfnote_private.invitation_link; +BEGIN + INSERT INTO ctfnote_private.invitation_link ("role", "token", "discord_id") + VALUES (create_invitation_link.role, gen_random_uuid (), create_invitation_link.discord_id) + RETURNING + * INTO invitation_link; + RETURN ROW (invitation_link.token::text)::ctfnote.invitation_link_response; +END; +$$ +LANGUAGE plpgsql +SECURITY DEFINER; + +GRANT EXECUTE ON FUNCTION ctfnote.create_invitation_link (ctfnote.role, text) TO user_admin; + +CREATE OR REPLACE FUNCTION ctfnote.register_with_token ("token" text, "login" text, "password" text) + RETURNS ctfnote.jwt + AS $$ +DECLARE + invitation_role ctfnote.role; + invitation_discord_id text; +BEGIN + SELECT + ROLE, discord_id INTO invitation_role, invitation_discord_id + FROM + ctfnote_private.invitation_link + WHERE + invitation_link.token::text = register_with_token.token + AND expiration > now(); + IF invitation_role IS NOT NULL THEN + DELETE FROM ctfnote_private.invitation_link + WHERE invitation_link.token::text = register_with_token.token; + IF invitation_discord_id IS NOT NULL THEN + RETURN ctfnote_private.do_register (register_with_token.login, register_with_token.password, invitation_role, invitation_discord_id); + ELSE + RETURN ctfnote_private.do_register (register_with_token.login, register_with_token.password, invitation_role); + END IF; + ELSE + RAISE EXCEPTION 'Invalid token'; + END IF; +END +$$ +LANGUAGE plpgsql +SECURITY DEFINER; + +GRANT EXECUTE ON FUNCTION ctfnote.register_with_token (text, text, text) TO user_anonymous; + +-- first we remove and re-apply the old internal registration function to be extra verbose +-- we implement the additional logic for registration with discord_id in a seperate function with the same name, thus overloading this function for normal original operation and +-- operation with the new discord id linking. +DROP FUNCTION ctfnote_private.do_register ("login" text, "password" text, "role" ctfnote.role); + +CREATE OR REPLACE FUNCTION ctfnote_private.do_register ("login" text, "password" text, "role" ctfnote.role) + RETURNS ctfnote.jwt + AS $$ +DECLARE + new_user ctfnote_private.user; +BEGIN + INSERT INTO ctfnote_private.user ("login", "password", "role") + VALUES (do_register.login, crypt(do_register.password, gen_salt('bf')), do_register.role) + RETURNING + * INTO new_user; + INSERT INTO ctfnote.profile ("id", "username") + VALUES (new_user.id, do_register.login); + RETURN (ctfnote_private.new_token (new_user.id))::ctfnote.jwt; +EXCEPTION + WHEN unique_violation THEN + RAISE EXCEPTION 'Username already taken'; +END; +$$ +LANGUAGE plpgsql +STRICT +SECURITY DEFINER; + +-- overloaded function, implements the logic needed for discord linking. +CREATE OR REPLACE FUNCTION ctfnote_private.do_register ("login" text, "password" text, "role" ctfnote.role, "discord_id" text) + RETURNS ctfnote.jwt + AS $$ +DECLARE + new_user ctfnote_private.user; +BEGIN + INSERT INTO ctfnote_private.user ("login", "password", "role") + VALUES (do_register.login, crypt(do_register.password, gen_salt('bf')), do_register.role) + RETURNING + * INTO new_user; + INSERT INTO ctfnote.profile ("id", "username", "discord_id") + VALUES (new_user.id, do_register.login, do_register.discord_id); + RETURN (ctfnote_private.new_token (new_user.id))::ctfnote.jwt; +EXCEPTION + WHEN unique_violation THEN + RAISE EXCEPTION 'Username already taken'; +END; +$$ +LANGUAGE plpgsql +STRICT +SECURITY DEFINER; + diff --git a/api/migrations/56-add-discord-integration-enabled.sql b/api/migrations/56-add-discord-integration-enabled.sql new file mode 100644 index 000000000..bfa1bd55c --- /dev/null +++ b/api/migrations/56-add-discord-integration-enabled.sql @@ -0,0 +1,8 @@ +ALTER TABLE ctfnote.settings + ADD COLUMN "discord_integration_enabled" boolean NOT NULL DEFAULT FALSE; + +GRANT SELECT ("discord_integration_enabled") ON ctfnote.settings TO user_anonymous; +REVOKE UPDATE ON ctfnote.settings FROM user_admin; +GRANT UPDATE (unique_id, registration_allowed, registration_password_allowed, registration_password, registration_default_role, style, ical_password) ON ctfnote.settings TO user_admin; +GRANT UPDATE ("discord_integration_enabled") ON ctfnote.settings TO user_postgraphile; + diff --git a/api/package.json b/api/package.json index a7e760ffa..e021ea549 100644 --- a/api/package.json +++ b/api/package.json @@ -25,7 +25,7 @@ "axios": "^1.6.8", "discord.js": "^14.14.1", "dotenv": "^16.4.5", - "express": "^4.19.1", + "express": "^4.19.2", "graphile-utils": "4.13.0", "graphql": "^16.8.1", "graphql-upload-ts": "^2.1.2", @@ -38,13 +38,13 @@ "devDependencies": { "@types/express": "^4.17.21", "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", + "@typescript-eslint/parser": "^7.16.0", "eslint": "^8.57.0", "lint-staged": "^15.2.2", "nodemon": "^3.1.0", "prettier": "^3.2.5", "ts-node": "^10.9.2", - "typescript": "^5.4.3" + "typescript": "^5.4.5" }, "packageManager": "yarn@4.1.1" } diff --git a/api/src/config.ts b/api/src/config.ts index 4076db417..353a69062 100644 --- a/api/src/config.ts +++ b/api/src/config.ts @@ -42,6 +42,9 @@ export type CTFNoteConfig = DeepReadOnly<{ voiceChannels: number; botName: string; maxChannelsPerCategory: number; + registrationEnabled: string; + registrationAccountRole: string; + registrationRoleId: string; }; }>; @@ -92,7 +95,13 @@ const config: CTFNoteConfig = { serverId: getEnv("DISCORD_SERVER_ID"), voiceChannels: getEnvInt("DISCORD_VOICE_CHANNELS"), botName: getEnv("DISCORD_BOT_NAME", "CTFNote"), - maxChannelsPerCategory: 50, // 50 is the hard Discord limit + maxChannelsPerCategory: 50, //! 50 is the hard Discord limit + registrationEnabled: getEnv("DISCORD_REGISTRATION_ENABLED", "false"), + registrationAccountRole: getEnv( + "DISCORD_REGISTRATION_CTFNOTE_ROLE", + "user_guest" + ), + registrationRoleId: getEnv("DISCORD_REGISTRATION_ROLE_ID", ""), }, }; diff --git a/api/src/discord/commands.ts b/api/src/discord/commands.ts index 7e729ac60..18c9705ba 100644 --- a/api/src/discord/commands.ts +++ b/api/src/discord/commands.ts @@ -5,6 +5,7 @@ import { SolveTask } from "./commands/solveTask"; import { LinkUser } from "./commands/linkUser"; import { StartWorking, StopWorking } from "./commands/workingOn"; import { DeleteCtf } from "./commands/deleteCtf"; +import { Register } from "./commands/register"; export const Commands: Command[] = [ ArchiveCtf, @@ -14,4 +15,5 @@ export const Commands: Command[] = [ StartWorking, StopWorking, DeleteCtf, + Register, ]; diff --git a/api/src/discord/commands/register.ts b/api/src/discord/commands/register.ts new file mode 100644 index 000000000..a6a68b914 --- /dev/null +++ b/api/src/discord/commands/register.ts @@ -0,0 +1,127 @@ +import { + ApplicationCommandType, + Client, + CommandInteraction, + GuildMemberRoleManager, +} from "discord.js"; +import { Command } from "../command"; +import { + AllowedRoles, + createInvitationTokenForDiscordId, + getInvitationTokenForDiscordId, + getUserByDiscordId, +} from "../database/users"; +import config from "../../config"; + +async function getInvitationUrl(invitationCode: string | null = null) { + if (config.pad.domain == "") return null; + if (invitationCode == null) return null; + + const ssl = config.pad.useSSL == "false" ? "" : "s"; + + return `http${ssl}://${config.pad.domain}/#/auth/register/${invitationCode}`; +} + +async function getProfileUrl() { + if (config.pad.domain == "") return null; + + const ssl = config.pad.useSSL == "false" ? "" : "s"; + + return `http${ssl}://${config.pad.domain}/#/user/settings`; +} + +async function registerLogic(client: Client, interaction: CommandInteraction) { + if (config.discord.registrationEnabled.toLowerCase() !== "true") { + await interaction.editReply({ + content: + "The functionality to create your own account this way has been disabled by an administrator.", + }); + return; + } + + if (config.discord.registrationRoleId !== "") { + if ( + !(interaction.member?.roles as GuildMemberRoleManager).cache.has( + config.discord.registrationRoleId + ) + ) { + await interaction.editReply({ + content: + "You do not have the role required to create an account yourself.", + }); + return; + } + } + + const userId = await getUserByDiscordId(interaction.user.id); + if (userId != null) { + await interaction.editReply({ + content: + "You can't link the same Discord account twice! If you do not have a CTFNote account or haven't linked it, contact an administrator.", + }); + return; + } + + const existingInvitationCode = await getInvitationTokenForDiscordId( + interaction.user.id + ); + if (existingInvitationCode != null) { + const invitationUrl = await getInvitationUrl(existingInvitationCode); + if (invitationUrl == null) { + await interaction.editReply({ + content: + "Could not generate invitation URL. Please contact an administrator.", + }); + return; + } + + await interaction.editReply({ + content: `Your personal invitation url: ${invitationUrl}.\n-# If you already have a CTFNote account you should link it using the \`/link\` command using the Discord token from your profile: ${await getProfileUrl()}.`, + }); + return; + } + + await interaction.editReply({ + content: + "Generating a private invitation URL... If you already have a CTFNote account you should link it using the `/link` command instead.", + }); + + const invitationCode = await createInvitationTokenForDiscordId( + interaction.user.id, + (config.discord.registrationAccountRole as AllowedRoles) ?? + AllowedRoles.user_guest + ); + + if (invitationCode == null) { + await interaction.editReply({ + content: + "Could not generate an invitation code. Please contact an administrator.", + }); + return; + } + + const invitationUrl = await getInvitationUrl(invitationCode); + if (invitationUrl == null) { + await interaction.editReply({ + content: + "Could not get an invitation URL. Please contact an administrator.", + }); + return; + } + + await interaction.editReply({ + content: `Your personal invitation url: ${invitationUrl}.\n-# If you already have a CTFNote account you should link it using the \`/link\` command using the Discord token from your profile: ${await getProfileUrl()}.`, + }); + return; +} + +export const Register: Command = { + name: "register", + description: "Create an account on CTFNote (if enabled)!", + type: ApplicationCommandType.ChatInput, + run: async (client, interaction) => { + return registerLogic(client, interaction).catch((e) => { + console.error("Error during /register Discord logic: ", e); + }); + }, +}; diff --git a/api/src/discord/database/users.ts b/api/src/discord/database/users.ts index ecca8306f..6a34997ac 100644 --- a/api/src/discord/database/users.ts +++ b/api/src/discord/database/users.ts @@ -45,6 +45,59 @@ export async function setDiscordIdForUser( } } +// refactor above to an enum +export enum AllowedRoles { + user_guest = "user_guest", + user_friend = "user_friend", + user_member = "user_member", + user_manager = "user_manager", + user_admin = "user_admin", +} + +export async function getInvitationTokenForDiscordId( + discordId: string, + pgClient: PoolClient | null = null +): Promise { + const useRequestClient = pgClient != null; + if (pgClient == null) pgClient = await connectToDatabase(); + + try { + const query = + "SELECT token FROM ctfnote_private.invitation_link WHERE discord_id = $1"; + const values = [discordId]; + const queryResult = await pgClient.query(query, values); + + return queryResult.rows[0].token as string; + } catch (error) { + return null; + } finally { + if (!useRequestClient) pgClient.release(); + } +} + +export async function createInvitationTokenForDiscordId( + discordId: string, + role: AllowedRoles = AllowedRoles.user_guest, + pgClient: PoolClient | null = null +): Promise { + role = (role as AllowedRoles) ?? AllowedRoles.user_guest; + + const useRequestClient = pgClient != null; + if (pgClient == null) pgClient = await connectToDatabase(); + + try { + const query = "SELECT token FROM ctfnote.create_invitation_link($1, $2)"; + const values = [role, discordId]; + const queryResult = await pgClient.query(query, values); + + return queryResult.rows[0].token as string; + } catch (error) { + return null; + } finally { + if (!useRequestClient) pgClient.release(); + } +} + export async function getUserByDiscordId( discordId: string, pgClient: PoolClient | null = null @@ -106,3 +159,23 @@ export async function getDiscordUsersThatCanPlayCTF( pgClient.release(); } } + +export async function getUserIdFromUsername( + username: string, + pgClient: PoolClient | null = null +): Promise { + const useRequestClient = pgClient != null; + if (pgClient == null) pgClient = await connectToDatabase(); + + try { + const query = "SELECT id FROM ctfnote.profile WHERE username = $1"; + const values = [username]; + const queryResult = await pgClient.query(query, values); + + return queryResult.rows[0].id as bigint; + } catch (error) { + return null; + } finally { + if (!useRequestClient) pgClient.release(); + } +} diff --git a/api/src/index.ts b/api/src/index.ts index 8d92cc41e..b28461238 100644 --- a/api/src/index.ts +++ b/api/src/index.ts @@ -22,6 +22,7 @@ import discordHooks from "./plugins/discordHooks"; import { getDiscordClient } from "./discord"; import PgManyToManyPlugin from "@graphile-contrib/pg-many-to-many"; import ProfileSubscriptionPlugin from "./plugins/ProfileSubscriptionPlugin"; +import { connectToDatabase } from "./discord/database/database"; function getDbUrl(role: "user" | "admin") { const login = config.db[role].login; @@ -154,6 +155,22 @@ async function main() { getDiscordClient(); + const pgClient = await connectToDatabase(); //? maybe we should not keep this dependency in the discord folder? + + try { + const query = + "UPDATE ctfnote.settings SET discord_integration_enabled = $1"; + const values = [config.discord.use.toLowerCase() !== "false"]; + await pgClient.query(query, values); + } catch (error) { + console.error( + "Failed to set discord_integration_enabled flag in the database:", + error + ); + } finally { + pgClient.release(); + } + app.listen(config.web.port, () => { //sendMessageToDiscord("CTFNote API started"); console.log(`Listening on :${config.web.port}`); diff --git a/api/src/plugins/discordHooks.ts b/api/src/plugins/discordHooks.ts index f90309bcc..45571d64b 100644 --- a/api/src/plugins/discordHooks.ts +++ b/api/src/plugins/discordHooks.ts @@ -9,7 +9,10 @@ import { } from "../discord/database/ctfs"; import { getDiscordGuild, usingDiscordBot } from "../discord"; import { changeDiscordUserRoleForCTF } from "../discord/commands/linkUser"; -import { getDiscordIdFromUserId } from "../discord/database/users"; +import { + getDiscordIdFromUserId, + getUserIdFromUsername, +} from "../discord/database/users"; import { Task, getTaskByCtfIdAndNameFromDatabase, @@ -94,7 +97,8 @@ const discordMutationHook = (_build: Build) => (fieldContext: Context) => { fieldContext.scope.fieldName !== "resetDiscordId" && fieldContext.scope.fieldName !== "deleteCtf" && fieldContext.scope.fieldName !== "updateUserRole" && - fieldContext.scope.fieldName !== "setDiscordEventLink" + fieldContext.scope.fieldName !== "setDiscordEventLink" && + fieldContext.scope.fieldName !== "registerWithToken" ) { return null; } @@ -279,6 +283,30 @@ const discordMutationHook = (_build: Build) => (fieldContext: Context) => { }); } + /* + * We have a nice ductape solution for the following problem: + * During the handling of these hooks, the changes to the database are not committed yet. + * This means that we can't query the database for the new user id. + * We have to wait a bit to make sure the user is in the database. + * Alternatively we can hook the postgraphile lifecycle but that is not compatible with the current setup. + * The outgoing request is probably handling within 1 second, so this works fine. + */ + if (fieldContext.scope.fieldName === "registerWithToken") { + const username = args.input.login; // the login is equal to the username at registration + setTimeout(async () => { + const userId = await getUserIdFromUsername(username, null); // use null to get a new client which is privileged as the Discord bot + if (userId == null) return; + const ctfs = await getAccessibleCTFsForUser(userId, null); + for (let i = 0; i < ctfs.length; i++) { + await changeDiscordUserRoleForCTF(userId, ctfs[i], "add").catch( + (err) => { + console.error("Error while adding role to user: ", err); + } + ); + } + }, 2000); + } + return input; }; diff --git a/api/yarn.lock b/api/yarn.lock index 05cbabe87..751d7d2d4 100644 --- a/api/yarn.lock +++ b/api/yarn.lock @@ -577,21 +577,31 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/parser@npm:^7.3.1": - version: 7.3.1 - resolution: "@typescript-eslint/parser@npm:7.3.1" - dependencies: - "@typescript-eslint/scope-manager": "npm:7.3.1" - "@typescript-eslint/types": "npm:7.3.1" - "@typescript-eslint/typescript-estree": "npm:7.3.1" - "@typescript-eslint/visitor-keys": "npm:7.3.1" +"@typescript-eslint/parser@npm:^7.16.0": + version: 7.16.0 + resolution: "@typescript-eslint/parser@npm:7.16.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:7.16.0" + "@typescript-eslint/types": "npm:7.16.0" + "@typescript-eslint/typescript-estree": "npm:7.16.0" + "@typescript-eslint/visitor-keys": "npm:7.16.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.56.0 peerDependenciesMeta: typescript: optional: true - checksum: 10/018326010fec1dcefd75809ccac5102a475bf1e052d824b898d707e7c0bf3e51e101164b410d1b2a513628985c96eb412538644d2005e26b99a22db6eb9402df + checksum: 10/dc374e6c9e7dfcdd968828bb32ef59d3ebabd0a18671dee22d14dda2c713dade6eb493fd11b127df17035c7451898b42f4a88102da9a4bf3ca6a3baed8c20309 + languageName: node + linkType: hard + +"@typescript-eslint/scope-manager@npm:7.16.0": + version: 7.16.0 + resolution: "@typescript-eslint/scope-manager@npm:7.16.0" + dependencies: + "@typescript-eslint/types": "npm:7.16.0" + "@typescript-eslint/visitor-keys": "npm:7.16.0" + checksum: 10/bf39a3ab803503c33e6c33568e7b93793d53d18100cb2f2ec1a540121aeba74d291d19c9ad3933198ff15e53a46d2f92db0c54309259dc99c1e3e297becd5677 languageName: node linkType: hard @@ -622,6 +632,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:7.16.0": + version: 7.16.0 + resolution: "@typescript-eslint/types@npm:7.16.0" + checksum: 10/0813d9eb158f984b9d7e9e83961533ddc1e8c8815ca9059dab820df276b1e537b183f4c83cc4fe79ab3865cde1a64f2ec3f7fffe7209872d7d404636299f630b + languageName: node + linkType: hard + "@typescript-eslint/types@npm:7.3.1": version: 7.3.1 resolution: "@typescript-eslint/types@npm:7.3.1" @@ -629,6 +646,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:7.16.0": + version: 7.16.0 + resolution: "@typescript-eslint/typescript-estree@npm:7.16.0" + dependencies: + "@typescript-eslint/types": "npm:7.16.0" + "@typescript-eslint/visitor-keys": "npm:7.16.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/5719c0cb649d627a073f1c8994a6073acc211ecfce0daef61d2de4315e42a23cf79e4dacb3b3596c4792eab062fdd22080c62345e2a58d38e7268eb6103a46d4 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:7.3.1": version: 7.3.1 resolution: "@typescript-eslint/typescript-estree@npm:7.3.1" @@ -665,6 +701,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:7.16.0": + version: 7.16.0 + resolution: "@typescript-eslint/visitor-keys@npm:7.16.0" + dependencies: + "@typescript-eslint/types": "npm:7.16.0" + eslint-visitor-keys: "npm:^3.4.3" + checksum: 10/aae065bdd6d5681d40df51af24933fc86c15f355f9d8f85c39a506f352ddc2a76fc72d4f8cf823ebb7550c84d543605a2fdd7d06979a0967cd48c1f542436714 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:7.3.1": version: 7.3.1 resolution: "@typescript-eslint/visitor-keys@npm:7.3.1" @@ -960,11 +1006,11 @@ __metadata: linkType: hard "braces@npm:^3.0.2, braces@npm:~3.0.2": - version: 3.0.2 - resolution: "braces@npm:3.0.2" + version: 3.0.3 + resolution: "braces@npm:3.0.3" dependencies: - fill-range: "npm:^7.0.1" - checksum: 10/966b1fb48d193b9d155f810e5efd1790962f2c4e0829f8440b8ad236ba009222c501f70185ef732fef17a4c490bb33a03b90dab0631feafbdf447da91e8165b1 + fill-range: "npm:^7.1.1" + checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 languageName: node linkType: hard @@ -1258,12 +1304,12 @@ __metadata: "@graphile/pg-pubsub": "npm:4.13.0" "@types/express": "npm:^4.17.21" "@typescript-eslint/eslint-plugin": "npm:^7.3.1" - "@typescript-eslint/parser": "npm:^7.3.1" + "@typescript-eslint/parser": "npm:^7.16.0" axios: "npm:^1.6.8" discord.js: "npm:^14.14.1" dotenv: "npm:^16.4.5" eslint: "npm:^8.57.0" - express: "npm:^4.19.1" + express: "npm:^4.19.2" graphile-utils: "npm:4.13.0" graphql: "npm:^16.8.1" graphql-upload-ts: "npm:^2.1.2" @@ -1276,7 +1322,7 @@ __metadata: prettier: "npm:^3.2.5" slugify: "npm:^1.6.6" ts-node: "npm:^10.9.2" - typescript: "npm:^5.4.3" + typescript: "npm:^5.4.5" languageName: unknown linkType: soft @@ -1652,9 +1698,9 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.19.1": - version: 4.19.1 - resolution: "express@npm:4.19.1" +"express@npm:^4.19.2": + version: 4.19.2 + resolution: "express@npm:4.19.2" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" @@ -1687,7 +1733,7 @@ __metadata: type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: 10/7b817f21afe96e478cd7fe77cd5f52cf7d2d6b70c3e98f0e1399ce48356cef3c5f5d34bf93bdbc7bc326403005c45e2f8522f51b4cc319da52220066c9094745 + checksum: 10/3fcd792536f802c059789ef48db3851b87e78fba103423e524144d79af37da7952a2b8d4e1a007f423329c7377d686d9476ac42e7d9ea413b80345d495e30a3a languageName: node linkType: hard @@ -1743,12 +1789,12 @@ __metadata: languageName: node linkType: hard -"fill-range@npm:^7.0.1": - version: 7.0.1 - resolution: "fill-range@npm:7.0.1" +"fill-range@npm:^7.1.1": + version: 7.1.1 + resolution: "fill-range@npm:7.1.1" dependencies: to-regex-range: "npm:^5.0.1" - checksum: 10/e260f7592fd196b4421504d3597cc76f4a1ca7a9488260d533b611fc3cefd61e9a9be1417cb82d3b01ad9f9c0ff2dbf258e1026d2445e26b0cf5148ff4250429 + checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea languageName: node linkType: hard @@ -2365,9 +2411,9 @@ __metadata: linkType: hard "ip@npm:^2.0.0": - version: 2.0.0 - resolution: "ip@npm:2.0.0" - checksum: 10/1270b11e534a466fb4cf4426cbcc3a907c429389f7f4e4e3b288b42823562e88d6a509ceda8141a507de147ca506141f745005c0aa144569d94cf24a54eb52bc + version: 2.0.1 + resolution: "ip@npm:2.0.1" + checksum: 10/d6dd154e1bc5e8725adfdd6fb92218635b9cbe6d873d051bd63b178f009777f751a5eea4c67021723a7056325fc3052f8b6599af0a2d56f042c93e684b4a0349 languageName: node linkType: hard @@ -2839,6 +2885,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.4": + version: 9.0.5 + resolution: "minimatch@npm:9.0.5" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 + languageName: node + linkType: hard + "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -3668,6 +3723,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.0": + version: 7.6.2 + resolution: "semver@npm:7.6.2" + bin: + semver: bin/semver.js + checksum: 10/296b17d027f57a87ef645e9c725bff4865a38dfc9caf29b26aa084b85820972fbe7372caea1ba6857162fa990702c6d9c1d82297cecb72d56c78ab29070d2ca2 + languageName: node + linkType: hard + "send@npm:0.18.0": version: 0.18.0 resolution: "send@npm:0.18.0" @@ -3993,8 +4057,8 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.2.0 - resolution: "tar@npm:6.2.0" + version: 6.2.1 + resolution: "tar@npm:6.2.1" dependencies: chownr: "npm:^2.0.0" fs-minipass: "npm:^2.0.0" @@ -4002,7 +4066,7 @@ __metadata: minizlib: "npm:^2.1.1" mkdirp: "npm:^1.0.3" yallist: "npm:^4.0.0" - checksum: 10/2042bbb14830b5cd0d584007db0eb0a7e933e66d1397e72a4293768d2332449bc3e312c266a0887ec20156dea388d8965e53b4fc5097f42d78593549016da089 + checksum: 10/bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 languageName: node linkType: hard @@ -4040,7 +4104,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": version: 1.3.0 resolution: "ts-api-utils@npm:1.3.0" peerDependencies: @@ -4134,23 +4198,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.4.3": - version: 5.4.3 - resolution: "typescript@npm:5.4.3" +"typescript@npm:^5.4.5": + version: 5.4.5 + resolution: "typescript@npm:5.4.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/de4c69f49a7ad4b1ea66a6dcc8b055ac34eb56af059a069d8988dd811c5e649be07e042e5bf573e8d0ac3ec2f30e6c999aa651cd09f6e9cbc6113749e8b6be20 + checksum: 10/d04a9e27e6d83861f2126665aa8d84847e8ebabcea9125b9ebc30370b98cb38b5dff2508d74e2326a744938191a83a69aa9fddab41f193ffa43eabfdf3f190a5 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.4.3#optional!builtin": - version: 5.4.3 - resolution: "typescript@patch:typescript@npm%3A5.4.3#optional!builtin::version=5.4.3&hash=5adc0c" +"typescript@patch:typescript@npm%3A^5.4.5#optional!builtin": + version: 5.4.5 + resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/5aedd97595582b08aadb8a70e8e3ddebaf5a9c1e5ad4d6503c2fcfc15329b5cf8d01145b09913e9555683ac16c5123a96be32b6d72614098ebd42df520eed9b1 + checksum: 10/760f7d92fb383dbf7dee2443bf902f4365db2117f96f875cf809167f6103d55064de973db9f78fe8f31ec08fff52b2c969aee0d310939c0a3798ec75d0bca2e1 languageName: node linkType: hard diff --git a/docker-compose.yml b/docker-compose.yml index fa8a22df7..a9db482f0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,6 +25,9 @@ services: DISCORD_BOT_TOKEN: ${DISCORD_BOT_TOKEN:-bot_token} DISCORD_SERVER_ID: ${DISCORD_SERVER_ID:-server_id} DISCORD_VOICE_CHANNELS: ${DISCORD_VOICE_CHANNELS:-3} + DISCORD_REGISTRATION_ENABLED: ${DISCORD_REGISTRATION_ENABLED:-false} + DISCORD_REGISTRATION_CTFNOTE_ROLE: ${DISCORD_REGISTRATION_CTFNOTE_ROLE} + DISCORD_REGISTRATION_ROLE_ID: ${DISCORD_REGISTRATION_ROLE_ID} TZ: ${TZ:-UTC} LC_ALL: ${LC_ALL:-en_US.UTF-8} SESSION_SECRET: ${SESSION_SECRET:-} diff --git a/front/.gitignore b/front/.gitignore index 0b4057a23..fa0267c81 100644 --- a/front/.gitignore +++ b/front/.gitignore @@ -32,3 +32,17 @@ yarn-error.log* *.njsproj *.sln .vscode + +# Yarn Integrity file +.yarn-integrity + +### yarn ### +# https://yarnpkg.com/advanced/qa#which-files-should-be-gitignored + +.yarn/* +!.yarn/cache +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions diff --git a/front/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-b95682a852.zip b/front/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-b95682a852.zip new file mode 100644 index 000000000..7b29dcc64 Binary files /dev/null and b/front/.yarn/cache/@discoveryjs-json-ext-npm-0.5.7-fe04af1f31-b95682a852.zip differ diff --git a/front/.yarn/cache/@polka-url-npm-1.0.0-next.23-816bf197c2-4b0330de1c.zip b/front/.yarn/cache/@polka-url-npm-1.0.0-next.23-816bf197c2-4b0330de1c.zip deleted file mode 100644 index 848a8ee11..000000000 Binary files a/front/.yarn/cache/@polka-url-npm-1.0.0-next.23-816bf197c2-4b0330de1c.zip and /dev/null differ diff --git a/front/.yarn/cache/@polka-url-npm-1.0.0-next.25-a523d9bd78-4ab1d7a371.zip b/front/.yarn/cache/@polka-url-npm-1.0.0-next.25-a523d9bd78-4ab1d7a371.zip new file mode 100644 index 000000000..4d233ed96 Binary files /dev/null and b/front/.yarn/cache/@polka-url-npm-1.0.0-next.25-a523d9bd78-4ab1d7a371.zip differ diff --git a/front/.yarn/cache/@quasar-app-webpack-npm-3.12.4-51bb557381-18d0342fd2.zip b/front/.yarn/cache/@quasar-app-webpack-npm-3.13.2-9b9c6d1a23-e337fcbd02.zip similarity index 90% rename from front/.yarn/cache/@quasar-app-webpack-npm-3.12.4-51bb557381-18d0342fd2.zip rename to front/.yarn/cache/@quasar-app-webpack-npm-3.13.2-9b9c6d1a23-e337fcbd02.zip index 6c23683d7..2426b3b29 100644 Binary files a/front/.yarn/cache/@quasar-app-webpack-npm-3.12.4-51bb557381-18d0342fd2.zip and b/front/.yarn/cache/@quasar-app-webpack-npm-3.13.2-9b9c6d1a23-e337fcbd02.zip differ diff --git a/front/.yarn/cache/@types-compression-npm-1.7.3-421a8043b4-eaa67663f9.zip b/front/.yarn/cache/@types-compression-npm-1.7.3-421a8043b4-eaa67663f9.zip deleted file mode 100644 index d99bafb9a..000000000 Binary files a/front/.yarn/cache/@types-compression-npm-1.7.3-421a8043b4-eaa67663f9.zip and /dev/null differ diff --git a/front/.yarn/cache/@types-compression-npm-1.7.5-43eae9707b-9d65485bfb.zip b/front/.yarn/cache/@types-compression-npm-1.7.5-43eae9707b-9d65485bfb.zip new file mode 100644 index 000000000..577ea6ed4 Binary files /dev/null and b/front/.yarn/cache/@types-compression-npm-1.7.5-43eae9707b-9d65485bfb.zip differ diff --git a/front/.yarn/cache/@types-express-npm-4.17.15-f269888d96-0bcda0e398.zip b/front/.yarn/cache/@types-express-npm-4.17.15-f269888d96-0bcda0e398.zip deleted file mode 100644 index e6180b8ba..000000000 Binary files a/front/.yarn/cache/@types-express-npm-4.17.15-f269888d96-0bcda0e398.zip and /dev/null differ diff --git a/front/.yarn/cache/@types-express-npm-4.17.21-be92a0245e-7a6d26cf6f.zip b/front/.yarn/cache/@types-express-npm-4.17.21-be92a0245e-7a6d26cf6f.zip new file mode 100644 index 000000000..97ffe4421 Binary files /dev/null and b/front/.yarn/cache/@types-express-npm-4.17.21-be92a0245e-7a6d26cf6f.zip differ diff --git a/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.6.0-38e8bff425-a0048e28f9.zip b/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.6.0-38e8bff425-a0048e28f9.zip deleted file mode 100644 index 9121422e3..000000000 Binary files a/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.6.0-38e8bff425-a0048e28f9.zip and /dev/null differ diff --git a/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.7.0-1629126e38-2d9a2d4e26.zip b/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.7.0-1629126e38-2d9a2d4e26.zip new file mode 100644 index 000000000..28e3810a0 Binary files /dev/null and b/front/.yarn/cache/@types-webpack-bundle-analyzer-npm-4.7.0-1629126e38-2d9a2d4e26.zip differ diff --git a/front/.yarn/cache/autoprefixer-npm-10.4.13-261edbcee5-0aefb9b115.zip b/front/.yarn/cache/autoprefixer-npm-10.4.13-261edbcee5-0aefb9b115.zip deleted file mode 100644 index 0109badb6..000000000 Binary files a/front/.yarn/cache/autoprefixer-npm-10.4.13-261edbcee5-0aefb9b115.zip and /dev/null differ diff --git a/front/.yarn/cache/autoprefixer-npm-10.4.19-7c86a73b2f-98378eae37.zip b/front/.yarn/cache/autoprefixer-npm-10.4.19-7c86a73b2f-98378eae37.zip new file mode 100644 index 000000000..66df265d2 Binary files /dev/null and b/front/.yarn/cache/autoprefixer-npm-10.4.19-7c86a73b2f-98378eae37.zip differ diff --git a/front/.yarn/cache/browserslist-npm-4.23.2-35c88a7025-326a98b1c3.zip b/front/.yarn/cache/browserslist-npm-4.23.2-35c88a7025-326a98b1c3.zip new file mode 100644 index 000000000..460f74634 Binary files /dev/null and b/front/.yarn/cache/browserslist-npm-4.23.2-35c88a7025-326a98b1c3.zip differ diff --git a/front/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip b/front/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip deleted file mode 100644 index df3951c35..000000000 Binary files a/front/.yarn/cache/camel-case-npm-3.0.0-d87e5afe35-4190ed6ab8.zip and /dev/null differ diff --git a/front/.yarn/cache/caniuse-lite-npm-1.0.30001642-794b0b6b47-8d80ea82be.zip b/front/.yarn/cache/caniuse-lite-npm-1.0.30001642-794b0b6b47-8d80ea82be.zip new file mode 100644 index 000000000..ef6786921 Binary files /dev/null and b/front/.yarn/cache/caniuse-lite-npm-1.0.30001642-794b0b6b47-8d80ea82be.zip differ diff --git a/front/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip b/front/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip new file mode 100644 index 000000000..b21d3e799 Binary files /dev/null and b/front/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip differ diff --git a/front/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-4f64dbebfa.zip b/front/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-4f64dbebfa.zip deleted file mode 100644 index c51038dd8..000000000 Binary files a/front/.yarn/cache/clean-css-npm-4.2.4-5d1d0f2f9b-4f64dbebfa.zip and /dev/null differ diff --git a/front/.yarn/cache/clean-css-npm-5.3.3-d2bb553a94-2db1ae37b3.zip b/front/.yarn/cache/clean-css-npm-5.3.3-d2bb553a94-2db1ae37b3.zip new file mode 100644 index 000000000..5945b1133 Binary files /dev/null and b/front/.yarn/cache/clean-css-npm-5.3.3-d2bb553a94-2db1ae37b3.zip differ diff --git a/front/.yarn/cache/commander-npm-10.0.1-f17613b72b-8799faa84a.zip b/front/.yarn/cache/commander-npm-10.0.1-f17613b72b-8799faa84a.zip new file mode 100644 index 000000000..a7bfd0a14 Binary files /dev/null and b/front/.yarn/cache/commander-npm-10.0.1-f17613b72b-8799faa84a.zip differ diff --git a/front/.yarn/cache/electron-to-chromium-npm-1.4.829-2f226cc171-4327956133.zip b/front/.yarn/cache/electron-to-chromium-npm-1.4.829-2f226cc171-4327956133.zip new file mode 100644 index 000000000..fb976206f Binary files /dev/null and b/front/.yarn/cache/electron-to-chromium-npm-1.4.829-2f226cc171-4327956133.zip differ diff --git a/front/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip b/front/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip new file mode 100644 index 000000000..c59ddcfc0 Binary files /dev/null and b/front/.yarn/cache/escalade-npm-3.1.2-5826d31cf8-a1e07fea2f.zip differ diff --git a/front/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip b/front/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip new file mode 100644 index 000000000..310f90f2a Binary files /dev/null and b/front/.yarn/cache/express-npm-4.19.2-f81334a22a-3fcd792536.zip differ diff --git a/front/.yarn/cache/fast-glob-npm-3.2.12-162763bbae-641e748664.zip b/front/.yarn/cache/fast-glob-npm-3.2.12-162763bbae-641e748664.zip deleted file mode 100644 index aa070c147..000000000 Binary files a/front/.yarn/cache/fast-glob-npm-3.2.12-162763bbae-641e748664.zip and /dev/null differ diff --git a/front/.yarn/cache/flat-npm-5.0.2-12748102a5-72479e651c.zip b/front/.yarn/cache/flat-npm-5.0.2-12748102a5-72479e651c.zip new file mode 100644 index 000000000..5f3b2bb23 Binary files /dev/null and b/front/.yarn/cache/flat-npm-5.0.2-12748102a5-72479e651c.zip differ diff --git a/front/.yarn/cache/fraction.js-npm-4.3.6-233f81170c-e018e613f1.zip b/front/.yarn/cache/fraction.js-npm-4.3.6-233f81170c-e018e613f1.zip deleted file mode 100644 index b48b8c481..000000000 Binary files a/front/.yarn/cache/fraction.js-npm-4.3.6-233f81170c-e018e613f1.zip and /dev/null differ diff --git a/front/.yarn/cache/fraction.js-npm-4.3.7-c2c7e95a8e-bb5ebcdeef.zip b/front/.yarn/cache/fraction.js-npm-4.3.7-c2c7e95a8e-bb5ebcdeef.zip new file mode 100644 index 000000000..ad1e711ef Binary files /dev/null and b/front/.yarn/cache/fraction.js-npm-4.3.7-c2c7e95a8e-bb5ebcdeef.zip differ diff --git a/front/.yarn/cache/fs-extra-npm-11.1.0-2cd157426f-b3f4a411e2.zip b/front/.yarn/cache/fs-extra-npm-11.1.0-2cd157426f-b3f4a411e2.zip deleted file mode 100644 index 5af12af22..000000000 Binary files a/front/.yarn/cache/fs-extra-npm-11.1.0-2cd157426f-b3f4a411e2.zip and /dev/null differ diff --git a/front/.yarn/cache/html-escaper-npm-2.0.2-38e51ef294-034d74029d.zip b/front/.yarn/cache/html-escaper-npm-2.0.2-38e51ef294-034d74029d.zip new file mode 100644 index 000000000..3137a4eff Binary files /dev/null and b/front/.yarn/cache/html-escaper-npm-2.0.2-38e51ef294-034d74029d.zip differ diff --git a/front/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-a1a49ee78a.zip b/front/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-a1a49ee78a.zip deleted file mode 100644 index 395d645ed..000000000 Binary files a/front/.yarn/cache/html-minifier-npm-4.0.0-2c414aaddf-a1a49ee78a.zip and /dev/null differ diff --git a/front/.yarn/cache/html-minifier-terser-npm-7.2.0-b9eba92a3b-7320095dbf.zip b/front/.yarn/cache/html-minifier-terser-npm-7.2.0-b9eba92a3b-7320095dbf.zip new file mode 100644 index 000000000..c8f4d87fe Binary files /dev/null and b/front/.yarn/cache/html-minifier-terser-npm-7.2.0-b9eba92a3b-7320095dbf.zip differ diff --git a/front/.yarn/cache/html-webpack-plugin-npm-5.5.0-75c5a14e55-16b08c3284.zip b/front/.yarn/cache/html-webpack-plugin-npm-5.5.0-75c5a14e55-16b08c3284.zip deleted file mode 100644 index e96330987..000000000 Binary files a/front/.yarn/cache/html-webpack-plugin-npm-5.5.0-75c5a14e55-16b08c3284.zip and /dev/null differ diff --git a/front/.yarn/cache/html-webpack-plugin-npm-5.6.0-4225ed9587-d651f3a88a.zip b/front/.yarn/cache/html-webpack-plugin-npm-5.6.0-4225ed9587-d651f3a88a.zip new file mode 100644 index 000000000..455283598 Binary files /dev/null and b/front/.yarn/cache/html-webpack-plugin-npm-5.6.0-4225ed9587-d651f3a88a.zip differ diff --git a/front/.yarn/cache/isbinaryfile-npm-5.0.0-e98524e7a5-511bb5ce54.zip b/front/.yarn/cache/isbinaryfile-npm-5.0.0-e98524e7a5-511bb5ce54.zip deleted file mode 100644 index 4b562f11f..000000000 Binary files a/front/.yarn/cache/isbinaryfile-npm-5.0.0-e98524e7a5-511bb5ce54.zip and /dev/null differ diff --git a/front/.yarn/cache/isbinaryfile-npm-5.0.2-3cb4869f50-515d7c963b.zip b/front/.yarn/cache/isbinaryfile-npm-5.0.2-3cb4869f50-515d7c963b.zip new file mode 100644 index 000000000..e87043c9c Binary files /dev/null and b/front/.yarn/cache/isbinaryfile-npm-5.0.2-3cb4869f50-515d7c963b.zip differ diff --git a/front/.yarn/cache/launch-editor-middleware-npm-2.6.0-e589e9a6a5-6e39d216a6.zip b/front/.yarn/cache/launch-editor-middleware-npm-2.6.0-e589e9a6a5-6e39d216a6.zip deleted file mode 100644 index 17d396622..000000000 Binary files a/front/.yarn/cache/launch-editor-middleware-npm-2.6.0-e589e9a6a5-6e39d216a6.zip and /dev/null differ diff --git a/front/.yarn/cache/launch-editor-middleware-npm-2.6.1-b5ef272eac-da9eaabe9d.zip b/front/.yarn/cache/launch-editor-middleware-npm-2.6.1-b5ef272eac-da9eaabe9d.zip new file mode 100644 index 000000000..21f5c6afb Binary files /dev/null and b/front/.yarn/cache/launch-editor-middleware-npm-2.6.1-b5ef272eac-da9eaabe9d.zip differ diff --git a/front/.yarn/cache/launch-editor-npm-2.6.0-0c6f590d3e-48e4230643.zip b/front/.yarn/cache/launch-editor-npm-2.6.0-0c6f590d3e-48e4230643.zip deleted file mode 100644 index 314266216..000000000 Binary files a/front/.yarn/cache/launch-editor-npm-2.6.0-0c6f590d3e-48e4230643.zip and /dev/null differ diff --git a/front/.yarn/cache/launch-editor-npm-2.8.0-4c524f1ef3-495009163f.zip b/front/.yarn/cache/launch-editor-npm-2.8.0-4c524f1ef3-495009163f.zip new file mode 100644 index 000000000..ea848126d Binary files /dev/null and b/front/.yarn/cache/launch-editor-npm-2.8.0-4c524f1ef3-495009163f.zip differ diff --git a/front/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-0c4aebc459.zip b/front/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-0c4aebc459.zip deleted file mode 100644 index 2e71e535a..000000000 Binary files a/front/.yarn/cache/lower-case-npm-1.1.4-9880e9dcb0-0c4aebc459.zip and /dev/null differ diff --git a/front/.yarn/cache/mini-css-extract-plugin-npm-2.7.2-bc3d177aec-7a8123d4fa.zip b/front/.yarn/cache/mini-css-extract-plugin-npm-2.7.2-bc3d177aec-7a8123d4fa.zip deleted file mode 100644 index 2df474935..000000000 Binary files a/front/.yarn/cache/mini-css-extract-plugin-npm-2.7.2-bc3d177aec-7a8123d4fa.zip and /dev/null differ diff --git a/front/.yarn/cache/mini-css-extract-plugin-npm-2.9.0-e9682fccac-4c9ee9c0c6.zip b/front/.yarn/cache/mini-css-extract-plugin-npm-2.9.0-e9682fccac-4c9ee9c0c6.zip new file mode 100644 index 000000000..c8803f059 Binary files /dev/null and b/front/.yarn/cache/mini-css-extract-plugin-npm-2.9.0-e9682fccac-4c9ee9c0c6.zip differ diff --git a/front/.yarn/cache/minimist-npm-1.2.7-51d33b1371-0202378a8e.zip b/front/.yarn/cache/minimist-npm-1.2.7-51d33b1371-0202378a8e.zip deleted file mode 100644 index 47fd8ad85..000000000 Binary files a/front/.yarn/cache/minimist-npm-1.2.7-51d33b1371-0202378a8e.zip and /dev/null differ diff --git a/front/.yarn/cache/mrmime-npm-1.0.1-d0aa4f5ddf-a157e833ff.zip b/front/.yarn/cache/mrmime-npm-1.0.1-d0aa4f5ddf-a157e833ff.zip deleted file mode 100644 index 8ea040347..000000000 Binary files a/front/.yarn/cache/mrmime-npm-1.0.1-d0aa4f5ddf-a157e833ff.zip and /dev/null differ diff --git a/front/.yarn/cache/mrmime-npm-2.0.0-0326eb1458-8d95f714ea.zip b/front/.yarn/cache/mrmime-npm-2.0.0-0326eb1458-8d95f714ea.zip new file mode 100644 index 000000000..0257cbf82 Binary files /dev/null and b/front/.yarn/cache/mrmime-npm-2.0.0-0326eb1458-8d95f714ea.zip differ diff --git a/front/.yarn/cache/no-case-npm-2.3.2-5403767f87-a92fc7c10f.zip b/front/.yarn/cache/no-case-npm-2.3.2-5403767f87-a92fc7c10f.zip deleted file mode 100644 index f1ef0c29c..000000000 Binary files a/front/.yarn/cache/no-case-npm-2.3.2-5403767f87-a92fc7c10f.zip and /dev/null differ diff --git a/front/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip b/front/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip deleted file mode 100644 index f409d4737..000000000 Binary files a/front/.yarn/cache/param-case-npm-2.1.1-e0aef3c289-3a63dcb8d8.zip and /dev/null differ diff --git a/front/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip b/front/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip new file mode 100644 index 000000000..21041b39e Binary files /dev/null and b/front/.yarn/cache/picocolors-npm-1.0.1-39442f3da8-fa68166d1f.zip differ diff --git a/front/.yarn/cache/postcss-npm-8.4.39-f77f32a87d-ad9c1add89.zip b/front/.yarn/cache/postcss-npm-8.4.39-f77f32a87d-ad9c1add89.zip new file mode 100644 index 000000000..6d8f817db Binary files /dev/null and b/front/.yarn/cache/postcss-npm-8.4.39-f77f32a87d-ad9c1add89.zip differ diff --git a/front/.yarn/cache/quasar-npm-2.15.1-3723dd5931-9458b512eb.zip b/front/.yarn/cache/quasar-npm-2.15.1-3723dd5931-9458b512eb.zip deleted file mode 100644 index cd99164f8..000000000 Binary files a/front/.yarn/cache/quasar-npm-2.15.1-3723dd5931-9458b512eb.zip and /dev/null differ diff --git a/front/.yarn/cache/quasar-npm-2.16.6-49dd0e6888-a3a0aa5b5f.zip b/front/.yarn/cache/quasar-npm-2.16.6-49dd0e6888-a3a0aa5b5f.zip new file mode 100644 index 000000000..d04fc10c9 Binary files /dev/null and b/front/.yarn/cache/quasar-npm-2.16.6-49dd0e6888-a3a0aa5b5f.zip differ diff --git a/front/.yarn/cache/sirv-npm-1.0.19-2cea3eead6-b6833ab4d4.zip b/front/.yarn/cache/sirv-npm-1.0.19-2cea3eead6-b6833ab4d4.zip deleted file mode 100644 index f3715e590..000000000 Binary files a/front/.yarn/cache/sirv-npm-1.0.19-2cea3eead6-b6833ab4d4.zip and /dev/null differ diff --git a/front/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip b/front/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip new file mode 100644 index 000000000..50527a332 Binary files /dev/null and b/front/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip differ diff --git a/front/.yarn/cache/table-npm-6.8.1-83abb79e20-512c4f2bfb.zip b/front/.yarn/cache/table-npm-6.8.2-e33ecc3c54-2946162eb8.zip similarity index 79% rename from front/.yarn/cache/table-npm-6.8.1-83abb79e20-512c4f2bfb.zip rename to front/.yarn/cache/table-npm-6.8.2-e33ecc3c54-2946162eb8.zip index 0dfea3597..82d57d0d6 100644 Binary files a/front/.yarn/cache/table-npm-6.8.1-83abb79e20-512c4f2bfb.zip and b/front/.yarn/cache/table-npm-6.8.2-e33ecc3c54-2946162eb8.zip differ diff --git a/front/.yarn/cache/terser-npm-5.31.3-0d82b5f3a6-7f66d93a11.zip b/front/.yarn/cache/terser-npm-5.31.3-0d82b5f3a6-7f66d93a11.zip new file mode 100644 index 000000000..423ac55ad Binary files /dev/null and b/front/.yarn/cache/terser-npm-5.31.3-0d82b5f3a6-7f66d93a11.zip differ diff --git a/front/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-77e7e429cf.zip b/front/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-77e7e429cf.zip deleted file mode 100644 index 89fd681da..000000000 Binary files a/front/.yarn/cache/terser-webpack-plugin-npm-5.3.6-27ed5132ff-77e7e429cf.zip and /dev/null differ diff --git a/front/.yarn/cache/totalist-npm-1.1.0-4e1d9cb01b-dfab80c710.zip b/front/.yarn/cache/totalist-npm-1.1.0-4e1d9cb01b-dfab80c710.zip deleted file mode 100644 index 084da8fa2..000000000 Binary files a/front/.yarn/cache/totalist-npm-1.1.0-4e1d9cb01b-dfab80c710.zip and /dev/null differ diff --git a/front/.yarn/cache/totalist-npm-3.0.1-91e71f3baa-5132d562cf.zip b/front/.yarn/cache/totalist-npm-3.0.1-91e71f3baa-5132d562cf.zip new file mode 100644 index 000000000..8683d1c4a Binary files /dev/null and b/front/.yarn/cache/totalist-npm-3.0.1-91e71f3baa-5132d562cf.zip differ diff --git a/front/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-4c0b800e0f.zip b/front/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-4c0b800e0f.zip deleted file mode 100644 index aadaa7edd..000000000 Binary files a/front/.yarn/cache/uglify-js-npm-3.17.4-58d4ab56aa-4c0b800e0f.zip and /dev/null differ diff --git a/front/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip b/front/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip new file mode 100644 index 000000000..068c0ccb7 Binary files /dev/null and b/front/.yarn/cache/update-browserslist-db-npm-1.1.0-3d2cb7d955-d70b9efeaf.zip differ diff --git a/front/.yarn/cache/upper-case-npm-1.1.3-061d82781f-fc4101fdcd.zip b/front/.yarn/cache/upper-case-npm-1.1.3-061d82781f-fc4101fdcd.zip deleted file mode 100644 index df4bd4b22..000000000 Binary files a/front/.yarn/cache/upper-case-npm-1.1.3-061d82781f-fc4101fdcd.zip and /dev/null differ diff --git a/front/.yarn/cache/webpack-bundle-analyzer-npm-4.10.2-970f80a648-cb7ff9d01d.zip b/front/.yarn/cache/webpack-bundle-analyzer-npm-4.10.2-970f80a648-cb7ff9d01d.zip new file mode 100644 index 000000000..0fc4ae2f3 Binary files /dev/null and b/front/.yarn/cache/webpack-bundle-analyzer-npm-4.10.2-970f80a648-cb7ff9d01d.zip differ diff --git a/front/.yarn/cache/webpack-bundle-analyzer-npm-4.7.0-493ca27caa-761ffbe721.zip b/front/.yarn/cache/webpack-bundle-analyzer-npm-4.7.0-493ca27caa-761ffbe721.zip deleted file mode 100644 index 2bcae60e9..000000000 Binary files a/front/.yarn/cache/webpack-bundle-analyzer-npm-4.7.0-493ca27caa-761ffbe721.zip and /dev/null differ diff --git a/front/.yarn/cache/webpack-merge-npm-5.10.0-c2d9fd1f83-fa46ab200f.zip b/front/.yarn/cache/webpack-merge-npm-5.10.0-c2d9fd1f83-fa46ab200f.zip new file mode 100644 index 000000000..6a4a854e4 Binary files /dev/null and b/front/.yarn/cache/webpack-merge-npm-5.10.0-c2d9fd1f83-fa46ab200f.zip differ diff --git a/front/.yarn/cache/webpack-merge-npm-5.8.0-e3c95fdc3c-c22812671a.zip b/front/.yarn/cache/webpack-merge-npm-5.8.0-e3c95fdc3c-c22812671a.zip deleted file mode 100644 index 7b36bba83..000000000 Binary files a/front/.yarn/cache/webpack-merge-npm-5.8.0-e3c95fdc3c-c22812671a.zip and /dev/null differ diff --git a/front/.yarn/install-state.gz b/front/.yarn/install-state.gz deleted file mode 100644 index d70089dac..000000000 Binary files a/front/.yarn/install-state.gz and /dev/null differ diff --git a/front/graphql.schema.json b/front/graphql.schema.json index 7e4850616..83a42762b 100644 --- a/front/graphql.schema.json +++ b/front/graphql.schema.json @@ -1297,6 +1297,18 @@ "isDeprecated": false, "deprecationReason": null }, + { + "name": "discordId", + "description": null, + "type": { + "kind": "SCALAR", + "name": "String", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "role", "description": null, @@ -12399,6 +12411,22 @@ "name": "Setting", "description": null, "fields": [ + { + "name": "discordIntegrationEnabled", + "description": null, + "args": [], + "type": { + "kind": "NON_NULL", + "name": null, + "ofType": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + } + }, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "icalPassword", "description": null, @@ -12525,6 +12553,18 @@ "description": "Represents an update to a `Setting`. Fields that are set will be updated.", "fields": null, "inputFields": [ + { + "name": "discordIntegrationEnabled", + "description": null, + "type": { + "kind": "SCALAR", + "name": "Boolean", + "ofType": null + }, + "defaultValue": null, + "isDeprecated": false, + "deprecationReason": null + }, { "name": "icalPassword", "description": null, diff --git a/front/package.json b/front/package.json index 75969cc18..0abf1bf0a 100644 --- a/front/package.json +++ b/front/package.json @@ -27,7 +27,7 @@ "core-js": "^3.36.1", "hotkeys-js": "^3.13.7", "jszip": "^3.10.1", - "quasar": "^2.15.1", + "quasar": "^2.16.6", "slugify": "^1.6.6", "ts-essentials": "^9.4.1", "v-calendar": "^3.1.2", @@ -44,13 +44,14 @@ "@graphql-codegen/typescript-document-nodes": "^3.0.4", "@graphql-codegen/typescript-operations": "^3.0.4", "@graphql-codegen/typescript-vue-apollo": "^3.3.7", - "@quasar/app-webpack": "^3.12.4", + "@quasar/app-webpack": "^3.13.2", "@quasar/quasar-app-extension-qmarkdown": "^2.0.0-beta.10", "@types/apollo-upload-client": "^17.0.5", "@types/babel__core": "^7", "@types/color-hash": "^1.0.5", "@types/node": "^16.18.91", "@typescript-eslint/eslint-plugin": "^5.62.0", + "autoprefixer": "^10.4.19", "babel-loader": "^9.1.3", "eslint": "^8.57.0", "eslint-config-prettier": "^8.10.0", diff --git a/front/src/components/Auth/Login.vue b/front/src/components/Auth/Login.vue index 139799962..0e9c5ff65 100644 --- a/front/src/components/Auth/Login.vue +++ b/front/src/components/Auth/Login.vue @@ -14,6 +14,7 @@ autocapitalize="none" label="Username" required + autofocus /> diff --git a/front/src/components/Auth/Register.vue b/front/src/components/Auth/Register.vue index 7c43ee128..16be2931c 100644 --- a/front/src/components/Auth/Register.vue +++ b/front/src/components/Auth/Register.vue @@ -13,6 +13,7 @@ dense label="Username" required + autofocus /> No guests found.
Sync with Discord event
-
+
+
+ The Discord integration is currently disabled. +
+
+
@@ -55,10 +60,12 @@ export default defineComponent({ setup() { const team = ctfnote.profiles.injectTeam(); const now = ref(new Date()); + const settings = ctfnote.settings.injectSettings(); return { now, team, + settings, inviteUserToCtf: ctfnote.ctfs.useInviteUserToCtf(), uninviteUserToCtf: ctfnote.ctfs.useUninviteUserToCtf(), }; diff --git a/front/src/ctfnote/models.ts b/front/src/ctfnote/models.ts index f505310c8..00debfa7a 100644 --- a/front/src/ctfnote/models.ts +++ b/front/src/ctfnote/models.ts @@ -102,6 +102,7 @@ export type Settings = { registrationAllowed: boolean; registrationPasswordAllowed: boolean; style: SettingsColorMap; + discordIntegrationEnabled: boolean; }; export type AdminSettings = Settings & { diff --git a/front/src/ctfnote/parsers/cini.ts b/front/src/ctfnote/parsers/cini.ts new file mode 100644 index 000000000..d1d9c311f --- /dev/null +++ b/front/src/ctfnote/parsers/cini.ts @@ -0,0 +1,56 @@ +import { ParsedTask, Parser } from '.'; +import { parseJson, parseJsonStrict } from '../utils'; + +interface Events { + gamePause?: unknown; + events: [ + { + id: number; + name: string; + sections: [ + { + id: number; + name: string; + challenges: [ + { + id: number; + title: string; + tags: string[]; + authors: string[]; + currentScore: number; + currentGlobalSolves: number; + hidden: boolean; + } + ]; + } + ]; + } + ]; +} + +const CINIParser: Parser = { + name: 'Cybersecurity National Lab (CINI) platform and ECSC 2024 (Turin) parser', + hint: 'paste platform /api/challenges', + + parse(s: string): ParsedTask[] { + const tasks = []; + const data = parseJsonStrict(s); + + for (const event of data.events) { + for (const section of event.sections) { + for (const chall of section.challenges) { + tasks.push({ title: chall.title, tags: chall.tags }); + } + } + } + + return tasks; + }, + isValid(s) { + const data = parseJson(s); + if (data == null) return false; + return data.gamePause !== undefined && data.events !== undefined; + }, +}; + +export default CINIParser; diff --git a/front/src/ctfnote/parsers/ecsc.ts b/front/src/ctfnote/parsers/ecsc.ts deleted file mode 100644 index 66ad18fd1..000000000 --- a/front/src/ctfnote/parsers/ecsc.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { ParsedTask, Parser } from '.'; -import { parseJson, parseJsonStrict } from '../utils'; - -const ECSCParser: Parser = { - name: 'ECSC parser', - hint: 'paste ecsc /stats.json', - - parse(s: string): ParsedTask[] { - const tasks = []; - const data = parseJsonStrict<[{ task: string; contract: string }]>(s); - if (!Array.isArray(data)) { - return []; - } - - for (const task of data) { - if (!task.task || !task.contract) { - continue; - } - tasks.push({ title: task.task, tags: [task.contract] }); - } - return tasks; - }, - isValid(s) { - const data = parseJson<[{ task: string; contract: string }]>(s); - return Array.isArray(data); - }, -}; - -export default ECSCParser; diff --git a/front/src/ctfnote/parsers/hitcon.ts b/front/src/ctfnote/parsers/hitcon.ts new file mode 100644 index 000000000..464916013 --- /dev/null +++ b/front/src/ctfnote/parsers/hitcon.ts @@ -0,0 +1,47 @@ +import { ParsedTask, Parser } from '.'; +import { parseJsonStrict } from '../utils'; + +const HitconParser: Parser = { + name: 'HITCONCTF parser', + hint: 'paste hitcon /dashboard/challenge_data', + parse(s): ParsedTask[] { + const tasks: ParsedTask[] = []; + const data = + parseJsonStrict< + [{ name: string; category: string; description: string }] + >(s); + if (data == null) { + return []; + } + + for (const challenge of data) { + if (!challenge.description || !challenge.name) { + continue; + } + + tasks.push({ + title: challenge.name, + tags: challenge.category.split(','), + description: challenge.description, + }); + } + + return tasks; + }, + isValid(s) { + const data = + parseJsonStrict< + [{ name: string; category: string; description: string }] + >(s); + if (data == null || data.length < 1) { + return false; + } + return ( + data[0].name != null && + data[0].category != null && + data[0].description != null + ); + }, +}; + +export default HitconParser; diff --git a/front/src/ctfnote/parsers/index.ts b/front/src/ctfnote/parsers/index.ts index a2ec5ab97..ca4c13606 100644 --- a/front/src/ctfnote/parsers/index.ts +++ b/front/src/ctfnote/parsers/index.ts @@ -1,10 +1,11 @@ import CTFDParser from './ctfd'; -import ECSCParser from './ecsc'; import RawParser from './raw'; import HTBParser from './htb'; import PicoParser from './pico'; import justCTFParser from './justctf'; import AngstromParser from './angstrom'; +import CINIParser from './cini'; +import HitconParser from './hitcon'; export type ParsedTask = { title: string; @@ -23,9 +24,10 @@ export type Parser = { export default [ RawParser, CTFDParser, - ECSCParser, HTBParser, PicoParser, justCTFParser, AngstromParser, + CINIParser, + HitconParser, ]; diff --git a/front/src/ctfnote/settings.ts b/front/src/ctfnote/settings.ts index 04c6fd746..5096a1d1c 100644 --- a/front/src/ctfnote/settings.ts +++ b/front/src/ctfnote/settings.ts @@ -40,6 +40,7 @@ export function buildSettings( registrationAllowed: fragment.registrationAllowed ?? false, registrationPasswordAllowed: fragment.registrationPasswordAllowed ?? false, style: parseStyle(fragment.style ?? '{}'), + discordIntegrationEnabled: fragment.discordIntegrationEnabled ?? false, }; } diff --git a/front/src/generated/graphql.ts b/front/src/generated/graphql.ts index 73934aef8..1ba35340b 100644 --- a/front/src/generated/graphql.ts +++ b/front/src/generated/graphql.ts @@ -300,6 +300,7 @@ export type CreateInvitationLinkInput = { * payload verbatim. May be used to track mutations by the client. */ clientMutationId?: InputMaybe; + discordId?: InputMaybe; role?: InputMaybe; }; @@ -2384,6 +2385,7 @@ export type SetDiscordEventLinkPayload = { export type Setting = Node & { __typename?: 'Setting'; + discordIntegrationEnabled: Scalars['Boolean']; icalPassword?: Maybe; /** A globally unique identifier. Can be used in various places throughout the system to identify this single value. */ nodeId: Scalars['ID']; @@ -2396,6 +2398,7 @@ export type Setting = Node & { /** Represents an update to a `Setting`. Fields that are set will be updated. */ export type SettingPatch = { + discordIntegrationEnabled?: InputMaybe; icalPassword?: InputMaybe; registrationAllowed?: InputMaybe; registrationDefaultRole?: InputMaybe; @@ -3712,14 +3715,14 @@ export type UpdateCredentialsForCtfIdMutationVariables = Exact<{ export type UpdateCredentialsForCtfIdMutation = { __typename?: 'Mutation', updateCtfSecret?: { __typename?: 'UpdateCtfSecretPayload', ctfSecret?: { __typename?: 'CtfSecret', nodeId: string, credentials?: string | null } | null } | null }; -export type SettingsInfoFragment = { __typename?: 'Setting', nodeId: string, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string }; +export type SettingsInfoFragment = { __typename?: 'Setting', nodeId: string, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string, discordIntegrationEnabled: boolean }; -export type AdminSettingsInfoFragment = { __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string }; +export type AdminSettingsInfoFragment = { __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string, discordIntegrationEnabled: boolean }; export type GetSettingsQueryVariables = Exact<{ [key: string]: never; }>; -export type GetSettingsQuery = { __typename?: 'Query', settings?: { __typename?: 'SettingsConnection', nodes: Array<{ __typename?: 'Setting', nodeId: string, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string }> } | null }; +export type GetSettingsQuery = { __typename?: 'Query', settings?: { __typename?: 'SettingsConnection', nodes: Array<{ __typename?: 'Setting', nodeId: string, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string, discordIntegrationEnabled: boolean }> } | null }; export type GetIcalPasswordQueryVariables = Exact<{ [key: string]: never; }>; @@ -3729,7 +3732,7 @@ export type GetIcalPasswordQuery = { __typename?: 'Query', settings?: { __typena export type GetAdminSettingsQueryVariables = Exact<{ [key: string]: never; }>; -export type GetAdminSettingsQuery = { __typename?: 'Query', settings?: { __typename?: 'SettingsConnection', nodes: Array<{ __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string }> } | null }; +export type GetAdminSettingsQuery = { __typename?: 'Query', settings?: { __typename?: 'SettingsConnection', nodes: Array<{ __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string, discordIntegrationEnabled: boolean }> } | null }; export type UpdateSettingsMutationVariables = Exact<{ nodeId: Scalars['ID']; @@ -3737,7 +3740,7 @@ export type UpdateSettingsMutationVariables = Exact<{ }>; -export type UpdateSettingsMutation = { __typename?: 'Mutation', updateSettingByNodeId?: { __typename?: 'UpdateSettingPayload', setting?: { __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string } | null } | null }; +export type UpdateSettingsMutation = { __typename?: 'Mutation', updateSettingByNodeId?: { __typename?: 'UpdateSettingPayload', setting?: { __typename?: 'Setting', nodeId: string, registrationPassword: string, registrationDefaultRole: Role, icalPassword?: string | null, registrationAllowed: boolean, registrationPasswordAllowed: boolean, style: string, discordIntegrationEnabled: boolean } | null } | null }; export type TagFragment = { __typename?: 'Tag', nodeId: string, id: number, tag: string }; @@ -4018,6 +4021,7 @@ export const SettingsInfoFragmentDoc = gql` registrationAllowed registrationPasswordAllowed style + discordIntegrationEnabled } `; export const AdminSettingsInfoFragmentDoc = gql` @@ -6265,6 +6269,7 @@ export const SettingsInfo = gql` registrationAllowed registrationPasswordAllowed style + discordIntegrationEnabled } `; export const AdminSettingsInfo = gql` diff --git a/front/src/graphql/Settings.graphql b/front/src/graphql/Settings.graphql index 75fbb4932..c3cc15a32 100644 --- a/front/src/graphql/Settings.graphql +++ b/front/src/graphql/Settings.graphql @@ -3,6 +3,7 @@ fragment SettingsInfo on Setting { registrationAllowed registrationPasswordAllowed style + discordIntegrationEnabled } fragment AdminSettingsInfo on Setting { diff --git a/front/src/pages/Settings.vue b/front/src/pages/Settings.vue index df98a3392..d289a2504 100644 --- a/front/src/pages/Settings.vue +++ b/front/src/pages/Settings.vue @@ -138,7 +138,17 @@
Link your Discord account
- + +
The Discord integration is currently disabled.
+
+ +
Your CTFNote account is not linked to your Discord account.
@@ -162,7 +172,11 @@
- + = ref(''); const { result: profileTokenResult } = ctfnote.me.getProfileToken(); + const settings = ctfnote.settings.injectSettings(); + watch( profileTokenResult, (s) => { @@ -242,6 +258,7 @@ export default defineComponent({ username, description, me, + settings, systemNotificationEnabled, askForNotificationPrivilege, disableSystemNotification, diff --git a/front/yarn.lock b/front/yarn.lock index 1e432cdd8..3df7843ae 100644 --- a/front/yarn.lock +++ b/front/yarn.lock @@ -1910,6 +1910,13 @@ __metadata: languageName: node linkType: hard +"@discoveryjs/json-ext@npm:0.5.7": + version: 0.5.7 + resolution: "@discoveryjs/json-ext@npm:0.5.7" + checksum: 10/b95682a852448e8ef50d6f8e3b7ba288aab3fd98a2bafbe46881a3db0c6e7248a2debe9e1ee0d4137c521e4743ca5bbcb1c0765c9d7b3e0ef53231506fec42b4 + languageName: node + linkType: hard + "@endemolshinegroup/cosmiconfig-typescript-loader@npm:3.0.2": version: 3.0.2 resolution: "@endemolshinegroup/cosmiconfig-typescript-loader@npm:3.0.2" @@ -2969,7 +2976,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.14, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": +"@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.19 resolution: "@jridgewell/trace-mapping@npm:0.3.19" dependencies: @@ -3249,10 +3256,10 @@ __metadata: languageName: node linkType: hard -"@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.23 - resolution: "@polka/url@npm:1.0.0-next.23" - checksum: 10/4b0330de1ceecd1002c7e7449094d0c41f2ed0e21765f4835ccc7b003f2f024ac557d503b9ffdf0918cf50b80d5b8c99dfc5a91927e7b3c468b09c6bb42a3c41 +"@polka/url@npm:^1.0.0-next.24": + version: 1.0.0-next.25 + resolution: "@polka/url@npm:1.0.0-next.25" + checksum: 10/4ab1d7a37163139c0e7bfc9d1e3f6a2a0db91a78b9f0a21f571d6aec2cdaeaacced744d47886c117aa7579aa5694b303fe3e0bd1922bb9cb3ce6bf7c2dc09801 languageName: node linkType: hard @@ -3263,23 +3270,23 @@ __metadata: languageName: node linkType: hard -"@quasar/app-webpack@npm:^3.12.4": - version: 3.12.4 - resolution: "@quasar/app-webpack@npm:3.12.4" +"@quasar/app-webpack@npm:^3.13.2": + version: 3.13.2 + resolution: "@quasar/app-webpack@npm:3.13.2" dependencies: "@quasar/babel-preset-app": "npm:^2.0.3" "@quasar/render-ssr-error": "npm:^1.0.3" "@quasar/ssr-helpers": "npm:2.2.2" "@types/chrome": "npm:^0.0.208" - "@types/compression": "npm:^1.7.2" + "@types/compression": "npm:^1.7.5" "@types/cordova": "npm:0.0.34" - "@types/express": "npm:4.17.15" - "@types/webpack-bundle-analyzer": "npm:4.6.0" + "@types/express": "npm:4.17.21" + "@types/webpack-bundle-analyzer": "npm:4.7.0" archiver: "npm:5.3.1" - autoprefixer: "npm:10.4.13" - browserslist: "npm:^4.12.0" + autoprefixer: "npm:10.4.19" + browserslist: "npm:^4.23.0" chalk: "npm:4.1.2" - chokidar: "npm:3.5.3" + chokidar: "npm:3.6.0" ci-info: "npm:3.7.1" compression-webpack-plugin: "npm:10.0.0" copy-webpack-plugin: "npm:11.0.0" @@ -3290,54 +3297,57 @@ __metadata: dot-prop: "npm:6.0.1" elementtree: "npm:0.1.7" error-stack-parser: "npm:2.1.4" - express: "npm:4.18.2" - fast-glob: "npm:3.2.12" + express: "npm:4.19.2" + fast-glob: "npm:3.3.2" file-loader: "npm:6.2.0" fork-ts-checker-webpack-plugin: "npm:6.5.0" - fs-extra: "npm:11.1.0" + fs-extra: "npm:11.2.0" hash-sum: "npm:2.0.0" - html-minifier: "npm:4.0.0" - html-webpack-plugin: "npm:5.5.0" + html-minifier-terser: "npm:^7.2.0" + html-webpack-plugin: "npm:5.6.0" inquirer: "npm:8.2.2" - isbinaryfile: "npm:5.0.0" - launch-editor-middleware: "npm:2.6.0" + isbinaryfile: "npm:5.0.2" + launch-editor-middleware: "npm:2.6.1" lodash: "npm:^4.17.21" log-update: "npm:4.0.0" - mini-css-extract-plugin: "npm:2.7.2" - minimist: "npm:1.2.7" + mini-css-extract-plugin: "npm:2.9.0" + minimist: "npm:1.2.8" node-loader: "npm:2.0.0" null-loader: "npm:4.0.1" open: "npm:8.4.0" - postcss: "npm:^8.4.4" + postcss: "npm:^8.4.38" postcss-loader: "npm:7.0.2" postcss-rtlcss: "npm:4.0.1" register-service-worker: "npm:1.7.2" sass: "npm:^1.33.0" sass-loader: "npm:13.2.0" - semver: "npm:^7.3.8" - table: "npm:6.8.1" - terser-webpack-plugin: "npm:5.3.6" + semver: "npm:^7.6.0" + table: "npm:6.8.2" + terser-webpack-plugin: "npm:5.3.10" ts-loader: "npm:9.4.2" typescript: "npm:4.9.4" url-loader: "npm:4.1.1" vue-loader: "npm:^17.1.1" vue-style-loader: "npm:4.1.3" - webpack: "npm:^5.58.1" - webpack-bundle-analyzer: "npm:4.7.0" + webpack: "npm:^5.91.0" + webpack-bundle-analyzer: "npm:4.10.2" webpack-chain: "npm:6.5.1" webpack-dev-server: "npm:4.11.1" - webpack-merge: "npm:5.8.0" + webpack-merge: "npm:5.10.0" webpack-node-externals: "npm:3.0.0" peerDependencies: + "@electron/packager": ">= 18" electron-builder: ">= 22" electron-packager: ">= 15" pinia: ^2.0.0 - quasar: ^2.14.0 + quasar: ^2.16.0 vue: ^3.2.29 vue-router: ^4.0.12 vuex: ^4.0.0 workbox-webpack-plugin: ">= 6" peerDependenciesMeta: + "@electron/packager": + optional: true electron-builder: optional: true electron-packager: @@ -3350,7 +3360,7 @@ __metadata: optional: true bin: quasar: bin/quasar - checksum: 10/18d0342fd24f81cf854892ce438aab38fd1ac905424c2be29ca37c28dfbb0f67a6f2ed15103c3e7d9ff8d90ad9ad3267d9213cb169ef13cf467e2ad42b1df699 + checksum: 10/e337fcbd027eb7788712164cf5432701769d6b1844ba14593f00a66cadf825f9e803782f695c7d386c2296e12cb154fdbe49d3471dae46f990c5a3093d5410b2 languageName: node linkType: hard @@ -3635,12 +3645,12 @@ __metadata: languageName: node linkType: hard -"@types/compression@npm:^1.7.2": - version: 1.7.3 - resolution: "@types/compression@npm:1.7.3" +"@types/compression@npm:^1.7.5": + version: 1.7.5 + resolution: "@types/compression@npm:1.7.5" dependencies: "@types/express": "npm:*" - checksum: 10/eaa67663f98d394b64e540c422333f380337d6deb3f76112762cc739075ce9f03cdd83713189fc7bdb9ade5e993d398b1f3a4a849da89982d622d83f18d15df9 + checksum: 10/9d65485bfb8e20035dedbbbebea06ea0c0554ac7bedb11ec3f2c6582cb082d121a10a03b4803b56315ae31705043eddf97eaf49c3dad6f9e39f7875b27c8feb4 languageName: node linkType: hard @@ -3704,7 +3714,7 @@ __metadata: languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.31, @types/express-serve-static-core@npm:^4.17.33": +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": version: 4.17.36 resolution: "@types/express-serve-static-core@npm:4.17.36" dependencies: @@ -3728,15 +3738,15 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:4.17.15": - version: 4.17.15 - resolution: "@types/express@npm:4.17.15" +"@types/express@npm:4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: "@types/body-parser": "npm:*" - "@types/express-serve-static-core": "npm:^4.17.31" + "@types/express-serve-static-core": "npm:^4.17.33" "@types/qs": "npm:*" "@types/serve-static": "npm:*" - checksum: 10/0bcda0e398a13f9d77e414de389ae4218cf96c064d837dd39093eaade20cd0c6de4f69ba77c3f46df9a1af49f9ae88b81ac92650c07b5adf35f72ce1b79d72ad + checksum: 10/7a6d26cf6f43d3151caf4fec66ea11c9d23166e4f3102edfe45a94170654a54ea08cf3103d26b3928d7ebcc24162c90488e33986b7e3a5f8941225edd5eb18c7 languageName: node linkType: hard @@ -4007,14 +4017,14 @@ __metadata: languageName: node linkType: hard -"@types/webpack-bundle-analyzer@npm:4.6.0": - version: 4.6.0 - resolution: "@types/webpack-bundle-analyzer@npm:4.6.0" +"@types/webpack-bundle-analyzer@npm:4.7.0": + version: 4.7.0 + resolution: "@types/webpack-bundle-analyzer@npm:4.7.0" dependencies: "@types/node": "npm:*" tapable: "npm:^2.2.0" webpack: "npm:^5" - checksum: 10/a0048e28f9c5109635d396a38de2b405a790fa8ec403c1356111672de4acc34488b63cea0dfd3be85c70a3eab1ea19d9f8a1f120eb88b353e574bd0cefcec485 + checksum: 10/2d9a2d4e26b1239623df97caceddd37a14c258623bccf27aca9da65b963cad33fdbfdc3a4770a58dbd2f9e6f591f62990616938aa52edf58aae3f6166c0045c1 languageName: node linkType: hard @@ -5202,13 +5212,13 @@ __metadata: languageName: node linkType: hard -"autoprefixer@npm:10.4.13": - version: 10.4.13 - resolution: "autoprefixer@npm:10.4.13" +"autoprefixer@npm:10.4.19, autoprefixer@npm:^10.4.19": + version: 10.4.19 + resolution: "autoprefixer@npm:10.4.19" dependencies: - browserslist: "npm:^4.21.4" - caniuse-lite: "npm:^1.0.30001426" - fraction.js: "npm:^4.2.0" + browserslist: "npm:^4.23.0" + caniuse-lite: "npm:^1.0.30001599" + fraction.js: "npm:^4.3.7" normalize-range: "npm:^0.1.2" picocolors: "npm:^1.0.0" postcss-value-parser: "npm:^4.2.0" @@ -5216,7 +5226,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: 10/0aefb9b115032354201e5a08f5771845dc4c824ca761d8f5b273d6f65429eff84141c5e8e607852d41e4ff1e81449649841e89a4184d23f6ef452fd937898afa + checksum: 10/98378eae37b8bf0f1515e4c91b4c9c1ce69ede311d4dea7e934f5afe147d23712c577f112c4019a4c40461c585d82d474d08044f8eb6cb8a063c3d5b7aca52d2 languageName: node linkType: hard @@ -5507,7 +5517,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.12.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9": +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9": version: 4.21.10 resolution: "browserslist@npm:4.21.10" dependencies: @@ -5535,6 +5545,20 @@ __metadata: languageName: node linkType: hard +"browserslist@npm:^4.23.0": + version: 4.23.2 + resolution: "browserslist@npm:4.23.2" + dependencies: + caniuse-lite: "npm:^1.0.30001640" + electron-to-chromium: "npm:^1.4.820" + node-releases: "npm:^2.0.14" + update-browserslist-db: "npm:^1.1.0" + bin: + browserslist: cli.js + checksum: 10/326a98b1c39bcc9a99b197f15790dc28e122b1aead3257c837421899377ac96239123f26868698085b3d9be916d72540602738e1f857e86a387e810af3fda6e5 + languageName: node + linkType: hard + "bser@npm:2.1.1": version: 2.1.1 resolution: "bser@npm:2.1.1" @@ -5669,16 +5693,6 @@ __metadata: languageName: node linkType: hard -"camel-case@npm:^3.0.0": - version: 3.0.0 - resolution: "camel-case@npm:3.0.0" - dependencies: - no-case: "npm:^2.2.0" - upper-case: "npm:^1.1.1" - checksum: 10/4190ed6ab8acf4f3f6e1a78ad4d0f3f15ce717b6bfa1b5686d58e4bcd29960f6e312dd746b5fa259c6d452f1413caef25aee2e10c9b9a580ac83e516533a961a - languageName: node - linkType: hard - "camelcase@npm:^5.0.0": version: 5.3.1 resolution: "camelcase@npm:5.3.1" @@ -5705,7 +5719,7 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001426, caniuse-lite@npm:^1.0.30001517": +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001517": version: 1.0.30001534 resolution: "caniuse-lite@npm:1.0.30001534" checksum: 10/848c94f57fd9563360b081f1a0b5c4c0558b4939befa367e58eb5b3085a1d5bc29281bc3c3b9946b48ee71292b531191caba0d1eabf4b2a1ad67021b787f6255 @@ -5719,6 +5733,13 @@ __metadata: languageName: node linkType: hard +"caniuse-lite@npm:^1.0.30001599, caniuse-lite@npm:^1.0.30001640": + version: 1.0.30001642 + resolution: "caniuse-lite@npm:1.0.30001642" + checksum: 10/8d80ea82be453ae0fdfea8766d82740a4945c1b99189650f29bfc458d4e235d7e99027a8f8bc5a4228d8c4457ba896315284b0703f300353ad5f09d8e693de10 + languageName: node + linkType: hard + "capital-case@npm:^1.0.4": version: 1.0.4 resolution: "capital-case@npm:1.0.4" @@ -5821,7 +5842,26 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:3.5.3, chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": +"chokidar@npm:3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + +"chokidar@npm:>=3.0.0 <4.0.0, chokidar@npm:^3.4.2, chokidar@npm:^3.5.3": version: 3.5.3 resolution: "chokidar@npm:3.5.3" dependencies: @@ -5875,21 +5915,21 @@ __metadata: languageName: node linkType: hard -"clean-css@npm:^4.2.1": - version: 4.2.4 - resolution: "clean-css@npm:4.2.4" +"clean-css@npm:^5.2.2": + version: 5.3.2 + resolution: "clean-css@npm:5.3.2" dependencies: source-map: "npm:~0.6.0" - checksum: 10/4f64dbebfa29feb79be25d6f91239239179adc805c6d7442e2c728970ca23a75b5f238118477b4b78553b89e50f14a64fe35145ecc86b6badf971883c4ad2ffe + checksum: 10/efd9efbf400f38a12f99324bad5359bdd153211b048721e4d4ddb629a88865dff3012dca547a14bdd783d78ccf064746e39fd91835546a08e2d811866aff0857 languageName: node linkType: hard -"clean-css@npm:^5.2.2": - version: 5.3.2 - resolution: "clean-css@npm:5.3.2" +"clean-css@npm:~5.3.2": + version: 5.3.3 + resolution: "clean-css@npm:5.3.3" dependencies: source-map: "npm:~0.6.0" - checksum: 10/efd9efbf400f38a12f99324bad5359bdd153211b048721e4d4ddb629a88865dff3012dca547a14bdd783d78ccf064746e39fd91835546a08e2d811866aff0857 + checksum: 10/2db1ae37b384c8ff0a06a12bfa80f56cc02b4abcaaf340db98c0ae88a61dd67c856653fd8135ace6eb0ec13aeab3089c425d2e4238d2a2ad6b6917e6ccc74729 languageName: node linkType: hard @@ -6084,7 +6124,14 @@ __metadata: languageName: node linkType: hard -"commander@npm:^2.19.0, commander@npm:^2.20.0": +"commander@npm:^10.0.0": + version: 10.0.1 + resolution: "commander@npm:10.0.1" + checksum: 10/8799faa84a30da985802e661cc9856adfaee324d4b138413013ef7f087e8d7924b144c30a1f1405475f0909f467665cd9e1ce13270a2f41b141dab0b7a58f3fb + languageName: node + linkType: hard + +"commander@npm:^2.20.0": version: 2.20.3 resolution: "commander@npm:2.20.3" checksum: 10/90c5b6898610cd075984c58c4f88418a4fb44af08c1b1415e9854c03171bec31b336b7f3e4cefe33de994b3f12b03c5e2d638da4316df83593b9e82554e7e95b @@ -6653,7 +6700,7 @@ __metadata: "@graphql-codegen/typescript-operations": "npm:^3.0.4" "@graphql-codegen/typescript-vue-apollo": "npm:^3.3.7" "@popperjs/core": "npm:^2.11.8" - "@quasar/app-webpack": "npm:^3.12.4" + "@quasar/app-webpack": "npm:^3.13.2" "@quasar/cli": "npm:^2.4.0" "@quasar/extras": "npm:^1.16.9" "@quasar/quasar-app-extension-apollo": "npm:^2.2.0" @@ -6667,6 +6714,7 @@ __metadata: "@vue/apollo-composable": "npm:^4.0.2" "@vueuse/core": "npm:^11.0.1" apollo-upload-client: "npm:^17.0.0" + autoprefixer: "npm:^10.4.19" babel-loader: "npm:^9.1.3" color-hash: "npm:^2.0.2" core-js: "npm:^3.36.1" @@ -6680,7 +6728,7 @@ __metadata: jszip: "npm:^3.10.1" lint-staged: "npm:^13.3.0" prettier: "npm:^2.8.8" - quasar: "npm:^2.15.1" + quasar: "npm:^2.16.6" slugify: "npm:^1.6.6" subscriptions-transport-ws: "npm:^0.11.0" ts-essentials: "npm:^9.4.1" @@ -6725,7 +6773,7 @@ __metadata: languageName: node linkType: hard -"debounce@npm:^1.2.0": +"debounce@npm:^1.2.0, debounce@npm:^1.2.1": version: 1.2.1 resolution: "debounce@npm:1.2.1" checksum: 10/0b95b2a9d80ed69117d890f8dab8c0f2d6066f8d20edd1d810ae51f8f366a6d4c8b1d56e97dcb9304e93d57de4d5db440d34a03def7dad50403fc3f22bf16808 @@ -7110,6 +7158,13 @@ __metadata: languageName: node linkType: hard +"electron-to-chromium@npm:^1.4.820": + version: 1.4.829 + resolution: "electron-to-chromium@npm:1.4.829" + checksum: 10/43279561337582ff47bb3486439efbc7c1f2192455c76ebc7374754fca61334380025af9e5da7646b4d8c007d9dc6c25d8f6059dffb2207dc39d2f79287a296a + languageName: node + linkType: hard + "elementtree@npm:0.1.7": version: 0.1.7 resolution: "elementtree@npm:0.1.7" @@ -7192,7 +7247,7 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.5.0": +"entities@npm:^4.4.0, entities@npm:^4.5.0": version: 4.5.0 resolution: "entities@npm:4.5.0" checksum: 10/ede2a35c9bce1aeccd055a1b445d41c75a14a2bb1cd22e242f20cf04d236cdcd7f9c859eb83f76885327bfae0c25bf03303665ee1ce3d47c5927b98b0e3e3d48 @@ -7252,6 +7307,13 @@ __metadata: languageName: node linkType: hard +"escalade@npm:^3.1.2": + version: 3.1.2 + resolution: "escalade@npm:3.1.2" + checksum: 10/a1e07fea2f15663c30e40b9193d658397846ffe28ce0a3e4da0d8e485fedfeca228ab846aee101a05015829adf39f9934ff45b2a3fca47bed37a29646bd05cd3 + languageName: node + linkType: hard + "escape-goat@npm:^4.0.0": version: 4.0.0 resolution: "escape-goat@npm:4.0.0" @@ -7554,7 +7616,46 @@ __metadata: languageName: node linkType: hard -"express@npm:4.18.2, express@npm:^4.17.3": +"express@npm:4.19.2": + version: 4.19.2 + resolution: "express@npm:4.19.2" + dependencies: + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.2" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.6.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 10/3fcd792536f802c059789ef48db3851b87e78fba103423e524144d79af37da7952a2b8d4e1a007f423329c7377d686d9476ac42e7d9ea413b80345d495e30a3a + languageName: node + linkType: hard + +"express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -7671,20 +7772,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:3.2.12": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/641e748664ae0fdc4dadd23c812fd7d6c80cd92d451571cb1f81fa87edb750e917f25abf74fc9503c97438b0b67ecf75b738bb8e50a83b16bd2a88b4d64e81fa - languageName: node - linkType: hard - -"fast-glob@npm:^3.1.1": +"fast-glob@npm:3.3.2, fast-glob@npm:^3.1.1": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -7915,6 +8003,15 @@ __metadata: languageName: node linkType: hard +"flat@npm:^5.0.2": + version: 5.0.2 + resolution: "flat@npm:5.0.2" + bin: + flat: cli.js + checksum: 10/72479e651c15eab53e25ce04c31bab18cfaac0556505cac19221dbbe85bbb9686bc76e4d397e89e5bf516ce667dcf818f8b07e585568edba55abc2bf1f698fb5 + languageName: node + linkType: hard + "flatted@npm:^3.2.7": version: 3.2.7 resolution: "flatted@npm:3.2.7" @@ -7998,10 +8095,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.3.6 - resolution: "fraction.js@npm:4.3.6" - checksum: 10/e018e613f1373965960bc00d1043205895b9a38c0bf1306a822bada90b48180fc1c6ace3ec84f1f6b36eeff935210dde5ec24e163aa82e7ae441e4b190f80707 +"fraction.js@npm:^4.3.7": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: 10/bb5ebcdeeffcdc37b68ead3bdfc244e68de188e0c64e9702197333c72963b95cc798883ad16adc21588088b942bca5b6a6ff4aeb1362d19f6f3b629035dc15f5 languageName: node linkType: hard @@ -8028,14 +8125,14 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" +"fs-extra@npm:11.2.0, fs-extra@npm:^11.2.0": + version: 11.2.0 + resolution: "fs-extra@npm:11.2.0" dependencies: graceful-fs: "npm:^4.2.0" jsonfile: "npm:^6.0.1" universalify: "npm:^2.0.0" - checksum: 10/b3f4a411e221f3300cfed7f2c1fa3ea0538cc1688c4276ce38fc404e270526002c5a01a18f64f8dee5e2745f7c2e9ba188cb130240796da67a2a142b133b4b25 + checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 languageName: node linkType: hard @@ -8050,17 +8147,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.2.0": - version: 11.2.0 - resolution: "fs-extra@npm:11.2.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/0579bf6726a4cd054d4aa308f10b483f52478bb16284f32cf60b4ce0542063d551fca1a08a2af365e35db21a3fa5a06cf2a6ed614004b4368982bc754cb816b3 - languageName: node - linkType: hard - "fs-extra@npm:^9.0.0": version: 9.1.0 resolution: "fs-extra@npm:9.1.0" @@ -8607,6 +8693,13 @@ __metadata: languageName: node linkType: hard +"html-escaper@npm:^2.0.2": + version: 2.0.2 + resolution: "html-escaper@npm:2.0.2" + checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 + languageName: node + linkType: hard + "html-minifier-terser@npm:^6.0.2": version: 6.1.0 resolution: "html-minifier-terser@npm:6.1.0" @@ -8624,26 +8717,26 @@ __metadata: languageName: node linkType: hard -"html-minifier@npm:4.0.0": - version: 4.0.0 - resolution: "html-minifier@npm:4.0.0" +"html-minifier-terser@npm:^7.2.0": + version: 7.2.0 + resolution: "html-minifier-terser@npm:7.2.0" dependencies: - camel-case: "npm:^3.0.0" - clean-css: "npm:^4.2.1" - commander: "npm:^2.19.0" - he: "npm:^1.2.0" - param-case: "npm:^2.1.1" + camel-case: "npm:^4.1.2" + clean-css: "npm:~5.3.2" + commander: "npm:^10.0.0" + entities: "npm:^4.4.0" + param-case: "npm:^3.0.4" relateurl: "npm:^0.2.7" - uglify-js: "npm:^3.5.1" + terser: "npm:^5.15.1" bin: - html-minifier: ./cli.js - checksum: 10/a1a49ee78a41eb3232f7aa51be25092d7634548e8996577b2bdab22dc9ac736594d35aab7fdf81fb5a0da11f7bc688f500c297b24fd312d48c0ce8739ed4f06f + html-minifier-terser: cli.js + checksum: 10/7320095dbf08c361b45e855bd840d1d21fe86326afee775503594163532ebaaed9bb1c9dc98232b03c169dc24b56f30c294d559bca0cade59f9c950a1992db82 languageName: node linkType: hard -"html-webpack-plugin@npm:5.5.0": - version: 5.5.0 - resolution: "html-webpack-plugin@npm:5.5.0" +"html-webpack-plugin@npm:5.6.0": + version: 5.6.0 + resolution: "html-webpack-plugin@npm:5.6.0" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -8651,8 +8744,14 @@ __metadata: pretty-error: "npm:^4.0.0" tapable: "npm:^2.0.0" peerDependencies: + "@rspack/core": 0.x || 1.x webpack: ^5.20.0 - checksum: 10/16b08c32841ce0a4feec8279da4c6fb5fb2606c36ee8fb4259397552b8f611884ad365722fae51cc8eb18f93eaa7303260f0ecb352b72e6b6b17a66871a7c80a + peerDependenciesMeta: + "@rspack/core": + optional: true + webpack: + optional: true + checksum: 10/d651f3a88a7c932c72c6a30f0fdd610b49a864a69f1ddb34562c750f1602ea471e27fd8fc32c01adadd484b38fa6b74f055d1ccce26e5f8fcf814ee0d398a121 languageName: node linkType: hard @@ -9329,10 +9428,10 @@ __metadata: languageName: node linkType: hard -"isbinaryfile@npm:5.0.0": - version: 5.0.0 - resolution: "isbinaryfile@npm:5.0.0" - checksum: 10/511bb5ce54c903e9881ca46fe7fe06759b29d9d01d6929f3c46cb95a4bf369320d9de858943d5bf4ac446a442b53be095b325b1deebca0e67ccd9f466c53ef74 +"isbinaryfile@npm:5.0.2": + version: 5.0.2 + resolution: "isbinaryfile@npm:5.0.2" + checksum: 10/515d7c963b35c2c443457d18c9152d1f655f3a0e2dceb548448e482145c1897e57a92fc024dece7de98c85c2909f5528e34e3d720c307887529cd689d7a7cd36 languageName: node linkType: hard @@ -9650,22 +9749,22 @@ __metadata: languageName: node linkType: hard -"launch-editor-middleware@npm:2.6.0": - version: 2.6.0 - resolution: "launch-editor-middleware@npm:2.6.0" +"launch-editor-middleware@npm:2.6.1": + version: 2.6.1 + resolution: "launch-editor-middleware@npm:2.6.1" dependencies: - launch-editor: "npm:^2.6.0" - checksum: 10/6e39d216a64f4749cfe9c04d8a576daf0585dd7c1c17a82be5a45192b1ddcb2c565e252a8dbb10614ed9746063c5c69a487e2470e795f40567bd447d43be49d0 + launch-editor: "npm:^2.6.1" + checksum: 10/da9eaabe9d1fe9914a80a8608218e242557e9c1a851e9169f0fe608663c84dbec0db7a5279ac30e939106d3c159579e8849e7230a95d0aa93e8858d8f822281b languageName: node linkType: hard -"launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" +"launch-editor@npm:^2.6.1": + version: 2.8.0 + resolution: "launch-editor@npm:2.8.0" dependencies: picocolors: "npm:^1.0.0" - shell-quote: "npm:^1.7.3" - checksum: 10/48e4230643e8fdb5c14c11314706d58d9f3fbafe2606be3d6e37da1918ad8bfe39dd87875c726a1b59b9f4da99d87ec3e36d4c528464f0b820f9e91e5cb1c02d + shell-quote: "npm:^1.8.1" + checksum: 10/495009163fd4879fbc576323d1da3b821379ec66e9c20ed3297ea65b3eceb720fe9409cbd2819d6ff5dd0115325e6b6716d473dd729d5aa8ddd67810e3545477 languageName: node linkType: hard @@ -9992,13 +10091,6 @@ __metadata: languageName: node linkType: hard -"lower-case@npm:^1.1.1": - version: 1.1.4 - resolution: "lower-case@npm:1.1.4" - checksum: 10/0c4aebc459ba330bcc38d20cad26ee33111155ed09c09e7d7ec395997277feee3a4d8db541ed5ca555f20ddc5c65a3b23648d18fcd2a950376da6d0c2e01416e - languageName: node - linkType: hard - "lower-case@npm:^2.0.2": version: 2.0.2 resolution: "lower-case@npm:2.0.2" @@ -10350,14 +10442,15 @@ __metadata: languageName: node linkType: hard -"mini-css-extract-plugin@npm:2.7.2": - version: 2.7.2 - resolution: "mini-css-extract-plugin@npm:2.7.2" +"mini-css-extract-plugin@npm:2.9.0": + version: 2.9.0 + resolution: "mini-css-extract-plugin@npm:2.9.0" dependencies: schema-utils: "npm:^4.0.0" + tapable: "npm:^2.2.1" peerDependencies: webpack: ^5.0.0 - checksum: 10/7a8123d4fa86760968064cb519e7c0c0d4a55f7adb07b664cba6dcf53146d67dc0189ae7f89f2bc48ae05f32083e12f8d3f6517f85215781a6a52e525ffaf042 + checksum: 10/4c9ee9c0c6160a64a4884d5a92a1a5c0b68d556cd00f975cf6c8a79b51ac90e6130a37b3832b17d377d0cb1b31c0313c8c023458d4f69e95fe3424a8b43d834f languageName: node linkType: hard @@ -10413,14 +10506,7 @@ __metadata: languageName: node linkType: hard -"minimist@npm:1.2.7": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 10/0202378a8eb1a9d98a44f623f43c89793a095f4bde6981bda29f6ae61e82a15c18b1690b5efc4c66ddbd402a3e9b7175e6ebdabb2b28037c279ac823b7360e00 - languageName: node - linkType: hard - -"minimist@npm:^1.2.0, minimist@npm:^1.2.8": +"minimist@npm:1.2.8, minimist@npm:^1.2.0, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" checksum: 10/908491b6cc15a6c440ba5b22780a0ba89b9810e1aea684e253e43c4e3b8d56ec1dcdd7ea96dde119c29df59c936cde16062159eae4225c691e19c70b432b6e6f @@ -10520,10 +10606,10 @@ __metadata: languageName: node linkType: hard -"mrmime@npm:^1.0.0": - version: 1.0.1 - resolution: "mrmime@npm:1.0.1" - checksum: 10/a157e833ffe76648ab2107319deeff024b80b136ec66c60fae9d339009a1bb72c57ec1feecfd6a905dfd3df29e2299e850bff84b69cad790cc9bd9ab075834d1 +"mrmime@npm:^2.0.0": + version: 2.0.0 + resolution: "mrmime@npm:2.0.0" + checksum: 10/8d95f714ea200c6cf3e3777cbc6168be04b05ac510090a9b41eef5ec081efeb1d1de3e535ffb9c9689fffcc42f59864fd52a500e84a677274f070adeea615c45 languageName: node linkType: hard @@ -10604,15 +10690,6 @@ __metadata: languageName: node linkType: hard -"no-case@npm:^2.2.0": - version: 2.3.2 - resolution: "no-case@npm:2.3.2" - dependencies: - lower-case: "npm:^1.1.1" - checksum: 10/a92fc7c10f40477bb69c3ca00e2a12fd08f838204bcef66233cbe8a36c0ec7938ba0cdf3f0534b38702376cbfa26270130607c0b8460ea87f44d474919c39c91 - languageName: node - linkType: hard - "no-case@npm:^3.0.4": version: 3.0.4 resolution: "no-case@npm:3.0.4" @@ -11120,15 +11197,6 @@ __metadata: languageName: node linkType: hard -"param-case@npm:^2.1.1": - version: 2.1.1 - resolution: "param-case@npm:2.1.1" - dependencies: - no-case: "npm:^2.2.0" - checksum: 10/3a63dcb8d8dc7995a612de061afdc7bb6fe7bd0e6db994db8d4cae999ed879859fd24389090e1a0d93f4c9207ebf8c048c870f468a3f4767161753e03cb9ab58 - languageName: node - linkType: hard - "param-case@npm:^3.0.4": version: 3.0.4 resolution: "param-case@npm:3.0.4" @@ -11294,6 +11362,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.0.1": + version: 1.0.1 + resolution: "picocolors@npm:1.0.1" + checksum: 10/fa68166d1f56009fc02a34cdfd112b0dd3cf1ef57667ac57281f714065558c01828cdf4f18600ad6851cbe0093952ed0660b1e0156bddf2184b6aaf5817553a5 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -11729,7 +11804,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.17, postcss@npm:^8.4.19, postcss@npm:^8.4.35, postcss@npm:^8.4.4, postcss@npm:^8.4.6": +"postcss@npm:^8.4.17, postcss@npm:^8.4.19, postcss@npm:^8.4.35, postcss@npm:^8.4.6": version: 8.4.38 resolution: "postcss@npm:8.4.38" dependencies: @@ -11740,6 +11815,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.38": + version: 8.4.39 + resolution: "postcss@npm:8.4.39" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.1" + source-map-js: "npm:^1.2.0" + checksum: 10/ad9c1add892c96433b9a5502878201ede4a20c4ce02d056251f61f8d9a3e5426dab3683fe5a086edfa78a1a19f2b4988c8cea02c5122136d29758cb5a17e2621 + languageName: node + linkType: hard + "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" @@ -11882,10 +11968,10 @@ __metadata: languageName: node linkType: hard -"quasar@npm:^2.15.1": - version: 2.15.1 - resolution: "quasar@npm:2.15.1" - checksum: 10/9458b512eb2c630b114a28863d4fd53143591f19d8882fa8feed52664fd44aee6c5d38a02b922bdb3d5fb56c274c84740887e9e903be6face6c26ca1171e0146 +"quasar@npm:^2.16.6": + version: 2.16.6 + resolution: "quasar@npm:2.16.6" + checksum: 10/a3a0aa5b5f3ccad8eee38ec6089efe3cb44a1418bd33e61949959f7eb13e00b8aff182109d8a4fbbe421d6abcd56297d75d51c9e5acf8937f287af58be1006e8 languageName: node linkType: hard @@ -12668,7 +12754,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3": +"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": version: 1.8.1 resolution: "shell-quote@npm:1.8.1" checksum: 10/af19ab5a1ec30cb4b2f91fd6df49a7442d5c4825a2e269b3712eded10eedd7f9efeaab96d57829880733fc55bcdd8e9b1d8589b4befb06667c731d08145e274d @@ -12707,14 +12793,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" +"sirv@npm:^2.0.3": + version: 2.0.4 + resolution: "sirv@npm:2.0.4" dependencies: - "@polka/url": "npm:^1.0.0-next.20" - mrmime: "npm:^1.0.0" - totalist: "npm:^1.0.0" - checksum: 10/b6833ab4d41f5e449ffcb4d89caac45d97de4b246f984f9b9fa86a0107689562c22d24788b533a58a10cf2cfcebb7e6c678ffa84ac7d3392fca9d18b1bd7ee05 + "@polka/url": "npm:^1.0.0-next.24" + mrmime: "npm:^2.0.0" + totalist: "npm:^3.0.0" + checksum: 10/24f42cf06895017e589c9d16fc3f1c6c07fe8b0dbafce8a8b46322cfba67b7f2498610183954cb0e9d089c8cb60002a7ee7e8bca6a91a0d7042bfbc3473c95c3 languageName: node linkType: hard @@ -13171,16 +13257,16 @@ __metadata: languageName: node linkType: hard -"table@npm:6.8.1": - version: 6.8.1 - resolution: "table@npm:6.8.1" +"table@npm:6.8.2": + version: 6.8.2 + resolution: "table@npm:6.8.2" dependencies: ajv: "npm:^8.0.1" lodash.truncate: "npm:^4.4.2" slice-ansi: "npm:^4.0.0" string-width: "npm:^4.2.3" strip-ansi: "npm:^6.0.1" - checksum: 10/512c4f2bfb6f46f4d5ced19943ae5db1a5163eac1f23ce752625eb49715f84217c1c62bc2d017eb8985b37e0f85731108f654df809c0b34cca1678a672e7ea20 + checksum: 10/2946162eb87a91b9bf4283214d26830db96f09cf517eff18e7501d47a4770c529b432bb54c9394337c3dfd6c8dbf66581f76edb37e9838beb6ec394080af4ac2 languageName: node linkType: hard @@ -13191,7 +13277,7 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0": +"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1": version: 2.2.1 resolution: "tapable@npm:2.2.1" checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a @@ -13225,29 +13311,7 @@ __metadata: languageName: node linkType: hard -"terser-webpack-plugin@npm:5.3.6": - version: 5.3.6 - resolution: "terser-webpack-plugin@npm:5.3.6" - dependencies: - "@jridgewell/trace-mapping": "npm:^0.3.14" - jest-worker: "npm:^27.4.5" - schema-utils: "npm:^3.1.1" - serialize-javascript: "npm:^6.0.0" - terser: "npm:^5.14.1" - peerDependencies: - webpack: ^5.1.0 - peerDependenciesMeta: - "@swc/core": - optional: true - esbuild: - optional: true - uglify-js: - optional: true - checksum: 10/77e7e429cf9c3e3173103b731360aace42083c8e7e54b33688195979d1ea29a99bde8e1c6589418d6f16e7dc54910db8bc403768833f8c8fa913bc48d7a22234 - languageName: node - linkType: hard - -"terser-webpack-plugin@npm:^5.3.10": +"terser-webpack-plugin@npm:5.3.10, terser-webpack-plugin@npm:^5.3.10": version: 5.3.10 resolution: "terser-webpack-plugin@npm:5.3.10" dependencies: @@ -13291,7 +13355,7 @@ __metadata: languageName: node linkType: hard -"terser@npm:^5.10.0, terser@npm:^5.14.1, terser@npm:^5.16.8": +"terser@npm:^5.10.0, terser@npm:^5.16.8": version: 5.19.4 resolution: "terser@npm:5.19.4" dependencies: @@ -13305,6 +13369,20 @@ __metadata: languageName: node linkType: hard +"terser@npm:^5.15.1": + version: 5.31.3 + resolution: "terser@npm:5.31.3" + dependencies: + "@jridgewell/source-map": "npm:^0.3.3" + acorn: "npm:^8.8.2" + commander: "npm:^2.20.0" + source-map-support: "npm:~0.5.20" + bin: + terser: bin/terser + checksum: 10/7f66d93a1157f66f5eda16515ed45e6eb485d3c4acbc46e78a5e62922f5b4643d9212abc586f791021fafc71563a93475a986c52f4270a5e0b3ee50a70507d9e + languageName: node + linkType: hard + "terser@npm:^5.26.0": version: 5.29.2 resolution: "terser@npm:5.29.2" @@ -13395,10 +13473,10 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: 10/dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 10/5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a languageName: node linkType: hard @@ -13686,15 +13764,6 @@ __metadata: languageName: node linkType: hard -"uglify-js@npm:^3.5.1": - version: 3.17.4 - resolution: "uglify-js@npm:3.17.4" - bin: - uglifyjs: bin/uglifyjs - checksum: 10/4c0b800e0ff192079d2c3ce8414fd3b656a570028c7c79af5c29c53d5c532b68bbcae4ad47307f89c2ee124d11826fff7a136b59d5c5bb18422bcdf5568afe1e - languageName: node - linkType: hard - "unc-path-regex@npm:^0.1.2": version: 0.1.2 resolution: "unc-path-regex@npm:0.1.2" @@ -13825,6 +13894,20 @@ __metadata: languageName: node linkType: hard +"update-browserslist-db@npm:^1.1.0": + version: 1.1.0 + resolution: "update-browserslist-db@npm:1.1.0" + dependencies: + escalade: "npm:^3.1.2" + picocolors: "npm:^1.0.1" + peerDependencies: + browserslist: ">= 4.21.0" + bin: + update-browserslist-db: cli.js + checksum: 10/d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c + languageName: node + linkType: hard + "update-notifier@npm:^6.0.2": version: 6.0.2 resolution: "update-notifier@npm:6.0.2" @@ -13856,13 +13939,6 @@ __metadata: languageName: node linkType: hard -"upper-case@npm:^1.1.1": - version: 1.1.3 - resolution: "upper-case@npm:1.1.3" - checksum: 10/fc4101fdcd783ee963d49d279186688d4ba2fab90e78dbd001ad141522a66ccfe310932f25e70d5211b559ab205be8c24bf9c5520c7ab7dcd0912274c6d976a3 - languageName: node - linkType: hard - "upper-case@npm:^2.0.2": version: 2.0.2 resolution: "upper-case@npm:2.0.2" @@ -14176,22 +14252,25 @@ __metadata: languageName: node linkType: hard -"webpack-bundle-analyzer@npm:4.7.0": - version: 4.7.0 - resolution: "webpack-bundle-analyzer@npm:4.7.0" +"webpack-bundle-analyzer@npm:4.10.2": + version: 4.10.2 + resolution: "webpack-bundle-analyzer@npm:4.10.2" dependencies: + "@discoveryjs/json-ext": "npm:0.5.7" acorn: "npm:^8.0.4" acorn-walk: "npm:^8.0.0" - chalk: "npm:^4.1.0" commander: "npm:^7.2.0" + debounce: "npm:^1.2.1" + escape-string-regexp: "npm:^4.0.0" gzip-size: "npm:^6.0.0" - lodash: "npm:^4.17.20" + html-escaper: "npm:^2.0.2" opener: "npm:^1.5.2" - sirv: "npm:^1.0.7" + picocolors: "npm:^1.0.0" + sirv: "npm:^2.0.3" ws: "npm:^7.3.1" bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: 10/761ffbe721be89f4c2951b04b5d8634cf2bea6edfed6d81d801f4fdbb60dfd271d9d2ba6781ea01697d4e6f4054e3d0a0a940eee947ffba22c69d180f16fb118 + checksum: 10/cb7ff9d01dc04ef23634f439ab9fe739e022cce5595cb340e01d106ed474605ce4ef50b11b47e444507d341b16650dcb3610e88944020ca6c1c38e88072d43ba languageName: node linkType: hard @@ -14264,13 +14343,14 @@ __metadata: languageName: node linkType: hard -"webpack-merge@npm:5.8.0": - version: 5.8.0 - resolution: "webpack-merge@npm:5.8.0" +"webpack-merge@npm:5.10.0": + version: 5.10.0 + resolution: "webpack-merge@npm:5.10.0" dependencies: clone-deep: "npm:^4.0.1" + flat: "npm:^5.0.2" wildcard: "npm:^2.0.0" - checksum: 10/c22812671a93d938bed21c02461d0efb0a7ec0b0f5e7cf28853b2c428a9ad947a26076e97243b1d9cb1cc5a3f92f24e467fc442f03f6e583d082bb3f3f460baf + checksum: 10/fa46ab200f17d06c7cb49fc37ad91f15769753953c9724adac1061fa305a2a223cb37c3ed25a5f501580c91f11a0800990fe3814c70a77bf1aa5b3fca45a2ac6 languageName: node linkType: hard @@ -14298,7 +14378,7 @@ __metadata: languageName: node linkType: hard -"webpack@npm:^5, webpack@npm:^5.58.1": +"webpack@npm:^5": version: 5.88.2 resolution: "webpack@npm:5.88.2" dependencies: