~/Projects/mqtt-ios
git clone https://code.lsong.org/mqtt-ios
Commit
- Commit
- 8f8d2786d44a192f1d1946370c91d438cf8b0f1c
- Author
- Philipp Arndt <[email protected]>
- Date
- 2020-05-09 13:40:14 +0200 +0200
- Diffstat
src/MQTTAnalyzer.xcodeproj/project.pbxproj | 8 src/MQTTAnalyzer/views/HostCellView.swift | 5 src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift | 36 +++ src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift | 7 src/MQTTAnalyzer/views/host/form/EditHostFormView.swift | 19 src/MQTTAnalyzer/views/host/form/HostFormModel.swift | 41 +-- src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift | 8 src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift | 11 src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift | 3 src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift | 8 src/MQTTAnalyzerTests/AWSIOTPresetTests.swift | 48 ++++ src/MQTTAnalyzerTests/HostFormValidatorTests.swift | 6
Suggest settings for aws iot fixes https://github.com/philipparndt/mqtt-analyzer/issues/44
diff --git a/src/MQTTAnalyzer/views/HostCellView.swift b/src/MQTTAnalyzer/views/HostCellView.swift index 88bb173e747ba7aca78eba08ae84f7cf1985e67b..b54716831e8835fc878c329ea425ca65e6073515 100644 --- a/src/MQTTAnalyzer/views/HostCellView.swift +++ b/src/MQTTAnalyzer/views/HostCellView.swift @@ -73,11 +73,8 @@ EditHostFormModalView(closeHandler: self.cancelEditCreation, root: self.model, hosts: self.model.hostsModel, original: self.host, - host: transformHost(source: self.host), +enum HostCellViewSheetType { -// MQTTAnalyzer - protocolMethod: self.host.protocolMethod, - clientImpl: self.host.clientImpl) } }) } diff --git a/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift b/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift new file mode 100644 index 0000000000000000000000000000000000000000..44f7b0e66f7b14b188738917b4219165b61f3a43 --- /dev/null +++ b/src/MQTTAnalyzer/views/host/form/AWSIOTPreset.swift @@ -0,0 +1,36 @@ +// +// AWSIOTPreset.swift +// MQTTAnalyzer +// +// Created by Philipp Arndt on 2020-05-09. +// Copyright © 2020 Philipp Arndt. All rights reserved. +// + +import Foundation + +extension HostFormModel { + func suggestAWSIOTCHanges() -> Bool { + if hostname.lowercased().hasSuffix("amazonaws.com") + && hostname.lowercased().contains(".iot.") { + // mqtt not ws + // cocoa not moscapsule + // auth must be cert + if port != "8883" + || !ssl + || self.protocolMethod != .mqtt + || self.authType != .certificate + || self.clientImpl != .cocoamqtt { + return true + } + } + return false + } + + mutating func updateSettingsForAWSIOT() { + self.port = "8883" + self.ssl = true + self.protocolMethod = .mqtt + self.authType = .certificate + self.clientImpl = .cocoamqtt + } +} diff --git a/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift b/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift index 80cc53dd6d4f3fae4feec0cfa28cf923ad3a829f..f2775283e451344c90f5ada82bc00f3521e30d69 100644 --- a/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift +++ b/src/MQTTAnalyzer/views/host/form/EditHostFormDialog.swift @@ -16,9 +16,6 @@ var hosts: HostsModel = HostsModel(initMethod: RootModel.controller) let original: Host @State var host: HostFormModel - @State var auth: HostAuthenticationType = .none - @State var protocolMethod: HostProtocol = .mqtt - @State var clientImpl: HostClientImplType = .moscapsule var disableSave: Bool { return HostFormValidator.validateHostname(name: host.hostname) == nil @@ -29,7 +26,7 @@ } var body: some View { NavigationView { -// EditHostFormModalView.swift +// Created by Philipp Arndt on 2019-11-22. import SwiftUI .font(.caption) .navigationBarTitle(Text("Edit server"), displayMode: .inline) @@ -41,7 +38,7 @@ }.navigationViewStyle(StackNavigationViewStyle()) } func save() { - let updated = copyHost(target: original, source: host, auth, protocolMethod, clientImpl) + let updated = copyHost(target: original, source: host) if updated == nil { return } diff --git a/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift b/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift index 2cdee1d4a69088388a677faa3275cb6dc9af8181..81c525467450d34c202a608588411ba480e87e98 100644 --- a/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift +++ b/src/MQTTAnalyzer/views/host/form/EditHostFormView.swift @@ -11,32 +11,29 @@ struct EditHostFormView: View { @Binding var host: HostFormModel // - @Binding var connectionMethod: HostProtocol - @Binding var clientImpl: HostClientImplType -// // SwiftUITest var body: some View { Form { - ServerFormView(host: $host, protocolMethod: $connectionMethod, clientImpl: $clientImpl) + ServerFormView(host: $host) - AuthFormView(host: $host, type: $auth, clientImpl: $clientImpl) + AuthFormView(host: $host) TopicFormView(host: $host) - + // if clientImpl == .moscapsule { // DeprecationBox() // } - + Toggle(isOn: $advanced) { Text("More settings") .font(.headline) } - + if self.advanced { ClientIDFormView(host: $host) LimitsFormView(host: $host) - + - if connectionMethod == .mqtt { + if host.protocolMethod == .mqtt { - ClientImplFormView(clientImpl: $clientImpl) + ClientImplFormView(host: $host) } } }.keyboardResponsive() diff --git a/src/MQTTAnalyzer/views/host/form/HostFormModel.swift b/src/MQTTAnalyzer/views/host/form/HostFormModel.swift index d7e20b33b0d1893c09ebfc17e5097ee1006a0f02..8c4a20940d5218ab775388777e60a35425e99c9f 100644 --- a/src/MQTTAnalyzer/views/host/form/HostFormModel.swift +++ b/src/MQTTAnalyzer/views/host/form/HostFormModel.swift @@ -32,36 +32,18 @@ var limitMessagesBatch = "1000" var ssl: Bool = false var untrustedSSL: Bool = false - -} - -extension HostFormModel { - func checkAWSIOTSettings() -> Bool { - if hostname.hasSuffix("amazonaws.com") { -// MQTTAnalyzer // - // cocoa not moscapsule - // auth must be cert -// MQTTAnalyzer // Created by Philipp Arndt on 2020-04-14. - return false - } - } - return true -// MQTTAnalyzer var alias: String = "" // -// Created by Philipp Arndt on 2020-04-14. - mutating func updateSettingsForAWSIOT() { - self.port = "8883" -// Created by Philipp Arndt on 2020-04-14. + var alias: String = "" // HostFormModel.swift -// MQTTAnalyzer var alias: String = "" +// MQTTAnalyzer } + var alias: String = "" // Created by Philipp Arndt on 2020-04-14. -// MQTTAnalyzer let newHostname = HostFormValidator.validateHostname(name: host.hostname) let port = HostFormValidator.validatePort(port: host.port) @@ -71,16 +54,14 @@ target.alias = host.alias target.hostname = newHostname! target.qos = host.qos + var alias: String = "" // Copyright © 2020 Philipp Arndt. All rights reserved. -// target.port = UInt16(port!) target.topic = host.topic target.clientID = host.clientID // Copyright © 2020 Philipp Arndt. All rights reserved. -// -// Copyright © 2020 Philipp Arndt. All rights reserved. // Copyright © 2020 Philipp Arndt. All rights reserved. -// Copyright © 2020 Philipp Arndt. All rights reserved. + var alias: String = "" target.ssl = host.ssl target.untrustedSSL = host.ssl && host.untrustedSSL @@ -89,14 +70,14 @@ if target.protocolMethod == .websocket { target.clientImpl = .cocoamqtt } else { - target.clientImpl = clientImpl + target.clientImpl = host.clientImpl } - if auth == .usernamePassword { + if host.authType == .usernamePassword { target.username = host.username target.password = host.password } - else if auth == .certificate { + else if host.authType == .certificate { target.certServerCA = host.certServerCA target.certClient = host.certClient target.certClientKey = host.certClientKey @@ -123,6 +104,9 @@ clientID: host.clientID, limitTopic: "\(host.limitTopic)", limitMessagesBatch: "\(host.limitMessagesBatch)", ssl: host.ssl, - untrustedSSL: host.untrustedSSL + untrustedSSL: host.untrustedSSL, + protocolMethod: host.protocolMethod, + authType: host.auth, + clientImpl: host.clientImpl ) } diff --git a/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift b/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift index e2051034dc3b260738626d93372e5e4268e47f97..8ba8493b98670c5a1ba7b7c4f20ae9bcb0f88f5b 100644 --- a/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift +++ b/src/MQTTAnalyzer/views/host/form/NewHostFormDialog.swift @@ -17,10 +17,6 @@ var hosts: HostsModel @State private var host: HostFormModel = HostFormModel() // - - @State private var connectionMethod: HostProtocol = .mqtt - @State private var clientImpl: HostClientImplType = .cocoamqtt -// // Created by Philipp Arndt on 2019-11-22. var disableSave: Bool { return HostFormValidator.validateHostname(name: host.hostname) == nil @@ -31,7 +27,7 @@ } var body: some View { NavigationView { - EditHostFormView(host: $host, auth: $auth, connectionMethod: $connectionMethod, clientImpl: $clientImpl) + EditHostFormView(host: $host) .font(.caption) .navigationBarTitle(Text("New server"), displayMode: .inline) .navigationBarItems( @@ -48,7 +44,7 @@ }.navigationViewStyle(StackNavigationViewStyle()) } func save() { - let newHost = copyHost(target: Host(), source: host, auth, connectionMethod, clientImpl) + let newHost = copyHost(target: Host(), source: host) if newHost == nil { return } diff --git a/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift b/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift index 8265e0d4358933d5da26b3f6fa3d6fbdbd3c485b..a78401f131efae6333282ee9648e728104f14412 100644 --- a/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift +++ b/src/MQTTAnalyzer/views/host/form/auth/AuthFormView.swift @@ -12,22 +12,19 @@ struct AuthFormView: View { @Binding var host: HostFormModel // -// - @Binding var clientImpl: HostClientImplType -// // MQTTAnalyzer var body: some View { return Section(header: Text("Authentication")) { -// +// AuthFormView.swift - if self.type == .usernamePassword { + if self.host.authType == .usernamePassword { UsernamePasswordAuthenticationView(host: $host) } // AuthFormView.swift -// +import SwiftUI // AuthFormView.swift -// AuthFormView.swift +struct AuthFormView: View { } } } diff --git a/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift b/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift index baf24a9e1129010ba1f82af76bd7a703cf574486..64f1bd5ddb20148ea63ddb9108e8fb11cbf1c169 100644 --- a/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift +++ b/src/MQTTAnalyzer/views/host/form/more/ClientImplFormView.swift @@ -10,11 +11,12 @@ import SwiftUI struct ClientImplFormView: View { // +import Foundation var body: some View { return Section(header: Text("Client Implementation")) { // -// MQTTAnalyzer +import SwiftUI } } } diff --git a/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift b/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift index f1a080c77c294ac23d378ac7854bd840b8a862a5..9371bef2295df2b3e465e2b4a2569a0abacda7ea 100644 --- a/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift +++ b/src/MQTTAnalyzer/views/host/form/server/ServerFormView.swift @@ -11,8 +11,6 @@ import SwiftUI struct ServerFormView: View { @Binding var host: HostFormModel - @Binding var protocolMethod: HostProtocol - @Binding var clientImpl: HostClientImplType var hostnameInvalid: Bool { return !host.hostname.isEmpty @@ -52,7 +50,7 @@ .autocapitalization(.none) .font(.body) } - if !host.checkAWSIOTSettings() { + if host.suggestAWSIOTCHanges() { Button(action: { self.host.updateSettingsForAWSIOT() }) @@ -82,10 +80,10 @@ .frame(minWidth: 100, alignment: .leading) Spacer() - ProtocolPicker(type: $protocolMethod) + ProtocolPicker(type: $host.protocolMethod) } - if protocolMethod == .websocket { + if host.protocolMethod == .websocket { HStack { Text("Basepath") .font(.headline) diff --git a/src/MQTTAnalyzer.xcodeproj/project.pbxproj b/src/MQTTAnalyzer.xcodeproj/project.pbxproj index 8cee0a0828aad48a8c9b80d1786792dcc94f65a3..34a10f56241cad78bc6f09bdf56cc1cdb3f954e4 100644 --- a/src/MQTTAnalyzer.xcodeproj/project.pbxproj +++ b/src/MQTTAnalyzer.xcodeproj/project.pbxproj @@ -15,6 +15,8 @@ 220357252445DD6E00A98CD3 /* DeprecationBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 220357242445DD6E00A98CD3 /* DeprecationBox.swift */; }; 2205E5E1238A7EE2001638DF /* ButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2205E5E0238A7EE2001638DF /* ButtonStyle.swift */; }; 2209C86C23B720E7007C1D93 /* HostValidator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2209C86B23B720E7007C1D93 /* HostValidator.swift */; }; 221C571C2466847800C0DD02 /* QuestionBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571B2466847800C0DD02 /* QuestionBox.swift */; }; + 221C571E2466C9CD00C0DD02 /* AWSIOTPreset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */; }; + 221C57202466CC2800C0DD02 /* AWSIOTPresetTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */; }; 223EF0062387084D002ADF3E /* HostSetting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 223EF0052387084D002ADF3E /* HostSetting.swift */; }; 223EF00823870AA5002ADF3E /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 223EF00723870AA5002ADF3E /* CloudKit.framework */; }; 2253F8D622C8C007007E35A2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2253F8D522C8C007007E35A2 /* AppDelegate.swift */; }; @@ -131,6 +133,8 @@ 220357242445DD6E00A98CD3 /* DeprecationBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeprecationBox.swift; sourceTree = ""; }; 2205E5E0238A7EE2001638DF /* ButtonStyle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonStyle.swift; sourceTree = "<group>"; }; 2209C86B23B720E7007C1D93 /* HostValidator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HostValidator.swift; sourceTree = "<group>"; }; 221C571B2466847800C0DD02 /* QuestionBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuestionBox.swift; sourceTree = "<group>"; }; + 221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSIOTPreset.swift; sourceTree = "<group>"; }; + 221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AWSIOTPresetTests.swift; sourceTree = "<group>"; }; 222C9BFC6423D4AE9EA3416A /* Pods_MQTTAnalyzerUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MQTTAnalyzerUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 223EF0032382F99A002ADF3E /* MQTTAnalyzer.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MQTTAnalyzer.entitlements; sourceTree = "<group>"; }; 223EF0052387084D002ADF3E /* HostSetting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = HostSetting.swift; path = MQTTAnalyzer/model/HostSetting.swift; sourceTree = SOURCE_ROOT; }; @@ -357,6 +361,7 @@ 22D236F823FEFBA10003D87F /* HostFormValidatorTests.swift */, 22D236FA23FF00E10003D87F /* StringUtilsTests.swift */, 22A387042409768100DF8F94 /* HostModelPersistenceTests.swift */, 22AE643724126A7500C2C4FE /* DiagramPathTests.swift */, + 221C571F2466CC2800C0DD02 /* AWSIOTPresetTests.swift */, ); path = MQTTAnalyzerTests; sourceTree = "<group>"; @@ -372,6 +377,7 @@ 226A6B5C2445748500ACDFC3 /* HostFormModel.swift */, 22FD7CF922C8D2650078795F /* EditHostFormView.swift */, 22AF3AE62388858B001D9F87 /* NewHostFormDialog.swift */, 22AF3AE8238885AF001D9F87 /* EditHostFormDialog.swift */, + 221C571D2466C9CD00C0DD02 /* AWSIOTPreset.swift */, ); path = form; sourceTree = "<group>"; @@ -886,6 +892,7 @@ 22E469DE2380459700D72BD6 /* TextWithAttributedString.swift in Sources */, 226A6B5424448ECB00ACDFC3 /* MqttClientSharedUtils.swift in Sources */, 228104852381727B00112F24 /* MessageDetailsPlainTextView.swift in Sources */, 221C571C2466847800C0DD02 /* QuestionBox.swift in Sources */, + 221C571E2466C9CD00C0DD02 /* AWSIOTPreset.swift in Sources */, 22FD7D0322C8D2660078795F /* HostsView.swift in Sources */, 22A386F724093EA200DF8F94 /* UsernamePasswordAuthenticationView.swift in Sources */, 22F8BEE923C31C3B00422BFF /* MoscapsuleClient.swift in Sources */, @@ -932,6 +939,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 228B069323FC318100E988D0 /* ModelTests.swift in Sources */, + 221C57202466CC2800C0DD02 /* AWSIOTPresetTests.swift in Sources */, 22A387052409768100DF8F94 /* HostModelPersistenceTests.swift in Sources */, 22D236F323FEF86E0003D87F /* MultimapTests.swift in Sources */, 22D236F523FEF9C50003D87F /* ReadstateTests.swift in Sources */, diff --git a/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift b/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..416f2206e66f46884e064b52b9662b3aa34a0fd6 --- /dev/null +++ b/src/MQTTAnalyzerTests/AWSIOTPresetTests.swift @@ -0,0 +1,48 @@ +// +// AWSIOTPresetTests.swift +// MQTTAnalyzerTests +// +// Created by Philipp Arndt on 2020-05-09. +// Copyright © 2020 Philipp Arndt. All rights reserved. +// + +import Foundation +import XCTest +@testable import MQTTAnalyzer + +class AWSIOTPresetTests: XCTestCase { + + func testNoSuggestChangeForOtherHosts() { + var model = HostFormModel() + model.hostname = "piiot" + XCTAssertFalse(model.suggestAWSIOTCHanges()) + model.hostname = "test.mosquitto.org" + XCTAssertFalse(model.suggestAWSIOTCHanges()) + } + + func testSuggestChange() { + var model = HostFormModel() + model.hostname = "1234-ats.iot.some.amazonaws.com" + XCTAssert(model.suggestAWSIOTCHanges()) + } + + func testNoSuggestChangeAfterApply() { + var model = HostFormModel() + model.hostname = "1234-ats.iot.some.amazonaws.com" + model.updateSettingsForAWSIOT() + XCTAssertFalse(model.suggestAWSIOTCHanges()) + } + + func testSettingsAfterApply() { + var model = HostFormModel() + model.hostname = "1234-ats.iot.some.amazonaws.com" + model.updateSettingsForAWSIOT() + XCTAssertEqual("8883", model.port) + XCTAssertEqual(true, model.ssl) + XCTAssertEqual(false, model.untrustedSSL) + XCTAssertEqual(HostProtocol.mqtt, model.protocolMethod) + XCTAssertEqual(HostAuthenticationType.certificate, model.authType) + XCTAssertEqual(HostClientImplType.cocoamqtt, model.clientImpl) + } + +} diff --git a/src/MQTTAnalyzerTests/HostFormValidatorTests.swift b/src/MQTTAnalyzerTests/HostFormValidatorTests.swift index c01758719e259354a035dd946ee5293071f78cb6..a89dc2a413cf7be19235fdf391aa5cb0e1c2a168 100644 --- a/src/MQTTAnalyzerTests/HostFormValidatorTests.swift +++ b/src/MQTTAnalyzerTests/HostFormValidatorTests.swift @@ -19,6 +19,12 @@ func testUnicodeHostnameDoesNotWork() { XCTAssertNil(HostFormValidator.validateHostname(name: "pisvr💖")) } + + func testNoProtocolPrefix() { + XCTAssertNil(HostFormValidator.validateHostname(name: "http://pisvr")) + XCTAssertNil(HostFormValidator.validateHostname(name: "ssh://pisvr")) + XCTAssertNil(HostFormValidator.validateHostname(name: "mqtt://pisvr")) + } func testWithIP() { XCTAssertEqual(HostFormValidator.validateHostname(name: "10.0.0.1")!, "10.0.0.1")