From 4bc66ab0149999c9038b19634c8efea81eb1d4c1 Mon Sep 17 00:00:00 2001 From: Zimeng Xiong Date: Fri, 28 Nov 2025 10:19:44 -0800 Subject: [PATCH] MVP passwords --- backend/Dockerfile | 7 +- backend/prisma/dev.db.backup | Bin 6316032 -> 5644288 bytes backend/prisma/dev.db.pre-migrate | Bin 0 -> 339968 bytes .../migration.sql | 34 + backend/prisma/prisma/dev.db | Bin 36864 -> 0 bytes backend/prisma/prisma/dev.db-journal | Bin 12824 -> 0 bytes backend/prisma/schema.prisma | 15 + backend/src/generated/client/edge.js | 20 +- backend/src/generated/client/index-browser.js | 13 + backend/src/generated/client/index.d.ts | 1283 ++++++++++++++++- backend/src/generated/client/index.js | 20 +- backend/src/generated/client/package.json | 2 +- backend/src/generated/client/schema.prisma | 15 + backend/src/generated/client/wasm.js | 13 + backend/src/index.ts | 352 ++++- frontend/src/App.tsx | 21 +- frontend/src/api/index.ts | 95 +- .../src/components/ChangeVaultPassword.tsx | 222 +++ frontend/src/components/DrawingCard.tsx | 18 +- frontend/src/components/Layout.tsx | 5 +- frontend/src/components/PrivateVaultSetup.tsx | 239 +++ frontend/src/components/Sidebar.tsx | 105 +- frontend/src/components/UnlockVaultModal.tsx | 149 ++ frontend/src/context/VaultContext.tsx | 240 +++ frontend/src/pages/Dashboard.tsx | 123 ++ frontend/src/pages/Editor.tsx | 149 +- frontend/src/pages/PrivateDrawings.tsx | 532 +++++++ frontend/src/pages/Settings.tsx | 140 +- frontend/src/types/index.ts | 17 + frontend/src/utils/crypto.ts | 270 ++++ 30 files changed, 4064 insertions(+), 35 deletions(-) create mode 100644 backend/prisma/dev.db.pre-migrate create mode 100644 backend/prisma/migrations/20251126185156_add_private_vault/migration.sql delete mode 100644 backend/prisma/prisma/dev.db delete mode 100644 backend/prisma/prisma/dev.db-journal create mode 100644 frontend/src/components/ChangeVaultPassword.tsx create mode 100644 frontend/src/components/PrivateVaultSetup.tsx create mode 100644 frontend/src/components/UnlockVaultModal.tsx create mode 100644 frontend/src/context/VaultContext.tsx create mode 100644 frontend/src/pages/PrivateDrawings.tsx create mode 100644 frontend/src/utils/crypto.ts diff --git a/backend/Dockerfile b/backend/Dockerfile index 53589ec..dea8931 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -8,7 +8,10 @@ COPY package*.json ./ COPY tsconfig.json ./ # Install dependencies -RUN npm ci +# Install build deps required for compiling native modules like better-sqlite3 +RUN apk add --no-cache python3 make g++ build-base sqlite-dev && \ + npm ci +ENV PYTHON=/usr/bin/python3 # Copy prisma schema COPY prisma ./prisma/ @@ -26,7 +29,7 @@ RUN npx tsc FROM node:20-alpine # Install OpenSSL for Prisma and su-exec, create non-root user -RUN apk add --no-cache openssl su-exec && \ +RUN apk add --no-cache openssl su-exec sqlite-libs && \ addgroup -g 1001 -S nodejs && \ adduser -S nodejs -u 1001 diff --git a/backend/prisma/dev.db.backup b/backend/prisma/dev.db.backup index 9f71e000286116a4d0e1db121c30cf445f723c02..00c5908dc449cef203282735d055e30a8caf4284 100644 GIT binary patch delta 23260 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

2_b=n`ENX{;f$LCLr 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

|kC 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 U+zc-hOO4aaduflFUdAW<9|eYwssI20 literal 0 HcmV?d00001 diff --git a/backend/prisma/migrations/20251126185156_add_private_vault/migration.sql b/backend/prisma/migrations/20251126185156_add_private_vault/migration.sql new file mode 100644 index 0000000..615330c --- /dev/null +++ b/backend/prisma/migrations/20251126185156_add_private_vault/migration.sql @@ -0,0 +1,34 @@ +-- CreateTable +CREATE TABLE "PrivateVault" ( + "id" TEXT NOT NULL PRIMARY KEY DEFAULT 'vault', + "passwordHash" TEXT NOT NULL, + "salt" TEXT NOT NULL, + "hint" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_Drawing" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "elements" TEXT NOT NULL, + "appState" TEXT NOT NULL, + "files" TEXT NOT NULL DEFAULT '{}', + "preview" TEXT, + "version" INTEGER NOT NULL DEFAULT 1, + "collectionId" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "isPrivate" BOOLEAN NOT NULL DEFAULT false, + "encryptedData" TEXT, + "iv" TEXT, + CONSTRAINT "Drawing_collectionId_fkey" FOREIGN KEY ("collectionId") REFERENCES "Collection" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); +INSERT INTO "new_Drawing" ("appState", "collectionId", "createdAt", "elements", "files", "id", "name", "preview", "updatedAt", "version") SELECT "appState", "collectionId", "createdAt", "elements", "files", "id", "name", "preview", "updatedAt", "version" FROM "Drawing"; +DROP TABLE "Drawing"; +ALTER TABLE "new_Drawing" RENAME TO "Drawing"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/backend/prisma/prisma/dev.db b/backend/prisma/prisma/dev.db deleted file mode 100644 index 6d2ea4ca5301cdc2caa89081b0360d3831b72413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeI&+in|07zc1WN#n#NH5Zj4+6%U>L>q}kyR*j;Lc%!PDr!#nAbKELW_M;&tF~io zr=>z%M6IemL$5$Q076{w0Nn8a2ws3^;F8((`jEIrxv7BUzmnz2?Ci`pznvM|v#EZ% z+2{);I_S1oUokRoXR_JM$BL54WG>3rvV0AXC7Dh#a?gvo-0Jn~*_RjlENF_h zc;c^j*^@?leeZ{+XCEdIn~k8$x=+)$#p3{J?&$!= z@o*8b!)AXNl>GYEnjQRuy}&6LGrhscGK6>L{44$r{d|b@bxsY{QQa> zTaq*#TWNOsb{@u5W%@qp>3s`;)Qw z(IfG+sNCAAcpJC3;|Z+XEKU|Et|=AomL~^W*{dqW@~9tjHpDBznzFMkhy11|*Ndu` zt_L!!z8eo-rCh3(OY2^Kt-YT+dN7|`y>>18ESpTZaaH5g!tseWK5@FamzvIAeBR*P zG8PtBZ(o}=x5hp3^>O;bv-{cHs;*~W_z8*M={9;T=C>OAT^0|P-gM5~aiZx0$Ee~3 z`^1qf-4iSJXwVKvK(R<$FDoK;-^KUM!V5_D7eq$Vl_U7%T`)y)Ej?rW72}J ztFU>nFPF%vBQBa&){O@s_X8F_nr!t%lf6Fc$~APdL|o~x)Tqm㳼IBs%-*2>p zytvg#o0FeM&4#R~*B70hoH>W>q^E<=kcv{@uF7fStxs2|<=4t{i>sgMvqr@9jq~;C zym|SpBK|#}S&^@Wm2WeJ&ZR#teIye&AOHafKmY;|fB*y_009U<;9n6qy0Vb3AFW*2 z%49AqQ|b`GHLfxeIjR|jOr-|VRpCZN52;}YlT(KhYB4G^%+QW>Cb*%Az!HobA+y~m z&;rv4h;BK$<}#*J66u5+Ce<7s1XlLd&wu{<1<{D5>%=5PvrOA(ocqneR;J%N;G#Jw zb@a}B65O3QxWIAEh=oLrh(T17$uOx1ZIwo0B&eow9!5MeY%>b1fRiW;NJv80b~Rgz zxE<<26uM@>O|F>{rNneiCtv}i!eE9=4MC{LzWVXq%X?{XM6)f^vXbDE9o%>a>af*L z3VnWbc`k{q6vsw*C~L4BRnzQHHK~wru1!_f)?Gt$9U2;z@ z5Cak}Tt+AfISm6_;|`(JB7V3VWHt4~4zLi^A{!${?H00Izz00bZa0SG_<0uX=z1kS#|#Pk2fv)^0v5CRZ@00bZa0SG_<0uX=z z1R!ue1@Qd;eBO8T8Uhf200bZa0SG_<0uX=z1kRVh#Pk32)p7I|0uX=z1Rwwb2tWV= N5P$##AaITZ{svUK4}bsw diff --git a/backend/prisma/prisma/dev.db-journal b/backend/prisma/prisma/dev.db-journal deleted file mode 100644 index d187e71bd0863ce407b587a572cd0e1eb816b197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12824 zcmeI2&2Jk;6u@_rG;R#094bZ716x<3jl`n)*snPtVVrFh)p3gLh<<>U+4)FUwH>qG zv{Z;g)C%<<;L;01NF2DK9{2;`#2m3&Du`lM!irKsWZ}Q*Yn=I_vSax zZ&n@~hHfu8frXj^uvGirI5T?f_t)N254vdrnt&#t31|YEfF_^`XabsmCZGwtKmz+` zm#W+QHDl8-POT8)Bf$Z;DU!bJNJedf5wt}h5o82o;c(&;L|jT#hr>Jxso)rh*cFsx zM!i7BAa-z!pzA{rPzni>5OM4f;PW_k5kM}4$Uz9Wju%nRqka;nG`$}UcDd-AkAM2( z*H8D~Sj@vZbu|ww_5(*!hHQy2vK^`dB!YQ1kxU8#0Ow3{i9JWgZp@KnF=B`XUI08G zxyN8ES>VLn;lPoEASZDAn8uU{OmRT4Kt!02e|+ogCuML5c&_8RMQ}3di*dwu`+I|7 zq4e?o*@YsuMjjjDOj&S!8vu{l4iO4j;1N6UV1Pm36NX(kh#g7-3Ji)7*U)-*PZl;I+_Q7Y~x;$9)YxnDDjuy7t0 z_hJ$&k2Z1%wjDryo4C@o9Smh2q{9WI%w-A=p~9Ec2NHNO^96<;V!(sG!~}aZ&H*AW z0*VM?oUqsf+((4C=)mnXECfB5M9DD83c+=U|MIm;>`Iy3rn)b`z(m)sH33aP6VL=S z0Zl*?&;&FAO+XXS1T+Cn;5ia_(E8_3W!~(5*h(^C$=!57GYcE98>VTzZ&^yVQeOFQ z1qXLyxDMov_ghtzP4UR%q2r zg}QaAYN=LFc-`uS*LzlbOI_QomUXSOvDxU{u&#zT-Z{`2(t$XpRZ2u(48$-SKV3>k zqi#mC6UG*&Nyi3S>*3|bcB^My{Nl@trH}Gt=RmXUyDQRhvOBC>8|_|rCG5NBqVY?UQ(r&M@d9570H{vG_K2T|H zwY$AeL&Y~`o}ZjeV~OM)aldX|-s*%KSK2vj>r(x&LVeBZgqK6*z8Q9{dUHBfEnU89 zYt~j<;cA6yZM$K)cB*UpT0R}C+2}SK>tS`xJ-xiTaltffb#I(AjbzBh=i|@%>IF2S zd)aRBd6G8~Ec0XK;hQSA&Yhd&R@q(NbWTmz@km;-mn5f#JC*%gi)TytKS}<@`xsmf1`qID0tSSw2Rp^7~%VUsF%Td+Ihy+QrxxFZ$6RF&$ydVE{(h^mq} zYm?$wYE5So9qbCF;?oTFcX!mrFxPU`(pZ`oH6F#3-8t;_n9FfSQ&p)CYve{JTGJ^{ zHxIU#rfOG;vSc9C;K8VLr}m?Mq702QG0OkPus1AbI@v?E+g(+P!}WQCpt{yvSYG`I ao|F;u3m3upzD4ymaXNpac=F8;fBg%>_U14E diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 23da027..8fa63e9 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -32,6 +32,21 @@ model Drawing { collection Collection? @relation(fields: [collectionId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + + // Privacy/Encryption fields + isPrivate Boolean @default(false) + encryptedData String? // Encrypted blob containing elements, appState, files when isPrivate=true + iv String? // Initialization vector for AES-GCM decryption +} + +// Singleton model for storing vault password hash and settings +model PrivateVault { + id String @id @default("vault") // Singleton pattern + passwordHash String // bcrypt hash for password verification + salt String // Salt for client-side key derivation (hex encoded) + hint String? // Optional password hint + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Library { diff --git a/backend/src/generated/client/edge.js b/backend/src/generated/client/edge.js index ded6d83..917782d 100644 --- a/backend/src/generated/client/edge.js +++ b/backend/src/generated/client/edge.js @@ -104,6 +104,18 @@ exports.Prisma.DrawingScalarFieldEnum = { version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', + updatedAt: 'updatedAt', + isPrivate: 'isPrivate', + encryptedData: 'encryptedData', + iv: 'iv' +}; + +exports.Prisma.PrivateVaultScalarFieldEnum = { + id: 'id', + passwordHash: 'passwordHash', + salt: 'salt', + hint: 'hint', + createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -128,6 +140,7 @@ exports.Prisma.NullsOrder = { exports.Prisma.ModelName = { Collection: 'Collection', Drawing: 'Drawing', + PrivateVault: 'PrivateVault', Library: 'Library' }; /** @@ -177,6 +190,7 @@ const config = { "db" ], "activeProvider": "sqlite", + "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -185,13 +199,13 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n binaryTargets = [\"native\", \"linux-musl-arm64-openssl-3.0.x\", \"linux-musl-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Library {\n id String @id @default(\"default\") // Singleton pattern - use \"default\" ID\n items String @default(\"[]\") // Stored as JSON string array of library items\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", - "inlineSchemaHash": "a6a8e55dadb0695c66246575cd1a63af3afd912ce070b4798d2e56269d371c87", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n binaryTargets = [\"native\", \"linux-musl-arm64-openssl-3.0.x\", \"linux-musl-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // Privacy/Encryption fields\n isPrivate Boolean @default(false)\n encryptedData String? // Encrypted blob containing elements, appState, files when isPrivate=true\n iv String? // Initialization vector for AES-GCM decryption\n}\n\n// Singleton model for storing vault password hash and settings\nmodel PrivateVault {\n id String @id @default(\"vault\") // Singleton pattern\n passwordHash String // bcrypt hash for password verification\n salt String // Salt for client-side key derivation (hex encoded)\n hint String? // Optional password hint\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Library {\n id String @id @default(\"default\") // Singleton pattern - use \"default\" ID\n items String @default(\"[]\") // Stored as JSON string array of library items\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "3cc99802d40f98b2ff8d3cb0c4f62ff9ae197917aed7f91357cb4cb402df6a7c", "copyEngine": true } config.dirname = '/' -config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Library\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"default\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"items\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"[]\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"encryptedData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iv\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PrivateVault\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"vault\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Library\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"default\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"items\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"[]\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/src/generated/client/index-browser.js b/backend/src/generated/client/index-browser.js index d303df9..9f4d295 100644 --- a/backend/src/generated/client/index-browser.js +++ b/backend/src/generated/client/index-browser.js @@ -136,6 +136,18 @@ exports.Prisma.DrawingScalarFieldEnum = { version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', + updatedAt: 'updatedAt', + isPrivate: 'isPrivate', + encryptedData: 'encryptedData', + iv: 'iv' +}; + +exports.Prisma.PrivateVaultScalarFieldEnum = { + id: 'id', + passwordHash: 'passwordHash', + salt: 'salt', + hint: 'hint', + createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -160,6 +172,7 @@ exports.Prisma.NullsOrder = { exports.Prisma.ModelName = { Collection: 'Collection', Drawing: 'Drawing', + PrivateVault: 'PrivateVault', Library: 'Library' }; diff --git a/backend/src/generated/client/index.d.ts b/backend/src/generated/client/index.d.ts index bca9643..4ff0c08 100644 --- a/backend/src/generated/client/index.d.ts +++ b/backend/src/generated/client/index.d.ts @@ -23,6 +23,11 @@ export type Collection = $Result.DefaultSelection * */ export type Drawing = $Result.DefaultSelection +/** + * Model PrivateVault + * + */ +export type PrivateVault = $Result.DefaultSelection /** * Model Library * @@ -172,6 +177,16 @@ export class PrismaClient< */ get drawing(): Prisma.DrawingDelegate; + /** + * `prisma.privateVault`: Exposes CRUD operations for the **PrivateVault** model. + * Example usage: + * ```ts + * // Fetch zero or more PrivateVaults + * const privateVaults = await prisma.privateVault.findMany() + * ``` + */ + get privateVault(): Prisma.PrivateVaultDelegate; + /** * `prisma.library`: Exposes CRUD operations for the **Library** model. * Example usage: @@ -624,6 +639,7 @@ export namespace Prisma { export const ModelName: { Collection: 'Collection', Drawing: 'Drawing', + PrivateVault: 'PrivateVault', Library: 'Library' }; @@ -640,7 +656,7 @@ export namespace Prisma { export type TypeMap = { meta: { - modelProps: "collection" | "drawing" | "library" + modelProps: "collection" | "drawing" | "privateVault" | "library" txIsolationLevel: Prisma.TransactionIsolationLevel } model: { @@ -784,6 +800,76 @@ export namespace Prisma { } } } + PrivateVault: { + payload: Prisma.$PrivateVaultPayload + fields: Prisma.PrivateVaultFieldRefs + operations: { + findUnique: { + args: Prisma.PrivateVaultFindUniqueArgs + result: $Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.PrivateVaultFindUniqueOrThrowArgs + result: $Utils.PayloadToResult + } + findFirst: { + args: Prisma.PrivateVaultFindFirstArgs + result: $Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.PrivateVaultFindFirstOrThrowArgs + result: $Utils.PayloadToResult + } + findMany: { + args: Prisma.PrivateVaultFindManyArgs + result: $Utils.PayloadToResult[] + } + create: { + args: Prisma.PrivateVaultCreateArgs + result: $Utils.PayloadToResult + } + createMany: { + args: Prisma.PrivateVaultCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.PrivateVaultCreateManyAndReturnArgs + result: $Utils.PayloadToResult[] + } + delete: { + args: Prisma.PrivateVaultDeleteArgs + result: $Utils.PayloadToResult + } + update: { + args: Prisma.PrivateVaultUpdateArgs + result: $Utils.PayloadToResult + } + deleteMany: { + args: Prisma.PrivateVaultDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.PrivateVaultUpdateManyArgs + result: BatchPayload + } + upsert: { + args: Prisma.PrivateVaultUpsertArgs + result: $Utils.PayloadToResult + } + aggregate: { + args: Prisma.PrivateVaultAggregateArgs + result: $Utils.Optional + } + groupBy: { + args: Prisma.PrivateVaultGroupByArgs + result: $Utils.Optional[] + } + count: { + args: Prisma.PrivateVaultCountArgs + result: $Utils.Optional | number + } + } + } Library: { payload: Prisma.$LibraryPayload fields: Prisma.LibraryFieldRefs @@ -2010,6 +2096,9 @@ export namespace Prisma { collectionId: string | null createdAt: Date | null updatedAt: Date | null + isPrivate: boolean | null + encryptedData: string | null + iv: string | null } export type DrawingMaxAggregateOutputType = { @@ -2023,6 +2112,9 @@ export namespace Prisma { collectionId: string | null createdAt: Date | null updatedAt: Date | null + isPrivate: boolean | null + encryptedData: string | null + iv: string | null } export type DrawingCountAggregateOutputType = { @@ -2036,6 +2128,9 @@ export namespace Prisma { collectionId: number createdAt: number updatedAt: number + isPrivate: number + encryptedData: number + iv: number _all: number } @@ -2059,6 +2154,9 @@ export namespace Prisma { collectionId?: true createdAt?: true updatedAt?: true + isPrivate?: true + encryptedData?: true + iv?: true } export type DrawingMaxAggregateInputType = { @@ -2072,6 +2170,9 @@ export namespace Prisma { collectionId?: true createdAt?: true updatedAt?: true + isPrivate?: true + encryptedData?: true + iv?: true } export type DrawingCountAggregateInputType = { @@ -2085,6 +2186,9 @@ export namespace Prisma { collectionId?: true createdAt?: true updatedAt?: true + isPrivate?: true + encryptedData?: true + iv?: true _all?: true } @@ -2185,6 +2289,9 @@ export namespace Prisma { collectionId: string | null createdAt: Date updatedAt: Date + isPrivate: boolean + encryptedData: string | null + iv: string | null _count: DrawingCountAggregateOutputType | null _avg: DrawingAvgAggregateOutputType | null _sum: DrawingSumAggregateOutputType | null @@ -2217,6 +2324,9 @@ export namespace Prisma { collectionId?: boolean createdAt?: boolean updatedAt?: boolean + isPrivate?: boolean + encryptedData?: boolean + iv?: boolean collection?: boolean | Drawing$collectionArgs }, ExtArgs["result"]["drawing"]> @@ -2231,6 +2341,9 @@ export namespace Prisma { collectionId?: boolean createdAt?: boolean updatedAt?: boolean + isPrivate?: boolean + encryptedData?: boolean + iv?: boolean collection?: boolean | Drawing$collectionArgs }, ExtArgs["result"]["drawing"]> @@ -2245,6 +2358,9 @@ export namespace Prisma { collectionId?: boolean createdAt?: boolean updatedAt?: boolean + isPrivate?: boolean + encryptedData?: boolean + iv?: boolean } export type DrawingInclude = { @@ -2270,6 +2386,9 @@ export namespace Prisma { collectionId: string | null createdAt: Date updatedAt: Date + isPrivate: boolean + encryptedData: string | null + iv: string | null }, ExtArgs["result"]["drawing"]> composites: {} } @@ -2674,6 +2793,9 @@ export namespace Prisma { readonly collectionId: FieldRef<"Drawing", 'String'> readonly createdAt: FieldRef<"Drawing", 'DateTime'> readonly updatedAt: FieldRef<"Drawing", 'DateTime'> + readonly isPrivate: FieldRef<"Drawing", 'Boolean'> + readonly encryptedData: FieldRef<"Drawing", 'String'> + readonly iv: FieldRef<"Drawing", 'String'> } @@ -3019,6 +3141,894 @@ export namespace Prisma { } + /** + * Model PrivateVault + */ + + export type AggregatePrivateVault = { + _count: PrivateVaultCountAggregateOutputType | null + _min: PrivateVaultMinAggregateOutputType | null + _max: PrivateVaultMaxAggregateOutputType | null + } + + export type PrivateVaultMinAggregateOutputType = { + id: string | null + passwordHash: string | null + salt: string | null + hint: string | null + createdAt: Date | null + updatedAt: Date | null + } + + export type PrivateVaultMaxAggregateOutputType = { + id: string | null + passwordHash: string | null + salt: string | null + hint: string | null + createdAt: Date | null + updatedAt: Date | null + } + + export type PrivateVaultCountAggregateOutputType = { + id: number + passwordHash: number + salt: number + hint: number + createdAt: number + updatedAt: number + _all: number + } + + + export type PrivateVaultMinAggregateInputType = { + id?: true + passwordHash?: true + salt?: true + hint?: true + createdAt?: true + updatedAt?: true + } + + export type PrivateVaultMaxAggregateInputType = { + id?: true + passwordHash?: true + salt?: true + hint?: true + createdAt?: true + updatedAt?: true + } + + export type PrivateVaultCountAggregateInputType = { + id?: true + passwordHash?: true + salt?: true + hint?: true + createdAt?: true + updatedAt?: true + _all?: true + } + + export type PrivateVaultAggregateArgs = { + /** + * Filter which PrivateVault to aggregate. + */ + where?: PrivateVaultWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of PrivateVaults to fetch. + */ + orderBy?: PrivateVaultOrderByWithRelationInput | PrivateVaultOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: PrivateVaultWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` PrivateVaults from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` PrivateVaults. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned PrivateVaults + **/ + _count?: true | PrivateVaultCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: PrivateVaultMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: PrivateVaultMaxAggregateInputType + } + + export type GetPrivateVaultAggregateType = { + [P in keyof T & keyof AggregatePrivateVault]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : GetScalarType + : GetScalarType + } + + + + + export type PrivateVaultGroupByArgs = { + where?: PrivateVaultWhereInput + orderBy?: PrivateVaultOrderByWithAggregationInput | PrivateVaultOrderByWithAggregationInput[] + by: PrivateVaultScalarFieldEnum[] | PrivateVaultScalarFieldEnum + having?: PrivateVaultScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: PrivateVaultCountAggregateInputType | true + _min?: PrivateVaultMinAggregateInputType + _max?: PrivateVaultMaxAggregateInputType + } + + export type PrivateVaultGroupByOutputType = { + id: string + passwordHash: string + salt: string + hint: string | null + createdAt: Date + updatedAt: Date + _count: PrivateVaultCountAggregateOutputType | null + _min: PrivateVaultMinAggregateOutputType | null + _max: PrivateVaultMaxAggregateOutputType | null + } + + type GetPrivateVaultGroupByPayload = Prisma.PrismaPromise< + Array< + PickEnumerable & + { + [P in ((keyof T) & (keyof PrivateVaultGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : GetScalarType + : GetScalarType + } + > + > + + + export type PrivateVaultSelect = $Extensions.GetSelect<{ + id?: boolean + passwordHash?: boolean + salt?: boolean + hint?: boolean + createdAt?: boolean + updatedAt?: boolean + }, ExtArgs["result"]["privateVault"]> + + export type PrivateVaultSelectCreateManyAndReturn = $Extensions.GetSelect<{ + id?: boolean + passwordHash?: boolean + salt?: boolean + hint?: boolean + createdAt?: boolean + updatedAt?: boolean + }, ExtArgs["result"]["privateVault"]> + + export type PrivateVaultSelectScalar = { + id?: boolean + passwordHash?: boolean + salt?: boolean + hint?: boolean + createdAt?: boolean + updatedAt?: boolean + } + + + export type $PrivateVaultPayload = { + name: "PrivateVault" + objects: {} + scalars: $Extensions.GetPayloadResult<{ + id: string + passwordHash: string + salt: string + hint: string | null + createdAt: Date + updatedAt: Date + }, ExtArgs["result"]["privateVault"]> + composites: {} + } + + type PrivateVaultGetPayload = $Result.GetResult + + type PrivateVaultCountArgs = + Omit & { + select?: PrivateVaultCountAggregateInputType | true + } + + export interface PrivateVaultDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['PrivateVault'], meta: { name: 'PrivateVault' } } + /** + * Find zero or one PrivateVault that matches the filter. + * @param {PrivateVaultFindUniqueArgs} args - Arguments to find a PrivateVault + * @example + * // Get one PrivateVault + * const privateVault = await prisma.privateVault.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "findUnique"> | null, null, ExtArgs> + + /** + * Find one PrivateVault that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {PrivateVaultFindUniqueOrThrowArgs} args - Arguments to find a PrivateVault + * @example + * // Get one PrivateVault + * const privateVault = await prisma.privateVault.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "findUniqueOrThrow">, never, ExtArgs> + + /** + * Find the first PrivateVault that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultFindFirstArgs} args - Arguments to find a PrivateVault + * @example + * // Get one PrivateVault + * const privateVault = await prisma.privateVault.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "findFirst"> | null, null, ExtArgs> + + /** + * Find the first PrivateVault that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultFindFirstOrThrowArgs} args - Arguments to find a PrivateVault + * @example + * // Get one PrivateVault + * const privateVault = await prisma.privateVault.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "findFirstOrThrow">, never, ExtArgs> + + /** + * Find zero or more PrivateVaults that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all PrivateVaults + * const privateVaults = await prisma.privateVault.findMany() + * + * // Get first 10 PrivateVaults + * const privateVaults = await prisma.privateVault.findMany({ take: 10 }) + * + * // Only select the `id` + * const privateVaultWithIdOnly = await prisma.privateVault.findMany({ select: { id: true } }) + * + */ + findMany(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "findMany">> + + /** + * Create a PrivateVault. + * @param {PrivateVaultCreateArgs} args - Arguments to create a PrivateVault. + * @example + * // Create one PrivateVault + * const PrivateVault = await prisma.privateVault.create({ + * data: { + * // ... data to create a PrivateVault + * } + * }) + * + */ + create(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "create">, never, ExtArgs> + + /** + * Create many PrivateVaults. + * @param {PrivateVaultCreateManyArgs} args - Arguments to create many PrivateVaults. + * @example + * // Create many PrivateVaults + * const privateVault = await prisma.privateVault.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Create many PrivateVaults and returns the data saved in the database. + * @param {PrivateVaultCreateManyAndReturnArgs} args - Arguments to create many PrivateVaults. + * @example + * // Create many PrivateVaults + * const privateVault = await prisma.privateVault.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many PrivateVaults and only return the `id` + * const privateVaultWithIdOnly = await prisma.privateVault.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: SelectSubset>): Prisma.PrismaPromise<$Result.GetResult, T, "createManyAndReturn">> + + /** + * Delete a PrivateVault. + * @param {PrivateVaultDeleteArgs} args - Arguments to delete one PrivateVault. + * @example + * // Delete one PrivateVault + * const PrivateVault = await prisma.privateVault.delete({ + * where: { + * // ... filter to delete one PrivateVault + * } + * }) + * + */ + delete(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "delete">, never, ExtArgs> + + /** + * Update one PrivateVault. + * @param {PrivateVaultUpdateArgs} args - Arguments to update one PrivateVault. + * @example + * // Update one PrivateVault + * const privateVault = await prisma.privateVault.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "update">, never, ExtArgs> + + /** + * Delete zero or more PrivateVaults. + * @param {PrivateVaultDeleteManyArgs} args - Arguments to filter PrivateVaults to delete. + * @example + * // Delete a few PrivateVaults + * const { count } = await prisma.privateVault.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more PrivateVaults. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many PrivateVaults + * const privateVault = await prisma.privateVault.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: SelectSubset>): Prisma.PrismaPromise + + /** + * Create or update one PrivateVault. + * @param {PrivateVaultUpsertArgs} args - Arguments to update or create a PrivateVault. + * @example + * // Update or create a PrivateVault + * const privateVault = await prisma.privateVault.upsert({ + * create: { + * // ... data to create a PrivateVault + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the PrivateVault we want to update + * } + * }) + */ + upsert(args: SelectSubset>): Prisma__PrivateVaultClient<$Result.GetResult, T, "upsert">, never, ExtArgs> + + + /** + * Count the number of PrivateVaults. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultCountArgs} args - Arguments to filter PrivateVaults to count. + * @example + * // Count the number of PrivateVaults + * const count = await prisma.privateVault.count({ + * where: { + * // ... the filter for the PrivateVaults we want to count + * } + * }) + **/ + count( + args?: Subset, + ): Prisma.PrismaPromise< + T extends $Utils.Record<'select', any> + ? T['select'] extends true + ? number + : GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a PrivateVault. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Subset): Prisma.PrismaPromise> + + /** + * Group by PrivateVault. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {PrivateVaultGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends PrivateVaultGroupByArgs, + HasSelectOrTake extends Or< + Extends<'skip', Keys>, + Extends<'take', Keys> + >, + OrderByArg extends True extends HasSelectOrTake + ? { orderBy: PrivateVaultGroupByArgs['orderBy'] } + : { orderBy?: PrivateVaultGroupByArgs['orderBy'] }, + OrderFields extends ExcludeUnderscoreKeys>>, + ByFields extends MaybeTupleToUnion, + ByValid extends Has, + HavingFields extends GetHavingFields, + HavingValid extends Has, + ByEmpty extends T['by'] extends never[] ? True : False, + InputErrors extends ByEmpty extends True + ? `Error: "by" must not be empty.` + : HavingValid extends False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Keys + ? 'orderBy' extends Keys + ? ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: SubsetIntersection & InputErrors): {} extends InputErrors ? GetPrivateVaultGroupByPayload : Prisma.PrismaPromise + /** + * Fields of the PrivateVault model + */ + readonly fields: PrivateVaultFieldRefs; + } + + /** + * The delegate class that acts as a "Promise-like" for PrivateVault. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ + export interface Prisma__PrivateVaultClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): $Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): $Utils.JsPromise + } + + + + + /** + * Fields of the PrivateVault model + */ + interface PrivateVaultFieldRefs { + readonly id: FieldRef<"PrivateVault", 'String'> + readonly passwordHash: FieldRef<"PrivateVault", 'String'> + readonly salt: FieldRef<"PrivateVault", 'String'> + readonly hint: FieldRef<"PrivateVault", 'String'> + readonly createdAt: FieldRef<"PrivateVault", 'DateTime'> + readonly updatedAt: FieldRef<"PrivateVault", 'DateTime'> + } + + + // Custom InputTypes + /** + * PrivateVault findUnique + */ + export type PrivateVaultFindUniqueArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter, which PrivateVault to fetch. + */ + where: PrivateVaultWhereUniqueInput + } + + /** + * PrivateVault findUniqueOrThrow + */ + export type PrivateVaultFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter, which PrivateVault to fetch. + */ + where: PrivateVaultWhereUniqueInput + } + + /** + * PrivateVault findFirst + */ + export type PrivateVaultFindFirstArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter, which PrivateVault to fetch. + */ + where?: PrivateVaultWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of PrivateVaults to fetch. + */ + orderBy?: PrivateVaultOrderByWithRelationInput | PrivateVaultOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for PrivateVaults. + */ + cursor?: PrivateVaultWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` PrivateVaults from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` PrivateVaults. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of PrivateVaults. + */ + distinct?: PrivateVaultScalarFieldEnum | PrivateVaultScalarFieldEnum[] + } + + /** + * PrivateVault findFirstOrThrow + */ + export type PrivateVaultFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter, which PrivateVault to fetch. + */ + where?: PrivateVaultWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of PrivateVaults to fetch. + */ + orderBy?: PrivateVaultOrderByWithRelationInput | PrivateVaultOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for PrivateVaults. + */ + cursor?: PrivateVaultWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` PrivateVaults from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` PrivateVaults. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of PrivateVaults. + */ + distinct?: PrivateVaultScalarFieldEnum | PrivateVaultScalarFieldEnum[] + } + + /** + * PrivateVault findMany + */ + export type PrivateVaultFindManyArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter, which PrivateVaults to fetch. + */ + where?: PrivateVaultWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of PrivateVaults to fetch. + */ + orderBy?: PrivateVaultOrderByWithRelationInput | PrivateVaultOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing PrivateVaults. + */ + cursor?: PrivateVaultWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` PrivateVaults from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` PrivateVaults. + */ + skip?: number + distinct?: PrivateVaultScalarFieldEnum | PrivateVaultScalarFieldEnum[] + } + + /** + * PrivateVault create + */ + export type PrivateVaultCreateArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * The data needed to create a PrivateVault. + */ + data: XOR + } + + /** + * PrivateVault createMany + */ + export type PrivateVaultCreateManyArgs = { + /** + * The data used to create many PrivateVaults. + */ + data: PrivateVaultCreateManyInput | PrivateVaultCreateManyInput[] + } + + /** + * PrivateVault createManyAndReturn + */ + export type PrivateVaultCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelectCreateManyAndReturn | null + /** + * The data used to create many PrivateVaults. + */ + data: PrivateVaultCreateManyInput | PrivateVaultCreateManyInput[] + } + + /** + * PrivateVault update + */ + export type PrivateVaultUpdateArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * The data needed to update a PrivateVault. + */ + data: XOR + /** + * Choose, which PrivateVault to update. + */ + where: PrivateVaultWhereUniqueInput + } + + /** + * PrivateVault updateMany + */ + export type PrivateVaultUpdateManyArgs = { + /** + * The data used to update PrivateVaults. + */ + data: XOR + /** + * Filter which PrivateVaults to update + */ + where?: PrivateVaultWhereInput + } + + /** + * PrivateVault upsert + */ + export type PrivateVaultUpsertArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * The filter to search for the PrivateVault to update in case it exists. + */ + where: PrivateVaultWhereUniqueInput + /** + * In case the PrivateVault found by the `where` argument doesn't exist, create a new PrivateVault with this data. + */ + create: XOR + /** + * In case the PrivateVault was found with the provided `where` argument, update it with this data. + */ + update: XOR + } + + /** + * PrivateVault delete + */ + export type PrivateVaultDeleteArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + /** + * Filter which PrivateVault to delete. + */ + where: PrivateVaultWhereUniqueInput + } + + /** + * PrivateVault deleteMany + */ + export type PrivateVaultDeleteManyArgs = { + /** + * Filter which PrivateVaults to delete + */ + where?: PrivateVaultWhereInput + } + + /** + * PrivateVault without action + */ + export type PrivateVaultDefaultArgs = { + /** + * Select specific fields to fetch from the PrivateVault + */ + select?: PrivateVaultSelect | null + } + + /** * Model Library */ @@ -3914,12 +4924,27 @@ export namespace Prisma { version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', - updatedAt: 'updatedAt' + updatedAt: 'updatedAt', + isPrivate: 'isPrivate', + encryptedData: 'encryptedData', + iv: 'iv' }; export type DrawingScalarFieldEnum = (typeof DrawingScalarFieldEnum)[keyof typeof DrawingScalarFieldEnum] + export const PrivateVaultScalarFieldEnum: { + id: 'id', + passwordHash: 'passwordHash', + salt: 'salt', + hint: 'hint', + createdAt: 'createdAt', + updatedAt: 'updatedAt' + }; + + export type PrivateVaultScalarFieldEnum = (typeof PrivateVaultScalarFieldEnum)[keyof typeof PrivateVaultScalarFieldEnum] + + export const LibraryScalarFieldEnum: { id: 'id', items: 'items', @@ -3972,6 +4997,13 @@ export namespace Prisma { + /** + * Reference to a field of type 'Boolean' + */ + export type BooleanFieldRefInput<$PrismaModel> = FieldRefInputType<$PrismaModel, 'Boolean'> + + + /** * Reference to a field of type 'Float' */ @@ -4046,6 +5078,9 @@ export namespace Prisma { collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string updatedAt?: DateTimeFilter<"Drawing"> | Date | string + isPrivate?: BoolFilter<"Drawing"> | boolean + encryptedData?: StringNullableFilter<"Drawing"> | string | null + iv?: StringNullableFilter<"Drawing"> | string | null collection?: XOR | null } @@ -4060,6 +5095,9 @@ export namespace Prisma { collectionId?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder + isPrivate?: SortOrder + encryptedData?: SortOrderInput | SortOrder + iv?: SortOrderInput | SortOrder collection?: CollectionOrderByWithRelationInput } @@ -4077,6 +5115,9 @@ export namespace Prisma { collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string updatedAt?: DateTimeFilter<"Drawing"> | Date | string + isPrivate?: BoolFilter<"Drawing"> | boolean + encryptedData?: StringNullableFilter<"Drawing"> | string | null + iv?: StringNullableFilter<"Drawing"> | string | null collection?: XOR | null }, "id"> @@ -4091,6 +5132,9 @@ export namespace Prisma { collectionId?: SortOrderInput | SortOrder createdAt?: SortOrder updatedAt?: SortOrder + isPrivate?: SortOrder + encryptedData?: SortOrderInput | SortOrder + iv?: SortOrderInput | SortOrder _count?: DrawingCountOrderByAggregateInput _avg?: DrawingAvgOrderByAggregateInput _max?: DrawingMaxOrderByAggregateInput @@ -4112,6 +5156,66 @@ export namespace Prisma { collectionId?: StringNullableWithAggregatesFilter<"Drawing"> | string | null createdAt?: DateTimeWithAggregatesFilter<"Drawing"> | Date | string updatedAt?: DateTimeWithAggregatesFilter<"Drawing"> | Date | string + isPrivate?: BoolWithAggregatesFilter<"Drawing"> | boolean + encryptedData?: StringNullableWithAggregatesFilter<"Drawing"> | string | null + iv?: StringNullableWithAggregatesFilter<"Drawing"> | string | null + } + + export type PrivateVaultWhereInput = { + AND?: PrivateVaultWhereInput | PrivateVaultWhereInput[] + OR?: PrivateVaultWhereInput[] + NOT?: PrivateVaultWhereInput | PrivateVaultWhereInput[] + id?: StringFilter<"PrivateVault"> | string + passwordHash?: StringFilter<"PrivateVault"> | string + salt?: StringFilter<"PrivateVault"> | string + hint?: StringNullableFilter<"PrivateVault"> | string | null + createdAt?: DateTimeFilter<"PrivateVault"> | Date | string + updatedAt?: DateTimeFilter<"PrivateVault"> | Date | string + } + + export type PrivateVaultOrderByWithRelationInput = { + id?: SortOrder + passwordHash?: SortOrder + salt?: SortOrder + hint?: SortOrderInput | SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type PrivateVaultWhereUniqueInput = Prisma.AtLeast<{ + id?: string + AND?: PrivateVaultWhereInput | PrivateVaultWhereInput[] + OR?: PrivateVaultWhereInput[] + NOT?: PrivateVaultWhereInput | PrivateVaultWhereInput[] + passwordHash?: StringFilter<"PrivateVault"> | string + salt?: StringFilter<"PrivateVault"> | string + hint?: StringNullableFilter<"PrivateVault"> | string | null + createdAt?: DateTimeFilter<"PrivateVault"> | Date | string + updatedAt?: DateTimeFilter<"PrivateVault"> | Date | string + }, "id"> + + export type PrivateVaultOrderByWithAggregationInput = { + id?: SortOrder + passwordHash?: SortOrder + salt?: SortOrder + hint?: SortOrderInput | SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + _count?: PrivateVaultCountOrderByAggregateInput + _max?: PrivateVaultMaxOrderByAggregateInput + _min?: PrivateVaultMinOrderByAggregateInput + } + + export type PrivateVaultScalarWhereWithAggregatesInput = { + AND?: PrivateVaultScalarWhereWithAggregatesInput | PrivateVaultScalarWhereWithAggregatesInput[] + OR?: PrivateVaultScalarWhereWithAggregatesInput[] + NOT?: PrivateVaultScalarWhereWithAggregatesInput | PrivateVaultScalarWhereWithAggregatesInput[] + id?: StringWithAggregatesFilter<"PrivateVault"> | string + passwordHash?: StringWithAggregatesFilter<"PrivateVault"> | string + salt?: StringWithAggregatesFilter<"PrivateVault"> | string + hint?: StringNullableWithAggregatesFilter<"PrivateVault"> | string | null + createdAt?: DateTimeWithAggregatesFilter<"PrivateVault"> | Date | string + updatedAt?: DateTimeWithAggregatesFilter<"PrivateVault"> | Date | string } export type LibraryWhereInput = { @@ -4224,6 +5328,9 @@ export namespace Prisma { version?: number createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null collection?: CollectionCreateNestedOneWithoutDrawingsInput } @@ -4238,6 +5345,9 @@ export namespace Prisma { collectionId?: string | null createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null } export type DrawingUpdateInput = { @@ -4250,6 +5360,9 @@ export namespace Prisma { version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null collection?: CollectionUpdateOneWithoutDrawingsNestedInput } @@ -4264,6 +5377,9 @@ export namespace Prisma { collectionId?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null } export type DrawingCreateManyInput = { @@ -4277,6 +5393,9 @@ export namespace Prisma { collectionId?: string | null createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null } export type DrawingUpdateManyMutationInput = { @@ -4289,6 +5408,9 @@ export namespace Prisma { version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null } export type DrawingUncheckedUpdateManyInput = { @@ -4302,6 +5424,72 @@ export namespace Prisma { collectionId?: NullableStringFieldUpdateOperationsInput | string | null createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null + } + + export type PrivateVaultCreateInput = { + id?: string + passwordHash: string + salt: string + hint?: string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type PrivateVaultUncheckedCreateInput = { + id?: string + passwordHash: string + salt: string + hint?: string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type PrivateVaultUpdateInput = { + id?: StringFieldUpdateOperationsInput | string + passwordHash?: StringFieldUpdateOperationsInput | string + salt?: StringFieldUpdateOperationsInput | string + hint?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type PrivateVaultUncheckedUpdateInput = { + id?: StringFieldUpdateOperationsInput | string + passwordHash?: StringFieldUpdateOperationsInput | string + salt?: StringFieldUpdateOperationsInput | string + hint?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type PrivateVaultCreateManyInput = { + id?: string + passwordHash: string + salt: string + hint?: string | null + createdAt?: Date | string + updatedAt?: Date | string + } + + export type PrivateVaultUpdateManyMutationInput = { + id?: StringFieldUpdateOperationsInput | string + passwordHash?: StringFieldUpdateOperationsInput | string + salt?: StringFieldUpdateOperationsInput | string + hint?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + } + + export type PrivateVaultUncheckedUpdateManyInput = { + id?: StringFieldUpdateOperationsInput | string + passwordHash?: StringFieldUpdateOperationsInput | string + salt?: StringFieldUpdateOperationsInput | string + hint?: NullableStringFieldUpdateOperationsInput | string | null + createdAt?: DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string } export type LibraryCreateInput = { @@ -4465,6 +5653,11 @@ export namespace Prisma { not?: NestedIntFilter<$PrismaModel> | number } + export type BoolFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> + not?: NestedBoolFilter<$PrismaModel> | boolean + } + export type CollectionNullableRelationFilter = { is?: CollectionWhereInput | null isNot?: CollectionWhereInput | null @@ -4486,6 +5679,9 @@ export namespace Prisma { collectionId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder + isPrivate?: SortOrder + encryptedData?: SortOrder + iv?: SortOrder } export type DrawingAvgOrderByAggregateInput = { @@ -4503,6 +5699,9 @@ export namespace Prisma { collectionId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder + isPrivate?: SortOrder + encryptedData?: SortOrder + iv?: SortOrder } export type DrawingMinOrderByAggregateInput = { @@ -4516,6 +5715,9 @@ export namespace Prisma { collectionId?: SortOrder createdAt?: SortOrder updatedAt?: SortOrder + isPrivate?: SortOrder + encryptedData?: SortOrder + iv?: SortOrder } export type DrawingSumOrderByAggregateInput = { @@ -4555,6 +5757,41 @@ export namespace Prisma { _max?: NestedIntFilter<$PrismaModel> } + export type BoolWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> + not?: NestedBoolWithAggregatesFilter<$PrismaModel> | boolean + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedBoolFilter<$PrismaModel> + _max?: NestedBoolFilter<$PrismaModel> + } + + export type PrivateVaultCountOrderByAggregateInput = { + id?: SortOrder + passwordHash?: SortOrder + salt?: SortOrder + hint?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type PrivateVaultMaxOrderByAggregateInput = { + id?: SortOrder + passwordHash?: SortOrder + salt?: SortOrder + hint?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + + export type PrivateVaultMinOrderByAggregateInput = { + id?: SortOrder + passwordHash?: SortOrder + salt?: SortOrder + hint?: SortOrder + createdAt?: SortOrder + updatedAt?: SortOrder + } + export type LibraryCountOrderByAggregateInput = { id?: SortOrder items?: SortOrder @@ -4644,6 +5881,10 @@ export namespace Prisma { divide?: number } + export type BoolFieldUpdateOperationsInput = { + set?: boolean + } + export type CollectionUpdateOneWithoutDrawingsNestedInput = { create?: XOR connectOrCreate?: CollectionCreateOrConnectWithoutDrawingsInput @@ -4735,6 +5976,11 @@ export namespace Prisma { not?: NestedStringNullableFilter<$PrismaModel> | string | null } + export type NestedBoolFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> + not?: NestedBoolFilter<$PrismaModel> | boolean + } + export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = { equals?: string | StringFieldRefInput<$PrismaModel> | null in?: string[] | null @@ -4790,6 +6036,14 @@ export namespace Prisma { not?: NestedFloatFilter<$PrismaModel> | number } + export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = { + equals?: boolean | BooleanFieldRefInput<$PrismaModel> + not?: NestedBoolWithAggregatesFilter<$PrismaModel> | boolean + _count?: NestedIntFilter<$PrismaModel> + _min?: NestedBoolFilter<$PrismaModel> + _max?: NestedBoolFilter<$PrismaModel> + } + export type DrawingCreateWithoutCollectionInput = { id?: string name: string @@ -4800,6 +6054,9 @@ export namespace Prisma { version?: number createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null } export type DrawingUncheckedCreateWithoutCollectionInput = { @@ -4812,6 +6069,9 @@ export namespace Prisma { version?: number createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null } export type DrawingCreateOrConnectWithoutCollectionInput = { @@ -4853,6 +6113,9 @@ export namespace Prisma { collectionId?: StringNullableFilter<"Drawing"> | string | null createdAt?: DateTimeFilter<"Drawing"> | Date | string updatedAt?: DateTimeFilter<"Drawing"> | Date | string + isPrivate?: BoolFilter<"Drawing"> | boolean + encryptedData?: StringNullableFilter<"Drawing"> | string | null + iv?: StringNullableFilter<"Drawing"> | string | null } export type CollectionCreateWithoutDrawingsInput = { @@ -4909,6 +6172,9 @@ export namespace Prisma { version?: number createdAt?: Date | string updatedAt?: Date | string + isPrivate?: boolean + encryptedData?: string | null + iv?: string | null } export type DrawingUpdateWithoutCollectionInput = { @@ -4921,6 +6187,9 @@ export namespace Prisma { version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null } export type DrawingUncheckedUpdateWithoutCollectionInput = { @@ -4933,6 +6202,9 @@ export namespace Prisma { version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null } export type DrawingUncheckedUpdateManyWithoutCollectionInput = { @@ -4945,6 +6217,9 @@ export namespace Prisma { version?: IntFieldUpdateOperationsInput | number createdAt?: DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: DateTimeFieldUpdateOperationsInput | Date | string + isPrivate?: BoolFieldUpdateOperationsInput | boolean + encryptedData?: NullableStringFieldUpdateOperationsInput | string | null + iv?: NullableStringFieldUpdateOperationsInput | string | null } @@ -4964,6 +6239,10 @@ export namespace Prisma { * @deprecated Use DrawingDefaultArgs instead */ export type DrawingArgs = DrawingDefaultArgs + /** + * @deprecated Use PrivateVaultDefaultArgs instead + */ + export type PrivateVaultArgs = PrivateVaultDefaultArgs /** * @deprecated Use LibraryDefaultArgs instead */ diff --git a/backend/src/generated/client/index.js b/backend/src/generated/client/index.js index 96defd5..f17f403 100644 --- a/backend/src/generated/client/index.js +++ b/backend/src/generated/client/index.js @@ -105,6 +105,18 @@ exports.Prisma.DrawingScalarFieldEnum = { version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', + updatedAt: 'updatedAt', + isPrivate: 'isPrivate', + encryptedData: 'encryptedData', + iv: 'iv' +}; + +exports.Prisma.PrivateVaultScalarFieldEnum = { + id: 'id', + passwordHash: 'passwordHash', + salt: 'salt', + hint: 'hint', + createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -129,6 +141,7 @@ exports.Prisma.NullsOrder = { exports.Prisma.ModelName = { Collection: 'Collection', Drawing: 'Drawing', + PrivateVault: 'PrivateVault', Library: 'Library' }; /** @@ -178,6 +191,7 @@ const config = { "db" ], "activeProvider": "sqlite", + "postinstall": false, "inlineDatasources": { "db": { "url": { @@ -186,8 +200,8 @@ const config = { } } }, - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n binaryTargets = [\"native\", \"linux-musl-arm64-openssl-3.0.x\", \"linux-musl-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Library {\n id String @id @default(\"default\") // Singleton pattern - use \"default\" ID\n items String @default(\"[]\") // Stored as JSON string array of library items\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", - "inlineSchemaHash": "a6a8e55dadb0695c66246575cd1a63af3afd912ce070b4798d2e56269d371c87", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\ngenerator client {\n provider = \"prisma-client-js\"\n output = \"../src/generated/client\"\n binaryTargets = [\"native\", \"linux-musl-arm64-openssl-3.0.x\", \"linux-musl-openssl-3.0.x\"]\n}\n\ndatasource db {\n provider = \"sqlite\"\n url = env(\"DATABASE_URL\")\n}\n\nmodel Collection {\n id String @id @default(uuid())\n name String\n drawings Drawing[]\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Drawing {\n id String @id @default(uuid())\n name String\n elements String // Stored as JSON string\n appState String // Stored as JSON string\n files String @default(\"{}\") // Stored as JSON string\n preview String? // SVG string for thumbnail\n version Int @default(1)\n collectionId String?\n collection Collection? @relation(fields: [collectionId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n // Privacy/Encryption fields\n isPrivate Boolean @default(false)\n encryptedData String? // Encrypted blob containing elements, appState, files when isPrivate=true\n iv String? // Initialization vector for AES-GCM decryption\n}\n\n// Singleton model for storing vault password hash and settings\nmodel PrivateVault {\n id String @id @default(\"vault\") // Singleton pattern\n passwordHash String // bcrypt hash for password verification\n salt String // Salt for client-side key derivation (hex encoded)\n hint String? // Optional password hint\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n\nmodel Library {\n id String @id @default(\"default\") // Singleton pattern - use \"default\" ID\n items String @default(\"[]\") // Stored as JSON string array of library items\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n}\n", + "inlineSchemaHash": "3cc99802d40f98b2ff8d3cb0c4f62ff9ae197917aed7f91357cb4cb402df6a7c", "copyEngine": true } @@ -208,7 +222,7 @@ if (!fs.existsSync(path.join(__dirname, 'schema.prisma'))) { config.isBundled = true } -config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Library\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"default\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"items\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"[]\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"Collection\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"drawings\",\"kind\":\"object\",\"isList\":true,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Drawing\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[],\"relationToFields\":[],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Drawing\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":{\"name\":\"uuid(4)\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"name\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"elements\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"appState\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"files\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"{}\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"preview\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"version\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Int\",\"default\":1,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collectionId\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":true,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"collection\",\"kind\":\"object\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"Collection\",\"relationName\":\"CollectionToDrawing\",\"relationFromFields\":[\"collectionId\"],\"relationToFields\":[\"id\"],\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true},{\"name\":\"isPrivate\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"Boolean\",\"default\":false,\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"encryptedData\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"iv\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"PrivateVault\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"vault\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"passwordHash\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"salt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"hint\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":false,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"String\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false},\"Library\":{\"dbName\":null,\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":true,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"default\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"items\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"String\",\"default\":\"[]\",\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":true,\"type\":\"DateTime\",\"default\":{\"name\":\"now\",\"args\":[]},\"isGenerated\":false,\"isUpdatedAt\":false},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"isList\":false,\"isRequired\":true,\"isUnique\":false,\"isId\":false,\"isReadOnly\":false,\"hasDefaultValue\":false,\"type\":\"DateTime\",\"isGenerated\":false,\"isUpdatedAt\":true}],\"primaryKey\":null,\"uniqueFields\":[],\"uniqueIndexes\":[],\"isGenerated\":false}},\"enums\":{},\"types\":{}}") defineDmmfProperty(exports.Prisma, config.runtimeDataModel) config.engineWasm = undefined diff --git a/backend/src/generated/client/package.json b/backend/src/generated/client/package.json index b653243..57b1d9f 100644 --- a/backend/src/generated/client/package.json +++ b/backend/src/generated/client/package.json @@ -1,5 +1,5 @@ { - "name": "prisma-client-8eed3ee5004eaec649fc60571177778f25acb4a3cdc2c238bbb8e70dd820d0ff", + "name": "prisma-client-2894d2d911743eb6e6a7a673efae7513c10b6ce609edeb9caf76ed42f4728682", "main": "index.js", "types": "index.d.ts", "browser": "index-browser.js", diff --git a/backend/src/generated/client/schema.prisma b/backend/src/generated/client/schema.prisma index 23da027..8fa63e9 100644 --- a/backend/src/generated/client/schema.prisma +++ b/backend/src/generated/client/schema.prisma @@ -32,6 +32,21 @@ model Drawing { collection Collection? @relation(fields: [collectionId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt + + // Privacy/Encryption fields + isPrivate Boolean @default(false) + encryptedData String? // Encrypted blob containing elements, appState, files when isPrivate=true + iv String? // Initialization vector for AES-GCM decryption +} + +// Singleton model for storing vault password hash and settings +model PrivateVault { + id String @id @default("vault") // Singleton pattern + passwordHash String // bcrypt hash for password verification + salt String // Salt for client-side key derivation (hex encoded) + hint String? // Optional password hint + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt } model Library { diff --git a/backend/src/generated/client/wasm.js b/backend/src/generated/client/wasm.js index d303df9..9f4d295 100644 --- a/backend/src/generated/client/wasm.js +++ b/backend/src/generated/client/wasm.js @@ -136,6 +136,18 @@ exports.Prisma.DrawingScalarFieldEnum = { version: 'version', collectionId: 'collectionId', createdAt: 'createdAt', + updatedAt: 'updatedAt', + isPrivate: 'isPrivate', + encryptedData: 'encryptedData', + iv: 'iv' +}; + +exports.Prisma.PrivateVaultScalarFieldEnum = { + id: 'id', + passwordHash: 'passwordHash', + salt: 'salt', + hint: 'hint', + createdAt: 'createdAt', updatedAt: 'updatedAt' }; @@ -160,6 +172,7 @@ exports.Prisma.NullsOrder = { exports.Prisma.ModelName = { Collection: 'Collection', Drawing: 'Drawing', + PrivateVault: 'PrivateVault', Library: 'Library' }; diff --git a/backend/src/index.ts b/backend/src/index.ts index b7b3bf4..a0bf802 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -10,6 +10,7 @@ import { Worker } from "worker_threads"; import multer from "multer"; import archiver from "archiver"; import { z } from "zod"; +import * as crypto from "crypto"; // @ts-ignore import { PrismaClient } from "./generated/client"; import { @@ -481,13 +482,350 @@ app.get("/health", (req, res) => { res.status(200).json({ status: "ok" }); }); +// --- Private Vault --- + +// Hash password using scrypt (similar to bcrypt but built-in to Node.js) +const hashPasswordServer = ( + password: string, + salt?: string +): Promise<{ hash: string; salt: string }> => { + return new Promise((resolve, reject) => { + const useSalt = salt || crypto.randomBytes(16).toString("hex"); + crypto.scrypt(password, useSalt, 64, (err, derivedKey) => { + if (err) reject(err); + resolve({ hash: derivedKey.toString("hex"), salt: useSalt }); + }); + }); +}; + +const verifyPasswordServer = ( + password: string, + hash: string, + salt: string +): Promise => { + return new Promise((resolve, reject) => { + crypto.scrypt(password, salt, 64, (err, derivedKey) => { + if (err) reject(err); + resolve(derivedKey.toString("hex") === hash); + }); + }); +}; + +// GET /vault/status - Check if vault is set up +app.get("/vault/status", async (req, res) => { + try { + const vault = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + const privateDrawingsCount = await prisma.drawing.count({ + where: { isPrivate: true }, + }); + + if (!vault) { + return res.json({ + isSetup: false, + privateDrawingsCount, + }); + } + + res.json({ + isSetup: true, + salt: vault.salt, + hint: vault.hint, + privateDrawingsCount, + }); + } catch (error) { + console.error("Failed to get vault status:", error); + res.status(500).json({ error: "Failed to get vault status" }); + } +}); + +// POST /vault/setup - Create vault with password +app.post("/vault/setup", async (req, res) => { + try { + const { passwordHash, salt, hint } = req.body; + + if (!passwordHash || !salt) { + return res + .status(400) + .json({ error: "Password hash and salt are required" }); + } + + // Check if vault already exists + const existing = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + if (existing) { + return res.status(400).json({ error: "Vault already exists" }); + } + + // Hash the client-side hash again for extra security + const { hash: serverHash, salt: serverSalt } = await hashPasswordServer( + passwordHash + ); + + await prisma.privateVault.create({ + data: { + id: "vault", + passwordHash: `${serverHash}:${serverSalt}`, // Store both server hash and server salt + salt, // Client-side salt for key derivation + hint: hint || null, + }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Failed to setup vault:", error); + res.status(500).json({ error: "Failed to setup vault" }); + } +}); + +// POST /vault/verify - Verify password and return salt for decryption +app.post("/vault/verify", async (req, res) => { + try { + const { password } = req.body; + + if (!password) { + return res.status(400).json({ error: "Password is required" }); + } + + const vault = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + if (!vault) { + return res.status(404).json({ error: "Vault not set up" }); + } + + // Parse stored hash format: "serverHash:serverSalt" + const [storedHash, serverSalt] = vault.passwordHash.split(":"); + + // Client sends SHA-256 hash of password, we verify against our scrypt hash + const isValid = await verifyPasswordServer( + password, + storedHash, + serverSalt + ); + + if (!isValid) { + return res + .status(401) + .json({ success: false, error: "Invalid password" }); + } + + res.json({ + success: true, + salt: vault.salt, // Return client-side salt for key derivation + }); + } catch (error) { + console.error("Failed to verify password:", error); + res.status(500).json({ error: "Failed to verify password" }); + } +}); + +// PUT /vault/password - Change vault password +app.put("/vault/password", async (req, res) => { + try { + const { passwordHash, salt } = req.body; + + if (!passwordHash || !salt) { + return res + .status(400) + .json({ error: "Password hash and salt are required" }); + } + + const vault = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + if (!vault) { + return res.status(404).json({ error: "Vault not set up" }); + } + + // Hash the new client-side hash + const { hash: serverHash, salt: serverSalt } = await hashPasswordServer( + passwordHash + ); + + await prisma.privateVault.update({ + where: { id: "vault" }, + data: { + passwordHash: `${serverHash}:${serverSalt}`, + salt, + }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Failed to change password:", error); + res.status(500).json({ error: "Failed to change password" }); + } +}); + +// GET /vault/hint - Get password hint +app.get("/vault/hint", async (req, res) => { + try { + const vault = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + if (!vault) { + return res.status(404).json({ error: "Vault not set up" }); + } + + res.json({ hint: vault.hint }); + } catch (error) { + console.error("Failed to get hint:", error); + res.status(500).json({ error: "Failed to get hint" }); + } +}); + +// PUT /vault/hint - Update password hint +app.put("/vault/hint", async (req, res) => { + try { + const { hint } = req.body; + + const vault = await prisma.privateVault.findUnique({ + where: { id: "vault" }, + }); + + if (!vault) { + return res.status(404).json({ error: "Vault not set up" }); + } + + await prisma.privateVault.update({ + where: { id: "vault" }, + data: { hint }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Failed to update hint:", error); + res.status(500).json({ error: "Failed to update hint" }); + } +}); + +// GET /drawings/private - Get all private drawings +app.get("/drawings/private", async (req, res) => { + try { + const drawings = await prisma.drawing.findMany({ + where: { isPrivate: true }, + orderBy: { updatedAt: "desc" }, + }); + + res.json(drawings); + } catch (error) { + console.error("Failed to get private drawings:", error); + res.status(500).json({ error: "Failed to get private drawings" }); + } +}); + +// PUT /drawings/:id/lock - Move drawing to private vault +app.put("/drawings/:id/lock", async (req, res) => { + try { + const { id } = req.params; + const { encryptedData, iv } = req.body; + + if (!encryptedData || !iv) { + return res + .status(400) + .json({ error: "Encrypted data and IV are required" }); + } + + const drawing = await prisma.drawing.findUnique({ + where: { id }, + }); + + if (!drawing) { + return res.status(404).json({ error: "Drawing not found" }); + } + + // Generate a locked preview + const lockedPreview = ` + + + + + + Private Drawing + `; + + await prisma.drawing.update({ + where: { id }, + data: { + isPrivate: true, + encryptedData, + iv, + elements: "[]", // Clear plaintext data + appState: "{}", + files: "{}", + preview: lockedPreview, + collectionId: null, // Remove from any collection + }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Failed to lock drawing:", error); + res.status(500).json({ error: "Failed to lock drawing" }); + } +}); + +// PUT /drawings/:id/unlock - Remove drawing from private vault +app.put("/drawings/:id/unlock", async (req, res) => { + try { + const { id } = req.params; + const { elements, appState, files, preview } = req.body; + + if (!elements || !appState) { + return res + .status(400) + .json({ error: "Elements and appState are required" }); + } + + const drawing = await prisma.drawing.findUnique({ + where: { id }, + }); + + if (!drawing) { + return res.status(404).json({ error: "Drawing not found" }); + } + + if (!drawing.isPrivate) { + return res.status(400).json({ error: "Drawing is not private" }); + } + + await prisma.drawing.update({ + where: { id }, + data: { + isPrivate: false, + encryptedData: null, + iv: null, + elements: JSON.stringify(elements), + appState: JSON.stringify(appState), + files: JSON.stringify(files || {}), + preview: preview || null, + }, + }); + + res.json({ success: true }); + } catch (error) { + console.error("Failed to unlock drawing:", error); + res.status(500).json({ error: "Failed to unlock drawing" }); + } +}); + // --- Drawings --- // GET /drawings app.get("/drawings", async (req, res) => { try { const { search, collectionId } = req.query; - const where: any = {}; + const where: any = { + isPrivate: false, // Exclude private drawings from regular listings + }; if (search) { where.name = { contains: String(search) }; @@ -534,6 +872,18 @@ app.get("/drawings/:id", async (req, res) => { return res.status(404).json({ error: "Drawing not found" }); } + // For private drawings, return encrypted data instead of parsed content + if (drawing.isPrivate) { + console.log("[API] Returning private drawing", { id }); + return res.json({ + ...drawing, + elements: [], // Empty for private drawings + appState: {}, + files: {}, + // encryptedData, iv, and isPrivate are already included + }); + } + console.log("[API] Returning drawing", { id, elementCount: (() => { diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 9543943..9c1e993 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -2,19 +2,24 @@ import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import { Dashboard } from './pages/Dashboard'; import { Editor } from './pages/Editor'; import { Settings } from './pages/Settings'; +import { PrivateDrawings } from './pages/PrivateDrawings'; import { ThemeProvider } from './context/ThemeContext'; +import { VaultProvider } from './context/VaultContext'; function App() { return ( - - - } /> - } /> - } /> - } /> - - + + + + } /> + } /> + } /> + } /> + } /> + + + ); } diff --git a/frontend/src/api/index.ts b/frontend/src/api/index.ts index 0bd9856..9cf57f0 100644 --- a/frontend/src/api/index.ts +++ b/frontend/src/api/index.ts @@ -1,5 +1,10 @@ import axios from "axios"; -import type { Drawing, Collection } from "../types"; +import type { + Drawing, + Collection, + VaultStatus, + VaultVerifyResult, +} from "../types"; export const API_URL = import.meta.env.VITE_API_URL || "/api"; @@ -96,3 +101,91 @@ export const updateLibrary = async (items: any[]) => { const response = await api.put<{ items: any[] }>("/library", { items }); return response.data.items; }; + +// --- Private Vault --- + +export const getVaultStatus = async (): Promise => { + const response = await api.get("/vault/status"); + return response.data; +}; + +export const setupVault = async ( + passwordHash: string, + salt: string, + hint?: string +): Promise => { + await api.post("/vault/setup", { passwordHash, salt, hint }); +}; + +export const verifyVaultPassword = async ( + password: string +): Promise => { + const response = await api.post("/vault/verify", { + password, + }); + return response.data; +}; + +export const updateVaultHint = async (hint: string): Promise => { + await api.put("/vault/hint", { hint }); +}; + +export const getVaultHint = async (): Promise => { + const response = await api.get<{ hint: string | null }>("/vault/hint"); + return response.data.hint; +}; + +export const changeVaultPassword = async ( + newPasswordHash: string, + newSalt: string, + _oldKey: CryptoKey, + _newKey: CryptoKey +): Promise => { + // Note: The actual re-encryption of drawings happens client-side + // This endpoint just updates the password hash and salt + await api.put("/vault/password", { + passwordHash: newPasswordHash, + salt: newSalt, + }); +}; + +// --- Private Drawings --- + +export const getPrivateDrawings = async (): Promise => { + const response = await api.get("/drawings/private"); + return response.data.map(deserializeDrawing); +}; + +export const lockDrawing = async ( + id: string, + encryptedData: string, + iv: string +): Promise => { + await api.put(`/drawings/${id}/lock`, { encryptedData, iv }); +}; + +export const lockDrawingWithPreview = async ( + id: string, + encryptedData: string, + iv: string, + preview?: string +): Promise => { + const body: any = { encryptedData, iv }; + if (preview !== undefined) body.preview = preview; + await api.put(`/drawings/${id}/lock`, body); +}; + +export const unlockDrawing = async ( + id: string, + elements: any[], + appState: any, + files: any, + preview?: string +): Promise => { + await api.put(`/drawings/${id}/unlock`, { + elements, + appState, + files, + preview, + }); +}; diff --git a/frontend/src/components/ChangeVaultPassword.tsx b/frontend/src/components/ChangeVaultPassword.tsx new file mode 100644 index 0000000..323ce55 --- /dev/null +++ b/frontend/src/components/ChangeVaultPassword.tsx @@ -0,0 +1,222 @@ +import React, { useState } from 'react'; +import { X, Key, Eye, EyeOff, AlertCircle } from 'lucide-react'; +import { validatePasswordStrength } from '../utils/crypto'; + +interface ChangeVaultPasswordProps { + isOpen: boolean; + onClose: () => void; + onChangePassword: (oldPassword: string, newPassword: string) => Promise; +} + +export const ChangeVaultPassword: React.FC = ({ + isOpen, + onClose, + onChangePassword, +}) => { + const [oldPassword, setOldPassword] = useState(''); + const [newPassword, setNewPassword] = useState(''); + const [confirmPassword, setConfirmPassword] = useState(''); + const [showOld, setShowOld] = useState(false); + const [showNew, setShowNew] = useState(false); + const [showConfirm, setShowConfirm] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const strength = validatePasswordStrength(newPassword); + const passwordsMatch = confirmPassword === newPassword; + const canSubmit = oldPassword.length > 0 && newPassword.length > 0 && passwordsMatch && strength.isValid; + + const handleClose = () => { + setOldPassword(''); + setNewPassword(''); + setConfirmPassword(''); + setShowOld(false); + setShowNew(false); + setShowConfirm(false); + setError(null); + onClose(); + }; + + if (!isOpen) return null; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!canSubmit) return; + + setIsLoading(true); + setError(null); + + try { + await onChangePassword(oldPassword, newPassword); + handleClose(); + } catch (err: any) { + setError(err instanceof Error ? err.message : 'Failed to change password'); + } finally { + setIsLoading(false); + } + }; + + const getStrengthColor = (score: number) => { + if (score <= 1) return 'bg-red-500'; + if (score === 2) return 'bg-orange-500'; + if (score === 3) return 'bg-yellow-500'; + return 'bg-green-500'; + }; + + const getStrengthText = (score: number) => { + if (score <= 1) return 'Weak'; + if (score === 2) return 'Fair'; + if (score === 3) return 'Good'; + return 'Strong'; + }; + + return ( +

+
+ {/* Header */} +
+
+
+ +
+
+

Change Vault Password

+

Update your vault password

+
+
+ +
+ + {/* Content */} +
+ {error && ( +
+ + {error} +
+ )} + + {/* Old Password */} +
+ +
+ setOldPassword(e.target.value)} + placeholder="Enter your current password" + autoFocus + className="w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 border-black dark:border-neutral-700 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-amber-500" + /> + +
+
+ + {/* New Password */} +
+ +
+ setNewPassword(e.target.value)} + placeholder="Enter your new password" + className="w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 border-black dark:border-neutral-700 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-amber-500" + /> + +
+ + {/* Strength Indicator */} + {newPassword.length > 0 && ( +
+
+ {[1, 2, 3, 4].map((i) => ( +
+ ))} +
+

+ {getStrengthText(strength.score)} +

+ {strength.feedback.length > 0 && ( +
    + {strength.feedback.map((fb, i) => ( +
  • • {fb}
  • + ))} +
+ )} +
+ )} +
+ + {/* Confirm Password */} +
+ +
+ setConfirmPassword(e.target.value)} + placeholder="Confirm your new password" + className={`w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-amber-500 ${ + confirmPassword.length > 0 && !passwordsMatch ? 'border-red-500' : 'border-black dark:border-neutral-700' + }`} + /> + +
+
+ + {/* Actions */} +
+ + +
+ +
+
+ ); +}; diff --git a/frontend/src/components/DrawingCard.tsx b/frontend/src/components/DrawingCard.tsx index b383d2d..497b041 100644 --- a/frontend/src/components/DrawingCard.tsx +++ b/frontend/src/components/DrawingCard.tsx @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; -import { PenTool, Trash2, FolderInput, ArrowRight, Check, Clock, Copy, Download } from 'lucide-react'; +import { PenTool, Trash2, FolderInput, ArrowRight, Check, Clock, Copy, Download, Lock } from 'lucide-react'; import type { Drawing, Collection } from '../types'; import { formatDistanceToNow } from 'date-fns'; import clsx from 'clsx'; @@ -24,6 +24,8 @@ interface DrawingCardProps { onDragStart?: (e: React.DragEvent, id: string) => void; onMouseDown?: (e: React.MouseEvent, id: string) => void; onPreviewGenerated?: (id: string, preview: string) => void; + onMoveToVault?: (id: string) => void; + isVaultSetup?: boolean; } const ContextMenuPortal: React.FC<{ children: React.ReactNode }> = ({ children }) => { @@ -44,6 +46,8 @@ export const DrawingCard: React.FC = ({ onDragStart, onMouseDown, onPreviewGenerated, + onMoveToVault, + isVaultSetup = false, }) => { const [isRenaming, setIsRenaming] = useState(false); const [showMoveSubmenu, setShowMoveSubmenu] = useState(false); @@ -336,6 +340,18 @@ export const DrawingCard: React.FC = ({ Export + {isVaultSetup && onMoveToVault && ( + + )} +
+
+ + {/* Content */} +
+ {error && ( +
+ + {error} +
+ )} + + {/* Password */} +
+ +
+ setPassword(e.target.value)} + placeholder="Enter your password" + className="w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 border-black dark:border-neutral-700 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-indigo-500" + /> + +
+ + {/* Strength Indicator */} + {password.length > 0 && ( +
+
+ {[1, 2, 3, 4].map((i) => ( +
+ ))} +
+

+ {getStrengthText(passwordStrength.score)} +

+ {passwordStrength.feedback.length > 0 && ( +
    + {passwordStrength.feedback.map((feedback, i) => ( +
  • • {feedback}
  • + ))} +
+ )} +
+ )} +
+ + {/* Confirm Password */} +
+ +
+ setConfirmPassword(e.target.value)} + placeholder="Confirm your password" + className={`w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-indigo-500 ${ + confirmPassword.length > 0 && !passwordsMatch + ? 'border-red-500' + : 'border-black dark:border-neutral-700' + }`} + /> + +
+ {confirmPassword.length > 0 && ( +
+ {passwordsMatch ? ( + <> + + Passwords match + + ) : ( + <> + + Passwords do not match + + )} +
+ )} +
+ + {/* Password Hint (Optional) */} +
+ + setHint(e.target.value)} + placeholder="A hint to help you remember" + className="w-full px-4 py-3 bg-white dark:bg-neutral-800 border-2 border-black dark:border-neutral-700 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-indigo-500" + /> +
+ + {/* Warning */} +
+

+ Important: There is no way to recover your password. If you forget it, + all private drawings will be permanently inaccessible. +

+
+ + {/* Actions */} +
+ + +
+ +
+ + ); +}; diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index 07dcd06..256a193 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -1,10 +1,11 @@ import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; -import { LayoutGrid, Folder, Plus, Trash2, Edit2, Archive, FolderOpen, Settings as SettingsIcon } from 'lucide-react'; +import { LayoutGrid, Folder, Plus, Trash2, Edit2, Archive, FolderOpen, Settings as SettingsIcon, Lock, Unlock } from 'lucide-react'; import type { Collection } from '../types'; import clsx from 'clsx'; import { ConfirmModal } from './ConfirmModal'; import { Logo } from './Logo'; +import { useVault } from '../context/VaultContext'; interface SidebarProps { collections: Collection[]; @@ -14,6 +15,7 @@ interface SidebarProps { onEditCollection: (id: string, name: string) => void; onDeleteCollection: (id: string) => void; onDrop?: (e: React.DragEvent, collectionId: string | null) => void; + onDropToVault?: (e: React.DragEvent) => void; } interface SidebarItemProps { @@ -109,6 +111,98 @@ const SidebarItem: React.FC = ({ ); }; +// Private Folder Item Component +const PrivateFolderItem: React.FC<{ + isActive: boolean; + onSelectCollection: (id: string | null | undefined) => void; + onDropToVault?: (e: React.DragEvent) => void; +}> = ({ isActive, onSelectCollection, onDropToVault }) => { + const vault = useVault(); + const navigate = useNavigate(); + const [isDragOver, setIsDragOver] = useState(false); + + // Don't show if still loading + if (vault.isLoading) { + return null; + } + + const handleClick = () => { + // Always navigate to /private - that page handles setup/unlock flow + onSelectCollection('private'); + navigate('/private'); + }; + + const handleDragOver = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + // Show drag over state for any drag (the actual check happens on drop) + setIsDragOver(true); + }; + + const handleDragLeave = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsDragOver(false); + }; + + const handleDrop = (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + setIsDragOver(false); + onDropToVault?.(e); + }; + + // Show different badge based on vault state + const getBadge = () => { + if (isDragOver) { + return ( + + Drop + + ); + } + if (!vault.isSetup) { + return ( + + Setup + + ); + } + if (vault.privateDrawingsCount > 0) { + return ( + + {vault.privateDrawingsCount} + + ); + } + return null; + }; + + return ( +
+ +
+ ); +}; export const Sidebar: React.FC = ({ @@ -118,7 +212,8 @@ export const Sidebar: React.FC = ({ onCreateCollection, onEditCollection, onDeleteCollection, - onDrop + onDrop, + onDropToVault }) => { const [isCreating, setIsCreating] = useState(false); const [newCollectionName, setNewCollectionName] = useState(''); @@ -206,6 +301,12 @@ export const Sidebar: React.FC = ({ onClick={() => onSelectCollection(null)} onDrop={onDrop} /> + +
diff --git a/frontend/src/components/UnlockVaultModal.tsx b/frontend/src/components/UnlockVaultModal.tsx new file mode 100644 index 0000000..db39a60 --- /dev/null +++ b/frontend/src/components/UnlockVaultModal.tsx @@ -0,0 +1,149 @@ +import React, { useState } from 'react'; +import { X, Lock, Eye, EyeOff, AlertCircle, HelpCircle } from 'lucide-react'; + +interface UnlockVaultModalProps { + isOpen: boolean; + onClose: () => void; + onUnlock: (password: string) => Promise; + passwordHint?: string | null; +} + +export const UnlockVaultModal: React.FC = ({ + isOpen, + onClose, + onUnlock, + passwordHint, +}) => { + const [password, setPassword] = useState(''); + const [showPassword, setShowPassword] = useState(false); + const [showHint, setShowHint] = useState(false); + const [isLoading, setIsLoading] = useState(false); + const [error, setError] = useState(null); + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + if (!password) return; + + setIsLoading(true); + setError(null); + + try { + const success = await onUnlock(password); + if (success) { + setPassword(''); + onClose(); + } else { + setError('Incorrect password'); + } + } catch (err) { + setError(err instanceof Error ? err.message : 'Failed to unlock vault'); + } finally { + setIsLoading(false); + } + }; + + const handleClose = () => { + setPassword(''); + setError(null); + setShowHint(false); + onClose(); + }; + + if (!isOpen) return null; + + return ( +
+
+ {/* Header */} +
+
+
+ +
+
+

Unlock Vault

+

Enter your password

+
+
+ +
+ + {/* Content */} +
+ {error && ( +
+ + {error} +
+ )} + + {/* Password */} +
+ +
+ setPassword(e.target.value)} + placeholder="Enter your password" + autoFocus + className="w-full px-4 py-3 pr-12 bg-white dark:bg-neutral-800 border-2 border-black dark:border-neutral-700 rounded-lg text-slate-900 dark:text-white placeholder-slate-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-amber-500" + /> + +
+
+ + {/* Password Hint */} + {passwordHint && ( +
+ + {showHint && ( +
+

{passwordHint}

+
+ )} +
+ )} + + {/* Actions */} +
+ + +
+
+
+
+ ); +}; diff --git a/frontend/src/context/VaultContext.tsx b/frontend/src/context/VaultContext.tsx new file mode 100644 index 0000000..b0fbbfd --- /dev/null +++ b/frontend/src/context/VaultContext.tsx @@ -0,0 +1,240 @@ +import React, { createContext, useContext, useState, useCallback, useEffect, useRef } from 'react'; +import { deriveKey, hexToBytes, generateSalt, bytesToHex, hashPassword } from '../utils/crypto'; +import * as api from '../api'; + +interface VaultState { + isSetup: boolean; + isUnlocked: boolean; + isLoading: boolean; + passwordHint: string | null; + privateDrawingsCount: number; +} + +interface VaultContextType extends VaultState { + sessionKey: CryptoKey | null; + salt: Uint8Array | null; + checkVaultStatus: () => Promise; + unlock: (password: string) => Promise; + lock: () => void; + setupVault: (password: string, hint?: string) => Promise; + changePassword: (oldPassword: string, newPassword: string) => Promise; + updateHint: (hint: string) => Promise; +} + +const VaultContext = createContext(null); + +// Auto-lock timeout in milliseconds (15 minutes) +const AUTO_LOCK_TIMEOUT = 15 * 60 * 1000; + +export const VaultProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [state, setState] = useState({ + isSetup: false, + isUnlocked: false, + isLoading: true, + passwordHint: null, + privateDrawingsCount: 0, + }); + + const [sessionKey, setSessionKey] = useState(null); + const [salt, setSalt] = useState(null); + const autoLockTimer = useRef | null>(null); + + // Reset auto-lock timer on activity + const resetAutoLockTimer = useCallback(() => { + if (autoLockTimer.current) { + clearTimeout(autoLockTimer.current); + } + if (state.isUnlocked) { + autoLockTimer.current = setTimeout(() => { + lock(); + }, AUTO_LOCK_TIMEOUT); + } + }, [state.isUnlocked]); + + // Set up activity listeners for auto-lock + useEffect(() => { + if (state.isUnlocked) { + const handleActivity = () => resetAutoLockTimer(); + window.addEventListener('mousemove', handleActivity); + window.addEventListener('keydown', handleActivity); + window.addEventListener('click', handleActivity); + resetAutoLockTimer(); + + return () => { + window.removeEventListener('mousemove', handleActivity); + window.removeEventListener('keydown', handleActivity); + window.removeEventListener('click', handleActivity); + if (autoLockTimer.current) { + clearTimeout(autoLockTimer.current); + } + }; + } + }, [state.isUnlocked, resetAutoLockTimer]); + + // Check vault status on mount + const checkVaultStatus = useCallback(async () => { + try { + setState(prev => ({ ...prev, isLoading: true })); + const status = await api.getVaultStatus(); + setState(prev => ({ + ...prev, + isSetup: status.isSetup, + passwordHint: status.hint || null, + privateDrawingsCount: status.privateDrawingsCount || 0, + isLoading: false, + })); + if (status.salt) { + setSalt(hexToBytes(status.salt)); + } + } catch (error) { + console.error('Failed to check vault status:', error); + setState(prev => ({ ...prev, isLoading: false })); + } + }, []); + + useEffect(() => { + checkVaultStatus(); + }, [checkVaultStatus]); + + // Lock the vault + const lock = useCallback(() => { + setSessionKey(null); + setState(prev => ({ ...prev, isUnlocked: false })); + if (autoLockTimer.current) { + clearTimeout(autoLockTimer.current); + autoLockTimer.current = null; + } + }, []); + + // Unlock the vault with password + const unlock = useCallback(async (password: string): Promise => { + try { + // Hash the password the same way we did during setup + const passwordHash = await hashPassword(password); + + // First verify the password with the server + const result = await api.verifyVaultPassword(passwordHash); + + if (!result.success) { + return false; + } + + // Derive the encryption key client-side + const saltBytes = hexToBytes(result.salt); + const key = await deriveKey(password, saltBytes); + + setSalt(saltBytes); + setSessionKey(key); + setState(prev => ({ ...prev, isUnlocked: true })); + resetAutoLockTimer(); + + return true; + } catch (error) { + console.error('Failed to unlock vault:', error); + return false; + } + }, [resetAutoLockTimer]); + + // Setup the vault with initial password + const setupVault = useCallback(async (password: string, hint?: string): Promise => { + try { + // Generate a new salt + const newSalt = generateSalt(); + const saltHex = bytesToHex(newSalt); + + // Hash the password for server storage + const passwordHash = await hashPassword(password); + + // Create vault on server + await api.setupVault(passwordHash, saltHex, hint); + + // Derive the encryption key + const key = await deriveKey(password, newSalt); + + setSalt(newSalt); + setSessionKey(key); + setState(prev => ({ + ...prev, + isSetup: true, + isUnlocked: true, + passwordHint: hint || null, + })); + resetAutoLockTimer(); + } catch (error) { + console.error('Failed to setup vault:', error); + throw error; + } + }, [resetAutoLockTimer]); + + // Change vault password (requires re-encrypting all private drawings) + const changePassword = useCallback(async (oldPassword: string, newPassword: string): Promise => { + try { + // Hash the old password the same way we did during setup + const oldPasswordHash = await hashPassword(oldPassword); + + // Verify old password first + const verifyResult = await api.verifyVaultPassword(oldPasswordHash); + if (!verifyResult.success) { + throw new Error('Invalid current password'); + } + + // Derive old key for decryption + const oldSalt = hexToBytes(verifyResult.salt); + const oldKey = await deriveKey(oldPassword, oldSalt); + + // Generate new salt and derive new key + const newSalt = generateSalt(); + const newSaltHex = bytesToHex(newSalt); + const newKey = await deriveKey(newPassword, newSalt); + const newPasswordHash = await hashPassword(newPassword); + + // Re-encrypt all private drawings + await api.changeVaultPassword(newPasswordHash, newSaltHex, oldKey, newKey); + + // Update local state + setSalt(newSalt); + setSessionKey(newKey); + + } catch (error) { + console.error('Failed to change password:', error); + throw error; + } + }, []); + + // Update password hint + const updateHint = useCallback(async (hint: string): Promise => { + try { + await api.updateVaultHint(hint); + setState(prev => ({ ...prev, passwordHint: hint })); + } catch (error) { + console.error('Failed to update hint:', error); + throw error; + } + }, []); + + return ( + + {children} + + ); +}; + +export const useVault = (): VaultContextType => { + const context = useContext(VaultContext); + if (!context) { + throw new Error('useVault must be used within a VaultProvider'); + } + return context; +}; diff --git a/frontend/src/pages/Dashboard.tsx b/frontend/src/pages/Dashboard.tsx index 2fd1be5..79e06f7 100644 --- a/frontend/src/pages/Dashboard.tsx +++ b/frontend/src/pages/Dashboard.tsx @@ -10,6 +10,9 @@ import { useDebounce } from '../hooks/useDebounce'; import clsx from 'clsx'; import { ConfirmModal } from '../components/ConfirmModal'; import { importDrawings } from '../utils/importUtils'; +import { useVault } from '../context/VaultContext'; +import { encryptDrawing, generateLockedPreview } from '../utils/crypto'; +import { UnlockVaultModal } from '../components/UnlockVaultModal'; type Point = { x: number; y: number }; @@ -102,6 +105,11 @@ export const Dashboard: React.FC = () => { }); const [isLoading, setIsLoading] = useState(false); + + // Vault state + const vault = useVault(); + const [drawingToMoveToVault, setDrawingToMoveToVault] = useState(null); + const [showVaultUnlockModal, setShowVaultUnlockModal] = useState(false); // navigate is already declared at the top const refreshData = useCallback(async () => { @@ -472,6 +480,106 @@ export const Dashboard: React.FC = () => { } }; + // Move drawing to private vault + const handleMoveToVault = useCallback(async (id: string) => { + // If vault isn't set up, redirect to settings + if (!vault.isSetup) { + navigate('/settings'); + return; + } + + // If vault isn't unlocked, show unlock modal + if (!vault.isUnlocked || !vault.sessionKey) { + setDrawingToMoveToVault(id); + setShowVaultUnlockModal(true); + return; + } + + // Proceed with encryption + await encryptAndMoveToVault(id); + }, [vault.isSetup, vault.isUnlocked, vault.sessionKey, navigate]); + + const encryptAndMoveToVault = useCallback(async (id: string) => { + if (!vault.sessionKey) return; + + const drawing = drawings.find(d => d.id === id); + if (!drawing) return; + + try { + // Encrypt the drawing data + const dataToEncrypt = { + elements: drawing.elements || [], + appState: drawing.appState || {}, + files: drawing.files || {}, + }; + + const { encryptedData, iv } = await encryptDrawing(dataToEncrypt, vault.sessionKey); + const lockedPreview = generateLockedPreview(); + + // Update drawing to be private with encrypted data (include locked preview) + await api.lockDrawingWithPreview(id, encryptedData, iv, lockedPreview); + + // Remove from current view + setDrawings(prev => prev.filter(d => d.id !== id)); + vault.checkVaultStatus(); // Refresh vault status to update count + } catch (err) { + console.error("Failed to move to vault:", err); + } + }, [vault.sessionKey, drawings, vault]); + + const handleVaultUnlockForMove = useCallback(async (password: string) => { + const success = await vault.unlock(password); + if (success && drawingToMoveToVault) { + setShowVaultUnlockModal(false); + await encryptAndMoveToVault(drawingToMoveToVault); + setDrawingToMoveToVault(null); + } + return success; + }, [vault, drawingToMoveToVault, encryptAndMoveToVault]); + + // Handle dropping drawings to the vault + const handleDropToVault = useCallback(async (e: React.DragEvent) => { + e.preventDefault(); + e.stopPropagation(); + + const draggedDrawingId = e.dataTransfer.getData('drawingId'); + if (!draggedDrawingId) return; + + // Collect IDs to move - if dragged item is selected, move all selected + let idsToMove: string[] = []; + if (selectedIds.has(draggedDrawingId)) { + idsToMove = Array.from(selectedIds); + } else { + idsToMove = [draggedDrawingId]; + } + + // If vault isn't set up, redirect to settings + if (!vault.isSetup) { + navigate('/settings'); + return; + } + + // If vault isn't unlocked, show unlock modal for the first drawing + if (!vault.isUnlocked || !vault.sessionKey) { + // Store first ID and show unlock modal + setDrawingToMoveToVault(idsToMove[0]); + setShowVaultUnlockModal(true); + // Note: For bulk moves when vault is locked, we only move the first one after unlock + // A more sophisticated approach would store all IDs, but this keeps it simple + return; + } + + // Move all drawings to vault + for (const id of idsToMove) { + await encryptAndMoveToVault(id); + } + + // Clear selection if we moved selected items + if (selectedIds.has(draggedDrawingId)) { + setSelectedIds(new Set()); + } + }, [selectedIds, vault.isSetup, vault.isUnlocked, vault.sessionKey, navigate, encryptAndMoveToVault]); + const handleBulkDuplicate = async () => { if (selectedIds.size === 0) return; @@ -635,6 +743,7 @@ export const Dashboard: React.FC = () => { onEditCollection={handleEditCollection} onDeleteCollection={handleDeleteCollection} onDrop={handleDrop} + onDropToVault={handleDropToVault} > {/* Drag Preview */}
{ drawing={drawing} collections={collections} isSelected={selectedIds.has(drawing.id)} + isTrash={isTrashView} onToggleSelection={(e) => handleToggleSelection(drawing.id, e)} onRename={handleRenameDrawing} onDelete={handleDeleteDrawing} @@ -927,6 +1037,8 @@ export const Dashboard: React.FC = () => { onMouseDown={handleCardMouseDown} onDragStart={handleCardDragStart} onPreviewGenerated={handlePreviewGenerated} + onMoveToVault={!isTrashView ? handleMoveToVault : undefined} + isVaultSetup={vault.isSetup} /> )) )} @@ -975,6 +1087,17 @@ export const Dashboard: React.FC = () => { onConfirm={() => setShowImportSuccess(false)} onCancel={() => setShowImportSuccess(false)} /> + + {/* Vault Unlock Modal for Move to Vault */} + { + setShowVaultUnlockModal(false); + setDrawingToMoveToVault(null); + }} + onUnlock={handleVaultUnlockForMove} + passwordHint={vault.passwordHint} + /> ); }; diff --git a/frontend/src/pages/Editor.tsx b/frontend/src/pages/Editor.tsx index b245534..4ed98fd 100644 --- a/frontend/src/pages/Editor.tsx +++ b/frontend/src/pages/Editor.tsx @@ -1,6 +1,6 @@ import React, { useCallback, useEffect, useState, useRef } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; -import { ArrowLeft, Download } from 'lucide-react'; +import { ArrowLeft, Download, Lock } from 'lucide-react'; import { Excalidraw, exportToSvg } from '@excalidraw/excalidraw'; import '@excalidraw/excalidraw/index.css'; import debounce from 'lodash/debounce'; @@ -10,9 +10,12 @@ import { io, Socket } from 'socket.io-client'; import { getUserIdentity } from '../utils/identity'; import { reconcileElements } from '../utils/sync'; import { exportFromEditor } from '../utils/exportUtils'; +import { encryptDrawing, decryptDrawing, generateLockedPreview } from '../utils/crypto'; import type { UserIdentity } from '../utils/identity'; import * as api from '../api'; import { useTheme } from '../context/ThemeContext'; +import { useVault } from '../context/VaultContext'; +import { UnlockVaultModal } from '../components/UnlockVaultModal'; interface Peer extends UserIdentity { isActive: boolean; @@ -51,12 +54,16 @@ export const Editor: React.FC = () => { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { theme } = useTheme(); + const vault = useVault(); const [drawingName, setDrawingName] = useState('Drawing Editor'); const [isRenaming, setIsRenaming] = useState(false); const [newName, setNewName] = useState(''); const [initialData, setInitialData] = useState(null); const [isSceneLoading, setIsSceneLoading] = useState(true); + const [isPrivateDrawing, setIsPrivateDrawing] = useState(false); + const [showUnlockModal, setShowUnlockModal] = useState(false); + const [pendingPrivateData, setPendingPrivateData] = useState(null); useEffect(() => { document.title = `${drawingName} - ExcaliDash`; @@ -334,13 +341,35 @@ export const Editor: React.FC = () => { elementCount: persistableElements.length, hasRenderableElements: persistableElements.some((el: any) => !el?.isDeleted), appState: persistableAppState, + isPrivate: isPrivateDrawing, }); - await api.updateDrawing(id, { - elements: persistableElements, - appState: persistableAppState, - files: latestFilesRef.current || {}, - }); + // Handle private drawings - encrypt before saving + if (isPrivateDrawing && vault.sessionKey) { + const dataToEncrypt = { + elements: persistableElements, + appState: persistableAppState, + files: latestFilesRef.current || {}, + }; + + const { encryptedData, iv } = await encryptDrawing(dataToEncrypt, vault.sessionKey); + + await api.updateDrawing(id, { + encryptedData, + iv, + // Don't save plaintext data for private drawings + elements: [], + appState: {}, + files: {}, + }); + } else { + // Normal drawing - save plaintext + await api.updateDrawing(id, { + elements: persistableElements, + appState: persistableAppState, + files: latestFilesRef.current || {}, + }); + } console.log("[Editor] Save complete", { drawingId: id }); } catch (err) { @@ -356,6 +385,14 @@ export const Editor: React.FC = () => { const currentSnapshot = latestElementsRef.current ?? elements; const currentFiles = latestFilesRef.current ?? files; + // For private drawings, generate a locked preview instead + if (isPrivateDrawing) { + const lockedPreview = generateLockedPreview(); + await api.updateDrawing(id, { preview: lockedPreview }); + console.log("[Editor] Locked preview saved", { drawingId: id }); + return; + } + // Generate preview const svg = await exportToSvg({ elements: currentSnapshot, @@ -448,6 +485,50 @@ export const Editor: React.FC = () => { // ------------------------------------------------------------------ // 2. DATA LOADING // ------------------------------------------------------------------ + + // Helper to decrypt and load private drawing data + const loadDecryptedDrawing = useCallback(async (data: any, libraryItems: any[]) => { + if (!vault.sessionKey || !data.encryptedData || !data.iv) { + toast.error("Cannot decrypt drawing - vault not unlocked"); + navigate('/'); + return; + } + + try { + const decrypted = await decryptDrawing(data.encryptedData, data.iv, vault.sessionKey); + + const elements = decrypted.elements || []; + const files = decrypted.files || {}; + latestElementsRef.current = elements; + latestFilesRef.current = files; + + elements.forEach((el: any) => { + recordElementVersion(el); + }); + + const persistedAppState = decrypted.appState || {}; + const hydratedAppState = { + ...persistedAppState, + viewBackgroundColor: persistedAppState.viewBackgroundColor ?? '#ffffff', + gridSize: persistedAppState.gridSize ?? null, + collaborators: new Map(), + }; + + setInitialData({ + elements, + appState: hydratedAppState, + files, + scrollToContent: true, + libraryItems, + }); + setIsSceneLoading(false); + } catch (err) { + console.error('Failed to decrypt drawing', err); + toast.error("Failed to decrypt drawing"); + navigate('/private'); + } + }, [vault.sessionKey, navigate, recordElementVersion]); + useEffect(() => { isBootstrappingScene.current = true; hasHydratedInitialScene.current = false; @@ -458,6 +539,8 @@ export const Editor: React.FC = () => { setIsReady(false); setIsSceneLoading(true); setInitialData(null); + setIsPrivateDrawing(false); + setPendingPrivateData(null); const loadData = async () => { if (!id) { @@ -476,7 +559,23 @@ export const Editor: React.FC = () => { ]); setDrawingName(data.name); - // Use elements directly without converting - they're already normalized during import + // Check if this is a private drawing + if (data.isPrivate) { + setIsPrivateDrawing(true); + + // If vault is not unlocked, show unlock modal + if (!vault.isUnlocked || !vault.sessionKey) { + setPendingPrivateData({ data, libraryItems }); + setShowUnlockModal(true); + return; + } + + // Decrypt and load the drawing + await loadDecryptedDrawing(data, libraryItems); + return; + } + + // Normal (non-private) drawing loading const elements = data.elements || []; const files = data.files || {}; latestElementsRef.current = elements; @@ -508,11 +607,24 @@ export const Editor: React.FC = () => { latestFilesRef.current = {}; setInitialData(buildEmptyScene()); } finally { - setIsSceneLoading(false); + if (!isPrivateDrawing) { + setIsSceneLoading(false); + } } }; loadData(); - }, [id, recordElementVersion, buildEmptyScene]); + }, [id, recordElementVersion, buildEmptyScene, vault.isUnlocked, vault.sessionKey, loadDecryptedDrawing]); + + // Handle vault unlock for pending private drawing + const handleVaultUnlock = useCallback(async (password: string) => { + const success = await vault.unlock(password); + if (success && pendingPrivateData) { + setShowUnlockModal(false); + await loadDecryptedDrawing(pendingPrivateData.data, pendingPrivateData.libraryItems); + setPendingPrivateData(null); + } + return success; + }, [vault, pendingPrivateData, loadDecryptedDrawing]); // ------------------------------------------------------------------ // 3. HANDLERS @@ -660,6 +772,14 @@ export const Editor: React.FC = () => { + {/* Private indicator */} + {isPrivateDrawing && ( +
+ + Private +
+ )} + {isRenaming ? (
{ )}
+ + {/* Unlock Modal for Private Drawings */} + { + setShowUnlockModal(false); + navigate('/'); + }} + onUnlock={handleVaultUnlock} + passwordHint={vault.passwordHint} + />
); }; diff --git a/frontend/src/pages/PrivateDrawings.tsx b/frontend/src/pages/PrivateDrawings.tsx new file mode 100644 index 0000000..21e9e6d --- /dev/null +++ b/frontend/src/pages/PrivateDrawings.tsx @@ -0,0 +1,532 @@ +import React, { useEffect, useState, useCallback } from 'react'; +import { createPortal } from 'react-dom'; +import { Layout } from '../components/Layout'; +import { useNavigate } from 'react-router-dom'; +import * as api from '../api'; +import type { Drawing, Collection } from '../types'; +import { Lock, Unlock, Loader2, Inbox, AlertCircle, MoreVertical, Trash2, UnlockKeyhole, PenTool, Clock, ShieldCheck } from 'lucide-react'; +import { ConfirmModal } from '../components/ConfirmModal'; +import { UnlockVaultModal } from '../components/UnlockVaultModal'; +import { PrivateVaultSetup } from '../components/PrivateVaultSetup'; +import { useVault } from '../context/VaultContext'; +import { decryptDrawing } from '../utils/crypto'; +import { formatDistanceToNow } from 'date-fns'; + +const ContextMenuPortal: React.FC<{ children: React.ReactNode }> = ({ children }) => { + return createPortal(children, document.body); +}; + +// Simple private drawing card component +const PrivateDrawingCard: React.FC<{ + drawing: Drawing; + onClick: () => void; + onDelete: () => void; + onRemoveFromVault: () => void; + onRename: (id: string, name: string) => void; +}> = ({ drawing, onClick, onDelete, onRemoveFromVault, onRename }) => { + const [showMenu, setShowMenu] = useState(false); + const [isRenaming, setIsRenaming] = useState(false); + const [newName, setNewName] = useState(drawing.name); + const [contextMenu, setContextMenu] = useState<{ x: number; y: number } | null>(null); + + // Close context menu on click outside + useEffect(() => { + const handleClick = () => setContextMenu(null); + document.addEventListener('click', handleClick); + return () => document.removeEventListener('click', handleClick); + }, []); + + const handleRenameSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (newName.trim()) { + onRename(drawing.id, newName); + setIsRenaming(false); + } + }; + + const handleContextMenu = (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + setContextMenu({ x: e.clientX, y: e.clientY }); + setShowMenu(false); + }; + + return ( + <> +
+ {/* Preview - Dark/black background for private drawings (no preview shown for privacy) */} +
+ {/* Lock indicator badge */} +
+ +
+ + {/* Menu button */} + + + {/* Dropdown menu */} + {showMenu && ( +
e.stopPropagation()} + > + + + +
+ )} +
+ + {/* Info */} +
+ {isRenaming ? ( + e.stopPropagation()} + onPointerDown={e => e.stopPropagation()} + onMouseDown={e => e.stopPropagation()} + > + setNewName(e.target.value)} + onBlur={() => setIsRenaming(false)} + onDragStart={(e) => e.stopPropagation()} + onMouseDown={(e) => e.stopPropagation()} + className="w-full px-2 py-1 -ml-2 text-base font-bold text-slate-900 dark:text-white border-2 border-black dark:border-neutral-600 rounded-lg focus:outline-none shadow-[2px_2px_0px_0px_rgba(0,0,0,1)] dark:shadow-[2px_2px_0px_0px_rgba(255,255,255,0.2)] bg-white dark:bg-neutral-800" + /> + + ) : ( +

{ + e.stopPropagation(); + setIsRenaming(true); + }} + > + {drawing.name} +

+ )} +

+ + {formatDistanceToNow(drawing.updatedAt, { addSuffix: true })} +

+
+
+ + {/* Context Menu Portal */} + {contextMenu && ( + +
setContextMenu(null)} + onContextMenu={(e) => { e.preventDefault(); setContextMenu(null); }} + > +
e.stopPropagation()} + > + + + + +
+ + +
+
+
+ )} + + ); +}; + +export const PrivateDrawings: React.FC = () => { + const navigate = useNavigate(); + const vault = useVault(); + const [drawings, setDrawings] = useState([]); + const [collections, setCollections] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [showUnlockModal, setShowUnlockModal] = useState(false); + const [showSetupModal, setShowSetupModal] = useState(false); + const [modalDismissed, setModalDismissed] = useState(false); + const [error, setError] = useState(null); + const [drawingToUnlock, setDrawingToUnlock] = useState(null); + + // Fetch collections for sidebar + useEffect(() => { + const fetchCollections = async () => { + try { + const data = await api.getCollections(); + setCollections(data); + } catch (err) { + console.error('Failed to fetch collections:', err); + } + }; + fetchCollections(); + }, []); + + // Fetch private drawings when vault is unlocked + const fetchPrivateDrawings = useCallback(async () => { + if (!vault.isUnlocked || !vault.sessionKey) return; + + setIsLoading(true); + setError(null); + + try { + const privateDrawings = await api.getPrivateDrawings(); + + // Decrypt names for display (the actual content is decrypted when opening) + const decryptedDrawings = await Promise.all( + privateDrawings.map(async (drawing) => { + // For now, just use the stored name (names aren't encrypted yet) + // In a full implementation, you'd decrypt the name here + return drawing; + }) + ); + + setDrawings(decryptedDrawings); + } catch (err) { + console.error('Failed to fetch private drawings:', err); + setError('Failed to load private drawings'); + } finally { + setIsLoading(false); + } + }, [vault.isUnlocked, vault.sessionKey]); + + // Handle vault state changes + useEffect(() => { + if (vault.isUnlocked) { + fetchPrivateDrawings(); + setShowUnlockModal(false); + setModalDismissed(false); // Reset dismissed state when unlocked + } else if (!vault.isLoading && vault.isSetup && !modalDismissed) { + // Vault is setup but locked - auto-show unlock modal on first visit only + setShowUnlockModal(true); + } + }, [vault.isUnlocked, vault.isLoading, vault.isSetup, fetchPrivateDrawings, modalDismissed]); + + // Handle unlock modal close + const handleUnlockModalClose = useCallback(() => { + setShowUnlockModal(false); + setModalDismissed(true); // Prevent auto-reopening + }, []); + + const handleSelectCollection = (id: string | null | undefined) => { + if (id === undefined) navigate('/'); + else if (id === null) navigate('/collections?id=unorganized'); + else if (id === 'private') navigate('/private'); + else navigate(`/collections?id=${id}`); + }; + + const handleCreateCollection = async (name: string) => { + await api.createCollection(name); + const newCollections = await api.getCollections(); + setCollections(newCollections); + }; + + const handleEditCollection = async (id: string, name: string) => { + setCollections(prev => prev.map(c => c.id === id ? { ...c, name } : c)); + await api.updateCollection(id, name); + }; + + const handleDeleteCollection = async (id: string) => { + setCollections(prev => prev.filter(c => c.id !== id)); + await api.deleteCollection(id); + }; + + const handleOpenDrawing = (id: string) => { + navigate(`/editor/${id}`); + }; + + const handleRemoveFromVault = async (id: string) => { + if (!vault.sessionKey) return; + + const drawing = drawings.find(d => d.id === id); + if (!drawing || !drawing.encryptedData || !drawing.iv) return; + + try { + // Decrypt the drawing data + const decrypted = await decryptDrawing( + drawing.encryptedData, + drawing.iv, + vault.sessionKey + ); + + // Unlock the drawing (move it out of private vault) + await api.unlockDrawing( + id, + decrypted.elements, + decrypted.appState, + decrypted.files + ); + + // Refresh the list + fetchPrivateDrawings(); + } catch (err) { + console.error('Failed to remove drawing from vault:', err); + setError('Failed to remove drawing from vault'); + } + }; + + const handleDelete = async (id: string) => { + try { + await api.deleteDrawing(id); + setDrawings(prev => prev.filter(d => d.id !== id)); + } catch (err) { + console.error('Failed to delete drawing:', err); + } + }; + + const handleRename = async (id: string, name: string) => { + try { + await api.updateDrawing(id, { name }); + setDrawings(prev => prev.map(d => d.id === id ? { ...d, name } : d)); + } catch (err) { + console.error('Failed to rename drawing:', err); + } + }; + + if (vault.isLoading) { + return ( + +
+ +
+
+ ); + } + + return ( + +
+
+
+ {vault.isUnlocked ? ( + + ) : ( + + )} +
+
+

+ Private Vault +

+

+ {!vault.isSetup + ? 'Set up your private vault to protect sensitive drawings' + : vault.isUnlocked + ? 'End-to-end encrypted drawings' + : 'Unlock vault to view drawings'} +

+
+
+ + {vault.isUnlocked && ( + + )} +
+ + {error && ( +
+ + {error} +
+ )} + + {/* Not Set Up State */} + {!vault.isSetup ? ( +
+
+ +
+

+ Set Up Private Vault +

+

+ Protect sensitive drawings with end-to-end encryption. + Only you can access them with your password. +

+ +
+ ) : !vault.isUnlocked ? ( + /* Locked State */ +
+
+ +
+

+ Vault is Locked +

+

+ Enter your password to access your private drawings. +

+ +
+ ) : isLoading ? ( + /* Loading State */ +
+ +
+ ) : drawings.length === 0 ? ( + /* Empty State */ +
+
+ +
+

+ No Private Drawings +

+

+ Move drawings to your private vault from the dashboard context menu. +

+
+ ) : ( + /* Drawings Grid */ +
+ {drawings.map((drawing) => ( + handleOpenDrawing(drawing.id)} + onDelete={() => handleDelete(drawing.id)} + onRemoveFromVault={() => setDrawingToUnlock(drawing.id)} + onRename={handleRename} + /> + ))} +
+ )} + + {/* Setup Modal */} + setShowSetupModal(false)} + onSetup={vault.setupVault} + /> + + {/* Unlock Modal */} + + + {/* Confirm remove from vault */} + { + if (drawingToUnlock) { + handleRemoveFromVault(drawingToUnlock); + } + setDrawingToUnlock(null); + }} + onCancel={() => setDrawingToUnlock(null)} + /> +
+ ); +}; diff --git a/frontend/src/pages/Settings.tsx b/frontend/src/pages/Settings.tsx index 314d0c3..97d7a6a 100644 --- a/frontend/src/pages/Settings.tsx +++ b/frontend/src/pages/Settings.tsx @@ -3,21 +3,31 @@ import { Layout } from '../components/Layout'; import { useNavigate } from 'react-router-dom'; import * as api from '../api'; import type { Collection } from '../types'; -import { Database, FileJson, Upload, Moon, Sun, Info, HardDrive } from 'lucide-react'; +import { Database, FileJson, Upload, Moon, Sun, Info, HardDrive, Lock, Key, ShieldCheck, Unlock } from 'lucide-react'; import { ConfirmModal } from '../components/ConfirmModal'; import { importDrawings } from '../utils/importUtils'; import { useTheme } from '../context/ThemeContext'; +import { useVault } from '../context/VaultContext'; +import { PrivateVaultSetup } from '../components/PrivateVaultSetup'; +import { UnlockVaultModal } from '../components/UnlockVaultModal'; +import { ChangeVaultPassword } from '../components/ChangeVaultPassword'; export const Settings: React.FC = () => { const [collections, setCollections] = useState([]); const navigate = useNavigate(); const { theme, toggleTheme } = useTheme(); + const vault = useVault(); // Import state const [importConfirmation, setImportConfirmation] = useState<{ isOpen: boolean; file: File | null }>({ isOpen: false, file: null }); const [importError, setImportError] = useState<{ isOpen: boolean; message: string }>({ isOpen: false, message: '' }); const [importSuccess, setImportSuccess] = useState(false); + // Vault modal state + const [showVaultSetup, setShowVaultSetup] = useState(false); + const [showUnlockModal, setShowUnlockModal] = useState(false); + const [showChangePassword, setShowChangePassword] = useState(false); + const appVersion = import.meta.env.VITE_APP_VERSION || 'Unknown version'; const buildLabel = import.meta.env.VITE_APP_BUILD_LABEL; @@ -71,6 +81,114 @@ export const Settings: React.FC = () => { Settings

+ {/* Private Vault Section */} +
+

Private Vault

+
+ {vault.isLoading ? ( +
+
+
+ ) : !vault.isSetup ? ( +
+
+ +
+

+ Set Up Private Vault +

+

+ Protect sensitive drawings with end-to-end encryption. + Only you can access them with your password. +

+ +
+ ) : ( +
+ {/* Vault Status */} +
+
+
+ {vault.isUnlocked ? ( + + ) : ( + + )} +
+
+

+ {vault.isUnlocked ? 'Vault Unlocked' : 'Vault Locked'} +

+

+ {vault.privateDrawingsCount} private drawing{vault.privateDrawingsCount !== 1 ? 's' : ''} +

+
+
+ +
+ + {/* Vault Actions */} +
+ {/* View Private Drawings */} + + + {/* Change Password */} + +
+ + {/* Password Hint */} + {vault.passwordHint && ( +
+

Password Hint

+

{vault.passwordHint}

+
+ )} +
+ )} +
+
+ +

General

{/* Theme Toggle */}