1
0
Эх сурвалжийг харах

Merge pull request #406 from AtkinsSJ/fs-upload-data-type-error

Explicitly reject invalid types for puter.fs.upload() and .write() payloads
Eric Dubé 1 жил өмнө
parent
commit
b15dc316d3

+ 18 - 25
packages/puter-js/src/modules/FileSystem/operations/upload.js

@@ -15,16 +15,19 @@ const upload = async function(items, dirPath, options = {}){
             }
         }
 
+        const error = (e) => {
+            // if error callback is provided, call it
+            if(options.error && typeof options.error === 'function')
+                options.error(e);
+            return reject(e);
+        };
+
         // xhr object to be used for the upload
         let xhr = new XMLHttpRequest();
 
         // Can not write to root
-        if(dirPath === '/'){
-            // if error callback is provided, call it
-            if(options.error && typeof options.error === 'function')
-                options.error('Can not upload to root directory.');
-            return reject('Can not upload to root directory.');
-        }
+        if(dirPath === '/')
+            return error('Can not upload to root directory.');
 
         // If dirPath is not provided or it's not starting with a slash, it means it's a relative path
         // in that case, we need to prepend the app's root directory to it
@@ -119,7 +122,11 @@ const upload = async function(items, dirPath, options = {}){
                 entries[i].filepath = entries[i].name;
                 entries[i].fullPath = entries[i].name;
             }
-        }       
+        }
+        // Anything else is invalid
+        else {
+            return error({ code: 'field_invalid', message: 'upload() items parameter is an invalid type' });
+        }
 
         // Will hold directories and files to be uploaded
         let dirs = [];
@@ -145,10 +152,7 @@ const upload = async function(items, dirPath, options = {}){
 
         // Continue only if there are actually any files/directories to upload
         if(dirs.length === 0 && files.length === 0){
-            if(options.error && typeof options.error === 'function'){
-                options.error({code: 'EMPTY_UPLOAD', message: 'No files or directories to upload.'});
-            }
-            return reject({code: 'EMPTY_UPLOAD', message: 'No files or directories to upload.'});
+            return error({code: 'EMPTY_UPLOAD', message: 'No files or directories to upload.'});
         }
 
         // Check storage capacity.
@@ -163,10 +167,7 @@ const upload = async function(items, dirPath, options = {}){
             try{
                 storage = await this.space();
                 if(storage.capacity - storage.used < total_size){
-                    if(options.error && typeof options.error === 'function'){
-                        options.error({code: 'NOT_ENOUGH_SPACE', message: 'Not enough storage space available.'});
-                    }
-                    return reject({code: 'NOT_ENOUGH_SPACE', message: 'Not enough storage space available.'});
+                    return error({code: 'NOT_ENOUGH_SPACE', message: 'Not enough storage space available.'});
                 }
             }catch(e){
                 // Ignored
@@ -368,18 +369,10 @@ const upload = async function(items, dirPath, options = {}){
                                 break;
                             }
                         }
-                        // if error callback is provided, call it
-                        if(options.error && typeof options.error === 'function'){
-                            options.error(failed_operation);
-                        }
-                        return reject(failed_operation);
+                        return error(failed_operation);
                     }
 
-                    // if error callback is provided, call it
-                    if(options.error && typeof options.error === 'function'){
-                        options.error(resp);
-                    }
-                    return reject(resp);
+                    return error(resp);
                 }
                 // Success
                 else{

+ 5 - 0
packages/puter-js/src/modules/FileSystem/operations/write.js

@@ -46,6 +46,11 @@ const write = async function (targetPath, data, options = {}) {
     if(!data)
         data = new File([data ?? ''], filename);
 
+    // data should be a File now. If it's not, it's an unsupported type
+    if (!(data instanceof File)) {
+        throw new Error({ code: 'field_invalid', message: 'write() data parameter is an invalid type' });
+    }
+
     // perform upload
     return this.upload(data, parent, options);
 }