Skip to content

Commit d526c61

Browse files
authored
fix(Core): Fix plugin configuration validation (#543)
Previous validation logic threw an error if it encountered a configuration stanza with no corresponding plugin registered for that key. However, the current CLI emits some plugin keys in unexpected situations, breaking this validation. Remediation would require a customer to edit the config file, which is possibly dangerous, and definitely inconvenient. This change: - Replaces the throwing error with a logged warning when the config encounters an unmatched plugin key - Changes the `Plugin.configure` signature to accept an optional `Any?` argument, instead of a non-optional. This will let plugins decide if they need to throw or not. - Fixes a data race in hub test code - Fix AWSCognitoAuthPlugin and AWSS3StoragePlugin to throw a PluginError instead of a category-specific error if they encounter an error during configuration fixes #540
1 parent 2b6972b commit d526c61

File tree

56 files changed

+600
-134
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+600
-134
lines changed

Amplify.xcodeproj/project.pbxproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2834,9 +2834,9 @@
28342834
FAC2354C227A056600424678 /* CategoryTests */ = {
28352835
isa = PBXGroup;
28362836
children = (
2837-
B4F3E9F624314E1300F23296 /* Auth */,
28382837
FAC2355D227A056600424678 /* Analytics */,
28392838
FAC23555227A056600424678 /* API */,
2839+
B4F3E9F624314E1300F23296 /* Auth */,
28402840
FAD3937B23820CE200463F5E /* DataStore */,
28412841
FAC23584227A442000424678 /* Hub */,
28422842
FAC23559227A056600424678 /* Logging */,
@@ -2956,9 +2956,9 @@
29562956
isa = PBXGroup;
29572957
children = (
29582958
FA607FE1233D131B00DFEA24 /* AmplifyOperationHubTests.swift */,
2959-
FACF52052329652600646E10 /* DefaultPluginTests */,
29602959
FAC23585227A443200424678 /* HubCategoryConfigurationTests.swift */,
29612960
FAC23587227A446C00424678 /* HubClientAPITests.swift */,
2961+
FACF52052329652600646E10 /* DefaultPluginTests */,
29622962
);
29632963
path = Hub;
29642964
sourceTree = "<group>";

Amplify/Categories/API/Internal/APICategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ extension AmplifyAPICategory: CategoryConfigurable {
1616
throw error
1717
}
1818

19-
for (pluginKey, pluginConfiguration) in configuration.plugins {
20-
let plugin = try getPlugin(for: pluginKey)
21-
try plugin.configure(using: pluginConfiguration)
22-
}
19+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2320

2421
isConfigured = true
2522
}

Amplify/Categories/Analytics/Internal/AnalyticsCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ extension AnalyticsCategory: CategoryConfigurable {
1616
throw error
1717
}
1818

19-
for (pluginKey, pluginConfiguration) in configuration.plugins {
20-
let plugin = try getPlugin(for: pluginKey)
21-
try plugin.configure(using: pluginConfiguration)
22-
}
19+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2320

2421
isConfigured = true
2522
}

Amplify/Categories/Auth/Internal/AuthCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ extension AuthCategory: CategoryConfigurable {
1818
throw error
1919
}
2020

21-
for (pluginKey, pluginConfiguration) in configuration.plugins {
22-
let plugin = try getPlugin(for: pluginKey)
23-
try plugin.configure(using: pluginConfiguration)
24-
}
21+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2522

2623
isConfigured = true
2724
}

Amplify/Categories/DataStore/Internal/DataStoreCategory+Configurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@ extension DataStoreCategory: CategoryConfigurable {
2424
throw error
2525
}
2626

27-
for (pluginKey, pluginConfiguration) in configuration.plugins {
28-
let plugin = try getPlugin(for: pluginKey)
29-
try plugin.configure(using: pluginConfiguration)
30-
}
27+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
3128

3229
isConfigured = true
3330
}

Amplify/Categories/Hub/Internal/HubCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,7 @@ extension HubCategory: CategoryConfigurable {
1818
throw error
1919
}
2020

21-
for (pluginKey, pluginConfiguration) in configuration.plugins {
22-
let plugin = try getPlugin(for: pluginKey)
23-
try plugin.configure(using: pluginConfiguration)
24-
}
21+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2522

2623
configurationState = .configured
2724
}

Amplify/Categories/Logging/Internal/LoggingCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,7 @@ extension LoggingCategory: CategoryConfigurable {
2626
throw error
2727
}
2828

29-
guard let pluginConfiguration = configuration.plugins[plugin.key] else {
30-
throw LoggingError.configuration(
31-
"No configuration found for added plugin `\(plugin.key)`",
32-
"""
33-
Either fix the configuration file to specify the plugin's key value of '\(plugin.key)',
34-
or add a plugin with one of the keys specified in the configuration:
35-
\(configuration.plugins.keys.joined(separator: ", "))
36-
"""
37-
)
38-
}
39-
40-
try plugin.configure(using: pluginConfiguration)
29+
try plugin.configure(using: configuration.plugins[plugin.key])
4130
self.plugin = plugin
4231
configurationState = .configured
4332
}

Amplify/Categories/Predictions/Internal/PredictionsCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ extension PredictionsCategory: CategoryConfigurable {
1616
throw error
1717
}
1818

19-
for (pluginKey, pluginConfiguration) in configuration.plugins {
20-
let plugin = try getPlugin(for: pluginKey)
21-
try plugin.configure(using: pluginConfiguration)
22-
}
19+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2320

2421
isConfigured = true
2522
}

Amplify/Categories/Storage/Internal/StorageCategory+CategoryConfigurable.swift

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,7 @@ extension StorageCategory: CategoryConfigurable {
1616
throw error
1717
}
1818

19-
for (pluginKey, pluginConfiguration) in configuration.plugins {
20-
let plugin = try getPlugin(for: pluginKey)
21-
try plugin.configure(using: pluginConfiguration)
22-
}
19+
try Amplify.configure(plugins: Array(plugins.values), using: configuration)
2320

2421
isConfigured = true
2522
}

Amplify/Core/Configuration/AmplifyConfiguration.swift

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,21 @@ extension Amplify {
145145

146146
try configurable.configure(using: configuration)
147147
}
148+
149+
/// Configures a list of plugins with the specified CategoryConfiguration. If any configurations do not match the
150+
/// specified plugins, emits a log warning.
151+
static func configure(plugins: [Plugin], using configuration: CategoryConfiguration) throws {
152+
var pluginConfigurations = configuration.plugins
153+
154+
for plugin in plugins {
155+
let pluginConfiguration = pluginConfigurations[plugin.key]
156+
try plugin.configure(using: pluginConfiguration)
157+
pluginConfigurations.removeValue(forKey: plugin.key)
158+
}
159+
160+
for unusedPluginKey in pluginConfigurations.keys {
161+
log.warn("No plugin found for configuration key `\(unusedPluginKey)`. Add a plugin for that key.")
162+
}
163+
}
164+
148165
}

0 commit comments

Comments
 (0)