diff --git a/server/package.json b/server/package.json index 9fb46e008..79bbbde78 100644 --- a/server/package.json +++ b/server/package.json @@ -56,7 +56,6 @@ "commander": "7.2.0", "connect-redis": "6.0.0", "csv-parse": "4.16.0", - "deep-equal": "^2.0.5", "deepmerge": "4.2.2", "dotenv": "10.0.0", "express": "4.17.1", diff --git a/server/pnpm-lock.yaml b/server/pnpm-lock.yaml index 203a78259..3d0c900ed 100644 --- a/server/pnpm-lock.yaml +++ b/server/pnpm-lock.yaml @@ -30,7 +30,6 @@ specifiers: commander: 7.2.0 connect-redis: 6.0.0 csv-parse: 4.16.0 - deep-equal: ^2.0.5 deepmerge: 4.2.2 dotenv: 10.0.0 eslint: 7.29.0 @@ -81,7 +80,6 @@ dependencies: commander: 7.2.0 connect-redis: 6.0.0 csv-parse: 4.16.0 - deep-equal: 2.0.5 deepmerge: 4.2.2 dotenv: 10.0.0 express: 4.17.1 @@ -1008,11 +1006,6 @@ packages: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true - /available-typed-arrays/1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} - dev: false - /aws-sign2/0.7.0: resolution: {integrity: sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=} dev: true @@ -1473,26 +1466,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /deep-equal/2.0.5: - resolution: {integrity: sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==} - dependencies: - call-bind: 1.0.2 - es-get-iterator: 1.1.2 - get-intrinsic: 1.1.1 - is-arguments: 1.1.1 - is-date-object: 1.0.5 - is-regex: 1.1.4 - isarray: 2.0.5 - object-is: 1.1.5 - object-keys: 1.1.1 - object.assign: 4.1.2 - regexp.prototype.flags: 1.3.1 - side-channel: 1.0.4 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.1 - which-typed-array: 1.1.7 - dev: false - /deep-is/0.1.3: resolution: {integrity: sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=} dev: true @@ -1681,19 +1654,6 @@ packages: unbox-primitive: 1.0.1 dev: false - /es-get-iterator/1.1.2: - resolution: {integrity: sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==} - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.1 - has-symbols: 1.0.2 - is-arguments: 1.1.1 - is-map: 2.0.2 - is-set: 2.0.2 - is-string: 1.0.7 - isarray: 2.0.5 - dev: false - /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} @@ -2140,10 +2100,6 @@ packages: is-callable: 1.2.4 dev: false - /foreach/2.0.5: - resolution: {integrity: sha1-C+4AUBiusmDQo6865ljdATbsG5k=} - dev: false - /foreground-child/2.0.0: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} @@ -2506,14 +2462,6 @@ packages: engines: {node: '>= 0.10'} dev: false - /is-arguments/1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - dev: false - /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true @@ -2586,10 +2534,6 @@ packages: is-extglob: 2.1.1 dev: true - /is-map/2.0.2: - resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} - dev: false - /is-nan/1.3.2: resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} engines: {node: '>= 0.4'} @@ -2620,10 +2564,6 @@ packages: call-bind: 1.0.2 has-tostringtag: 1.0.0 - /is-set/2.0.2: - resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} - dev: false - /is-shared-array-buffer/1.0.1: resolution: {integrity: sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==} dev: false @@ -2644,35 +2584,16 @@ packages: dependencies: has-symbols: 1.0.2 - /is-typed-array/1.1.8: - resolution: {integrity: sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-abstract: 1.19.1 - foreach: 2.0.5 - has-tostringtag: 1.0.0 - dev: false - /is-typedarray/1.0.0: resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} dev: true - /is-weakmap/2.0.1: - resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} - dev: false - /is-weakref/1.0.1: resolution: {integrity: sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==} dependencies: call-bind: 1.0.2 dev: false - /is-weakset/2.0.1: - resolution: {integrity: sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw==} - dev: false - /is-windows/1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2686,10 +2607,6 @@ packages: resolution: {integrity: sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=} dev: false - /isarray/2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: false - /isexe/2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true @@ -3304,14 +3221,6 @@ packages: /object-inspect/1.11.0: resolution: {integrity: sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==} - /object-is/1.1.5: - resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.3 - dev: false - /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3769,14 +3678,6 @@ packages: redis-parser: 3.0.0 dev: false - /regexp.prototype.flags/1.3.1: - resolution: {integrity: sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.3 - dev: false - /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -4611,31 +4512,10 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 - /which-collection/1.0.1: - resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} - dependencies: - is-map: 2.0.2 - is-set: 2.0.2 - is-weakmap: 2.0.1 - is-weakset: 2.0.1 - dev: false - /which-module/2.0.0: resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} dev: true - /which-typed-array/1.1.7: - resolution: {integrity: sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==} - engines: {node: '>= 0.4'} - dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.2 - es-abstract: 1.19.1 - foreach: 2.0.5 - has-tostringtag: 1.0.0 - is-typed-array: 1.1.8 - dev: false - /which/2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} diff --git a/server/scripts/sync-database/sync-database.ts b/server/scripts/sync-database/sync-database.ts index 4e621dc13..c8b32b836 100644 --- a/server/scripts/sync-database/sync-database.ts +++ b/server/scripts/sync-database/sync-database.ts @@ -2,7 +2,6 @@ // This script syncs this tachi instances database up with the tachi-database-seeds. import { execSync } from "child_process"; -import deepEqual from "deep-equal"; import { monkDB } from "external/mongo/db"; import fs from "fs"; import CreateLogCtx, { KtLogger } from "lib/logger/logger"; @@ -13,6 +12,7 @@ import os from "os"; import path from "path"; import { ChartDocument, FolderDocument, SongDocument, TableDocument } from "tachi-common"; import { InitaliseFolderChartLookup } from "utils/folder"; +import fjsh from "fast-json-stable-hash"; interface SyncInstructions { pattern: RegExp; @@ -70,7 +70,7 @@ async function GenericUpsert( // @ts-expect-error Actually, T is assignable to OptionalId. insertOne: { document }, }); - } else if (!deepEqual(document, exists, { strict: true })) { + } else if (fjsh.hash(document, "sha256") !== fjsh.hash(exists, "sha256")) { bwriteOps.push({ replaceOne: { // @ts-expect-error Known X->Y generic issue. @@ -132,7 +132,7 @@ const syncInstructions: SyncInstructions[] = [ // @ts-expect-error faulty monk types insertOne: { document: folder }, }); - } else if (!deepEqual(folder, exists, { strict: true })) { + } else if (fjsh.hash(document, "sha256") !== fjsh.hash(exists, "sha256")) { bwriteOps.push({ updateOne: { filter: { @@ -175,7 +175,7 @@ const syncInstructions: SyncInstructions[] = [ // @ts-expect-error faulty monk types insertOne: { document: table }, }); - } else if (!deepEqual(table, exists, { strict: true })) { + } else if (fjsh.hash(document, "sha256") !== fjsh.hash(exists, "sha256")) { bwriteOps.push({ updateOne: { filter: { diff --git a/server/src/server/router/api/v1/oauth/clients/router.ts b/server/src/server/router/api/v1/oauth/clients/router.ts index 245a7deed..5689aaded 100644 --- a/server/src/server/router/api/v1/oauth/clients/router.ts +++ b/server/src/server/router/api/v1/oauth/clients/router.ts @@ -157,6 +157,18 @@ router.patch( return "Invalid URL."; } + return true; + }), + redirectUri: optNull((self) => { + if (typeof self !== "string") { + return "Expected a string."; + } + const res = IsValidURL(self); + + if (!res) { + return "Invalid URL."; + } + return true; }), }),