@@ -16,6 +16,7 @@ import {
1616 SanitizedFields ,
1717 SaveUserConfigRequest
1818} from './types.js'
19+ import { getSession } from '@/services/session.js'
1920
2021export const getDefault = async ( _ : Request , res : Response ) => {
2122 try {
@@ -33,15 +34,24 @@ export const createUserConfig = async (req: Request, res: Response) => {
3334 const data : CreateConfigRequest = req . body
3435 const tag = data . version || data . tag
3536
36- if ( ! data . walletAddress ) {
37+ if ( ! data ? .walletAddress ) {
3738 throw 'Wallet address is required'
3839 }
40+ const walletAddress = decodeURIComponent ( `https://${ data . walletAddress } ` )
41+
42+ const cookieHeader = req . headers . cookie
43+ const session = await getSession ( cookieHeader )
44+
45+ const validForWallet = session ?. get ( 'validForWallet' )
46+
47+ if ( ! session || validForWallet !== walletAddress ) {
48+ throw 'Grant confirmation is required'
49+ }
50+
3951 const defaultData = await getDefaultData ( )
4052 const defaultDataContent : ConfigVersions [ 'default' ] =
4153 JSON . parse ( defaultData ) . default
42- defaultDataContent . walletAddress = decodeURIComponent (
43- `https://${ data . walletAddress } `
44- )
54+ defaultDataContent . walletAddress = walletAddress
4555
4656 sanitizeConfigFields ( { ...defaultDataContent , tag } )
4757
@@ -51,6 +61,7 @@ export const createUserConfig = async (req: Request, res: Response) => {
5161 try {
5262 // existing config
5363 const s3data = await s3 . send ( new GetObjectCommand ( params ) )
64+
5465 // Convert the file stream to a string
5566 fileContentString = await streamToString (
5667 s3data . Body as NodeJS . ReadableStream
@@ -97,10 +108,17 @@ export const createUserConfig = async (req: Request, res: Response) => {
97108export const saveUserConfig = async ( req : Request , res : Response ) => {
98109 try {
99110 const data : SaveUserConfigRequest = req . body
111+ const cookieHeader = req . headers . cookie
112+ const session = await getSession ( cookieHeader )
113+
114+ const validForWallet = session ?. get ( 'validForWallet' )
100115
101116 if ( ! data . walletAddress ) {
102117 throw 'Wallet address is required'
103118 }
119+ if ( ! session || validForWallet !== data . walletAddress ) {
120+ throw 'Grant confirmation is required'
121+ }
104122
105123 const { s3, params } = getS3AndParams ( data . walletAddress )
106124
@@ -132,19 +150,22 @@ export const getUserConfig = async (req: Request, res: Response) => {
132150 if ( ! id ) {
133151 throw new S3FileNotFoundError ( 'Wallet address is required' )
134152 }
153+ const walletAddress = decodeURIComponent ( `https://${ id } ` )
135154
136155 // ensure we have all keys w default values, user config will overwrite values that exist in saved json
137156 const defaultData = await getDefaultData ( )
157+ const parsedDefaultData = JSON . parse ( defaultData )
158+ parsedDefaultData . default . walletAddress = walletAddress
138159
139- const { s3, params } = getS3AndParams ( id )
160+ const { s3, params } = getS3AndParams ( walletAddress )
140161 const data = await s3 . send ( new GetObjectCommand ( params ) )
141162 // Convert the file stream to a string
142163 const fileContentString = await streamToString (
143164 data . Body as NodeJS . ReadableStream
144165 )
145166
146167 let fileContent = Object . assign (
147- JSON . parse ( defaultData ) ,
168+ parsedDefaultData ,
148169 ...[ JSON . parse ( fileContentString ) ]
149170 )
150171 fileContent = filterDeepProperties ( fileContent )
0 commit comments