11import { env } from '$env/dynamic/private' ;
22import { MAX_UPLOAD_SIZE } from '$lib/consts.js' ;
3- import { createPresignedPost } from "@aws-sdk/s3-presigned-post" ;
3+ import { stringToObjectId } from '$lib/server/objectId.js' ;
4+ import { createPresignedPost } from '@aws-sdk/s3-presigned-post' ;
45import { error , json } from '@sveltejs/kit' ;
56import argon2 from 'argon2' ;
67import sodium from 'libsodium-wrappers-sumo' ;
78import { z } from 'zod' ;
89
910const createPasteSchema = z . object ( {
10- codeHeader : z . string ( ) . trim ( ) . max ( 128 ) ,
11- codeKeySalt : z . string ( ) . trim ( ) . max ( 64 ) ,
12- codeName : z . string ( ) . trim ( ) . max ( 32 ) . optional ( ) ,
13- codeNameNonce : z . string ( ) . trim ( ) . max ( 32 ) . optional ( ) ,
14- codeNameKeySalt : z . string ( ) . trim ( ) . max ( 32 ) . optional ( )
11+ codeHeader : z . string ( ) . trim ( ) . max ( 128 ) ,
12+ codeKeySalt : z . string ( ) . trim ( ) . max ( 64 ) ,
13+ codeName : z . string ( ) . trim ( ) . max ( 32 ) . optional ( ) ,
14+ codeNameNonce : z . string ( ) . trim ( ) . max ( 32 ) . optional ( ) ,
15+ codeNameKeySalt : z . string ( ) . trim ( ) . max ( 32 ) . optional ( )
1516} ) ;
1617
1718export async function POST ( { locals, request } ) {
18- await sodium . ready ;
19-
20- const formData = createPasteSchema . safeParse (
21- Object . fromEntries ( await request . formData ( ) )
22- ) ;
23-
24- if ( ! formData . success ) {
25- throw error ( 400 , formData . error ) ;
26- }
27-
28- const accessKey = sodium . to_base64 ( sodium . randombytes_buf ( 32 ) ) ;
29-
30- const createdPaste = await locals . mongoDb . collection ( 'pastes' ) . insertOne ( {
31- header : formData . data . codeHeader ,
32- keySalt : formData . data . codeKeySalt ,
33- name : {
34- value : formData . data . codeName ,
35- nonce : formData . data . codeNameNonce ,
36- keySalt : formData . data . codeNameKeySalt
37- } ,
38- language : null ,
39- expireAfter : - 2 ,
40- accessKey : await argon2 . hash ( accessKey ) ,
41- created : new Date ( ) ,
42- deleteNextRequest : false ,
43- wrapWords : false
44- } ) ;
45-
46- const signedUrl = await createPresignedPost ( locals . s3Client , {
47- Bucket : env . S3_BUCKET ?? '' ,
48- Key : `${ createdPaste . insertedId } .bin` ,
49- Conditions : [
50- [ 'content-length-range' , 0 , MAX_UPLOAD_SIZE ] ,
51- ] ,
52- Expires : 82800 ,
53- } ) ;
54-
55- return json ( {
56- pasteId : createdPaste . insertedId . toString ( ) ,
57- accessKey : accessKey ,
58- signedUrl : signedUrl
59- } ) ;
60- }
19+ await sodium . ready ;
20+
21+ const formData = createPasteSchema . safeParse ( Object . fromEntries ( await request . formData ( ) ) ) ;
22+
23+ if ( ! formData . success ) {
24+ throw error ( 400 , formData . error ) ;
25+ }
26+
27+ let expireAfter = - 2 ;
28+
29+ if ( locals . userId ) {
30+ const results = await locals . mongoDb
31+ . collection ( 'userDefaults' )
32+ . findOne ( { _id : stringToObjectId ( locals . userId ) } ) ;
33+
34+ if ( results ) {
35+ expireAfter = results . expireAfter ;
36+ }
37+ }
38+
39+ const accessKey = sodium . to_base64 ( sodium . randombytes_buf ( 32 ) ) ;
40+
41+ const createdPaste = await locals . mongoDb . collection ( 'pastes' ) . insertOne ( {
42+ header : formData . data . codeHeader ,
43+ keySalt : formData . data . codeKeySalt ,
44+ name : {
45+ value : formData . data . codeName ,
46+ nonce : formData . data . codeNameNonce ,
47+ keySalt : formData . data . codeNameKeySalt
48+ } ,
49+ language : null ,
50+ expireAfter : expireAfter ,
51+ accessKey : await argon2 . hash ( accessKey ) ,
52+ created : new Date ( ) ,
53+ deleteNextRequest : false ,
54+ wrapWords : false
55+ } ) ;
56+
57+ const signedUrl = await createPresignedPost ( locals . s3Client , {
58+ Bucket : env . S3_BUCKET ?? '' ,
59+ Key : `${ createdPaste . insertedId } .bin` ,
60+ Conditions : [ [ 'content-length-range' , 0 , MAX_UPLOAD_SIZE ] ] ,
61+ Expires : 82800
62+ } ) ;
63+
64+ return json ( {
65+ pasteId : createdPaste . insertedId . toString ( ) ,
66+ accessKey : accessKey ,
67+ signedUrl : signedUrl
68+ } ) ;
69+ }
0 commit comments