diff --git a/server/package-lock.json b/server/package-lock.json index 6089296..5b8f895 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -12,7 +12,6 @@ "@prisma/client": "^4.0.0", "bloom-filters": "^3.0.0", "body-parser": "^1.20.0", - "class-transformer": "^0.5.1", "class-validator": "^0.13.2", "crc": "^4.1.1", "dotenv": "^16.0.1", @@ -939,11 +938,6 @@ "node": ">=10" } }, - "node_modules/class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, "node_modules/class-validator": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", @@ -5983,11 +5977,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "class-transformer": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", - "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==" - }, "class-validator": { "version": "0.13.2", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.13.2.tgz", diff --git a/server/package.json b/server/package.json index 22c3c02..603afa1 100644 --- a/server/package.json +++ b/server/package.json @@ -19,7 +19,6 @@ "@prisma/client": "^4.0.0", "bloom-filters": "^3.0.0", "body-parser": "^1.20.0", - "class-transformer": "^0.5.1", "class-validator": "^0.13.2", "crc": "^4.1.1", "dotenv": "^16.0.1", diff --git a/server/src/controllers/note/note.post.controller.ts b/server/src/controllers/note/note.post.controller.ts index 80e022c..b4f6266 100644 --- a/server/src/controllers/note/note.post.controller.ts +++ b/server/src/controllers/note/note.post.controller.ts @@ -12,10 +12,10 @@ import { ValidateIf, ValidationError, Matches, - ValidateNested, IsString, + IsArray, + ValidateNested, } from "class-validator"; -import { Type } from "class-transformer"; export class EncryptedEmbed { @IsBase64() @@ -54,8 +54,8 @@ export class NotePostRequest { @Matches("^v[0-9]+$") crypto_version: string = "v1"; - @ValidateNested({ each: true }) - @Type(() => EncryptedEmbed) + // validate the shape of each item manually, avoid need for class-transformer package + @IsArray() embeds: EncryptedEmbed[] = []; } diff --git a/server/src/util.ts b/server/src/util.ts index 01b03cf..9305d36 100644 --- a/server/src/util.ts +++ b/server/src/util.ts @@ -11,3 +11,13 @@ export function getConnectingIp(req: Request): string { req.headers["X-Forwarded-For"] || req.socket.remoteAddress) as string; } + +// base64 to array buffer (Node JS api, so don't use atob or btoa) +export function base64ToArrayBuffer(base64: string): ArrayBuffer { + return Buffer.from(base64, "base64"); +} + +// array buffer to base64 (Node JS api, so don't use atob or btoa) +export function arrayBufferToBase64(buffer: ArrayBuffer): string { + return Buffer.from(buffer).toString("base64"); +} diff --git a/server/src/util.unit.test.ts b/server/src/util.unit.test.ts index f9bde62..6c88af1 100644 --- a/server/src/util.unit.test.ts +++ b/server/src/util.unit.test.ts @@ -1,5 +1,10 @@ import { describe, it, expect } from "vitest"; -import { addDays, getConnectingIp } from "./util"; +import { + addDays, + arrayBufferToBase64, + base64ToArrayBuffer, + getConnectingIp, +} from "./util"; describe("addDays()", () => { it("Should add n days to the input date", () => { @@ -8,3 +13,19 @@ describe("addDays()", () => { expect(addDays(date, 30)).toEqual(expectedDate); }); }); + +describe("converting to/from base64", () => { + it("Should convert a base64 string to an array buffer", () => { + const base64 = "EjRWeJA="; + const expectedBuffer = new Uint8Array([18, 52, 86, 120, 144]); + expect(new Uint8Array(base64ToArrayBuffer(base64))).toStrictEqual( + expectedBuffer + ); + }); + + it("Should convert an array buffer to a base64 string", () => { + const buffer = new Uint8Array([18, 52, 86, 120, 144]); + const expectedBase64 = "EjRWeJA="; + expect(arrayBufferToBase64(buffer)).toEqual(expectedBase64); + }); +});