Skip to content

Commit 0551d11

Browse files
authored
fix(storage): Storage.list crash on null "options" (#1061)
* Fix storage crash * Remove validation message
1 parent 439bc5e commit 0551d11

File tree

3 files changed

+37
-52
lines changed

3 files changed

+37
-52
lines changed

packages/amplify_storage_s3/example/.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ app.*.map.json
4242
# Exceptions to above rules.
4343
!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
4444

45-
#amplify
45+
#amplify-do-not-edit-begin
4646
amplify/\#current-cloud-backend
4747
amplify/.config/local-*
4848
amplify/logs
@@ -61,3 +61,5 @@ amplify-build-config.json
6161
amplify-gradle-config.json
6262
amplifytools.xcconfig
6363
.secret-*
64+
**.sample
65+
#amplify-do-not-edit-end

packages/amplify_storage_s3/ios/Classes/AmplifyStorageOperations.swift

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,28 +90,23 @@ public class AmplifyStorageOperations {
9090
}
9191

9292
public static func list(flutterResult: @escaping FlutterResult, request: Dictionary<String, AnyObject>){
93-
do {
94-
try FlutterListRequest.validate(request: request)
95-
let req = FlutterListRequest(request: request)
96-
_ = Amplify.Storage.list(options: req.options,
97-
resultListener: {event in
98-
switch event{
99-
case .success(let result):
100-
var listResultDictionary = [String:Any]();
101-
var storageItemList = [[String:Any?]]();
102-
for item in result.items {
103-
let storageItemDictionary = getStorageItemDictionary(item: item)
104-
storageItemList.append(storageItemDictionary)
105-
}
106-
listResultDictionary["items"] = storageItemList
107-
flutterResult(listResultDictionary);
108-
case.failure(let storageError):
109-
prepareError(flutterResult: flutterResult, error: storageError)
93+
let req = FlutterListRequest(request: request)
94+
_ = Amplify.Storage.list(options: req.options,
95+
resultListener: {event in
96+
switch event{
97+
case .success(let result):
98+
var listResultDictionary = [String:Any]();
99+
var storageItemList = [[String:Any]]();
100+
for item in result.items {
101+
let storageItemDictionary = getStorageItemDictionary(item: item)
102+
storageItemList.append(storageItemDictionary)
110103
}
111-
})
112-
} catch {
113-
prepareError(flutterResult: flutterResult, error: error)
114-
}
104+
listResultDictionary["items"] = storageItemList
105+
flutterResult(listResultDictionary);
106+
case.failure(let storageError):
107+
prepareError(flutterResult: flutterResult, error: storageError)
108+
}
109+
})
115110
}
116111

117112
internal static func downloadFile(flutterResult: @escaping FlutterResult, request: Dictionary<String, AnyObject>, transferProgressStreamHandler : TransferProgressStreamHandler){

packages/amplify_storage_s3/ios/Classes/FlutterListRequest.swift

Lines changed: 18 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -18,41 +18,29 @@ import Amplify
1818
import amplify_core
1919

2020
struct FlutterListRequest {
21-
var options: StorageListRequest.Options?
22-
init(request: Dictionary<String, AnyObject>) {
23-
self.options = setOptions(request: request)
24-
}
2521

26-
static func validate(request: Dictionary<String, AnyObject>) throws {
27-
let validationErrorMessage = "List request malformed."
28-
if !(request["path"] is String?) {
29-
throw InvalidRequestError.storage(comment: validationErrorMessage,
30-
suggestion: String(format: ErrorMessages.missingAttribute, "path"))
31-
}
22+
let options: StorageListRequest.Options
23+
24+
init(request: [String: Any?]) {
25+
self.options = FlutterListRequest.parseOptions(request: request)
3226
}
33-
34-
private func setOptions(request: Dictionary<String, AnyObject>) -> StorageListRequest.Options? {
27+
28+
private static func parseOptions(request: [String: Any?]) -> StorageListRequest.Options {
29+
var accessLevel = StorageAccessLevel.guest
30+
var targetIdentityId: String? = nil
31+
let path = request["path"] as? String
3532

36-
if(request["options"] != nil || request["path"] != nil) {
37-
let requestOptions = request["options"] as! Dictionary<String, AnyObject>
38-
//Default options
39-
var accessLevel = StorageAccessLevel.guest
40-
var targetIdentityId: String? = nil
41-
let path: String? = request["path"] as! String?
42-
43-
for(key,value) in requestOptions {
44-
switch key {
45-
case "accessLevel":
46-
accessLevel = StorageAccessLevel(rawValue: value as! String) ?? accessLevel
47-
case "targetIdentityId":
48-
targetIdentityId = value as? String
49-
default:
50-
print("Received unexpected option: \(key)")
51-
}
33+
if let options = request["options"] as? [String: Any?] {
34+
if let accessValueLevel = options["accessLevel"] as? String,
35+
let storageAccessLevel = StorageAccessLevel(rawValue: accessValueLevel) {
36+
accessLevel = storageAccessLevel
5237
}
53-
return StorageListRequest.Options(accessLevel: accessLevel, targetIdentityId: targetIdentityId, path: path)
38+
targetIdentityId = options["targetIdentityId"] as? String
5439
}
55-
return nil
40+
41+
return StorageListRequest.Options(accessLevel: accessLevel,
42+
targetIdentityId: targetIdentityId,
43+
path: path)
5644
}
5745

5846
}

0 commit comments

Comments
 (0)