diff --git a/packages/storage/e2e/StorageReference.e2e.js b/packages/storage/e2e/StorageReference.e2e.js index 76edcc68fbc..2d356ff79d4 100644 --- a/packages/storage/e2e/StorageReference.e2e.js +++ b/packages/storage/e2e/StorageReference.e2e.js @@ -346,6 +346,20 @@ describe('storage() -> StorageReference', function() { result.prefixes.length.should.be.greaterThan(0); result.prefixes[0].constructor.name.should.eql('StorageReference'); }); + + it('should not crash if the user is not allowed to list the directory', async function() { + const storageReference = firebase.storage().ref('/forbidden'); + try { + await storageReference.listAll(); + return Promise.reject(new Error('listAll on a forbidden directory succeeded')); + } catch (error) { + error.code.should.equal('storage/unauthorized'); + error.message.should.equal( + '[storage/unauthorized] User is not authorized to perform the desired action.', + ); + return Promise.resolve(); + } + }); }); describe('updateMetadata', function() { diff --git a/packages/storage/ios/RNFBStorage/RNFBStorageModule.m b/packages/storage/ios/RNFBStorage/RNFBStorageModule.m index a3a92a87dd1..012367193e9 100644 --- a/packages/storage/ios/RNFBStorage/RNFBStorageModule.m +++ b/packages/storage/ios/RNFBStorage/RNFBStorageModule.m @@ -194,7 +194,16 @@ - (void)invalidate { ) { FIRStorageReference *storageReference = [self getReferenceFromUrl:url app:firebaseApp]; + __block bool alreadyCompleted = false; + id completionBlock = ^(FIRStorageListResult *result, NSError *error) { + // This may be called multiple times if an error occurs + // Make sure we won't try to resolve the promise twice in this case + // TODO - remove pending resolution of https://github.com/firebase/firebase-ios-sdk/issues/7197 + if (alreadyCompleted) { + return; + } + alreadyCompleted = true; if (error != nil) { [self promiseRejectStorageException:reject error:error]; } else {