Skip to content

Commit b47b478

Browse files
authored
Returning the original message in case of decryption failure (#151)
fix(crypto): handle unencrypted message while getting it with CryptoModule configured
1 parent 6980f9f commit b47b478

File tree

10 files changed

+267
-39
lines changed

10 files changed

+267
-39
lines changed

.pubnub.yml

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
---
22
name: swift
33
scm: github.com/pubnub/swift
4-
version: "6.2.2"
4+
version: "6.2.3"
55
schema: 1
66
changelog:
7+
- date: 2023-11-28
8+
version: 6.2.3
9+
changes:
10+
- type: bug
11+
text: "Handle unencrypted message while getting it with CryptoModule configured."
712
- date: 2023-10-30
813
version: 6.2.2
914
changes:
@@ -507,7 +512,7 @@ sdks:
507512
- distribution-type: source
508513
distribution-repository: GitHub release
509514
package-name: PubNub
510-
location: https://github.com/pubnub/swift/archive/refs/tags/6.2.2.zip
515+
location: https://github.com/pubnub/swift/archive/refs/tags/6.2.3.zip
511516
supported-platforms:
512517
supported-operating-systems:
513518
macOS:

PubNub.xcodeproj/project.pbxproj

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,7 @@
389389
3DACC7F72AB88F8E00210B14 /* Data+CommonCrypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DACC7F62AB88F8E00210B14 /* Data+CommonCrypto.swift */; };
390390
3DBB2C212ABD8053008A100E /* PubNubCryptoModuleContractTestSteps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DBB2C202ABD8053008A100E /* PubNubCryptoModuleContractTestSteps.swift */; };
391391
3DBB2C222ABD8053008A100E /* PubNubCryptoModuleContractTestSteps.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3DBB2C202ABD8053008A100E /* PubNubCryptoModuleContractTestSteps.swift */; };
392+
3DFB01942B0E30EE00146B57 /* subscription_encrypted_message_success.json in Resources */ = {isa = PBXBuildFile; fileRef = 3DFB01932B0E30EE00146B57 /* subscription_encrypted_message_success.json */; };
392393
4C2A8D84BCD39B07A66FD9B4 /* Pods_PubNubContractTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1E7F3D449F2D66FC29674EF6 /* Pods_PubNubContractTests.framework */; };
393394
79407BD2271D4CFA0032076C /* PubNubContractTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79407BBF271D4CFA0032076C /* PubNubContractTestCase.swift */; };
394395
79407BD3271D4CFA0032076C /* PubNubContractTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79407BBF271D4CFA0032076C /* PubNubContractTestCase.swift */; };
@@ -924,6 +925,7 @@
924925
3DACC7F62AB88F8E00210B14 /* Data+CommonCrypto.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+CommonCrypto.swift"; sourceTree = "<group>"; };
925926
3DBB2C202ABD8053008A100E /* PubNubCryptoModuleContractTestSteps.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PubNubCryptoModuleContractTestSteps.swift; sourceTree = "<group>"; };
926927
3DE632651BA8B2E27ACFC4AD /* Pods-PubNubContractTestsBeta.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-PubNubContractTestsBeta.release.xcconfig"; path = "Target Support Files/Pods-PubNubContractTestsBeta/Pods-PubNubContractTestsBeta.release.xcconfig"; sourceTree = "<group>"; };
928+
3DFB01932B0E30EE00146B57 /* subscription_encrypted_message_success.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscription_encrypted_message_success.json; sourceTree = "<group>"; };
927929
793079152667C63700F23B72 /* CODEOWNERS */ = {isa = PBXFileReference; lastKnownFileType = text; path = CODEOWNERS; sourceTree = "<group>"; };
928930
793079172667C63700F23B72 /* validate-yml.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = "validate-yml.js"; sourceTree = "<group>"; };
929931
793079182667C63700F23B72 /* validate-pubnub-yml.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = "validate-pubnub-yml.yml"; sourceTree = "<group>"; };
@@ -1320,6 +1322,7 @@
13201322
isa = PBXGroup;
13211323
children = (
13221324
359287C423185EEE0046F7A2 /* subscription_success.json */,
1325+
3DFB01932B0E30EE00146B57 /* subscription_encrypted_message_success.json */,
13231326
35C6B6DF22F513D80054F242 /* subscription_mixed_success.json */,
13241327
359287BE23183DBB0046F7A2 /* subscription_signal_success.json */,
13251328
359287C023183E4A0046F7A2 /* subscription_presence_success.json */,
@@ -2637,6 +2640,7 @@
26372640
35FE941422EFB7C10051C455 /* unknownEndpointError.json in Resources */,
26382641
35FE93F122EF93A90051C455 /* serverCertificateUntrusted.json in Resources */,
26392642
35A6C79A22FBC2AD00E97CC5 /* groups_delete_success.json in Resources */,
2643+
3DFB01942B0E30EE00146B57 /* subscription_encrypted_message_success.json in Resources */,
26402644
35293A872369F0230049A71F /* addMessageAction_error_400.json in Resources */,
26412645
35FE93F622EF93A90051C455 /* cannotParseResponse.json in Resources */,
26422646
35A6C79C22FBC2D100E97CC5 /* groups_channels_add_success.json in Resources */,
@@ -3436,7 +3440,7 @@
34363440
"@executable_path/Frameworks",
34373441
"@loader_path/Frameworks",
34383442
);
3439-
MARKETING_VERSION = 6.2.2;
3443+
MARKETING_VERSION = 6.2.3;
34403444
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
34413445
MTL_FAST_MATH = YES;
34423446
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubUser;
@@ -3483,7 +3487,7 @@
34833487
"@executable_path/Frameworks",
34843488
"@loader_path/Frameworks",
34853489
);
3486-
MARKETING_VERSION = 6.2.2;
3490+
MARKETING_VERSION = 6.2.3;
34873491
MTL_ENABLE_DEBUG_INFO = NO;
34883492
MTL_FAST_MATH = YES;
34893493
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubUser;
@@ -3583,7 +3587,7 @@
35833587
"@executable_path/Frameworks",
35843588
"@loader_path/Frameworks",
35853589
);
3586-
MARKETING_VERSION = 6.2.2;
3590+
MARKETING_VERSION = 6.2.3;
35873591
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
35883592
MTL_FAST_MATH = YES;
35893593
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubSpace;
@@ -3632,7 +3636,7 @@
36323636
"@executable_path/Frameworks",
36333637
"@loader_path/Frameworks",
36343638
);
3635-
MARKETING_VERSION = 6.2.2;
3639+
MARKETING_VERSION = 6.2.3;
36363640
MTL_ENABLE_DEBUG_INFO = NO;
36373641
MTL_FAST_MATH = YES;
36383642
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubSpace;
@@ -3745,7 +3749,7 @@
37453749
"@executable_path/Frameworks",
37463750
"@loader_path/Frameworks",
37473751
);
3748-
MARKETING_VERSION = 6.2.2;
3752+
MARKETING_VERSION = 6.2.3;
37493753
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
37503754
MTL_FAST_MATH = YES;
37513755
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubMembership;
@@ -3793,7 +3797,7 @@
37933797
"@executable_path/Frameworks",
37943798
"@loader_path/Frameworks",
37953799
);
3796-
MARKETING_VERSION = 6.2.2;
3800+
MARKETING_VERSION = 6.2.3;
37973801
MTL_ENABLE_DEBUG_INFO = NO;
37983802
MTL_FAST_MATH = YES;
37993803
PRODUCT_BUNDLE_IDENTIFIER = com.pubnub.swift.PubNubMembership;
@@ -4253,7 +4257,7 @@
42534257
"$(inherited)",
42544258
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
42554259
);
4256-
MARKETING_VERSION = 6.2.2;
4260+
MARKETING_VERSION = 6.2.3;
42574261
OTHER_CFLAGS = "$(inherited)";
42584262
OTHER_LDFLAGS = "$(inherited)";
42594263
OTHER_SWIFT_FLAGS = "$(inherited)";
@@ -4292,7 +4296,7 @@
42924296
"$(inherited)",
42934297
"$(TOOLCHAIN_DIR)/usr/lib/swift/macosx",
42944298
);
4295-
MARKETING_VERSION = 6.2.2;
4299+
MARKETING_VERSION = 6.2.3;
42964300
OTHER_CFLAGS = "$(inherited)";
42974301
OTHER_LDFLAGS = "$(inherited)";
42984302
OTHER_SWIFT_FLAGS = "$(inherited)";

PubNubSwift.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Pod::Spec.new do |s|
22
s.name = 'PubNubSwift'
3-
s.version = '6.2.2'
3+
s.version = '6.2.3'
44
s.homepage = 'https://github.com/pubnub/swift'
55
s.documentation_url = 'https://www.pubnub.com/docs/swift-native/pubnub-swift-sdk'
66
s.authors = { 'PubNub, Inc.' => '[email protected]' }

Sources/PubNub/Helpers/Constants.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public enum Constant {
5757

5858
static let pubnubSwiftSDKName: String = "PubNubSwift"
5959

60-
static let pubnubSwiftSDKVersion: String = "6.2.2"
60+
static let pubnubSwiftSDKVersion: String = "6.2.3"
6161

6262
static let appBundleId: String = {
6363
if let info = Bundle.main.infoDictionary,

Sources/PubNub/Models/PubNubMessage.swift

Lines changed: 58 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@ public protocol PubNubMessage {
3838
var metadata: JSONCodable? { get set }
3939
/// The type of message that was received
4040
var messageType: PubNubMessageType { get set }
41-
41+
/// An error (if any) occured while getting this message
42+
var error: PubNubError? { get set }
43+
4244
/// Allows for transcoding between different MessageEvent types
4345
init(from other: PubNubMessage) throws
4446
}
@@ -69,16 +71,17 @@ public extension PubNubMessage {
6971

7072
/// The default implementation of the `PubNubMessage` protocol
7173
public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
72-
var concretePayload: AnyJSON
7374
public var publisher: String?
74-
var concreteMessageActions: [PubNubMessageActionBase]
7575
public var channel: String
7676
public var subscription: String?
7777
public var published: Timetoken
78-
var concreteMetadata: AnyJSON?
79-
8078
public var messageType: PubNubMessageType
81-
79+
public var error: PubNubError?
80+
81+
var concretePayload: AnyJSON
82+
var concreteMessageActions: [PubNubMessageActionBase]
83+
var concreteMetadata: AnyJSON?
84+
8285
public var payload: JSONCodable {
8386
get { return concretePayload }
8487
set {
@@ -109,7 +112,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
109112
subscription: other.subscription,
110113
published: other.published,
111114
metadata: other.metadata?.codableValue,
112-
messageType: other.messageType
115+
messageType: other.messageType,
116+
error: other.error
113117
)
114118
}
115119

@@ -122,7 +126,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
122126
subscription: subscribe.subscription,
123127
published: subscribe.publishTimetoken.timetoken,
124128
metadata: subscribe.metadata,
125-
messageType: subscribe.messageType.asPubNubMessageType
129+
messageType: subscribe.messageType.asPubNubMessageType,
130+
error: subscribe.error
126131
)
127132
}
128133

@@ -141,7 +146,8 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
141146
subscription: nil,
142147
published: history.timetoken,
143148
metadata: history.meta,
144-
messageType: history.messageType ?? .unknown
149+
messageType: history.messageType ?? .unknown,
150+
error: history.error
145151
)
146152
}
147153

@@ -153,16 +159,55 @@ public struct PubNubMessageBase: PubNubMessage, Codable, Hashable {
153159
subscription: String?,
154160
published: Timetoken,
155161
metadata: AnyJSON?,
156-
messageType: PubNubMessageType = .unknown
162+
messageType: PubNubMessageType = .unknown,
163+
error: PubNubError? = nil
157164
) {
158-
concretePayload = payload
159-
concreteMessageActions = actions
165+
self.concretePayload = payload
166+
self.concreteMessageActions = actions
160167
self.publisher = publisher
161168
self.channel = channel
162169
self.subscription = subscription
163170
self.published = published
164-
concreteMetadata = metadata
171+
self.concreteMetadata = metadata
165172
self.messageType = messageType
173+
self.error = error
174+
}
175+
176+
public func encode(to encoder: Encoder) throws {
177+
var container = encoder.container(keyedBy: CodingKeys.self)
178+
179+
try container.encode(self.concretePayload, forKey: .concretePayload)
180+
try container.encodeIfPresent(self.publisher, forKey: .publisher)
181+
try container.encode(self.concreteMessageActions, forKey: .concreteMessageActions)
182+
try container.encode(self.channel, forKey: .channel)
183+
try container.encodeIfPresent(self.subscription, forKey: .subscription)
184+
try container.encode(self.published, forKey: .published)
185+
try container.encodeIfPresent(self.concreteMetadata, forKey: .concreteMetadata)
186+
try container.encode(self.messageType, forKey: .messageType)
187+
}
188+
189+
enum CodingKeys: CodingKey {
190+
case concretePayload
191+
case publisher
192+
case concreteMessageActions
193+
case channel
194+
case subscription
195+
case published
196+
case concreteMetadata
197+
case messageType
198+
}
199+
200+
public init(from decoder: Decoder) throws {
201+
let container = try decoder.container(keyedBy: CodingKeys.self)
202+
203+
self.concretePayload = try container.decode(AnyJSON.self, forKey: .concretePayload)
204+
self.publisher = try container.decodeIfPresent(String.self, forKey: .publisher)
205+
self.concreteMessageActions = try container.decode([PubNubMessageActionBase].self, forKey: .concreteMessageActions)
206+
self.channel = try container.decode(String.self, forKey: .channel)
207+
self.subscription = try container.decodeIfPresent(String.self, forKey: .subscription)
208+
self.published = try container.decode(Timetoken.self, forKey: .published)
209+
self.concreteMetadata = try container.decodeIfPresent(AnyJSON.self, forKey: .concreteMetadata)
210+
self.messageType = try container.decode(PubNubMessageType.self, forKey: .messageType)
166211
}
167212
}
168213

Sources/PubNub/Networking/Routers/HistoryRouter.swift

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,36 @@ struct MessageHistoryResponseDecoder: ResponseDecoder {
190190
timetoken: message.timetoken,
191191
meta: message.meta,
192192
uuid: message.uuid,
193-
messageType: message.messageType
193+
messageType: message.messageType,
194+
error: nil
194195
)
195196
case .failure(let error):
196-
PubNub.log.error("History message failed to decrypt due to \(error)")
197+
messages[index] = MessageHistoryMessagePayload(
198+
message: message.message,
199+
timetoken: message.timetoken,
200+
meta: message.meta,
201+
uuid: message.uuid,
202+
messageType: message.messageType,
203+
error: error
204+
)
205+
PubNub.log.warn("History message failed to decrypt due to \(error)")
197206
}
207+
} else {
208+
messages[index] = MessageHistoryMessagePayload(
209+
message: message.message,
210+
timetoken: message.timetoken,
211+
meta: message.meta,
212+
uuid: message.uuid,
213+
messageType: message.messageType,
214+
error: PubNubError(
215+
.decryptionFailure,
216+
additional: ["Cannot decrypt message due to invalid Base-64 input"]
217+
)
218+
)
198219
}
199220
}
221+
222+
200223
return messages
201224
}
202225

@@ -284,21 +307,24 @@ struct MessageHistoryMessagePayload: Codable {
284307
let uuid: String?
285308
let messageType: PubNubMessageType?
286309
let actions: RawMessageAction
310+
let error: PubNubError?
287311

288312
init(
289313
message: JSONCodable,
290314
timetoken: Timetoken = 0,
291315
meta: JSONCodable? = nil,
292316
uuid: String?,
293317
messageType: PubNubMessageType?,
294-
actions: RawMessageAction = [:]
318+
actions: RawMessageAction = [:],
319+
error: PubNubError?
295320
) {
296321
self.message = message.codableValue
297322
self.timetoken = timetoken
298323
self.uuid = uuid
299324
self.messageType = messageType
300325
self.meta = meta?.codableValue
301326
self.actions = actions
327+
self.error = error
302328
}
303329

304330
enum CodingKeys: String, CodingKey {
@@ -319,6 +345,7 @@ struct MessageHistoryMessagePayload: Codable {
319345
messageType = try container.decodeIfPresent(PubNubMessageType.self, forKey: .messageType)
320346
timetoken = Timetoken(try container.decode(String.self, forKey: .timetoken)) ?? 0
321347
actions = try container.decodeIfPresent(RawMessageAction.self, forKey: .actions) ?? [:]
348+
error = nil
322349
}
323350

324351
public func encode(to encoder: Encoder) throws {

0 commit comments

Comments
 (0)