diff --git a/app/[locale]/dashboard/components/file-upload.tsx b/app/[locale]/dashboard/components/file-upload.tsx index f634b08..5d9a496 100644 --- a/app/[locale]/dashboard/components/file-upload.tsx +++ b/app/[locale]/dashboard/components/file-upload.tsx @@ -167,6 +167,7 @@ export default function FileUpload( { type: json.type, path: new URL( json.path, window.location.href ).href, status: json.status, + encrypted: json.encrypted, versions: json.versions.map( ( version ) => ( { ...version, date: new Date( version.date ) diff --git a/app/[locale]/dashboard/components/row-actions.tsx b/app/[locale]/dashboard/components/row-actions.tsx index 1c0673f..65299d1 100644 --- a/app/[locale]/dashboard/components/row-actions.tsx +++ b/app/[locale]/dashboard/components/row-actions.tsx @@ -18,6 +18,7 @@ import { Ban, History, RefreshCw, FolderLock, + ShieldCheck, ArrowUpRight, ClipboardCopy, MoreHorizontal, @@ -69,8 +70,10 @@ export default function RowActions( { // Déclaration des variables d'état. const rename = useRef( null ); + const access = useRef( null ); const loading = states.loading.includes( row.id ); const [ open, setOpen ] = useState( false ); + const [ password, setPassword ] = useState( "" ); // Filtrage des données d'une ou plusieurs lignes. const rowData = states.files.filter( ( file ) => file.uuid === row.id ); @@ -533,7 +536,7 @@ export default function RowActions( { ); } }} - disabled={loading} + disabled={loading || !selectedData[ 0 ].name} className="max-sm:w-full" > {loading ? ( @@ -552,16 +555,111 @@ export default function RowActions( { - - - - Accéder à la ressource - - + {rowData[ 0 ].encrypted ? ( + + + event.preventDefault()} + > + + Accéder à la ressource + + + + + + + + + + Veuillez saisir la clé de déchiffrement. + + + + + Ce fichier est chiffré par une clé que le + serveur ne possède pas. Pour accéder à la + ressource, veuillez saisir la clé de + déchiffrement qui vous a été fournie lors du + téléversement du fichier.{" "} + + En cas de perte, vous ne pourrez plus + accéder à la ressource. Si c‘est + le cas, supprimez le fichier et + téléversez-le à nouveau. + L‘assistance technique ne pourra + pas vous aider car elle ne possède pas + la clé de déchiffrement. + + + + + + { + // Mise à jour de l'entrée utilisateur. + setPassword( event.currentTarget.value ); + }} + onKeyDown={( event ) => + { + // Soumission du formulaire par clavier. + const { key } = event; + + if ( + key === "Enter" + || key === "NumpadEnter" + ) + { + access.current?.click(); + } + }} + spellCheck="false" + placeholder="your_key" + autoComplete="off" + autoCapitalize="off" + /> + + + + + + + ) : ( + + + + Accéder à la ressource + + + )} diff --git a/app/[locale]/dashboard/page.tsx b/app/[locale]/dashboard/page.tsx index 42bda21..0b1f788 100644 --- a/app/[locale]/dashboard/page.tsx +++ b/app/[locale]/dashboard/page.tsx @@ -73,6 +73,7 @@ async function getFiles(): Promise type: mime.getType( file.name ) ?? "application/octet-stream", path, status: file.status ?? "public", + encrypted: file.encrypted, versions: file.versions.map( ( version ) => ( { uuid: version.id, size: Number( version.size ), diff --git a/interfaces/File.ts b/interfaces/File.ts index 3aaca36..80780c6 100644 --- a/interfaces/File.ts +++ b/interfaces/File.ts @@ -17,6 +17,9 @@ export interface FileAttributes { // Statut de partage du fichier. status: "public" | "private" | "shared"; + // État de chiffrement du fichier. + encrypted: boolean; + // Liste des versions du fichier. versions: { // Identifiant unique de la version. diff --git a/middleware.ts b/middleware.ts index b57b4ac..cd7107c 100644 --- a/middleware.ts +++ b/middleware.ts @@ -72,10 +72,14 @@ export default async function middleware( request: NextRequest ) { // On récupère le tampon de données du fichier ainsi que // la clé de chiffrement. + const key = request.nextUrl.searchParams.get( "key" ); const buffer = new Uint8Array( await content.arrayBuffer() ); const cipher = await crypto.subtle.importKey( "raw", - Buffer.from( process.env.AUTH_SECRET ?? "", "base64" ), + Buffer.from( + key ?? process.env.AUTH_SECRET ?? "", + "base64" + ), { name: "AES-GCM", length: 256 diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5027c6c..60b7c27 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -51,6 +51,7 @@ model File { userId String name String status String + encrypted Boolean @default(false) expiration DateTime? versions Version[] }